Browse Source
Add the following categories * RD-only element-wise instructions (_w suffix * packed add/sub instructions (_w suffix only) * packed cross instructions (_wx suffix only) * packed accumulation instructions (_ws suffix * packed sign-extend and saturating instructions * packed shift instructions (_w/_ws suffix and * packed compare instructions (_w suffix only) * packed pack instructions (_h/_w suffix only) * rev_rv32/rev/rev16pull/2246/head
committed by
Chih-Min Chao
55 changed files with 370 additions and 0 deletions
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_LOOP(32,32,32, { |
||||
|
p_rd = ((int64_t)p_rs1 + p_rs2) >> 1; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_ULOOP(32,32,32, { |
||||
|
p_rd = ((uint64_t)p_rs1 + p_rs2) >> 1; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,7 @@ |
|||||
|
require_rv64; |
||||
|
P_CROSS_LOOP(32, { |
||||
|
p_rd = ((int64_t)p_rs1 + p_rs2) >> 1; |
||||
|
}, { |
||||
|
p_rd = ((int64_t)p_rs1 - p_rs2) >> 1; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_LOOP(32, 32, 32, { |
||||
|
p_rd = p_rs1 + p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_LOOP(32, 32, { |
||||
|
p_rd = p_rs1 + P_FIELD(RS2, 0, 32); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,7 @@ |
|||||
|
require_rv64; |
||||
|
P_CROSS_LOOP(32, { |
||||
|
p_rd = p_rs1 + p_rs2; |
||||
|
}, { |
||||
|
p_rd = p_rs1 - p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,7 @@ |
|||||
|
require_rv64; |
||||
|
P_CROSS_LOOP(32, { |
||||
|
p_rd = ((uint64_t)p_rs1 - p_rs2) >> 1; |
||||
|
}, { |
||||
|
p_rd = ((uint64_t)p_rs1 + p_rs2) >> 1; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_LOOP(32,32,32, { |
||||
|
p_rd = ((int64_t)p_rs1 - p_rs2) >> 1; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_ULOOP(32,32,32, { |
||||
|
p_rd = ((uint64_t)p_rs1 - p_rs2) >> 1; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_LOOP(32, { |
||||
|
p_rd = (insn.p_imm10csl() & 0x200) ? (0xfffffc00 | insn.p_imm10csl()) : insn.p_imm10csl(); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_LOOP(32, { |
||||
|
p_rd = insn.p_imm10csrw(); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_LOOP(32,32,32, { |
||||
|
p_rd = (p_rs1 > p_rs2) ? p_rs1 : p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_ULOOP(32,32,32, { |
||||
|
p_rd = (p_rs1 > p_rs2) ? p_rs1 : p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_LOOP(32,32,32, { |
||||
|
p_rd = (p_rs1 < p_rs2) ? p_rs1 : p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_ULOOP(32,32,32, { |
||||
|
p_rd = (p_rs1 < p_rs2) ? p_rs1 : p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_LOOP(32,32,32, { |
||||
|
p_rd = (p_rs1 == p_rs2) ? -1 : 0; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_LOOP(32,32,32, { |
||||
|
p_rd = (p_rs1 < p_rs2) ? -1 : 0; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_ULOOP(32,32,32, { |
||||
|
p_rd = (p_rs1 < p_rs2) ? -1 : 0; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1 @@ |
|||||
|
P_PACK(16, 0, 0); |
||||
@ -0,0 +1,2 @@ |
|||||
|
require_rv64; |
||||
|
P_PACK(32, 0, 1); |
||||
@ -0,0 +1,2 @@ |
|||||
|
require_rv64; |
||||
|
P_PACK(32, 1, 1); |
||||
@ -0,0 +1,2 @@ |
|||||
|
require_rv64; |
||||
|
P_PACK(32, 1, 0); |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
reg_t rd_tmp = RS2; \ |
||||
|
P_RS1_LOOP_BASE(32) |
||||
|
P_RS1_PARAMS(32) |
||||
|
rd_tmp += sext_xlen(p_rs1); |
||||
|
P_RD_LOOP_END() |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
reg_t rd_tmp = RS2; \ |
||||
|
P_RS1_LOOP_BASE(32) |
||||
|
P_RS1_UPARAMS(32) |
||||
|
rd_tmp += zext_xlen(p_rs1); |
||||
|
P_RD_LOOP_END() |
||||
@ -0,0 +1,7 @@ |
|||||
|
require_rv64; |
||||
|
P_CROSS_LOOP(32, { |
||||
|
p_rd = p_rs1 - p_rs2; |
||||
|
}, { |
||||
|
p_rd = p_rs1 + p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_LOOP(32,32,32, { |
||||
|
bool sat = false; |
||||
|
p_rd = (sat_add<int32_t, uint32_t>(p_rs1, p_rs2, sat)); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_ULOOP(32,32,32, { |
||||
|
bool sat = false; |
||||
|
p_rd = (sat_addu<uint32_t>(p_rs1, p_rs2, sat)); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,9 @@ |
|||||
|
require_rv64; |
||||
|
P_CROSS_ULOOP(32, { |
||||
|
bool sat = false; |
||||
|
p_rd = (sat_add<int32_t, uint32_t>(p_rs1, p_rs2, sat)); |
||||
|
}, { |
||||
|
bool sat = false; |
||||
|
p_rd = (sat_sub<int32_t, uint32_t>(p_rs1, p_rs2, sat)); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_LOOP(32, 32, { |
||||
|
p_rd = P_SAT(insn.shamtw() + 1, p_rs1); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_LOOP(32, 32, { |
||||
|
p_rd = (int32_t)(int8_t)p_rs1; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_LOOP(32, 32, { |
||||
|
p_rd = (int32_t)(int16_t)p_rs1; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_LOOP(32, 32, 32, { |
||||
|
p_rd = (p_rs1 << 1) + p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_LOOP(32, 32, { |
||||
|
p_rd = p_rs1 << (RS2 & (32 - 1)); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_LOOP(32, 32, { |
||||
|
p_rd = p_rs1 << insn.shamtw(); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_LOOP(32, 32, { |
||||
|
p_rd = p_rs1 >> (RS2 & (32 - 1)); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_LOOP(32, 32, { |
||||
|
p_rd = p_rs1 >> insn.shamtw(); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_LOOP(32, 32, { |
||||
|
p_rd = insn.shamtw() ? ((p_rs1 >> insn.shamtw()) + ((p_rs1 >> (insn.shamtw() - 1)) & 1)) : p_rs1; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_ULOOP(32, 32, { |
||||
|
p_rd = p_rs1 >> (RS2 & (32 - 1)); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_ULOOP(32, 32, { |
||||
|
p_rd = p_rs1 >> insn.shamtw(); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,9 @@ |
|||||
|
require_rv64; |
||||
|
P_CROSS_ULOOP(32, { |
||||
|
bool sat = false; |
||||
|
p_rd = (sat_sub<int32_t, uint32_t>(p_rs1, p_rs2, sat)); |
||||
|
}, { |
||||
|
bool sat = false; |
||||
|
p_rd = (sat_add<int32_t, uint32_t>(p_rs1, p_rs2, sat)); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_LOOP(32, 32, 32, { |
||||
|
p_rd = P_SAT(32, P_SAT(32, p_rs1 << 1) + p_rs2); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,13 @@ |
|||||
|
require_rv64; |
||||
|
sreg_t sshamt = P_FIELD(RS2, 0, 8); |
||||
|
P_RD_RS1_LOOP(32, 32, { |
||||
|
if (p_rs1 == 0) |
||||
|
p_rd = 0; |
||||
|
else if (sshamt >= 32) |
||||
|
p_rd = (p_rs1 & 0x80000000) ? 0x80000000 : 0x7fffffff; |
||||
|
else if (sshamt <= -32) |
||||
|
p_rd = (p_rs1 & 0x80000000) ? 0xffffffff : 0; |
||||
|
else |
||||
|
p_rd = sshamt >= 0 ? P_SAT(32, sext32(p_rs1) << sshamt) : (p_rs1 >> -sshamt); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,13 @@ |
|||||
|
require_rv64; |
||||
|
sreg_t sshamt = P_FIELD(RS2, 0, 8); |
||||
|
P_RD_RS1_LOOP(32, 32, { |
||||
|
if (p_rs1 == 0) |
||||
|
p_rd = 0; |
||||
|
else if (sshamt >= 32) |
||||
|
p_rd = (p_rs1 & 0x80000000) ? 0x80000000 : 0x7fffffff; |
||||
|
else if (sshamt <= -32) |
||||
|
p_rd = 0; |
||||
|
else |
||||
|
p_rd = sshamt >= 0 ? P_SAT(32, sext32(p_rs1) << sshamt) : ((p_rs1 >> -sshamt) + ((p_rs1 >> (-sshamt - 1)) & 1)); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_LOOP(32, 32, { |
||||
|
p_rd = P_SAT(32, sext32(p_rs1) << insn.shamtw()); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_LOOP(32,32,32, { |
||||
|
bool sat = false; |
||||
|
p_rd = (sat_sub<int32_t, uint32_t>(p_rs1, p_rs2, sat)); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,6 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_ULOOP(32,32,32, { |
||||
|
bool sat = false; |
||||
|
p_rd = (sat_subu<uint32_t>(p_rs1, p_rs2, sat)); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_RS2_LOOP(32, 32, 32, { |
||||
|
p_rd = p_rs1 - p_rs2; |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,5 @@ |
|||||
|
require_rv64; |
||||
|
P_RD_RS1_LOOP(32, 32, { |
||||
|
p_rd = P_USAT(insn.shamtw() + 1, p_rs1); |
||||
|
} |
||||
|
) |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
|
||||
|
#include "grevi.h" |
||||
@ -0,0 +1,4 @@ |
|||||
|
require_rv64; |
||||
|
require_extension('P'); |
||||
|
|
||||
|
#include "grevi.h" |
||||
@ -0,0 +1,3 @@ |
|||||
|
require_extension('P'); |
||||
|
|
||||
|
#include "grevi.h" |
||||
@ -0,0 +1,11 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
sreg_t sshamt = P_FIELD(RS2, 0, 8); |
||||
|
if (RS1 == 0) |
||||
|
WRITE_RD(0); |
||||
|
else if (sshamt >= 64) |
||||
|
WRITE_RD(0); |
||||
|
else if (sshamt <= -64) |
||||
|
WRITE_RD((RS1 & 0x8000000000000000) ? 0xffffffffffffffff : 0); |
||||
|
else |
||||
|
WRITE_RD(sshamt >= 0 ? (RS1 << sshamt) : ((sreg_t)RS1 >> -sshamt)); |
||||
@ -0,0 +1,11 @@ |
|||||
|
require_extension('P'); |
||||
|
require_rv64; |
||||
|
sreg_t sshamt = P_FIELD(RS2, 0, 8); |
||||
|
if (RS1 == 0) |
||||
|
WRITE_RD(0); |
||||
|
else if (sshamt >= 64) |
||||
|
WRITE_RD(0); |
||||
|
else if (sshamt <= -64) |
||||
|
WRITE_RD(0); |
||||
|
else |
||||
|
WRITE_RD(sshamt >= 0 ? (RS1 << sshamt) : (((sreg_t)RS1 >> -sshamt) + ((RS1 >> (-sshamt - 1)) & 1))); |
||||
Loading…
Reference in new issue