Browse Source
Add the following categories * packed zip and unzip instructions * packed basic arithmetic and data-move * packed multiply instructions (_w suffix only) * packed accumulate instructions (_w suffix * packed multiply-add instructions (_w/_h suffix * packed sati/usati/srari for rv64 Signed-off-by: Chih-Min Chao <chihmin.chao@sifive.com>pull/2246/head
committed by
Chih-Min Chao
104 changed files with 675 additions and 0 deletions
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
require_extension('P'); |
||||
|
reg_t s1_w = sext32(RS1); |
||||
|
reg_t result = (int32_t(s1_w) < 0) ? -s1_w : s1_w; |
||||
|
WRITE_RD(sext_xlen(result)); |
||||
@ -0,0 +1,11 @@ |
|||||
|
require_rv64; |
||||
|
require_extension('P'); |
||||
|
reg_t x = 32 - 1; |
||||
|
reg_t msb = (RS1 >> (32 - 1)) & 1; |
||||
|
for (int i = 0; i < 32 - 1; i++) { |
||||
|
if (msb != ((RS1 >> (32 - i - 2)) & 1)) { |
||||
|
x = i; |
||||
|
break; |
||||
|
} |
||||
|
} |
||||
|
WRITE_RD(sext_xlen(x)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(RD + sext32(RS1) * sext32(RS2)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(RD + sext32(RS1) * sext32(RS2 >> 32)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(RD + sext32(RS1 >> 32) * sext32(RS2 >> 32)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(RD + sext32(RS1) * zext32(RS2)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(RD + sext32(RS1 >> 32) * zext32(RS2 >> 32)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(RD + zext32(RS1) * zext32(RS2)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(RD + zext32(RS1) * zext32(RS2 >> 32)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(RD + zext32(RS1 >> 32) * zext32(RS2 >> 32)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(RD + (((sreg_t)P_FIELD(RS1, 0, 32) * P_FIELD(RS2, 0, 32)) >> 31)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(RD + (((sreg_t)P_FIELD(RS1, 0, 32) * P_FIELD(RS2, 1, 32)) >> 31)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(RD + (((sreg_t)P_FIELD(RS1, 1, 32) * P_FIELD(RS2, 1, 32)) >> 31)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(RD + (((sreg_t)P_FIELD(RS1, 0, 32) * P_FIELD(RS2, 0, 32) + 0x40000000) >> 31)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(RD + (((sreg_t)P_FIELD(RS1, 0, 32) * P_FIELD(RS2, 1, 32) + 0x40000000) >> 31)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(RD + (((sreg_t)P_FIELD(RS1, 1, 32) * P_FIELD(RS2, 1, 32) + 0x40000000) >> 31)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(sext32(RS1) * sext32(RS2)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(sext32(RS1) * sext32(RS2 >> 32)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(sext32(RS1 >> 32) * sext32(RS2 >> 32)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(sext32(RS1) * zext32(RS2)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(sext32(RS1 >> 32) * zext32(RS2 >> 32)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(zext32(RS1) * zext32(RS2)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(zext32(RS1) * zext32(RS2 >> 32)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(zext32(RS1 >> 32) * zext32(RS2 >> 32)); |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_REDUCTION_LOOP(64, 32, false, false, { |
||||
|
p_res += (sreg_t)p_rs1 * p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_REDUCTION_CROSS_LOOP(64, 32, false, false, { |
||||
|
p_res += (sreg_t)p_rs1 * p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_REDUCTION_LOOP(64, 32, true, false, { |
||||
|
p_res += (sreg_t)p_rs1 * p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_REDUCTION_CROSS_LOOP(64, 32, true, false, { |
||||
|
p_res += (sreg_t)p_rs1 * p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_REDUCTION_SULOOP(64, 32, true, false, { |
||||
|
p_res += (sreg_t)p_rs1 * p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_REDUCTION_ULOOP(64, 32, true, false, { |
||||
|
p_res += (reg_t)p_rs1 * p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_REDUCTION_SULOOP(64, 32, false, false, { |
||||
|
p_res += (sreg_t)p_rs1 * p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_REDUCTION_ULOOP(64, 32, false, false, { |
||||
|
p_res += (reg_t)p_rs1 * p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,8 @@ |
|||||
|
require_rv64; |
||||
|
P_REDUCTION_LOOP(64, 32, false, false, { |
||||
|
if (j & 1) |
||||
|
p_res -= (sreg_t)p_rs1 * p_rs2; |
||||
|
else |
||||
|
p_res += (sreg_t)p_rs1 * p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,8 @@ |
|||||
|
require_rv64; |
||||
|
P_REDUCTION_CROSS_LOOP(64, 32, false, false, { |
||||
|
if (j & 1) |
||||
|
p_res -= (sreg_t)p_rs1 * p_rs2; |
||||
|
else |
||||
|
p_res += (sreg_t)p_rs1 * p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,8 @@ |
|||||
|
require_rv64; |
||||
|
P_REDUCTION_LOOP(64, 32, true, false, { |
||||
|
if (j & 1) |
||||
|
p_res -= (sreg_t)p_rs1 * p_rs2; |
||||
|
else |
||||
|
p_res += (sreg_t)p_rs1 * p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,8 @@ |
|||||
|
require_rv64; |
||||
|
P_REDUCTION_CROSS_LOOP(64, 32, true, false, { |
||||
|
if (j & 1) |
||||
|
p_res -= (sreg_t)p_rs1 * p_rs2; |
||||
|
else |
||||
|
p_res += (sreg_t)p_rs1 * p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_REDUCTION_LOOP(64, 16, false, false, { |
||||
|
p_res += (sreg_t)p_rs1 * p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_REDUCTION_LOOP(64, 16, true, false, { |
||||
|
p_res += (sreg_t)p_rs1 * p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_REDUCTION_SULOOP(64, 16, true, false, { |
||||
|
p_res += (sreg_t)p_rs1 * p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_REDUCTION_ULOOP(64, 16, true, false, { |
||||
|
p_res += (reg_t)p_rs1 * p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_REDUCTION_SULOOP(64, 16, false, false, { |
||||
|
p_res += (sreg_t)p_rs1 * p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_REDUCTION_ULOOP(64, 16, false, false, { |
||||
|
p_res += (reg_t)p_rs1 * p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_EE_LOOP(32, 16, 16, { |
||||
|
p_rd += sext32(p_rs1) * sext32(p_rs2); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_EO_LOOP(32, 16, 16, { |
||||
|
p_rd += sext32(p_rs1) * sext32(p_rs2); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_OO_LOOP(32, 16, 16, { |
||||
|
p_rd += sext32(p_rs1) * sext32(p_rs2); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_EE_SULOOP(32, 16, 16, { |
||||
|
p_rd += sext32(p_rs1) * zext32(p_rs2); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_OO_SULOOP(32, 16, 16, { |
||||
|
p_rd += sext32(p_rs1) * zext32(p_rs2); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_EE_ULOOP(32, 16, 16, { |
||||
|
p_rd += zext32(p_rs1) * zext32(p_rs2); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_EO_ULOOP(32, 16, 16, { |
||||
|
p_rd += zext32(p_rs1) * zext32(p_rs2); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_OO_ULOOP(32, 16, 16, { |
||||
|
p_rd += zext32(p_rs1) * zext32(p_rs2); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_LOOP(32,32,32, { |
||||
|
sreg_t mres = sext(p_rs1,64) * sext(p_rs2,64); |
||||
|
p_rd += mres>>32; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_E_LOOP(32,32,16, { |
||||
|
sreg_t mres = sext(p_rs1,64) * sext(p_rs2,64); |
||||
|
p_rd += mres>>32; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_O_LOOP(32,32,16, { |
||||
|
sreg_t mres = sext(p_rs1,64) * sext(p_rs2,64); |
||||
|
p_rd += mres>>32; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_SULOOP(32,32,32, { |
||||
|
sreg_t mres = sext(p_rs1,64) * zext(p_rs2,64); |
||||
|
p_rd += mres>>32; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_E_SULOOP(32,32,16, { |
||||
|
sreg_t mres = sext(p_rs1,64) * zext(p_rs2,64); |
||||
|
p_rd += mres>>32; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_O_SULOOP(32,32,16, { |
||||
|
sreg_t mres = sext(p_rs1,64) * zext(p_rs2,64); |
||||
|
p_rd += mres>>32; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_ULOOP(32,32,32, { |
||||
|
reg_t mres = zext(p_rs1,64) * zext(p_rs2,64); |
||||
|
p_rd += mres>>32; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,7 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_LOOP(32,32,32, { |
||||
|
sreg_t mres = sext(p_rs1,64) * sext(p_rs2,64); |
||||
|
int32_t round = ((mres >> 31) + 1) >> 1; |
||||
|
p_rd += round; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,7 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_SULOOP(32,32,32, { |
||||
|
sreg_t mres = sext(p_rs1,64) * zext(p_rs2,64); |
||||
|
int32_t round = ((mres >> 31) + 1) >> 1; |
||||
|
p_rd += round; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,7 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_ULOOP(32,32,32, { |
||||
|
reg_t mres = zext(p_rs1,64) * zext(p_rs2,64); |
||||
|
uint32_t round = ((mres >> 31) + 1) >> 1; |
||||
|
p_rd += round; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_REDUCTION_LOOP(64, 32, false, false, { |
||||
|
p_res += ((sreg_t)p_rs1 * p_rs2) >> 31; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_REDUCTION_LOOP(64, 32, true, false, { |
||||
|
p_res += ((sreg_t)p_rs1 * p_rs2) >> 31; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_EE_LOOP(32, 16, 16, { |
||||
|
p_rd += (p_rs1 * p_rs2) >> 15; |
||||
|
}) |
||||
|
|
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_EO_LOOP(32, 16, 16, { |
||||
|
p_rd += (p_rs1 * p_rs2) >> 15; |
||||
|
}) |
||||
|
|
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_OO_LOOP(32, 16, 16, { |
||||
|
p_rd += (p_rs1 * p_rs2) >> 15; |
||||
|
}) |
||||
|
|
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_REDUCTION_LOOP(64, 32, false, false, { |
||||
|
p_res += (((sreg_t)p_rs1 * p_rs2) + 0x40000000) >> 31; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_REDUCTION_LOOP(64, 32, true, false, { |
||||
|
p_res += (((sreg_t)p_rs1 * p_rs2) + 0x40000000) >> 31; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_EE_LOOP(32, 16, 16, { |
||||
|
p_rd += (p_rs1 * p_rs2 + 0x4000) >> 15; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_EO_LOOP(32, 16, 16, { |
||||
|
p_rd += (p_rs1 * p_rs2 + 0x4000) >> 15; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_OO_LOOP(32, 16, 16, { |
||||
|
p_rd += (p_rs1 * p_rs2 + 0x4000) >> 15; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_EE_LOOP(32, 16, 16, { |
||||
|
p_rd = sext32(p_rs1) * sext32(p_rs2); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_EO_LOOP(32, 16, 16, { |
||||
|
p_rd = sext32(p_rs1) * sext32(p_rs2); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_OO_LOOP(32, 16, 16, { |
||||
|
p_rd = sext32(p_rs1) * sext32(p_rs2); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_LOOP(32,32,32, { |
||||
|
int64_t mres = sext(p_rs1,64) * sext(p_rs2,64); |
||||
|
p_rd = mres >> 32; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_E_LOOP(32,32,16, { |
||||
|
sreg_t mres = sext(p_rs1,64) * sext(p_rs2,64); |
||||
|
p_rd = mres >> 32; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_O_LOOP(32,32,16, { |
||||
|
sreg_t mres = sext(p_rs1,64) * sext(p_rs2,64); |
||||
|
p_rd = mres >> 32; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_LOOP(32,32,32, { |
||||
|
sreg_t mres = sext(p_rs1,64) * sext(p_rs2,64); |
||||
|
p_rd = ((mres >> 31) + 1) >> 1; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_SULOOP(32,32,32, { |
||||
|
sreg_t mres = sext(p_rs1,64) * zext(p_rs2,64); |
||||
|
p_rd = ((mres >> 31) + 1) >> 1; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_ULOOP(32,32,32, { |
||||
|
reg_t mres = zext(p_rs1,64) * zext(p_rs2,64); |
||||
|
p_rd = ((mres >> 31) + 1) >> 1; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_SULOOP(32,32,32, { |
||||
|
int64_t mres = sext(p_rs1,64) * zext(p_rs2,64); |
||||
|
p_rd = mres >> 32; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_E_SULOOP(32,32,16, { |
||||
|
sreg_t mres = sext(p_rs1,64) * zext(p_rs2,64); |
||||
|
p_rd = mres >> 32; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_O_SULOOP(32,32,16, { |
||||
|
sreg_t mres = sext(p_rs1,64) * zext(p_rs2,64); |
||||
|
p_rd = mres >> 32; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_ULOOP(32,32,32, { |
||||
|
uint64_t mres = zext(p_rs1,64) * zext(p_rs2,64); |
||||
|
p_rd = mres >> 32; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,9 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_LOOP(32,32,32, { |
||||
|
if ((p_rs1 != INT32_MIN) | (p_rs2 != INT32_MIN)) { |
||||
|
p_rd = ((int64_t)p_rs1 * (int64_t)p_rs2) >> 31; |
||||
|
} else { |
||||
|
p_rd = INT32_MAX; |
||||
|
} |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,9 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_LOOP(32,32,32, { |
||||
|
if ((p_rs1 != INT32_MIN) | (p_rs2 != INT32_MIN)) { |
||||
|
p_rd = ((((int64_t)p_rs1 * (int64_t)p_rs2) >> 30) + 1) >> 1; |
||||
|
} else { |
||||
|
p_rd = INT32_MAX; |
||||
|
} |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_EE_SULOOP(32, 16, 16, { |
||||
|
p_rd = sext32(p_rs1) * zext32(p_rs2); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_OO_SULOOP(32, 16, 16, { |
||||
|
p_rd = sext32(p_rs1) * zext32(p_rs2); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_EE_ULOOP(32, 16, 16, { |
||||
|
p_rd = zext32(p_rs1) * zext32(p_rs2); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_EO_ULOOP(32, 16, 16, { |
||||
|
p_rd = zext32(p_rs1) * zext32(p_rs2); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_OO_ULOOP(32, 16, 16, { |
||||
|
p_rd = zext32(p_rs1) * zext32(p_rs2); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(P_SAT(insn.shamtd() + 1, (sreg_t)RS1)); |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(insn.shamtd() ? ((sext_xlen(RS1) >> insn.shamtd()) + ((sext_xlen(RS1) >> (insn.shamtd() - 1)) & 1)) : RS1); |
||||
@ -0,0 +1 @@ |
|||||
|
P_UNZIP(16, 1) |
||||
@ -0,0 +1 @@ |
|||||
|
P_UNZIP(16, 0) |
||||
@ -0,0 +1 @@ |
|||||
|
P_UNZIP(8, 1) |
||||
@ -0,0 +1 @@ |
|||||
|
P_UNZIP(8, 0) |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
WRITE_RD(P_USAT(insn.shamtd() + 1, (sreg_t)RS1)); |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_ZIP_LOOP(16, 16, 16, 1, { |
||||
|
p_rd = i % 2 ? p_rs2 : p_rs1; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_ZIP_LOOP(16, 16, 16, 0, { |
||||
|
p_rd = i % 2 ? p_rs2 : p_rs1; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_extension('P'); |
||||
|
P_RD_RS1_RS2_ZIP_LOOP(8, 8, 8, 1, { |
||||
|
p_rd = i % 2 ? p_rs2 : p_rs1; |
||||
|
} |
||||
|
) |
||||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue