llsr.c 435 Bytes
/* See the "Run-time ABI for the ARM Architecture", Section 4.2 */

typedef unsigned int uint32_t;

long long __aeabi_llsr(long long value, int shift) {
  uint32_t low = ((uint32_t)value >> shift);
  if (shift < 32) {
    low |= ((uint32_t)(value >> 32) << (32 - shift));
  } else {
    low |= ((uint32_t)(value >> 32) >> (shift - 32));
  }
  uint32_t high = (uint32_t)(value >> 32) >> shift;
  return ((long long)high << 32) | low;
}