committed by
GitHub
109 changed files with 1040 additions and 2 deletions
@ -0,0 +1,3 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
WRITE_RD(zext32(insn.i_imm() + RS1)); |
|||
@ -0,0 +1,3 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
WRITE_RD(sext_xlen(zext32(RS1) + RS2)); |
|||
@ -0,0 +1,3 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
WRITE_RD(zext32(RS1 + RS2)); |
|||
@ -0,0 +1,2 @@ |
|||
require_extension('B'); |
|||
WRITE_RD(RS1 & ~RS2); |
|||
@ -0,0 +1,9 @@ |
|||
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; |
|||
i += __builtin_popcountl(b); |
|||
mask -= b; |
|||
} |
|||
WRITE_RD(sext_xlen(c)); |
|||
@ -0,0 +1,10 @@ |
|||
require_rv64; |
|||
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; |
|||
i += __builtin_popcountl(b); |
|||
mask -= b; |
|||
} |
|||
WRITE_RD(sext32(c)); |
|||
@ -0,0 +1,9 @@ |
|||
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); |
|||
i += __builtin_popcountl(b); |
|||
mask -= b; |
|||
} |
|||
WRITE_RD(sext_xlen(c)); |
|||
@ -0,0 +1,10 @@ |
|||
require_rv64; |
|||
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); |
|||
i += __builtin_popcountl(b); |
|||
mask -= b; |
|||
} |
|||
WRITE_RD(sext32(c)); |
|||
@ -0,0 +1,10 @@ |
|||
require_extension('B'); |
|||
reg_t cfg = RS2 >> (xlen/2); |
|||
if ((cfg >> 30) == 2) |
|||
cfg = cfg >> 16; |
|||
int len = (cfg >> 8) & (xlen/2-1); |
|||
int off = cfg & (xlen-1); |
|||
len = len ? len : xlen/2; |
|||
reg_t mask = ~(~reg_t(0) << len) << off; |
|||
reg_t data = RS2 << off; |
|||
WRITE_RD(sext_xlen((data & mask) | (RS1 & ~mask))); |
|||
@ -0,0 +1,8 @@ |
|||
require_extension('B'); |
|||
reg_t cfg = RS2 >> 16; |
|||
int len = (cfg >> 8) & 15; |
|||
int off = cfg & 31; |
|||
len = len ? len : 16; |
|||
reg_t mask = ~(~reg_t(0) << len) << off; |
|||
reg_t data = RS2 << off; |
|||
WRITE_RD(sext32((data & mask) | (RS1 & ~mask))); |
|||
@ -0,0 +1,11 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
reg_t x = RS1; |
|||
for (int i = 0; i < 3; i++) { |
|||
x = (x & 0xFFFF00000000FFFFLL) | ((x & 0x0000FFFF00000000LL) >> 16) | ((x & 0x00000000FFFF0000LL) << 16); |
|||
x = (x & 0xFF0000FFFF0000FFLL) | ((x & 0x00FF000000FF0000LL) >> 8) | ((x & 0x0000FF000000FF00LL) << 8); |
|||
x = (x & 0xF00FF00FF00FF00FLL) | ((x & 0x0F000F000F000F00LL) >> 4) | ((x & 0x00F000F000F000F0LL) << 4); |
|||
x = (x & 0xC3C3C3C3C3C3C3C3LL) | ((x & 0x3030303030303030LL) >> 2) | ((x & 0x0C0C0C0C0C0C0C0CLL) << 2); |
|||
x = (x & 0x9999999999999999LL) | ((x & 0x4444444444444444LL) >> 1) | ((x & 0x2222222222222222LL) << 1); |
|||
} |
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,29 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
|
|||
// transpose of rs2
|
|||
int64_t rs2t = RS2; |
|||
for (int i = 0; i < 3; i++) { |
|||
rs2t = (rs2t & 0xFFFF00000000FFFFLL) | ((rs2t & 0x0000FFFF00000000LL) >> 16) | ((rs2t & 0x00000000FFFF0000LL) << 16); |
|||
rs2t = (rs2t & 0xFF0000FFFF0000FFLL) | ((rs2t & 0x00FF000000FF0000LL) >> 8) | ((rs2t & 0x0000FF000000FF00LL) << 8); |
|||
rs2t = (rs2t & 0xF00FF00FF00FF00FLL) | ((rs2t & 0x0F000F000F000F00LL) >> 4) | ((rs2t & 0x00F000F000F000F0LL) << 4); |
|||
rs2t = (rs2t & 0xC3C3C3C3C3C3C3C3LL) | ((rs2t & 0x3030303030303030LL) >> 2) | ((rs2t & 0x0C0C0C0C0C0C0C0CLL) << 2); |
|||
rs2t = (rs2t & 0x9999999999999999LL) | ((rs2t & 0x4444444444444444LL) >> 1) | ((rs2t & 0x2222222222222222LL) << 1); |
|||
} |
|||
|
|||
int64_t rs1 = RS1; |
|||
uint8_t u[8]; // rows of rs1
|
|||
uint8_t v[8]; // cols of rs2
|
|||
|
|||
for (int i = 0; i < 8; i++) { |
|||
u[i] = rs1 >> (i*8); |
|||
v[i] = rs2t >> (i*8); |
|||
} |
|||
|
|||
uint64_t x = 0; |
|||
for (int i = 0; i < 64; i++) { |
|||
if ((u[i / 8] & v[i % 8]) != 0) |
|||
x |= 1LL << i; |
|||
} |
|||
|
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,29 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
|
|||
// transpose of rs2
|
|||
int64_t rs2t = RS2; |
|||
for (int i = 0; i < 3; i++) { |
|||
rs2t = (rs2t & 0xFFFF00000000FFFFLL) | ((rs2t & 0x0000FFFF00000000LL) >> 16) | ((rs2t & 0x00000000FFFF0000LL) << 16); |
|||
rs2t = (rs2t & 0xFF0000FFFF0000FFLL) | ((rs2t & 0x00FF000000FF0000LL) >> 8) | ((rs2t & 0x0000FF000000FF00LL) << 8); |
|||
rs2t = (rs2t & 0xF00FF00FF00FF00FLL) | ((rs2t & 0x0F000F000F000F00LL) >> 4) | ((rs2t & 0x00F000F000F000F0LL) << 4); |
|||
rs2t = (rs2t & 0xC3C3C3C3C3C3C3C3LL) | ((rs2t & 0x3030303030303030LL) >> 2) | ((rs2t & 0x0C0C0C0C0C0C0C0CLL) << 2); |
|||
rs2t = (rs2t & 0x9999999999999999LL) | ((rs2t & 0x4444444444444444LL) >> 1) | ((rs2t & 0x2222222222222222LL) << 1); |
|||
} |
|||
|
|||
int64_t rs1 = RS1; |
|||
uint8_t u[8]; // rows of rs1
|
|||
uint8_t v[8]; // cols of rs2
|
|||
|
|||
for (int i = 0; i < 8; i++) { |
|||
u[i] = rs1 >> (i*8); |
|||
v[i] = rs2t >> (i*8); |
|||
} |
|||
|
|||
uint64_t x = 0; |
|||
for (int i = 0; i < 64; i++) { |
|||
if (__builtin_popcountl(u[i / 8] & v[i % 8]) & 1) |
|||
x |= 1LL << i; |
|||
} |
|||
|
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,6 @@ |
|||
require_extension('B'); |
|||
reg_t a = zext_xlen(RS1), b = zext_xlen(RS2), x = 0; |
|||
for (int i = 0; i < xlen; i++) |
|||
if ((b >> i) & 1) |
|||
x ^= a << i; |
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,6 @@ |
|||
require_extension('B'); |
|||
reg_t a = zext_xlen(RS1), b = zext_xlen(RS2), x = 0; |
|||
for (int i = 1; i < xlen; i++) |
|||
if ((b >> i) & 1) |
|||
x ^= a >> (xlen-i); |
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,6 @@ |
|||
require_extension('B'); |
|||
reg_t a = zext32(RS1), b = zext32(RS2), x = 0; |
|||
for (int i = 1; i < 32; i++) |
|||
if ((b >> i) & 1) |
|||
x ^= a >> (32-i); |
|||
WRITE_RD(sext32(x)); |
|||
@ -0,0 +1,6 @@ |
|||
require_extension('B'); |
|||
reg_t a = zext_xlen(RS1), b = zext_xlen(RS2), x = 0; |
|||
for (int i = 0; i < xlen; i++) |
|||
if ((b >> i) & 1) |
|||
x ^= a >> (xlen-i-1); |
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,6 @@ |
|||
require_extension('B'); |
|||
reg_t a = zext32(RS1), b = zext32(RS2), x = 0; |
|||
for (int i = 0; i < 32; i++) |
|||
if ((b >> i) & 1) |
|||
x ^= a >> (31-i); |
|||
WRITE_RD(sext32(x)); |
|||
@ -0,0 +1,6 @@ |
|||
require_extension('B'); |
|||
reg_t a = zext32(RS1), b = zext32(RS2), x = 0; |
|||
for (int i = 0; i < 32; i++) |
|||
if ((b >> i) & 1) |
|||
x ^= a << i; |
|||
WRITE_RD(sext32(x)); |
|||
@ -0,0 +1,5 @@ |
|||
require_extension('B'); |
|||
reg_t x = xlen; |
|||
for (int i = 0; i < xlen; i++) |
|||
if (1 & (RS1 >> (xlen-i-1))) { x = i; break; } |
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,6 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
reg_t x = 32; |
|||
for (int i = 0; i < 32; i++) |
|||
if (1 & (RS1 >> (31-i))) { x = i; break; } |
|||
WRITE_RD(sext32(x)); |
|||
@ -0,0 +1,2 @@ |
|||
require_extension('B'); |
|||
WRITE_RD((RS1 & RS2) | (RS3 & ~RS2)); |
|||
@ -0,0 +1,2 @@ |
|||
require_extension('B'); |
|||
WRITE_RD(RS2 ? RS1 : RS3); |
|||
@ -0,0 +1,5 @@ |
|||
require_extension('B'); |
|||
reg_t x = zext_xlen(RS1); |
|||
for (int i = 0; i < 8; i++) |
|||
x = (x >> 1) ^ (0xEDB88320 & ~((x&1)-1)); |
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,5 @@ |
|||
require_extension('B'); |
|||
reg_t x = zext_xlen(RS1); |
|||
for (int i = 0; i < 64; i++) |
|||
x = (x >> 1) ^ (0xEDB88320 & ~((x&1)-1)); |
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,5 @@ |
|||
require_extension('B'); |
|||
reg_t x = zext_xlen(RS1); |
|||
for (int i = 0; i < 16; i++) |
|||
x = (x >> 1) ^ (0xEDB88320 & ~((x&1)-1)); |
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,5 @@ |
|||
require_extension('B'); |
|||
reg_t x = zext_xlen(RS1); |
|||
for (int i = 0; i < 32; i++) |
|||
x = (x >> 1) ^ (0xEDB88320 & ~((x&1)-1)); |
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,5 @@ |
|||
require_extension('B'); |
|||
reg_t x = zext_xlen(RS1); |
|||
for (int i = 0; i < 8; i++) |
|||
x = (x >> 1) ^ (0x82F63B78 & ~((x&1)-1)); |
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,5 @@ |
|||
require_extension('B'); |
|||
reg_t x = zext_xlen(RS1); |
|||
for (int i = 0; i < 64; i++) |
|||
x = (x >> 1) ^ (0x82F63B78 & ~((x&1)-1)); |
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,5 @@ |
|||
require_extension('B'); |
|||
reg_t x = zext_xlen(RS1); |
|||
for (int i = 0; i < 16; i++) |
|||
x = (x >> 1) ^ (0x82F63B78 & ~((x&1)-1)); |
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,5 @@ |
|||
require_extension('B'); |
|||
reg_t x = zext_xlen(RS1); |
|||
for (int i = 0; i < 32; i++) |
|||
x = (x >> 1) ^ (0x82F63B78 & ~((x&1)-1)); |
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,5 @@ |
|||
require_extension('B'); |
|||
reg_t x = xlen; |
|||
for (int i = 0; i < xlen; i++) |
|||
if (1 & (RS1 >> i)) { x = i; break; } |
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,6 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
reg_t x = 32; |
|||
for (int i = 0; i < 32; i++) |
|||
if (1 & (RS1 >> i)) { x = i; break; } |
|||
WRITE_RD(sext32(x)); |
|||
@ -0,0 +1,9 @@ |
|||
require_extension('B'); |
|||
int shamt = RS2 & (2*xlen-1); |
|||
reg_t a = RS1, b = RS3; |
|||
if (shamt >= xlen) { |
|||
a = RS3, b = RS1; |
|||
shamt -= xlen; |
|||
} |
|||
int rshamt = -shamt & (xlen-1); |
|||
WRITE_RD(sext_xlen(shamt ? (a << shamt) | (zext_xlen(b) >> rshamt) : a)); |
|||
@ -0,0 +1,10 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
int shamt = RS2 & 63; |
|||
reg_t a = RS1, b = RS3; |
|||
if (shamt >= 32) { |
|||
a = RS3, b = RS1; |
|||
shamt -= 32; |
|||
} |
|||
int rshamt = -shamt & 31; |
|||
WRITE_RD(sext32(shamt ? (a << shamt) | (zext32(b) >> rshamt) : a)); |
|||
@ -0,0 +1,9 @@ |
|||
require_extension('B'); |
|||
int shamt = RS2 & (2*xlen-1); |
|||
reg_t a = RS1, b = RS3; |
|||
if (shamt >= xlen) { |
|||
a = RS3, b = RS1; |
|||
shamt -= xlen; |
|||
} |
|||
int rshamt = -shamt & (xlen-1); |
|||
WRITE_RD(sext_xlen(shamt ? (b << rshamt) | (zext_xlen(a) >> shamt) : a)); |
|||
@ -0,0 +1,9 @@ |
|||
require_extension('B'); |
|||
int shamt = SHAMT & (2*xlen-1); |
|||
reg_t a = RS1, b = RS3; |
|||
if (shamt >= xlen) { |
|||
a = RS3, b = RS1; |
|||
shamt -= xlen; |
|||
} |
|||
int rshamt = -shamt & (xlen-1); |
|||
WRITE_RD(sext_xlen(shamt ? (b << rshamt) | (zext_xlen(a) >> shamt) : a)); |
|||
@ -0,0 +1,10 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
int shamt = SHAMT & 63; |
|||
reg_t a = RS1, b = RS3; |
|||
if (shamt >= 32) { |
|||
a = RS3, b = RS1; |
|||
shamt -= 32; |
|||
} |
|||
int rshamt = -shamt & 31; |
|||
WRITE_RD(sext32(shamt ? (b << rshamt) | (zext32(a) >> shamt) : a)); |
|||
@ -0,0 +1,10 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
int shamt = RS2 & 63; |
|||
reg_t a = RS1, b = RS3; |
|||
if (shamt >= 32) { |
|||
a = RS3, b = RS1; |
|||
shamt -= 32; |
|||
} |
|||
int rshamt = -shamt & 31; |
|||
WRITE_RD(sext32(shamt ? (b << rshamt) | (zext32(a) >> shamt) : a)); |
|||
@ -0,0 +1,10 @@ |
|||
require_extension('B'); |
|||
reg_t x = RS1; |
|||
int shamt = RS2 & (xlen-1); |
|||
if (shamt & 1) x |= ((x & 0x5555555555555555LL) << 1) | ((x & 0xAAAAAAAAAAAAAAAALL) >> 1); |
|||
if (shamt & 2) x |= ((x & 0x3333333333333333LL) << 2) | ((x & 0xCCCCCCCCCCCCCCCCLL) >> 2); |
|||
if (shamt & 4) x |= ((x & 0x0F0F0F0F0F0F0F0FLL) << 4) | ((x & 0xF0F0F0F0F0F0F0F0LL) >> 4); |
|||
if (shamt & 8) x |= ((x & 0x00FF00FF00FF00FFLL) << 8) | ((x & 0xFF00FF00FF00FF00LL) >> 8); |
|||
if (shamt & 16) x |= ((x & 0x0000FFFF0000FFFFLL) << 16) | ((x & 0xFFFF0000FFFF0000LL) >> 16); |
|||
if (shamt & 32) x |= ((x & 0x00000000FFFFFFFFLL) << 32) | ((x & 0xFFFFFFFF00000000LL) >> 32); |
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,11 @@ |
|||
require_extension('B'); |
|||
require(SHAMT < xlen); |
|||
reg_t x = RS1; |
|||
int shamt = SHAMT; |
|||
if (shamt & 1) x |= ((x & 0x5555555555555555LL) << 1) | ((x & 0xAAAAAAAAAAAAAAAALL) >> 1); |
|||
if (shamt & 2) x |= ((x & 0x3333333333333333LL) << 2) | ((x & 0xCCCCCCCCCCCCCCCCLL) >> 2); |
|||
if (shamt & 4) x |= ((x & 0x0F0F0F0F0F0F0F0FLL) << 4) | ((x & 0xF0F0F0F0F0F0F0F0LL) >> 4); |
|||
if (shamt & 8) x |= ((x & 0x00FF00FF00FF00FFLL) << 8) | ((x & 0xFF00FF00FF00FF00LL) >> 8); |
|||
if (shamt & 16) x |= ((x & 0x0000FFFF0000FFFFLL) << 16) | ((x & 0xFFFF0000FFFF0000LL) >> 16); |
|||
if (shamt & 32) x |= ((x & 0x00000000FFFFFFFFLL) << 32) | ((x & 0xFFFFFFFF00000000LL) >> 32); |
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,11 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
require(SHAMT < 32); |
|||
reg_t x = RS1; |
|||
int shamt = SHAMT; |
|||
if (shamt & 1) x |= ((x & 0x5555555555555555LL) << 1) | ((x & 0xAAAAAAAAAAAAAAAALL) >> 1); |
|||
if (shamt & 2) x |= ((x & 0x3333333333333333LL) << 2) | ((x & 0xCCCCCCCCCCCCCCCCLL) >> 2); |
|||
if (shamt & 4) x |= ((x & 0x0F0F0F0F0F0F0F0FLL) << 4) | ((x & 0xF0F0F0F0F0F0F0F0LL) >> 4); |
|||
if (shamt & 8) x |= ((x & 0x00FF00FF00FF00FFLL) << 8) | ((x & 0xFF00FF00FF00FF00LL) >> 8); |
|||
if (shamt & 16) x |= ((x & 0x0000FFFF0000FFFFLL) << 16) | ((x & 0xFFFF0000FFFF0000LL) >> 16); |
|||
WRITE_RD(sext32(x)); |
|||
@ -0,0 +1,10 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
reg_t x = RS1; |
|||
int shamt = RS2 & 31; |
|||
if (shamt & 1) x |= ((x & 0x5555555555555555LL) << 1) | ((x & 0xAAAAAAAAAAAAAAAALL) >> 1); |
|||
if (shamt & 2) x |= ((x & 0x3333333333333333LL) << 2) | ((x & 0xCCCCCCCCCCCCCCCCLL) >> 2); |
|||
if (shamt & 4) x |= ((x & 0x0F0F0F0F0F0F0F0FLL) << 4) | ((x & 0xF0F0F0F0F0F0F0F0LL) >> 4); |
|||
if (shamt & 8) x |= ((x & 0x00FF00FF00FF00FFLL) << 8) | ((x & 0xFF00FF00FF00FF00LL) >> 8); |
|||
if (shamt & 16) x |= ((x & 0x0000FFFF0000FFFFLL) << 16) | ((x & 0xFFFF0000FFFF0000LL) >> 16); |
|||
WRITE_RD(sext32(x)); |
|||
@ -0,0 +1,10 @@ |
|||
require_extension('B'); |
|||
reg_t x = RS1; |
|||
int shamt = RS2 & (xlen-1); |
|||
if (shamt & 1) x = ((x & 0x5555555555555555LL) << 1) | ((x & 0xAAAAAAAAAAAAAAAALL) >> 1); |
|||
if (shamt & 2) x = ((x & 0x3333333333333333LL) << 2) | ((x & 0xCCCCCCCCCCCCCCCCLL) >> 2); |
|||
if (shamt & 4) x = ((x & 0x0F0F0F0F0F0F0F0FLL) << 4) | ((x & 0xF0F0F0F0F0F0F0F0LL) >> 4); |
|||
if (shamt & 8) x = ((x & 0x00FF00FF00FF00FFLL) << 8) | ((x & 0xFF00FF00FF00FF00LL) >> 8); |
|||
if (shamt & 16) x = ((x & 0x0000FFFF0000FFFFLL) << 16) | ((x & 0xFFFF0000FFFF0000LL) >> 16); |
|||
if (shamt & 32) x = ((x & 0x00000000FFFFFFFFLL) << 32) | ((x & 0xFFFFFFFF00000000LL) >> 32); |
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,11 @@ |
|||
require_extension('B'); |
|||
require(SHAMT < xlen); |
|||
reg_t x = RS1; |
|||
int shamt = SHAMT; |
|||
if (shamt & 1) x = ((x & 0x5555555555555555LL) << 1) | ((x & 0xAAAAAAAAAAAAAAAALL) >> 1); |
|||
if (shamt & 2) x = ((x & 0x3333333333333333LL) << 2) | ((x & 0xCCCCCCCCCCCCCCCCLL) >> 2); |
|||
if (shamt & 4) x = ((x & 0x0F0F0F0F0F0F0F0FLL) << 4) | ((x & 0xF0F0F0F0F0F0F0F0LL) >> 4); |
|||
if (shamt & 8) x = ((x & 0x00FF00FF00FF00FFLL) << 8) | ((x & 0xFF00FF00FF00FF00LL) >> 8); |
|||
if (shamt & 16) x = ((x & 0x0000FFFF0000FFFFLL) << 16) | ((x & 0xFFFF0000FFFF0000LL) >> 16); |
|||
if (shamt & 32) x = ((x & 0x00000000FFFFFFFFLL) << 32) | ((x & 0xFFFFFFFF00000000LL) >> 32); |
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,11 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
require(SHAMT < 32); |
|||
reg_t x = RS1; |
|||
int shamt = SHAMT; |
|||
if (shamt & 1) x = ((x & 0x5555555555555555LL) << 1) | ((x & 0xAAAAAAAAAAAAAAAALL) >> 1); |
|||
if (shamt & 2) x = ((x & 0x3333333333333333LL) << 2) | ((x & 0xCCCCCCCCCCCCCCCCLL) >> 2); |
|||
if (shamt & 4) x = ((x & 0x0F0F0F0F0F0F0F0FLL) << 4) | ((x & 0xF0F0F0F0F0F0F0F0LL) >> 4); |
|||
if (shamt & 8) x = ((x & 0x00FF00FF00FF00FFLL) << 8) | ((x & 0xFF00FF00FF00FF00LL) >> 8); |
|||
if (shamt & 16) x = ((x & 0x0000FFFF0000FFFFLL) << 16) | ((x & 0xFFFF0000FFFF0000LL) >> 16); |
|||
WRITE_RD(sext32(x)); |
|||
@ -0,0 +1,10 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
reg_t x = RS1; |
|||
int shamt = RS2 & 31; |
|||
if (shamt & 1) x = ((x & 0x5555555555555555LL) << 1) | ((x & 0xAAAAAAAAAAAAAAAALL) >> 1); |
|||
if (shamt & 2) x = ((x & 0x3333333333333333LL) << 2) | ((x & 0xCCCCCCCCCCCCCCCCLL) >> 2); |
|||
if (shamt & 4) x = ((x & 0x0F0F0F0F0F0F0F0FLL) << 4) | ((x & 0xF0F0F0F0F0F0F0F0LL) >> 4); |
|||
if (shamt & 8) x = ((x & 0x00FF00FF00FF00FFLL) << 8) | ((x & 0xFF00FF00FF00FF00LL) >> 8); |
|||
if (shamt & 16) x = ((x & 0x0000FFFF0000FFFFLL) << 16) | ((x & 0xFFFF0000FFFF0000LL) >> 16); |
|||
WRITE_RD(sext32(x)); |
|||
@ -0,0 +1,2 @@ |
|||
require_extension('B'); |
|||
WRITE_RD(sext_xlen(sreg_t(RS1) > sreg_t(RS2) ? RS1 : RS2)); |
|||
@ -0,0 +1,2 @@ |
|||
require_extension('B'); |
|||
WRITE_RD(sext_xlen(RS1 > RS2 ? RS1 : RS2)); |
|||
@ -0,0 +1,2 @@ |
|||
require_extension('B'); |
|||
WRITE_RD(sext_xlen(sreg_t(RS1) < sreg_t(RS2) ? RS1 : RS2)); |
|||
@ -0,0 +1,2 @@ |
|||
require_extension('B'); |
|||
WRITE_RD(sext_xlen(RS1 < RS2 ? RS1 : RS2)); |
|||
@ -0,0 +1,2 @@ |
|||
require_extension('B'); |
|||
WRITE_RD(RS1 | ~RS2); |
|||
@ -0,0 +1,4 @@ |
|||
require_extension('B'); |
|||
reg_t lo = zext_xlen(RS1 << (xlen/2)) >> (xlen/2); |
|||
reg_t hi = zext_xlen(RS2 << (xlen/2)); |
|||
WRITE_RD(sext_xlen(lo | hi)); |
|||
@ -0,0 +1,4 @@ |
|||
require_extension('B'); |
|||
reg_t lo = zext_xlen(RS1 << (xlen-8)) >> (xlen-8); |
|||
reg_t hi = zext_xlen(RS2 << (xlen-8)) >> (xlen-16); |
|||
WRITE_RD(sext_xlen(lo | hi)); |
|||
@ -0,0 +1,4 @@ |
|||
require_extension('B'); |
|||
reg_t lo = zext_xlen(RS1) >> (xlen/2); |
|||
reg_t hi = zext_xlen(RS2) >> (xlen/2) << (xlen/2); |
|||
WRITE_RD(sext_xlen(lo | hi)); |
|||
@ -0,0 +1,4 @@ |
|||
require_extension('B'); |
|||
reg_t lo = zext32(RS1) >> 16; |
|||
reg_t hi = zext32(RS2) >> 16 << 16; |
|||
WRITE_RD(sext32(lo | hi)); |
|||
@ -0,0 +1,4 @@ |
|||
require_extension('B'); |
|||
reg_t lo = zext32(RS1 << 16) >> 16; |
|||
reg_t hi = zext32(RS2 << 16); |
|||
WRITE_RD(sext32(lo | hi)); |
|||
@ -0,0 +1,5 @@ |
|||
require_extension('B'); |
|||
reg_t x = 0; |
|||
for (int i = 0; i < xlen; i++) |
|||
if (1 & (RS1 >> i)) x++; |
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,6 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
reg_t x = 0; |
|||
for (int i = 0; i < 32; i++) |
|||
if (1 & (RS1 >> i)) x++; |
|||
WRITE_RD(sext32(x)); |
|||
@ -0,0 +1,4 @@ |
|||
require_extension('B'); |
|||
int shamt = RS2 & (xlen-1); |
|||
int rshamt = -shamt & (xlen-1); |
|||
WRITE_RD(sext_xlen((RS1 << shamt) | (zext_xlen(RS1) >> rshamt))); |
|||
@ -0,0 +1,5 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
int shamt = RS2 & 31; |
|||
int rshamt = -shamt & 31; |
|||
WRITE_RD(sext32((RS1 << shamt) | (zext32(RS1) >> rshamt))); |
|||
@ -0,0 +1,4 @@ |
|||
require_extension('B'); |
|||
int shamt = RS2 & (xlen-1); |
|||
int rshamt = -shamt & (xlen-1); |
|||
WRITE_RD(sext_xlen((RS1 << rshamt) | (zext_xlen(RS1) >> shamt))); |
|||
@ -0,0 +1,5 @@ |
|||
require_extension('B'); |
|||
require(SHAMT < xlen); |
|||
int shamt = SHAMT & (xlen-1); |
|||
int rshamt = -shamt & (xlen-1); |
|||
WRITE_RD(sext_xlen((RS1 << rshamt) | (zext_xlen(RS1) >> shamt))); |
|||
@ -0,0 +1,5 @@ |
|||
require_extension('B'); |
|||
require(SHAMT < 32); |
|||
int shamt = SHAMT & 31; |
|||
int rshamt = -shamt & 31; |
|||
WRITE_RD(sext32((RS1 << rshamt) | (zext32(RS1) >> shamt))); |
|||
@ -0,0 +1,5 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
int shamt = RS2 & 31; |
|||
int rshamt = -shamt & 31; |
|||
WRITE_RD(sext32((RS1 << rshamt) | (zext32(RS1) >> shamt))); |
|||
@ -0,0 +1,3 @@ |
|||
require_extension('B'); |
|||
int shamt = RS2 & (xlen-1); |
|||
WRITE_RD(sext_xlen(RS1 & ~(1LL << shamt))); |
|||
@ -0,0 +1,3 @@ |
|||
require_extension('B'); |
|||
int shamt = SHAMT & (xlen-1); |
|||
WRITE_RD(sext_xlen(RS1 & ~(1LL << shamt))); |
|||
@ -0,0 +1,3 @@ |
|||
require_extension('B'); |
|||
int shamt = SHAMT & 31; |
|||
WRITE_RD(sext32(RS1 & ~(1LL << shamt))); |
|||
@ -0,0 +1,3 @@ |
|||
require_extension('B'); |
|||
int shamt = RS2 & 31; |
|||
WRITE_RD(sext32(RS1 & ~(1LL << shamt))); |
|||
@ -0,0 +1,3 @@ |
|||
require_extension('B'); |
|||
int shamt = RS2 & (xlen-1); |
|||
WRITE_RD(sext_xlen(1 & (RS1 >> shamt))); |
|||
@ -0,0 +1,3 @@ |
|||
require_extension('B'); |
|||
int shamt = SHAMT & (xlen-1); |
|||
WRITE_RD(sext_xlen(1 & (RS1 >> shamt))); |
|||
@ -0,0 +1,3 @@ |
|||
require_extension('B'); |
|||
int shamt = RS2 & 31; |
|||
WRITE_RD(sext32(1 & (RS1 >> shamt))); |
|||
@ -0,0 +1,3 @@ |
|||
require_extension('B'); |
|||
int shamt = RS2 & (xlen-1); |
|||
WRITE_RD(sext_xlen(RS1 ^ (1LL << shamt))); |
|||
@ -0,0 +1,3 @@ |
|||
require_extension('B'); |
|||
int shamt = SHAMT & (xlen-1); |
|||
WRITE_RD(sext_xlen(RS1 ^ (1LL << shamt))); |
|||
@ -0,0 +1,3 @@ |
|||
require_extension('B'); |
|||
int shamt = SHAMT & 31; |
|||
WRITE_RD(sext32(RS1 ^ (1LL << shamt))); |
|||
@ -0,0 +1,3 @@ |
|||
require_extension('B'); |
|||
int shamt = RS2 & 31; |
|||
WRITE_RD(sext32(RS1 ^ (1LL << shamt))); |
|||
@ -0,0 +1,3 @@ |
|||
require_extension('B'); |
|||
int shamt = RS2 & (xlen-1); |
|||
WRITE_RD(sext_xlen(RS1 | (1LL << shamt))); |
|||
@ -0,0 +1,3 @@ |
|||
require_extension('B'); |
|||
int shamt = SHAMT & (xlen-1); |
|||
WRITE_RD(sext_xlen(RS1 | (1LL << shamt))); |
|||
@ -0,0 +1,3 @@ |
|||
require_extension('B'); |
|||
int shamt = SHAMT & 31; |
|||
WRITE_RD(sext32(RS1 | (1LL << shamt))); |
|||
@ -0,0 +1,3 @@ |
|||
require_extension('B'); |
|||
int shamt = RS2 & 31; |
|||
WRITE_RD(sext32(RS1 | (1LL << shamt))); |
|||
@ -0,0 +1,2 @@ |
|||
require_extension('B'); |
|||
WRITE_RD((sreg_t)(int8_t)(RS1)); |
|||
@ -0,0 +1,2 @@ |
|||
require_extension('B'); |
|||
WRITE_RD((sreg_t)(int16_t)(RS1)); |
|||
@ -0,0 +1,2 @@ |
|||
require_extension('B'); |
|||
WRITE_RD(sext_xlen((RS1 << 1) + RS2)); |
|||
@ -0,0 +1,3 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
WRITE_RD(sext_xlen((zext32(RS1) << 1) + RS2)); |
|||
@ -0,0 +1,2 @@ |
|||
require_extension('B'); |
|||
WRITE_RD(sext_xlen((RS1 << 2) + RS2)); |
|||
@ -0,0 +1,3 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
WRITE_RD(sext_xlen((zext32(RS1) << 2) + RS2)); |
|||
@ -0,0 +1,2 @@ |
|||
require_extension('B'); |
|||
WRITE_RD(sext_xlen((RS1 << 3) + RS2)); |
|||
@ -0,0 +1,3 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
WRITE_RD(sext_xlen((zext32(RS1) << 3) + RS2)); |
|||
@ -0,0 +1,9 @@ |
|||
require_extension('B'); |
|||
reg_t x = RS1; |
|||
int shamt = RS2 & ((xlen-1) >> 1); |
|||
if (shamt & 16) x = (x & 0xFFFF00000000FFFFLL) | ((x & 0x0000FFFF00000000LL) >> 16) | ((x & 0x00000000FFFF0000LL) << 16); |
|||
if (shamt & 8) x = (x & 0xFF0000FFFF0000FFLL) | ((x & 0x00FF000000FF0000LL) >> 8) | ((x & 0x0000FF000000FF00LL) << 8); |
|||
if (shamt & 4) x = (x & 0xF00FF00FF00FF00FLL) | ((x & 0x0F000F000F000F00LL) >> 4) | ((x & 0x00F000F000F000F0LL) << 4); |
|||
if (shamt & 2) x = (x & 0xC3C3C3C3C3C3C3C3LL) | ((x & 0x3030303030303030LL) >> 2) | ((x & 0x0C0C0C0C0C0C0C0CLL) << 2); |
|||
if (shamt & 1) x = (x & 0x9999999999999999LL) | ((x & 0x4444444444444444LL) >> 1) | ((x & 0x2222222222222222LL) << 1); |
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,10 @@ |
|||
require_extension('B'); |
|||
require(SHAMT < (xlen/2)); |
|||
reg_t x = RS1; |
|||
int shamt = SHAMT & ((xlen-1) >> 1); |
|||
if (shamt & 16) x = (x & 0xFFFF00000000FFFFLL) | ((x & 0x0000FFFF00000000LL) >> 16) | ((x & 0x00000000FFFF0000LL) << 16); |
|||
if (shamt & 8) x = (x & 0xFF0000FFFF0000FFLL) | ((x & 0x00FF000000FF0000LL) >> 8) | ((x & 0x0000FF000000FF00LL) << 8); |
|||
if (shamt & 4) x = (x & 0xF00FF00FF00FF00FLL) | ((x & 0x0F000F000F000F00LL) >> 4) | ((x & 0x00F000F000F000F0LL) << 4); |
|||
if (shamt & 2) x = (x & 0xC3C3C3C3C3C3C3C3LL) | ((x & 0x3030303030303030LL) >> 2) | ((x & 0x0C0C0C0C0C0C0C0CLL) << 2); |
|||
if (shamt & 1) x = (x & 0x9999999999999999LL) | ((x & 0x4444444444444444LL) >> 1) | ((x & 0x2222222222222222LL) << 1); |
|||
WRITE_RD(sext_xlen(x)); |
|||
@ -0,0 +1,9 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
reg_t x = RS1; |
|||
int shamt = RS2 & 15; |
|||
if (shamt & 8) x = (x & 0xFF0000FFFF0000FFLL) | ((x & 0x00FF000000FF0000LL) >> 8) | ((x & 0x0000FF000000FF00LL) << 8); |
|||
if (shamt & 4) x = (x & 0xF00FF00FF00FF00FLL) | ((x & 0x0F000F000F000F00LL) >> 4) | ((x & 0x00F000F000F000F0LL) << 4); |
|||
if (shamt & 2) x = (x & 0xC3C3C3C3C3C3C3C3LL) | ((x & 0x3030303030303030LL) >> 2) | ((x & 0x0C0C0C0C0C0C0C0CLL) << 2); |
|||
if (shamt & 1) x = (x & 0x9999999999999999LL) | ((x & 0x4444444444444444LL) >> 1) | ((x & 0x2222222222222222LL) << 1); |
|||
WRITE_RD(sext32(x)); |
|||
@ -0,0 +1,3 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
WRITE_RD(sext_xlen(zext32(RS1) << SHAMT)); |
|||
@ -0,0 +1,2 @@ |
|||
require_extension('B'); |
|||
WRITE_RD(sext_xlen(~((~RS1) << (RS2 & (xlen-1))))); |
|||
@ -0,0 +1,3 @@ |
|||
require(SHAMT < xlen); |
|||
require_extension('B'); |
|||
WRITE_RD(sext_xlen(~((~RS1) << SHAMT))); |
|||
@ -0,0 +1,3 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
WRITE_RD(sext32(~((~RS1) << SHAMT))); |
|||
@ -0,0 +1,3 @@ |
|||
require_rv64; |
|||
require_extension('B'); |
|||
WRITE_RD(sext32(~((~RS1) << (RS2 & 0x1F)))); |
|||
@ -0,0 +1,2 @@ |
|||
require_extension('B'); |
|||
WRITE_RD(sext_xlen(~((zext_xlen(~RS1)) >> (RS2 & (xlen-1))))); |
|||
@ -0,0 +1,3 @@ |
|||
require(SHAMT < xlen); |
|||
require_extension('B'); |
|||
WRITE_RD(sext_xlen(~((zext_xlen(~RS1)) >> SHAMT))); |
|||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue