Browse Source

Avoid use of __builtin_ctz for portability

pull/602/head
Andrew Waterman 6 years ago
parent
commit
b2a2f24692
  1. 35
      riscv/arith.h
  2. 2
      riscv/insns/bdep.h
  3. 2
      riscv/insns/bdepw.h
  4. 2
      riscv/insns/bext.h
  5. 2
      riscv/insns/bextw.h
  6. 10
      riscv/processor.cc

35
riscv/arith.h

@ -120,4 +120,39 @@ static inline uint64_t make_mask64(int pos, int len)
assert(pos >= 0 && len > 0 && pos < 64 && len <= 64);
return (UINT64_MAX >> (64 - len)) << pos;
}
static inline int ctz(uint64_t val)
{
if (!val)
return 0;
int res = 0;
if ((val << 32) == 0) res += 32, val >>= 32;
if ((val << 48) == 0) res += 16, val >>= 16;
if ((val << 56) == 0) res += 8, val >>= 8;
if ((val << 60) == 0) res += 4, val >>= 4;
if ((val << 62) == 0) res += 2, val >>= 2;
if ((val << 63) == 0) res += 1, val >>= 1;
return res;
}
static inline int clz(uint64_t val)
{
if (!val)
return 0;
int res = 0;
if ((val >> 32) == 0) res += 32, val <<= 32;
if ((val >> 48) == 0) res += 16, val <<= 16;
if ((val >> 56) == 0) res += 8, val <<= 8;
if ((val >> 60) == 0) res += 4, val <<= 4;
if ((val >> 62) == 0) res += 2, val <<= 2;
if ((val >> 63) == 0) res += 1, val <<= 1;
return res;
}
#endif

2
riscv/insns/bdep.h

@ -2,7 +2,7 @@ require_extension('B');
uint64_t c = 0, i = 0, data = zext_xlen(RS1), mask = zext_xlen(RS2);
while (mask) {
uint64_t b = mask & ~((mask | (mask-1)) + 1);
c |= (data << (__builtin_ctzl(b) - i)) & b;
c |= (data << (ctz(b) - i)) & b;
i += __builtin_popcountl(b);
mask -= b;
}

2
riscv/insns/bdepw.h

@ -3,7 +3,7 @@ require_extension('B');
uint64_t c = 0, i = 0, data = zext32(RS1), mask = zext32(RS2);
while (mask) {
uint64_t b = mask & ~((mask | (mask-1)) + 1);
c |= (data << (__builtin_ctzl(b) - i)) & b;
c |= (data << (ctz(b) - i)) & b;
i += __builtin_popcountl(b);
mask -= b;
}

2
riscv/insns/bext.h

@ -2,7 +2,7 @@ require_extension('B');
uint64_t c = 0, i = 0, data = zext_xlen(RS1), mask = zext_xlen(RS2);
while (mask) {
uint64_t b = mask & ~((mask | (mask-1)) + 1);
c |= (data & b) >> (__builtin_ctzl(b) - i);
c |= (data & b) >> (ctz(b) - i);
i += __builtin_popcountl(b);
mask -= b;
}

2
riscv/insns/bextw.h

@ -3,7 +3,7 @@ require_extension('B');
uint64_t c = 0, i = 0, data = zext32(RS1), mask = zext32(RS2);
while (mask) {
uint64_t b = mask & ~((mask | (mask-1)) + 1);
c |= (data & b) >> (__builtin_ctzl(b) - i);
c |= (data & b) >> (ctz(b) - i);
i += __builtin_popcountl(b);
mask -= b;
}

10
riscv/processor.cc

@ -478,16 +478,6 @@ void processor_t::reset()
sim->proc_reset(id);
}
// Count number of contiguous 0 bits starting from the LSB.
static int ctz(reg_t val)
{
int res = 0;
if (val)
while ((val & 1) == 0)
val >>= 1, res++;
return res;
}
void processor_t::set_pmp_num(reg_t n)
{
// check the number of pmp is in a reasonable range

Loading…
Cancel
Save