Browse Source

Avoid use of __builtin_popcount for portability

pull/602/head
Andrew Waterman 6 years ago
parent
commit
081bcaddc5
  1. 11
      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. 2
      riscv/insns/bmatxor.h

11
riscv/arith.h

@ -121,6 +121,17 @@ static inline uint64_t make_mask64(int pos, int len)
return (UINT64_MAX >> (64 - len)) << pos;
}
static inline int popcount(uint64_t val)
{
val = (val & 0x5555555555555555U) + ((val >> 1) & 0x5555555555555555U);
val = (val & 0x3333333333333333U) + ((val >> 2) & 0x3333333333333333U);
val = (val & 0x0f0f0f0f0f0f0f0fU) + ((val >> 4) & 0x0f0f0f0f0f0f0f0fU);
val = (val & 0x00ff00ff00ff00ffU) + ((val >> 8) & 0x00ff00ff00ff00ffU);
val = (val & 0x0000ffff0000ffffU) + ((val >> 16) & 0x0000ffff0000ffffU);
val = (val & 0x00000000ffffffffU) + ((val >> 32) & 0x00000000ffffffffU);
return val;
}
static inline int ctz(uint64_t val)
{
if (!val)

2
riscv/insns/bdep.h

@ -3,7 +3,7 @@ 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 << (ctz(b) - i)) & b;
i += __builtin_popcountl(b);
i += popcount(b);
mask -= b;
}
WRITE_RD(sext_xlen(c));

2
riscv/insns/bdepw.h

@ -4,7 +4,7 @@ uint64_t c = 0, i = 0, data = zext32(RS1), mask = zext32(RS2);
while (mask) {
uint64_t b = mask & ~((mask | (mask-1)) + 1);
c |= (data << (ctz(b) - i)) & b;
i += __builtin_popcountl(b);
i += popcount(b);
mask -= b;
}
WRITE_RD(sext32(c));

2
riscv/insns/bext.h

@ -3,7 +3,7 @@ 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) >> (ctz(b) - i);
i += __builtin_popcountl(b);
i += popcount(b);
mask -= b;
}
WRITE_RD(sext_xlen(c));

2
riscv/insns/bextw.h

@ -4,7 +4,7 @@ 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) >> (ctz(b) - i);
i += __builtin_popcountl(b);
i += popcount(b);
mask -= b;
}
WRITE_RD(sext32(c));

2
riscv/insns/bmatxor.h

@ -22,7 +22,7 @@ for (int i = 0; i < 8; i++) {
uint64_t x = 0;
for (int i = 0; i < 64; i++) {
if (__builtin_popcountl(u[i / 8] & v[i % 8]) & 1)
if (popcount(u[i / 8] & v[i % 8]) & 1)
x |= 1LL << i;
}

Loading…
Cancel
Save