diff options
Diffstat (limited to 'riscv/insns')
609 files changed, 3228 insertions, 2 deletions
diff --git a/riscv/insns/aadd.h b/riscv/insns/aadd.h new file mode 100644 index 00000000..5456cef6 --- /dev/null +++ b/riscv/insns/aadd.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD((RS1 + RS2)>>1);
\ No newline at end of file diff --git a/riscv/insns/aaddu.h b/riscv/insns/aaddu.h new file mode 100644 index 00000000..bf011496 --- /dev/null +++ b/riscv/insns/aaddu.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD((0ULL + (uint32_t)RS1 + (uint32_t)RS2)>>1);
\ No newline at end of file diff --git a/riscv/insns/abs.h b/riscv/insns/abs.h new file mode 100644 index 00000000..1b747ffe --- /dev/null +++ b/riscv/insns/abs.h @@ -0,0 +1,4 @@ +require_extension('P'); +reg_t s1 = RS1; +reg_t result = (int64_t(s1) < 0) ? -s1 : s1; +WRITE_RD(sext_xlen(result));
\ No newline at end of file diff --git a/riscv/insns/absw.h b/riscv/insns/absw.h new file mode 100644 index 00000000..e10240ff --- /dev/null +++ b/riscv/insns/absw.h @@ -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)); diff --git a/riscv/insns/addd.h b/riscv/insns/addd.h new file mode 100644 index 00000000..0a4901f5 --- /dev/null +++ b/riscv/insns/addd.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_P_RD_PAIR(P_RS1_PAIR + P_RS2_PAIR);
\ No newline at end of file diff --git a/riscv/insns/asub.h b/riscv/insns/asub.h new file mode 100644 index 00000000..b7a7ab53 --- /dev/null +++ b/riscv/insns/asub.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD((RS1 - RS2)>>1);
\ No newline at end of file diff --git a/riscv/insns/asubu.h b/riscv/insns/asubu.h new file mode 100644 index 00000000..6139feb2 --- /dev/null +++ b/riscv/insns/asubu.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD((0ULL + (uint32_t)RS1 - (uint32_t)RS2)>>1);
\ No newline at end of file diff --git a/riscv/insns/cls.h b/riscv/insns/cls.h new file mode 100644 index 00000000..3d80b618 --- /dev/null +++ b/riscv/insns/cls.h @@ -0,0 +1,10 @@ +require_extension('P'); +reg_t x = xlen - 1; +reg_t msb = (RS1 >> (xlen - 1)) & 1; +for (int i = 0; i < xlen - 1; i++) { + if (msb != ((RS1 >> (xlen - i - 2)) & 1)) { + x = i; + break; + } +} +WRITE_RD(sext_xlen(x));
\ No newline at end of file diff --git a/riscv/insns/clsw.h b/riscv/insns/clsw.h new file mode 100644 index 00000000..651f28af --- /dev/null +++ b/riscv/insns/clsw.h @@ -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)); diff --git a/riscv/insns/macc_h00.h b/riscv/insns/macc_h00.h new file mode 100644 index 00000000..bddbc4cd --- /dev/null +++ b/riscv/insns/macc_h00.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(RD + sext(RS1, 16) * sext(RS2, 16));
\ No newline at end of file diff --git a/riscv/insns/macc_h01.h b/riscv/insns/macc_h01.h new file mode 100644 index 00000000..551e4568 --- /dev/null +++ b/riscv/insns/macc_h01.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(RD + sext(RS1, 16) * sext(RS2 >> 16, 16));
\ No newline at end of file diff --git a/riscv/insns/macc_h11.h b/riscv/insns/macc_h11.h new file mode 100644 index 00000000..73104545 --- /dev/null +++ b/riscv/insns/macc_h11.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(RD + sext(RS1 >> 16, 16) * sext(RS2 >> 16, 16));
\ No newline at end of file diff --git a/riscv/insns/macc_w00.h b/riscv/insns/macc_w00.h new file mode 100644 index 00000000..2f82736d --- /dev/null +++ b/riscv/insns/macc_w00.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv64; +WRITE_RD(RD + sext32(RS1) * sext32(RS2)); diff --git a/riscv/insns/macc_w01.h b/riscv/insns/macc_w01.h new file mode 100644 index 00000000..ab99bd81 --- /dev/null +++ b/riscv/insns/macc_w01.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv64; +WRITE_RD(RD + sext32(RS1) * sext32(RS2 >> 32)); diff --git a/riscv/insns/macc_w11.h b/riscv/insns/macc_w11.h new file mode 100644 index 00000000..b3d76f08 --- /dev/null +++ b/riscv/insns/macc_w11.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv64; +WRITE_RD(RD + sext32(RS1 >> 32) * sext32(RS2 >> 32)); diff --git a/riscv/insns/maccsu_h00.h b/riscv/insns/maccsu_h00.h new file mode 100644 index 00000000..4039c255 --- /dev/null +++ b/riscv/insns/maccsu_h00.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(RD + sext(RS1, 16) * zext(RS2, 16));
\ No newline at end of file diff --git a/riscv/insns/maccsu_h11.h b/riscv/insns/maccsu_h11.h new file mode 100644 index 00000000..1bbde234 --- /dev/null +++ b/riscv/insns/maccsu_h11.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(RD + sext(RS1 >> 16, 16) * zext(RS2 >> 16, 16));
\ No newline at end of file diff --git a/riscv/insns/maccsu_w00.h b/riscv/insns/maccsu_w00.h new file mode 100644 index 00000000..d689c5b5 --- /dev/null +++ b/riscv/insns/maccsu_w00.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv64; +WRITE_RD(RD + sext32(RS1) * zext32(RS2)); diff --git a/riscv/insns/maccsu_w11.h b/riscv/insns/maccsu_w11.h new file mode 100644 index 00000000..6a75ce7b --- /dev/null +++ b/riscv/insns/maccsu_w11.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv64; +WRITE_RD(RD + sext32(RS1 >> 32) * zext32(RS2 >> 32)); diff --git a/riscv/insns/maccu_h00.h b/riscv/insns/maccu_h00.h new file mode 100644 index 00000000..22002959 --- /dev/null +++ b/riscv/insns/maccu_h00.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(RD + zext(RS1, 16) * zext(RS2, 16));
\ No newline at end of file diff --git a/riscv/insns/maccu_h01.h b/riscv/insns/maccu_h01.h new file mode 100644 index 00000000..a35865bf --- /dev/null +++ b/riscv/insns/maccu_h01.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(RD + zext(RS1, 16) * zext(RS2 >> 16, 16));
\ No newline at end of file diff --git a/riscv/insns/maccu_h11.h b/riscv/insns/maccu_h11.h new file mode 100644 index 00000000..a30a8760 --- /dev/null +++ b/riscv/insns/maccu_h11.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(RD + zext(RS1 >> 16, 16) * zext(RS2 >> 16, 16));
\ No newline at end of file diff --git a/riscv/insns/maccu_w00.h b/riscv/insns/maccu_w00.h new file mode 100644 index 00000000..12c3cb6b --- /dev/null +++ b/riscv/insns/maccu_w00.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv64; +WRITE_RD(RD + zext32(RS1) * zext32(RS2)); diff --git a/riscv/insns/maccu_w01.h b/riscv/insns/maccu_w01.h new file mode 100644 index 00000000..b469c387 --- /dev/null +++ b/riscv/insns/maccu_w01.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv64; +WRITE_RD(RD + zext32(RS1) * zext32(RS2 >> 32)); diff --git a/riscv/insns/maccu_w11.h b/riscv/insns/maccu_w11.h new file mode 100644 index 00000000..eca1f711 --- /dev/null +++ b/riscv/insns/maccu_w11.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv64; +WRITE_RD(RD + zext32(RS1 >> 32) * zext32(RS2 >> 32)); diff --git a/riscv/insns/merge.h b/riscv/insns/merge.h new file mode 100644 index 00000000..d184c5c8 --- /dev/null +++ b/riscv/insns/merge.h @@ -0,0 +1,2 @@ +require_extension('P'); +WRITE_RD((RS2 & RD) | (RS1 & ~RD));
\ No newline at end of file diff --git a/riscv/insns/mhacc.h b/riscv/insns/mhacc.h new file mode 100644 index 00000000..77de911d --- /dev/null +++ b/riscv/insns/mhacc.h @@ -0,0 +1,4 @@ +require_extension('P'); +require_rv32; +sreg_t mres = sext32(RS1) * sext32(RS2); +WRITE_RD(RD + (mres >> 32));
\ No newline at end of file diff --git a/riscv/insns/mhacc_h0.h b/riscv/insns/mhacc_h0.h new file mode 100644 index 00000000..699e9165 --- /dev/null +++ b/riscv/insns/mhacc_h0.h @@ -0,0 +1,4 @@ +require_extension('P'); +require_rv32; +sreg_t mres = sext32(RS1) * sext32(P_FIELD(RS2, 0, 16)); +WRITE_RD(RD + (mres >> 32));
\ No newline at end of file diff --git a/riscv/insns/mhacc_h1.h b/riscv/insns/mhacc_h1.h new file mode 100644 index 00000000..ea228fe6 --- /dev/null +++ b/riscv/insns/mhacc_h1.h @@ -0,0 +1,4 @@ +require_extension('P'); +require_rv32; +sreg_t mres = sext32(RS1) * sext32(P_FIELD(RS2, 1, 16)); +WRITE_RD(RD + (mres >> 32));
\ No newline at end of file diff --git a/riscv/insns/mhaccsu.h b/riscv/insns/mhaccsu.h new file mode 100644 index 00000000..328355c1 --- /dev/null +++ b/riscv/insns/mhaccsu.h @@ -0,0 +1,4 @@ +require_extension('P'); +require_rv32; +sreg_t mres = sext32(RS1) * reg_t((uint32_t)RS2); +WRITE_RD(RD + (mres >> 32));
\ No newline at end of file diff --git a/riscv/insns/mhaccsu_h0.h b/riscv/insns/mhaccsu_h0.h new file mode 100644 index 00000000..e89f309b --- /dev/null +++ b/riscv/insns/mhaccsu_h0.h @@ -0,0 +1,4 @@ +require_extension('P'); +require_rv32; +sreg_t mres = sext32(RS1) * (uint32_t)P_FIELD(RS2, 0, 16); +WRITE_RD(RD + (mres >> 32));
\ No newline at end of file diff --git a/riscv/insns/mhaccsu_h1.h b/riscv/insns/mhaccsu_h1.h new file mode 100644 index 00000000..e49a15f6 --- /dev/null +++ b/riscv/insns/mhaccsu_h1.h @@ -0,0 +1,4 @@ +require_extension('P'); +require_rv32; +sreg_t mres = sext32(RS1) * (uint32_t)P_FIELD(RS2, 1, 16); +WRITE_RD(RD + (mres >> 32));
\ No newline at end of file diff --git a/riscv/insns/mhaccu.h b/riscv/insns/mhaccu.h new file mode 100644 index 00000000..e9fb8020 --- /dev/null +++ b/riscv/insns/mhaccu.h @@ -0,0 +1,4 @@ +require_extension('P'); +require_rv32; +uint64_t mres = reg_t((uint32_t)RS1) * reg_t((uint32_t)RS2); +WRITE_RD(RD + (mres >> 32));
\ No newline at end of file diff --git a/riscv/insns/mhracc.h b/riscv/insns/mhracc.h new file mode 100644 index 00000000..902b0e56 --- /dev/null +++ b/riscv/insns/mhracc.h @@ -0,0 +1,5 @@ +require_extension('P'); +require_rv32; +sreg_t mres = sext32(RS1) * sext32(RS2); +int32_t round = ((mres >> 31) + 1) >> 1; +WRITE_RD(RD + round);
\ No newline at end of file diff --git a/riscv/insns/mhraccsu.h b/riscv/insns/mhraccsu.h new file mode 100644 index 00000000..5d676ba6 --- /dev/null +++ b/riscv/insns/mhraccsu.h @@ -0,0 +1,5 @@ +require_extension('P'); +require_rv32; +sreg_t mres = sext(RS1,64) * reg_t((uint32_t)RS2); +int32_t round = ((mres >> 31) + 1) >> 1; +WRITE_RD(RD + round);
\ No newline at end of file diff --git a/riscv/insns/mhraccu.h b/riscv/insns/mhraccu.h new file mode 100644 index 00000000..9cf5e5a4 --- /dev/null +++ b/riscv/insns/mhraccu.h @@ -0,0 +1,5 @@ +require_extension('P'); +require_rv32; +reg_t mres = reg_t((uint32_t)RS1) * reg_t((uint32_t)RS2); +uint32_t round = ((mres >> 31) + 1) >> 1; +WRITE_RD(RD + round);
\ No newline at end of file diff --git a/riscv/insns/mqacc_h00.h b/riscv/insns/mqacc_h00.h new file mode 100644 index 00000000..7b4b8e7c --- /dev/null +++ b/riscv/insns/mqacc_h00.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(RD + (((int32_t)P_FIELD(RS1, 0, 16) * P_FIELD(RS2, 0, 16)) >> 15));
\ No newline at end of file diff --git a/riscv/insns/mqacc_h01.h b/riscv/insns/mqacc_h01.h new file mode 100644 index 00000000..ff618720 --- /dev/null +++ b/riscv/insns/mqacc_h01.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(RD + (((int32_t)P_FIELD(RS1, 0, 16) * P_FIELD(RS2, 1, 16)) >> 15));
\ No newline at end of file diff --git a/riscv/insns/mqacc_h11.h b/riscv/insns/mqacc_h11.h new file mode 100644 index 00000000..ac9e18bc --- /dev/null +++ b/riscv/insns/mqacc_h11.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(RD + (((int32_t)P_FIELD(RS1, 1, 16) * P_FIELD(RS2, 1, 16)) >> 15));
\ No newline at end of file diff --git a/riscv/insns/mqacc_w00.h b/riscv/insns/mqacc_w00.h new file mode 100644 index 00000000..677b9bc4 --- /dev/null +++ b/riscv/insns/mqacc_w00.h @@ -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)); diff --git a/riscv/insns/mqacc_w01.h b/riscv/insns/mqacc_w01.h new file mode 100644 index 00000000..d03020d5 --- /dev/null +++ b/riscv/insns/mqacc_w01.h @@ -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)); diff --git a/riscv/insns/mqacc_w11.h b/riscv/insns/mqacc_w11.h new file mode 100644 index 00000000..30f93a8e --- /dev/null +++ b/riscv/insns/mqacc_w11.h @@ -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)); diff --git a/riscv/insns/mqracc_h00.h b/riscv/insns/mqracc_h00.h new file mode 100644 index 00000000..37d49bde --- /dev/null +++ b/riscv/insns/mqracc_h00.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(RD + (((int32_t)P_FIELD(RS1, 0, 16) * P_FIELD(RS2, 0, 16) + 0x4000) >> 15));
\ No newline at end of file diff --git a/riscv/insns/mqracc_h01.h b/riscv/insns/mqracc_h01.h new file mode 100644 index 00000000..3e7358e5 --- /dev/null +++ b/riscv/insns/mqracc_h01.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(RD + (((int32_t)P_FIELD(RS1, 0, 16) * P_FIELD(RS2, 1, 16) + 0x4000) >> 15));
\ No newline at end of file diff --git a/riscv/insns/mqracc_h11.h b/riscv/insns/mqracc_h11.h new file mode 100644 index 00000000..c4eb4860 --- /dev/null +++ b/riscv/insns/mqracc_h11.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(RD + (((int32_t)P_FIELD(RS1, 1, 16) * P_FIELD(RS2, 1, 16) + 0x4000) >> 15));
\ No newline at end of file diff --git a/riscv/insns/mqracc_w00.h b/riscv/insns/mqracc_w00.h new file mode 100644 index 00000000..6426aa5c --- /dev/null +++ b/riscv/insns/mqracc_w00.h @@ -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)); diff --git a/riscv/insns/mqracc_w01.h b/riscv/insns/mqracc_w01.h new file mode 100644 index 00000000..ac315532 --- /dev/null +++ b/riscv/insns/mqracc_w01.h @@ -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)); diff --git a/riscv/insns/mqracc_w11.h b/riscv/insns/mqracc_w11.h new file mode 100644 index 00000000..0e9386c3 --- /dev/null +++ b/riscv/insns/mqracc_w11.h @@ -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)); diff --git a/riscv/insns/mqrwacc.h b/riscv/insns/mqrwacc.h new file mode 100644 index 00000000..0aa2e73d --- /dev/null +++ b/riscv/insns/mqrwacc.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_P_RD_PAIR(P_RD_PAIR + (((sreg_t)RS1*(sreg_t)RS2 + 0x40000000) >> 31));
\ No newline at end of file diff --git a/riscv/insns/mqwacc.h b/riscv/insns/mqwacc.h new file mode 100644 index 00000000..6f7cacdc --- /dev/null +++ b/riscv/insns/mqwacc.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_P_RD_PAIR(P_RD_PAIR + (((sreg_t)RS1*(sreg_t)RS2) >> 31));
\ No newline at end of file diff --git a/riscv/insns/mseq.h b/riscv/insns/mseq.h new file mode 100644 index 00000000..cf540b20 --- /dev/null +++ b/riscv/insns/mseq.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(RS1 == RS2 ? -1 : 0);
\ No newline at end of file diff --git a/riscv/insns/mslt.h b/riscv/insns/mslt.h new file mode 100644 index 00000000..18aa387a --- /dev/null +++ b/riscv/insns/mslt.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD((int32_t)RS1 < (int32_t)RS2 ? -1 : 0);
\ No newline at end of file diff --git a/riscv/insns/msltu.h b/riscv/insns/msltu.h new file mode 100644 index 00000000..062f12df --- /dev/null +++ b/riscv/insns/msltu.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD((uint32_t)RS1 < (uint32_t)RS2 ? -1 : 0);
\ No newline at end of file diff --git a/riscv/insns/mul_h00.h b/riscv/insns/mul_h00.h new file mode 100644 index 00000000..69bfaae6 --- /dev/null +++ b/riscv/insns/mul_h00.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(sext(RS1, 16) * sext(RS2, 16));
\ No newline at end of file diff --git a/riscv/insns/mul_h01.h b/riscv/insns/mul_h01.h new file mode 100644 index 00000000..ec95fe17 --- /dev/null +++ b/riscv/insns/mul_h01.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(sext(RS1, 16) * sext(RS2 >> 16, 16));
\ No newline at end of file diff --git a/riscv/insns/mul_h11.h b/riscv/insns/mul_h11.h new file mode 100644 index 00000000..4ea0d680 --- /dev/null +++ b/riscv/insns/mul_h11.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(sext(RS1 >> 16, 16) * sext(RS2 >> 16, 16));
\ No newline at end of file diff --git a/riscv/insns/mul_w00.h b/riscv/insns/mul_w00.h new file mode 100644 index 00000000..a338218e --- /dev/null +++ b/riscv/insns/mul_w00.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv64; +WRITE_RD(sext32(RS1) * sext32(RS2)); diff --git a/riscv/insns/mul_w01.h b/riscv/insns/mul_w01.h new file mode 100644 index 00000000..23c7f73c --- /dev/null +++ b/riscv/insns/mul_w01.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv64; +WRITE_RD(sext32(RS1) * sext32(RS2 >> 32)); diff --git a/riscv/insns/mul_w11.h b/riscv/insns/mul_w11.h new file mode 100644 index 00000000..d0233c11 --- /dev/null +++ b/riscv/insns/mul_w11.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv64; +WRITE_RD(sext32(RS1 >> 32) * sext32(RS2 >> 32)); diff --git a/riscv/insns/mulh_h0.h b/riscv/insns/mulh_h0.h new file mode 100644 index 00000000..2143d3d2 --- /dev/null +++ b/riscv/insns/mulh_h0.h @@ -0,0 +1,4 @@ +require_extension('P'); +require_rv32; +int64_t mres = sext(RS1,64) * sext(P_FIELD(RS2, 0, 16),64); +WRITE_RD(mres>>32);
\ No newline at end of file diff --git a/riscv/insns/mulh_h1.h b/riscv/insns/mulh_h1.h new file mode 100644 index 00000000..5e5bf994 --- /dev/null +++ b/riscv/insns/mulh_h1.h @@ -0,0 +1,4 @@ +require_extension('P'); +require_rv32; +int64_t mres = sext(RS1,64) * sext(P_FIELD(RS2, 1, 16),64); +WRITE_RD(mres>>32);
\ No newline at end of file diff --git a/riscv/insns/mulhr.h b/riscv/insns/mulhr.h new file mode 100644 index 00000000..527d2a2f --- /dev/null +++ b/riscv/insns/mulhr.h @@ -0,0 +1,4 @@ +require_extension('P'); +require_rv32; +int64_t mres = sext(RS1,64) * sext(RS2,64); +WRITE_RD(((mres >> 31) + 1) >> 1);
\ No newline at end of file diff --git a/riscv/insns/mulhrsu.h b/riscv/insns/mulhrsu.h new file mode 100644 index 00000000..bbd7619b --- /dev/null +++ b/riscv/insns/mulhrsu.h @@ -0,0 +1,4 @@ +require_extension('P'); +require_rv32; +sreg_t mres = sext(RS1,64) * reg_t((uint32_t)RS2); +WRITE_RD(((mres >> 31) + 1) >> 1);
\ No newline at end of file diff --git a/riscv/insns/mulhru.h b/riscv/insns/mulhru.h new file mode 100644 index 00000000..51cf38cb --- /dev/null +++ b/riscv/insns/mulhru.h @@ -0,0 +1,4 @@ +require_extension('P'); +require_rv32; +sreg_t mres = reg_t((uint32_t)RS1) * reg_t((uint32_t)RS2); +WRITE_RD(((mres >> 31) + 1) >> 1);
\ No newline at end of file diff --git a/riscv/insns/mulhsu_h0.h b/riscv/insns/mulhsu_h0.h new file mode 100644 index 00000000..2cdb292c --- /dev/null +++ b/riscv/insns/mulhsu_h0.h @@ -0,0 +1,4 @@ +require_extension('P'); +require_rv32; +sreg_t mres = sext32(RS1) * (uint32_t)P_FIELD(RS2, 0, 16); +WRITE_RD(mres >> 32);
\ No newline at end of file diff --git a/riscv/insns/mulhsu_h1.h b/riscv/insns/mulhsu_h1.h new file mode 100644 index 00000000..4cc9fc32 --- /dev/null +++ b/riscv/insns/mulhsu_h1.h @@ -0,0 +1,4 @@ +require_extension('P'); +require_rv32; +sreg_t mres = sext32(RS1) * (uint32_t)P_FIELD(RS2, 1, 16); +WRITE_RD(mres >> 32);
\ No newline at end of file diff --git a/riscv/insns/mulq.h b/riscv/insns/mulq.h new file mode 100644 index 00000000..256b7efd --- /dev/null +++ b/riscv/insns/mulq.h @@ -0,0 +1,8 @@ +require_extension('P'); +require_rv32; +if ((RS1 != (reg_t)INT32_MIN) || (RS2 != (reg_t)INT32_MIN)) { + WRITE_RD((RS1 * RS2) >> 31); + } else { + WRITE_RD(INT32_MAX); + P.VU.vxsat->write(1); +} diff --git a/riscv/insns/mulqr.h b/riscv/insns/mulqr.h new file mode 100644 index 00000000..d024e9ff --- /dev/null +++ b/riscv/insns/mulqr.h @@ -0,0 +1,8 @@ +require_extension('P'); +require_rv32; +if ((RS1 != (reg_t)INT32_MIN) || (RS2 != (reg_t)INT32_MIN)) { + WRITE_RD((((RS1 * RS2) >> 30) + 1) >> 1); + } else { + WRITE_RD(INT32_MAX); + P.VU.vxsat->write(1); +} diff --git a/riscv/insns/mulsu_h00.h b/riscv/insns/mulsu_h00.h new file mode 100644 index 00000000..f02de759 --- /dev/null +++ b/riscv/insns/mulsu_h00.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(sext(RS1, 16) * zext(RS2, 16));
\ No newline at end of file diff --git a/riscv/insns/mulsu_h11.h b/riscv/insns/mulsu_h11.h new file mode 100644 index 00000000..d4954037 --- /dev/null +++ b/riscv/insns/mulsu_h11.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(sext(RS1 >> 16, 16) * zext(RS2 >> 16, 16));
\ No newline at end of file diff --git a/riscv/insns/mulsu_w00.h b/riscv/insns/mulsu_w00.h new file mode 100644 index 00000000..0323688d --- /dev/null +++ b/riscv/insns/mulsu_w00.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv64; +WRITE_RD(sext32(RS1) * zext32(RS2)); diff --git a/riscv/insns/mulsu_w11.h b/riscv/insns/mulsu_w11.h new file mode 100644 index 00000000..21f0c004 --- /dev/null +++ b/riscv/insns/mulsu_w11.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv64; +WRITE_RD(sext32(RS1 >> 32) * zext32(RS2 >> 32)); diff --git a/riscv/insns/mulu_h00.h b/riscv/insns/mulu_h00.h new file mode 100644 index 00000000..d92c605b --- /dev/null +++ b/riscv/insns/mulu_h00.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(zext(RS1, 16) * zext(RS2, 16));
\ No newline at end of file diff --git a/riscv/insns/mulu_h01.h b/riscv/insns/mulu_h01.h new file mode 100644 index 00000000..75a8302b --- /dev/null +++ b/riscv/insns/mulu_h01.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(zext(RS1, 16) * zext(RS2 >> 16, 16));
\ No newline at end of file diff --git a/riscv/insns/mulu_h11.h b/riscv/insns/mulu_h11.h new file mode 100644 index 00000000..28db7c86 --- /dev/null +++ b/riscv/insns/mulu_h11.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(zext(RS1 >> 16, 16) * zext(RS2 >> 16, 16));
\ No newline at end of file diff --git a/riscv/insns/mulu_w00.h b/riscv/insns/mulu_w00.h new file mode 100644 index 00000000..ce96de9c --- /dev/null +++ b/riscv/insns/mulu_w00.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv64; +WRITE_RD(zext32(RS1) * zext32(RS2)); diff --git a/riscv/insns/mulu_w01.h b/riscv/insns/mulu_w01.h new file mode 100644 index 00000000..ee911eee --- /dev/null +++ b/riscv/insns/mulu_w01.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv64; +WRITE_RD(zext32(RS1) * zext32(RS2 >> 32)); diff --git a/riscv/insns/mulu_w11.h b/riscv/insns/mulu_w11.h new file mode 100644 index 00000000..2111bebc --- /dev/null +++ b/riscv/insns/mulu_w11.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv64; +WRITE_RD(zext32(RS1 >> 32) * zext32(RS2 >> 32)); diff --git a/riscv/insns/mvm.h b/riscv/insns/mvm.h new file mode 100644 index 00000000..bf2ddad1 --- /dev/null +++ b/riscv/insns/mvm.h @@ -0,0 +1,2 @@ +require_extension('P'); +WRITE_RD((RS1 & RS2) | (RD & ~RS2));
\ No newline at end of file diff --git a/riscv/insns/mvmn.h b/riscv/insns/mvmn.h new file mode 100644 index 00000000..8c863d91 --- /dev/null +++ b/riscv/insns/mvmn.h @@ -0,0 +1,2 @@ +require_extension('P'); +WRITE_RD((RD & RS2) | (RS1 & ~RS2));
\ No newline at end of file diff --git a/riscv/insns/nclip.h b/riscv/insns/nclip.h new file mode 100644 index 00000000..f1ecfc76 --- /dev/null +++ b/riscv/insns/nclip.h @@ -0,0 +1,5 @@ +require_extension('P'); +require_rv32; +sreg_t tmp = (sreg_t)P_RS1_PAIR >> (RS2 & 0x3f); +int32_t result = P_SAT(32, tmp); +WRITE_RD(result);
\ No newline at end of file diff --git a/riscv/insns/nclipi.h b/riscv/insns/nclipi.h new file mode 100644 index 00000000..79bc1f2a --- /dev/null +++ b/riscv/insns/nclipi.h @@ -0,0 +1,5 @@ +require_extension('P'); +require_rv32; +sreg_t tmp = (sreg_t)P_RS1_PAIR >> insn.shamtd(); +int32_t result = P_SAT(32, tmp); +WRITE_RD(result);
\ No newline at end of file diff --git a/riscv/insns/nclipiu.h b/riscv/insns/nclipiu.h new file mode 100644 index 00000000..d8608d10 --- /dev/null +++ b/riscv/insns/nclipiu.h @@ -0,0 +1,5 @@ +require_extension('P'); +require_rv32; +reg_t tmp = (reg_t)P_RS1_PAIR >> insn.shamtd(); +uint32_t result = P_USAT_FULL(32, (sreg_t)tmp); +WRITE_RD(result);
\ No newline at end of file diff --git a/riscv/insns/nclipr.h b/riscv/insns/nclipr.h new file mode 100644 index 00000000..e9aca14e --- /dev/null +++ b/riscv/insns/nclipr.h @@ -0,0 +1,11 @@ +require_extension('P'); +require_rv32; +sreg_t val = (sreg_t)P_RS1_PAIR; +uint32_t shamt = RS2 & 0x3f; +sreg_t result; +if (shamt == 0) { + result = P_SAT(32, val); +} else { + result = P_SAT(32, (val >> shamt) + ((val >> (shamt - 1)) & 1)); +} +WRITE_RD(result);
\ No newline at end of file diff --git a/riscv/insns/nclipri.h b/riscv/insns/nclipri.h new file mode 100644 index 00000000..17528201 --- /dev/null +++ b/riscv/insns/nclipri.h @@ -0,0 +1,11 @@ +require_extension('P'); +require_rv32; +sreg_t val = (sreg_t)P_RS1_PAIR; +uint32_t shamt = insn.shamtd(); +sreg_t result; +if (shamt == 0) { + result = P_SAT(32, val); +} else { + result = P_SAT(32, (val >> shamt) + ((val >> (shamt - 1)) & 1)); +} +WRITE_RD(result);
\ No newline at end of file diff --git a/riscv/insns/nclipriu.h b/riscv/insns/nclipriu.h new file mode 100644 index 00000000..2595dbc8 --- /dev/null +++ b/riscv/insns/nclipriu.h @@ -0,0 +1,11 @@ +require_extension('P'); +require_rv32; +reg_t val = (reg_t)P_RS1_PAIR; +uint32_t shamt = insn.shamtd(); +reg_t result; +if (shamt == 0) { + result = P_USAT_FULL(32, (sreg_t)val); +} else { + result = P_USAT_FULL(32, (sreg_t)((val >> shamt) + ((val >> (shamt - 1)) & 1))); +} +WRITE_RD(result);
\ No newline at end of file diff --git a/riscv/insns/nclipru.h b/riscv/insns/nclipru.h new file mode 100644 index 00000000..c8044ed0 --- /dev/null +++ b/riscv/insns/nclipru.h @@ -0,0 +1,11 @@ +require_extension('P'); +require_rv32; +reg_t val = (reg_t)P_RS1_PAIR; +uint32_t shamt = RS2 & 0x3f; +reg_t result; +if (shamt == 0) { + result = P_USAT_FULL(32, (sreg_t)val); +} else { + result = P_USAT_FULL(32, (sreg_t)((val >> shamt) + ((val >> (shamt - 1)) & 1))); +} +WRITE_RD(result);
\ No newline at end of file diff --git a/riscv/insns/nclipu.h b/riscv/insns/nclipu.h new file mode 100644 index 00000000..a1e6099d --- /dev/null +++ b/riscv/insns/nclipu.h @@ -0,0 +1,5 @@ +require_extension('P'); +require_rv32; +reg_t tmp = (reg_t)P_RS1_PAIR >> (RS2 & 0x3f); +uint32_t result = P_USAT_FULL(32, (sreg_t)tmp); +WRITE_RD(result);
\ No newline at end of file diff --git a/riscv/insns/nsra.h b/riscv/insns/nsra.h new file mode 100644 index 00000000..7cf9f39f --- /dev/null +++ b/riscv/insns/nsra.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD((sreg_t)P_RS1_PAIR >> (RS2 & 0x3f));
\ No newline at end of file diff --git a/riscv/insns/nsrai.h b/riscv/insns/nsrai.h new file mode 100644 index 00000000..63e287ca --- /dev/null +++ b/riscv/insns/nsrai.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD((sreg_t)P_RS1_PAIR >> insn.shamtd());
\ No newline at end of file diff --git a/riscv/insns/nsrar.h b/riscv/insns/nsrar.h new file mode 100644 index 00000000..b0879d3f --- /dev/null +++ b/riscv/insns/nsrar.h @@ -0,0 +1,11 @@ +require_extension('P'); +require_rv32; +sreg_t val = (sreg_t)P_RS1_PAIR; +uint32_t shamt = RS2 & 0x3f; +sreg_t result; +if (shamt == 0) { + result = val; +} else { + result = (val >> shamt) + ((val >> (shamt - 1)) & 1); +} +WRITE_RD(result); diff --git a/riscv/insns/nsrari.h b/riscv/insns/nsrari.h new file mode 100644 index 00000000..4e5fb806 --- /dev/null +++ b/riscv/insns/nsrari.h @@ -0,0 +1,11 @@ +require_extension('P'); +require_rv32; +sreg_t val = (sreg_t)P_RS1_PAIR; +uint32_t shamt = insn.shamtd(); +sreg_t result; +if (shamt == 0) { + result = val; +} else { + result = (val >> shamt) + ((val >> (shamt - 1)) & 1); +} +WRITE_RD(result); diff --git a/riscv/insns/nsrl.h b/riscv/insns/nsrl.h new file mode 100644 index 00000000..7de7e5b8 --- /dev/null +++ b/riscv/insns/nsrl.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(P_RS1_PAIR >> (RS2 & 0x3f));
\ No newline at end of file diff --git a/riscv/insns/nsrli.h b/riscv/insns/nsrli.h new file mode 100644 index 00000000..b85a84ee --- /dev/null +++ b/riscv/insns/nsrli.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(P_RS1_PAIR >> insn.shamtd());
\ No newline at end of file diff --git a/riscv/insns/paadd_b.h b/riscv/insns/paadd_b.h new file mode 100644 index 00000000..9f5f043c --- /dev/null +++ b/riscv/insns/paadd_b.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_LOOP(8,8,8, { + p_rd = (p_rs1 + p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/paadd_db.h b/riscv/insns/paadd_db.h new file mode 100644 index 00000000..4ce1e126 --- /dev/null +++ b/riscv/insns/paadd_db.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(8,8,8, { + p_rd = (p_rs1 + p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/paadd_dh.h b/riscv/insns/paadd_dh.h new file mode 100644 index 00000000..966921c6 --- /dev/null +++ b/riscv/insns/paadd_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(16,16,16, { + p_rd = (p_rs1 + p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/paadd_dw.h b/riscv/insns/paadd_dw.h new file mode 100644 index 00000000..2409cf55 --- /dev/null +++ b/riscv/insns/paadd_dw.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(32,32,32, { + p_rd = ((sreg_t)p_rs1 + (sreg_t)p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/paadd_h.h b/riscv/insns/paadd_h.h new file mode 100644 index 00000000..bc01ea16 --- /dev/null +++ b/riscv/insns/paadd_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_LOOP(16,16,16, { + p_rd = (p_rs1 + p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/paadd_w.h b/riscv/insns/paadd_w.h new file mode 100644 index 00000000..6dd9811f --- /dev/null +++ b/riscv/insns/paadd_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_LOOP(32,32,32, { + p_rd = ((int64_t)p_rs1 + p_rs2) >> 1; +} +) diff --git a/riscv/insns/paaddu_b.h b/riscv/insns/paaddu_b.h new file mode 100644 index 00000000..0a413d55 --- /dev/null +++ b/riscv/insns/paaddu_b.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_ULOOP(8,8,8, { + p_rd = (p_rs1 + p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/paaddu_db.h b/riscv/insns/paaddu_db.h new file mode 100644 index 00000000..71899a34 --- /dev/null +++ b/riscv/insns/paaddu_db.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(8,8,8, { + p_rd = (p_rs1 + p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/paaddu_dh.h b/riscv/insns/paaddu_dh.h new file mode 100644 index 00000000..884b277e --- /dev/null +++ b/riscv/insns/paaddu_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(16,16,16, { + p_rd = (p_rs1 + p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/paaddu_dw.h b/riscv/insns/paaddu_dw.h new file mode 100644 index 00000000..0ba41340 --- /dev/null +++ b/riscv/insns/paaddu_dw.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(32,32,32, { + p_rd = ((reg_t)p_rs1 + (reg_t)p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/paaddu_h.h b/riscv/insns/paaddu_h.h new file mode 100644 index 00000000..dbef824b --- /dev/null +++ b/riscv/insns/paaddu_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_ULOOP(16,16,16, { + p_rd = (p_rs1 + p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/paaddu_w.h b/riscv/insns/paaddu_w.h new file mode 100644 index 00000000..fee391c7 --- /dev/null +++ b/riscv/insns/paaddu_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_ULOOP(32,32,32, { + p_rd = ((uint64_t)p_rs1 + p_rs2) >> 1; +} +) diff --git a/riscv/insns/paas_dhx.h b/riscv/insns/paas_dhx.h new file mode 100644 index 00000000..43ff1a26 --- /dev/null +++ b/riscv/insns/paas_dhx.h @@ -0,0 +1,6 @@ +require_rv32; +P_CROSS_DW_LOOP(16, { + p_rd = (p_rs1 + p_rs2) >> 1; +}, { + p_rd = (p_rs1 - p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/paas_hx.h b/riscv/insns/paas_hx.h new file mode 100644 index 00000000..5c393a85 --- /dev/null +++ b/riscv/insns/paas_hx.h @@ -0,0 +1,5 @@ +P_CROSS_LOOP(16, { + p_rd = (p_rs1 + p_rs2) >> 1; +}, { + p_rd = (p_rs1 - p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/paas_wx.h b/riscv/insns/paas_wx.h new file mode 100644 index 00000000..64565491 --- /dev/null +++ b/riscv/insns/paas_wx.h @@ -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; +} +) diff --git a/riscv/insns/pabd_b.h b/riscv/insns/pabd_b.h new file mode 100644 index 00000000..978adbac --- /dev/null +++ b/riscv/insns/pabd_b.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_LOOP(8, 8, 8, { + p_rd = (p_rs1 < p_rs2) ? (int8_t)((uint8_t)p_rs2 - (uint8_t)p_rs1) + : (int8_t)((uint8_t)p_rs1 - (uint8_t)p_rs2); +})
\ No newline at end of file diff --git a/riscv/insns/pabd_db.h b/riscv/insns/pabd_db.h new file mode 100644 index 00000000..495f4aa1 --- /dev/null +++ b/riscv/insns/pabd_db.h @@ -0,0 +1,5 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(8, 8, 8, { + p_rd = (p_rs1 < p_rs2) ? (int8_t)((uint8_t)p_rs2 - (uint8_t)p_rs1) + : (int8_t)((uint8_t)p_rs1 - (uint8_t)p_rs2); +})
\ No newline at end of file diff --git a/riscv/insns/pabd_dh.h b/riscv/insns/pabd_dh.h new file mode 100644 index 00000000..035de401 --- /dev/null +++ b/riscv/insns/pabd_dh.h @@ -0,0 +1,5 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(16, 16, 16, { + p_rd = (p_rs1 < p_rs2) ? (int16_t)((uint16_t)p_rs2 - (uint16_t)p_rs1) + : (int16_t)((uint16_t)p_rs1 - (uint16_t)p_rs2); +}) diff --git a/riscv/insns/pabd_h.h b/riscv/insns/pabd_h.h new file mode 100644 index 00000000..cd18fac7 --- /dev/null +++ b/riscv/insns/pabd_h.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_LOOP(16, 16, 16, { + p_rd = (p_rs1 < p_rs2) ? (int16_t)((uint16_t)p_rs2 - (uint16_t)p_rs1) + : (int16_t)((uint16_t)p_rs1 - (uint16_t)p_rs2); +})
\ No newline at end of file diff --git a/riscv/insns/pabdsumau_b.h b/riscv/insns/pabdsumau_b.h new file mode 100644 index 00000000..6ffc6888 --- /dev/null +++ b/riscv/insns/pabdsumau_b.h @@ -0,0 +1,3 @@ +P_REDUCTION_ULOOP(64, 8, true, false, { + p_res += (p_rs1 > p_rs2 ? p_rs1 - p_rs2 : p_rs2 - p_rs1); +})
\ No newline at end of file diff --git a/riscv/insns/pabdsumu_b.h b/riscv/insns/pabdsumu_b.h new file mode 100644 index 00000000..b7effa47 --- /dev/null +++ b/riscv/insns/pabdsumu_b.h @@ -0,0 +1,3 @@ +P_REDUCTION_ULOOP(64, 8, false, false, { + p_res += (p_rs1 > p_rs2 ? p_rs1 - p_rs2 : p_rs2 - p_rs1); +})
\ No newline at end of file diff --git a/riscv/insns/pabdu_b.h b/riscv/insns/pabdu_b.h new file mode 100644 index 00000000..d0092550 --- /dev/null +++ b/riscv/insns/pabdu_b.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_ULOOP(8, 8, 8, { + p_rd = (p_rs1 < p_rs2) ? p_rs2 - p_rs1 : p_rs1 - p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pabdu_db.h b/riscv/insns/pabdu_db.h new file mode 100644 index 00000000..a60eef91 --- /dev/null +++ b/riscv/insns/pabdu_db.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(8, 8, 8, { + p_rd = (p_rs1 < p_rs2) ? p_rs2 - p_rs1 : p_rs1 - p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pabdu_dh.h b/riscv/insns/pabdu_dh.h new file mode 100644 index 00000000..6bff1079 --- /dev/null +++ b/riscv/insns/pabdu_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(16, 16, 16, { + p_rd = (p_rs1 < p_rs2) ? p_rs2 - p_rs1 : p_rs1 - p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pabdu_h.h b/riscv/insns/pabdu_h.h new file mode 100644 index 00000000..83b1445d --- /dev/null +++ b/riscv/insns/pabdu_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_ULOOP(16, 16, 16, { + p_rd = (p_rs1 < p_rs2) ? p_rs2 - p_rs1 : p_rs1 - p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pack.h b/riscv/insns/pack.h index acc49877..25f5145b 100644 --- a/riscv/insns/pack.h +++ b/riscv/insns/pack.h @@ -1,6 +1,7 @@ // RV32Zbb contains zext.h but not general pack require(((xlen == 32) && (insn.rs2() == 0) && p->extension_enabled(EXT_ZBB)) - || p->extension_enabled(EXT_ZBKB)); + || p->extension_enabled(EXT_ZBKB) + || p->extension_enabled('P')); reg_t lo = zext_xlen(RS1 << (xlen/2)) >> (xlen/2); reg_t hi = zext_xlen(RS2 << (xlen/2)); -WRITE_RD(sext_xlen(lo | hi)); +WRITE_RD(sext_xlen(lo | hi));
\ No newline at end of file diff --git a/riscv/insns/padd_b.h b/riscv/insns/padd_b.h new file mode 100644 index 00000000..05f890ca --- /dev/null +++ b/riscv/insns/padd_b.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_LOOP(8,8,8, { + p_rd = p_rs1 + p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/padd_bs.h b/riscv/insns/padd_bs.h new file mode 100644 index 00000000..9070fc9b --- /dev/null +++ b/riscv/insns/padd_bs.h @@ -0,0 +1,3 @@ +P_RD_RS1_LOOP(8, 8, { + p_rd = p_rs1 + P_FIELD(RS2, 0, 8); +})
\ No newline at end of file diff --git a/riscv/insns/padd_db.h b/riscv/insns/padd_db.h new file mode 100644 index 00000000..6f0ae17e --- /dev/null +++ b/riscv/insns/padd_db.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(8, 8, 8, { + p_rd = p_rs1 + p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/padd_dbs.h b/riscv/insns/padd_dbs.h new file mode 100644 index 00000000..9fc77320 --- /dev/null +++ b/riscv/insns/padd_dbs.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_LOOP(8, 8, { + p_rd = p_rs1 + P_FIELD(RS2, 0, 8); +})
\ No newline at end of file diff --git a/riscv/insns/padd_dh.h b/riscv/insns/padd_dh.h new file mode 100644 index 00000000..eec465cc --- /dev/null +++ b/riscv/insns/padd_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(16, 16, 16, { + p_rd = p_rs1 + p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/padd_dhs.h b/riscv/insns/padd_dhs.h new file mode 100644 index 00000000..c268c755 --- /dev/null +++ b/riscv/insns/padd_dhs.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_LOOP(16, 16, { + p_rd = p_rs1 + P_FIELD(RS2, 0, 16); +})
\ No newline at end of file diff --git a/riscv/insns/padd_dw.h b/riscv/insns/padd_dw.h new file mode 100644 index 00000000..9bf943db --- /dev/null +++ b/riscv/insns/padd_dw.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(32, 32, 32, { + p_rd = p_rs1 + p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/padd_dws.h b/riscv/insns/padd_dws.h new file mode 100644 index 00000000..58f1dd47 --- /dev/null +++ b/riscv/insns/padd_dws.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_LOOP(32, 32, { + p_rd = p_rs1 + P_FIELD(RS2, 0, 32); +})
\ No newline at end of file diff --git a/riscv/insns/padd_h.h b/riscv/insns/padd_h.h new file mode 100644 index 00000000..5ff1d324 --- /dev/null +++ b/riscv/insns/padd_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_LOOP(16, 16, 16, { + p_rd = p_rs1 + p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/padd_hs.h b/riscv/insns/padd_hs.h new file mode 100644 index 00000000..e68d0044 --- /dev/null +++ b/riscv/insns/padd_hs.h @@ -0,0 +1,3 @@ +P_RD_RS1_LOOP(16, 16, { + p_rd = p_rs1 + P_FIELD(RS2, 0, 16); +})
\ No newline at end of file diff --git a/riscv/insns/padd_w.h b/riscv/insns/padd_w.h new file mode 100644 index 00000000..9049c7c2 --- /dev/null +++ b/riscv/insns/padd_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_LOOP(32, 32, 32, { + p_rd = p_rs1 + p_rs2; +} +) diff --git a/riscv/insns/padd_ws.h b/riscv/insns/padd_ws.h new file mode 100644 index 00000000..a3fc8b12 --- /dev/null +++ b/riscv/insns/padd_ws.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_LOOP(32, 32, { + p_rd = p_rs1 + P_FIELD(RS2, 0, 32); +} +) diff --git a/riscv/insns/pas_dhx.h b/riscv/insns/pas_dhx.h new file mode 100644 index 00000000..3c74af3b --- /dev/null +++ b/riscv/insns/pas_dhx.h @@ -0,0 +1,6 @@ +require_rv32; +P_CROSS_DW_LOOP(16, { + p_rd = p_rs1 + p_rs2; +}, { + p_rd = p_rs1 - p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pas_hx.h b/riscv/insns/pas_hx.h new file mode 100644 index 00000000..fbe4a244 --- /dev/null +++ b/riscv/insns/pas_hx.h @@ -0,0 +1,5 @@ +P_CROSS_LOOP(16, { + p_rd = p_rs1 + p_rs2; +}, { + p_rd = p_rs1 - p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pas_wx.h b/riscv/insns/pas_wx.h new file mode 100644 index 00000000..b1d6394d --- /dev/null +++ b/riscv/insns/pas_wx.h @@ -0,0 +1,7 @@ +require_rv64; +P_CROSS_LOOP(32, { + p_rd = p_rs1 + p_rs2; +}, { + p_rd = p_rs1 - p_rs2; +} +) diff --git a/riscv/insns/pasa_dhx.h b/riscv/insns/pasa_dhx.h new file mode 100644 index 00000000..253c9c5b --- /dev/null +++ b/riscv/insns/pasa_dhx.h @@ -0,0 +1,6 @@ +require_rv32; +P_CROSS_DW_LOOP(16, { + p_rd = (p_rs1 - p_rs2) >> 1; +}, { + p_rd = (p_rs1 + p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/pasa_hx.h b/riscv/insns/pasa_hx.h new file mode 100644 index 00000000..eea09357 --- /dev/null +++ b/riscv/insns/pasa_hx.h @@ -0,0 +1,5 @@ +P_CROSS_LOOP(16, { + p_rd = (p_rs1 - p_rs2) >> 1; +}, { + p_rd = (p_rs1 + p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/pasa_wx.h b/riscv/insns/pasa_wx.h new file mode 100644 index 00000000..1ddcd3b0 --- /dev/null +++ b/riscv/insns/pasa_wx.h @@ -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; +} +) diff --git a/riscv/insns/pasub_b.h b/riscv/insns/pasub_b.h new file mode 100644 index 00000000..48173164 --- /dev/null +++ b/riscv/insns/pasub_b.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_LOOP(8,8,8, { + p_rd = (p_rs1 - p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/pasub_db.h b/riscv/insns/pasub_db.h new file mode 100644 index 00000000..b2f4674e --- /dev/null +++ b/riscv/insns/pasub_db.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(8,8,8, { + p_rd = (p_rs1 - p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/pasub_dh.h b/riscv/insns/pasub_dh.h new file mode 100644 index 00000000..72fbf04d --- /dev/null +++ b/riscv/insns/pasub_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(16,16,16, { + p_rd = (p_rs1 - p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/pasub_dw.h b/riscv/insns/pasub_dw.h new file mode 100644 index 00000000..4305989f --- /dev/null +++ b/riscv/insns/pasub_dw.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(32,32,32, { + p_rd = ((sreg_t)p_rs1 - (sreg_t)p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/pasub_h.h b/riscv/insns/pasub_h.h new file mode 100644 index 00000000..57c271ae --- /dev/null +++ b/riscv/insns/pasub_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_LOOP(16,16,16, { + p_rd = (p_rs1 - p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/pasub_w.h b/riscv/insns/pasub_w.h new file mode 100644 index 00000000..55c24439 --- /dev/null +++ b/riscv/insns/pasub_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_LOOP(32,32,32, { + p_rd = ((int64_t)p_rs1 - p_rs2) >> 1; +} +) diff --git a/riscv/insns/pasubu_b.h b/riscv/insns/pasubu_b.h new file mode 100644 index 00000000..7543305a --- /dev/null +++ b/riscv/insns/pasubu_b.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_ULOOP(8,8,8, { + p_rd = (p_rs1 - p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/pasubu_db.h b/riscv/insns/pasubu_db.h new file mode 100644 index 00000000..cafdcd2e --- /dev/null +++ b/riscv/insns/pasubu_db.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(8,8,8, { + p_rd = (p_rs1 - p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/pasubu_dh.h b/riscv/insns/pasubu_dh.h new file mode 100644 index 00000000..b6d1bff3 --- /dev/null +++ b/riscv/insns/pasubu_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(16,16,16, { + p_rd = (p_rs1 - p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/pasubu_dw.h b/riscv/insns/pasubu_dw.h new file mode 100644 index 00000000..415fc7f9 --- /dev/null +++ b/riscv/insns/pasubu_dw.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(32,32,32, { + p_rd = ((reg_t)p_rs1 - (reg_t)p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/pasubu_h.h b/riscv/insns/pasubu_h.h new file mode 100644 index 00000000..453fe57b --- /dev/null +++ b/riscv/insns/pasubu_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_ULOOP(16,16,16, { + p_rd = (p_rs1 - p_rs2) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/pasubu_w.h b/riscv/insns/pasubu_w.h new file mode 100644 index 00000000..39d4693f --- /dev/null +++ b/riscv/insns/pasubu_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_ULOOP(32,32,32, { + p_rd = ((uint64_t)p_rs1 - p_rs2) >> 1; +} +) diff --git a/riscv/insns/pli_b.h b/riscv/insns/pli_b.h new file mode 100644 index 00000000..b04452e3 --- /dev/null +++ b/riscv/insns/pli_b.h @@ -0,0 +1,3 @@ +P_RD_LOOP(8, { + p_rd = insn.p_imm8(); +})
\ No newline at end of file diff --git a/riscv/insns/pli_db.h b/riscv/insns/pli_db.h new file mode 100644 index 00000000..e411fe0f --- /dev/null +++ b/riscv/insns/pli_db.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_DW_LOOP(8, { + p_rd = insn.p_imm8(); +})
\ No newline at end of file diff --git a/riscv/insns/pli_dh.h b/riscv/insns/pli_dh.h new file mode 100644 index 00000000..215b03df --- /dev/null +++ b/riscv/insns/pli_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_DW_LOOP(16, { + p_rd = (insn.p_imm10csl() & 0x200) ? (0xfc00 | insn.p_imm10csl()) : insn.p_imm10csl(); +})
\ No newline at end of file diff --git a/riscv/insns/pli_h.h b/riscv/insns/pli_h.h new file mode 100644 index 00000000..4a891624 --- /dev/null +++ b/riscv/insns/pli_h.h @@ -0,0 +1,3 @@ +P_RD_LOOP(16, { + p_rd = (insn.p_imm10csl() & 0x200) ? (0xfc00 | insn.p_imm10csl()) : insn.p_imm10csl(); +})
\ No newline at end of file diff --git a/riscv/insns/pli_w.h b/riscv/insns/pli_w.h new file mode 100644 index 00000000..22a69c81 --- /dev/null +++ b/riscv/insns/pli_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_LOOP(32, { + p_rd = (insn.p_imm10csl() & 0x200) ? (0xfffffc00 | insn.p_imm10csl()) : insn.p_imm10csl(); +} +) diff --git a/riscv/insns/plui_dh.h b/riscv/insns/plui_dh.h new file mode 100644 index 00000000..61f3d6b6 --- /dev/null +++ b/riscv/insns/plui_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_DW_LOOP(16, { + p_rd = insn.p_imm10csr(); +})
\ No newline at end of file diff --git a/riscv/insns/plui_h.h b/riscv/insns/plui_h.h new file mode 100644 index 00000000..c11af3e3 --- /dev/null +++ b/riscv/insns/plui_h.h @@ -0,0 +1,3 @@ +P_RD_LOOP(16, { + p_rd = insn.p_imm10csr(); +})
\ No newline at end of file diff --git a/riscv/insns/plui_w.h b/riscv/insns/plui_w.h new file mode 100644 index 00000000..64461192 --- /dev/null +++ b/riscv/insns/plui_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_LOOP(32, { + p_rd = insn.p_imm10csrw(); +} +) diff --git a/riscv/insns/pm2add_h.h b/riscv/insns/pm2add_h.h new file mode 100644 index 00000000..c0218159 --- /dev/null +++ b/riscv/insns/pm2add_h.h @@ -0,0 +1,3 @@ +P_REDUCTION_LOOP(32, 16, false, false, { + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2add_hx.h b/riscv/insns/pm2add_hx.h new file mode 100644 index 00000000..a84dbcc7 --- /dev/null +++ b/riscv/insns/pm2add_hx.h @@ -0,0 +1,3 @@ +P_REDUCTION_CROSS_LOOP(32, 16, false, false, { + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2add_w.h b/riscv/insns/pm2add_w.h new file mode 100644 index 00000000..33efbd63 --- /dev/null +++ b/riscv/insns/pm2add_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_REDUCTION_LOOP(64, 32, false, false, { + p_res += (sreg_t)p_rs1 * p_rs2; +} +) diff --git a/riscv/insns/pm2add_wx.h b/riscv/insns/pm2add_wx.h new file mode 100644 index 00000000..ea8dc10e --- /dev/null +++ b/riscv/insns/pm2add_wx.h @@ -0,0 +1,5 @@ +require_rv64; +P_REDUCTION_CROSS_LOOP(64, 32, false, false, { + p_res += (sreg_t)p_rs1 * p_rs2; +} +) diff --git a/riscv/insns/pm2adda_h.h b/riscv/insns/pm2adda_h.h new file mode 100644 index 00000000..ed2e0eb5 --- /dev/null +++ b/riscv/insns/pm2adda_h.h @@ -0,0 +1,3 @@ +P_REDUCTION_LOOP(32, 16, true, false, { + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2adda_hx.h b/riscv/insns/pm2adda_hx.h new file mode 100644 index 00000000..2a5d96cb --- /dev/null +++ b/riscv/insns/pm2adda_hx.h @@ -0,0 +1,3 @@ +P_REDUCTION_CROSS_LOOP(32, 16, true, false, { + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2adda_w.h b/riscv/insns/pm2adda_w.h new file mode 100644 index 00000000..3bbb37ea --- /dev/null +++ b/riscv/insns/pm2adda_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_REDUCTION_LOOP(64, 32, true, false, { + p_res += (sreg_t)p_rs1 * p_rs2; +} +) diff --git a/riscv/insns/pm2adda_wx.h b/riscv/insns/pm2adda_wx.h new file mode 100644 index 00000000..02bd918b --- /dev/null +++ b/riscv/insns/pm2adda_wx.h @@ -0,0 +1,5 @@ +require_rv64; +P_REDUCTION_CROSS_LOOP(64, 32, true, false, { + p_res += (sreg_t)p_rs1 * p_rs2; +} +) diff --git a/riscv/insns/pm2addasu_h.h b/riscv/insns/pm2addasu_h.h new file mode 100644 index 00000000..8ddbcf21 --- /dev/null +++ b/riscv/insns/pm2addasu_h.h @@ -0,0 +1,3 @@ +P_REDUCTION_SULOOP(32, 16, true, false, { + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2addasu_w.h b/riscv/insns/pm2addasu_w.h new file mode 100644 index 00000000..4168bae3 --- /dev/null +++ b/riscv/insns/pm2addasu_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_REDUCTION_SULOOP(64, 32, true, false, { + p_res += (sreg_t)p_rs1 * p_rs2; +} +) diff --git a/riscv/insns/pm2addau_h.h b/riscv/insns/pm2addau_h.h new file mode 100644 index 00000000..bc8dba63 --- /dev/null +++ b/riscv/insns/pm2addau_h.h @@ -0,0 +1,3 @@ +P_REDUCTION_ULOOP(32, 16, true, false, { + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2addau_w.h b/riscv/insns/pm2addau_w.h new file mode 100644 index 00000000..ecc60c49 --- /dev/null +++ b/riscv/insns/pm2addau_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_REDUCTION_ULOOP(64, 32, true, false, { + p_res += (reg_t)p_rs1 * p_rs2; +} +) diff --git a/riscv/insns/pm2addsu_h.h b/riscv/insns/pm2addsu_h.h new file mode 100644 index 00000000..dfbc5274 --- /dev/null +++ b/riscv/insns/pm2addsu_h.h @@ -0,0 +1,3 @@ +P_REDUCTION_SULOOP(32, 16, false, false, { + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2addsu_w.h b/riscv/insns/pm2addsu_w.h new file mode 100644 index 00000000..8b36ddf2 --- /dev/null +++ b/riscv/insns/pm2addsu_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_REDUCTION_SULOOP(64, 32, false, false, { + p_res += (sreg_t)p_rs1 * p_rs2; +} +) diff --git a/riscv/insns/pm2addu_h.h b/riscv/insns/pm2addu_h.h new file mode 100644 index 00000000..97944410 --- /dev/null +++ b/riscv/insns/pm2addu_h.h @@ -0,0 +1,3 @@ +P_REDUCTION_ULOOP(32, 16, false, false, { + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2addu_w.h b/riscv/insns/pm2addu_w.h new file mode 100644 index 00000000..fb9b4bc8 --- /dev/null +++ b/riscv/insns/pm2addu_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_REDUCTION_ULOOP(64, 32, false, false, { + p_res += (reg_t)p_rs1 * p_rs2; +} +) diff --git a/riscv/insns/pm2sadd_h.h b/riscv/insns/pm2sadd_h.h new file mode 100644 index 00000000..01ba8c66 --- /dev/null +++ b/riscv/insns/pm2sadd_h.h @@ -0,0 +1,3 @@ +P_REDUCTION_LOOP(32, 16, false, true, { + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2sadd_hx.h b/riscv/insns/pm2sadd_hx.h new file mode 100644 index 00000000..d7dca373 --- /dev/null +++ b/riscv/insns/pm2sadd_hx.h @@ -0,0 +1,3 @@ +P_REDUCTION_CROSS_LOOP(32, 16, false, true, { + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2sub_h.h b/riscv/insns/pm2sub_h.h new file mode 100644 index 00000000..48f6ce06 --- /dev/null +++ b/riscv/insns/pm2sub_h.h @@ -0,0 +1,6 @@ +P_REDUCTION_LOOP(32, 16, false, false, { + if (j & 1) + p_res -= p_rs1 * p_rs2; + else + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2sub_hx.h b/riscv/insns/pm2sub_hx.h new file mode 100644 index 00000000..1ff687c0 --- /dev/null +++ b/riscv/insns/pm2sub_hx.h @@ -0,0 +1,6 @@ +P_REDUCTION_CROSS_LOOP(32, 16, false, false, { + if (j & 1) + p_res -= p_rs1 * p_rs2; + else + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2sub_w.h b/riscv/insns/pm2sub_w.h new file mode 100644 index 00000000..4e7c8307 --- /dev/null +++ b/riscv/insns/pm2sub_w.h @@ -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; +} +) diff --git a/riscv/insns/pm2sub_wx.h b/riscv/insns/pm2sub_wx.h new file mode 100644 index 00000000..f8b300f2 --- /dev/null +++ b/riscv/insns/pm2sub_wx.h @@ -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; +} +) diff --git a/riscv/insns/pm2suba_h.h b/riscv/insns/pm2suba_h.h new file mode 100644 index 00000000..d8c923e2 --- /dev/null +++ b/riscv/insns/pm2suba_h.h @@ -0,0 +1,6 @@ +P_REDUCTION_LOOP(32, 16, true, false, { + if (j & 1) + p_res -= p_rs1 * p_rs2; + else + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2suba_hx.h b/riscv/insns/pm2suba_hx.h new file mode 100644 index 00000000..13971e26 --- /dev/null +++ b/riscv/insns/pm2suba_hx.h @@ -0,0 +1,6 @@ +P_REDUCTION_CROSS_LOOP(32, 16, true, false, { + if (j & 1) + p_res -= p_rs1 * p_rs2; + else + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2suba_w.h b/riscv/insns/pm2suba_w.h new file mode 100644 index 00000000..f3f4dc96 --- /dev/null +++ b/riscv/insns/pm2suba_w.h @@ -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; +} +) diff --git a/riscv/insns/pm2suba_wx.h b/riscv/insns/pm2suba_wx.h new file mode 100644 index 00000000..1a597259 --- /dev/null +++ b/riscv/insns/pm2suba_wx.h @@ -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; +} +) diff --git a/riscv/insns/pm2wadd_h.h b/riscv/insns/pm2wadd_h.h new file mode 100644 index 00000000..be756fb7 --- /dev/null +++ b/riscv/insns/pm2wadd_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_REDUCTION_LOOP(32, 16, false, false, { + p_res += sext32(p_rs1) * sext32(p_rs2); +})
\ No newline at end of file diff --git a/riscv/insns/pm2wadd_hx.h b/riscv/insns/pm2wadd_hx.h new file mode 100644 index 00000000..dd000bbf --- /dev/null +++ b/riscv/insns/pm2wadd_hx.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_REDUCTION_CROSS_LOOP(32, 16, false, false, { + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2wadda_h.h b/riscv/insns/pm2wadda_h.h new file mode 100644 index 00000000..a0a1bb65 --- /dev/null +++ b/riscv/insns/pm2wadda_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_REDUCTION_LOOP(32, 16, true, false, { + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2wadda_hx.h b/riscv/insns/pm2wadda_hx.h new file mode 100644 index 00000000..8ef3e387 --- /dev/null +++ b/riscv/insns/pm2wadda_hx.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_REDUCTION_CROSS_LOOP(32, 16, true, false, { + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2waddasu_h.h b/riscv/insns/pm2waddasu_h.h new file mode 100644 index 00000000..b525feb4 --- /dev/null +++ b/riscv/insns/pm2waddasu_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_REDUCTION_SULOOP(32, 16, true, false, { + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2waddau_h.h b/riscv/insns/pm2waddau_h.h new file mode 100644 index 00000000..5e67a7a5 --- /dev/null +++ b/riscv/insns/pm2waddau_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_REDUCTION_ULOOP(32, 16, true, false, { + p_res += (uint32_t)p_rs1 * (uint32_t)p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2waddsu_h.h b/riscv/insns/pm2waddsu_h.h new file mode 100644 index 00000000..8c845953 --- /dev/null +++ b/riscv/insns/pm2waddsu_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_REDUCTION_SULOOP(32, 16, false, false, { + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2waddu_h.h b/riscv/insns/pm2waddu_h.h new file mode 100644 index 00000000..30a4ad1f --- /dev/null +++ b/riscv/insns/pm2waddu_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_REDUCTION_ULOOP(32, 16, false, false, { + p_res += (uint32_t)p_rs1 * (uint32_t)p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2wsub_h.h b/riscv/insns/pm2wsub_h.h new file mode 100644 index 00000000..903cbe30 --- /dev/null +++ b/riscv/insns/pm2wsub_h.h @@ -0,0 +1,7 @@ +require_rv32; +P_WIDEN_REDUCTION_LOOP(32, 16, false, false, { + if (j & 1) + p_res += p_rs1 * p_rs2; + else + p_res -= p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2wsub_hx.h b/riscv/insns/pm2wsub_hx.h new file mode 100644 index 00000000..81da3652 --- /dev/null +++ b/riscv/insns/pm2wsub_hx.h @@ -0,0 +1,7 @@ +require_rv32; +P_WIDEN_REDUCTION_CROSS_LOOP(32, 16, false, false, { + if (j & 1) + p_res += p_rs1 * p_rs2; + else + p_res -= p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2wsuba_h.h b/riscv/insns/pm2wsuba_h.h new file mode 100644 index 00000000..600b77e2 --- /dev/null +++ b/riscv/insns/pm2wsuba_h.h @@ -0,0 +1,7 @@ +require_rv32; +P_WIDEN_REDUCTION_LOOP(32, 16, true, false, { + if (j & 1) + p_res += p_rs1 * p_rs2; + else + p_res -= p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm2wsuba_hx.h b/riscv/insns/pm2wsuba_hx.h new file mode 100644 index 00000000..58a99d03 --- /dev/null +++ b/riscv/insns/pm2wsuba_hx.h @@ -0,0 +1,7 @@ +require_rv32; +P_WIDEN_REDUCTION_CROSS_LOOP(32, 16, true, false, { + if (j & 1) + p_res += p_rs1 * p_rs2; + else + p_res -= p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm4add_b.h b/riscv/insns/pm4add_b.h new file mode 100644 index 00000000..ac1c49ce --- /dev/null +++ b/riscv/insns/pm4add_b.h @@ -0,0 +1,3 @@ +P_REDUCTION_LOOP(32, 8, false, false, { + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm4add_h.h b/riscv/insns/pm4add_h.h new file mode 100644 index 00000000..ea9a82bf --- /dev/null +++ b/riscv/insns/pm4add_h.h @@ -0,0 +1,5 @@ +require_rv64; +P_REDUCTION_LOOP(64, 16, false, false, { + p_res += (sreg_t)p_rs1 * p_rs2; +} +) diff --git a/riscv/insns/pm4adda_b.h b/riscv/insns/pm4adda_b.h new file mode 100644 index 00000000..d3e00eee --- /dev/null +++ b/riscv/insns/pm4adda_b.h @@ -0,0 +1,3 @@ +P_REDUCTION_LOOP(32, 8, true, false, { + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm4adda_h.h b/riscv/insns/pm4adda_h.h new file mode 100644 index 00000000..a3498cc4 --- /dev/null +++ b/riscv/insns/pm4adda_h.h @@ -0,0 +1,5 @@ +require_rv64; +P_REDUCTION_LOOP(64, 16, true, false, { + p_res += (sreg_t)p_rs1 * p_rs2; +} +) diff --git a/riscv/insns/pm4addasu_b.h b/riscv/insns/pm4addasu_b.h new file mode 100644 index 00000000..cac07f07 --- /dev/null +++ b/riscv/insns/pm4addasu_b.h @@ -0,0 +1,3 @@ +P_REDUCTION_SULOOP(32, 8, true, false, { + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm4addasu_h.h b/riscv/insns/pm4addasu_h.h new file mode 100644 index 00000000..d0aafb61 --- /dev/null +++ b/riscv/insns/pm4addasu_h.h @@ -0,0 +1,5 @@ +require_rv64; +P_REDUCTION_SULOOP(64, 16, true, false, { + p_res += (sreg_t)p_rs1 * p_rs2; +} +) diff --git a/riscv/insns/pm4addau_b.h b/riscv/insns/pm4addau_b.h new file mode 100644 index 00000000..37b29c33 --- /dev/null +++ b/riscv/insns/pm4addau_b.h @@ -0,0 +1,3 @@ +P_REDUCTION_ULOOP(32, 8, true, false, { + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm4addau_h.h b/riscv/insns/pm4addau_h.h new file mode 100644 index 00000000..1ce56684 --- /dev/null +++ b/riscv/insns/pm4addau_h.h @@ -0,0 +1,5 @@ +require_rv64; +P_REDUCTION_ULOOP(64, 16, true, false, { + p_res += (reg_t)p_rs1 * p_rs2; +} +) diff --git a/riscv/insns/pm4addsu_b.h b/riscv/insns/pm4addsu_b.h new file mode 100644 index 00000000..02fb9b74 --- /dev/null +++ b/riscv/insns/pm4addsu_b.h @@ -0,0 +1,3 @@ +P_REDUCTION_SULOOP(32, 8, false, false, { + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm4addsu_h.h b/riscv/insns/pm4addsu_h.h new file mode 100644 index 00000000..1c0c6d8b --- /dev/null +++ b/riscv/insns/pm4addsu_h.h @@ -0,0 +1,5 @@ +require_rv64; +P_REDUCTION_SULOOP(64, 16, false, false, { + p_res += (sreg_t)p_rs1 * p_rs2; +} +) diff --git a/riscv/insns/pm4addu_b.h b/riscv/insns/pm4addu_b.h new file mode 100644 index 00000000..a6880e57 --- /dev/null +++ b/riscv/insns/pm4addu_b.h @@ -0,0 +1,3 @@ +P_REDUCTION_ULOOP(32, 8, false, false, { + p_res += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pm4addu_h.h b/riscv/insns/pm4addu_h.h new file mode 100644 index 00000000..b3ce1aa5 --- /dev/null +++ b/riscv/insns/pm4addu_h.h @@ -0,0 +1,5 @@ +require_rv64; +P_REDUCTION_ULOOP(64, 16, false, false, { + p_res += (reg_t)p_rs1 * p_rs2; +} +) diff --git a/riscv/insns/pmacc_w_h00.h b/riscv/insns/pmacc_w_h00.h new file mode 100644 index 00000000..086e8907 --- /dev/null +++ b/riscv/insns/pmacc_w_h00.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_EE_LOOP(32, 16, 16, { + p_rd += sext32(p_rs1) * sext32(p_rs2); +} +) diff --git a/riscv/insns/pmacc_w_h01.h b/riscv/insns/pmacc_w_h01.h new file mode 100644 index 00000000..67557cf4 --- /dev/null +++ b/riscv/insns/pmacc_w_h01.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_EO_LOOP(32, 16, 16, { + p_rd += sext32(p_rs1) * sext32(p_rs2); +} +) diff --git a/riscv/insns/pmacc_w_h11.h b/riscv/insns/pmacc_w_h11.h new file mode 100644 index 00000000..bd45540f --- /dev/null +++ b/riscv/insns/pmacc_w_h11.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_OO_LOOP(32, 16, 16, { + p_rd += sext32(p_rs1) * sext32(p_rs2); +} +) diff --git a/riscv/insns/pmaccsu_w_h00.h b/riscv/insns/pmaccsu_w_h00.h new file mode 100644 index 00000000..d1c3cd54 --- /dev/null +++ b/riscv/insns/pmaccsu_w_h00.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_EE_SULOOP(32, 16, 16, { + p_rd += sext32(p_rs1) * zext32(p_rs2); +} +) diff --git a/riscv/insns/pmaccsu_w_h11.h b/riscv/insns/pmaccsu_w_h11.h new file mode 100644 index 00000000..dbe0b7fa --- /dev/null +++ b/riscv/insns/pmaccsu_w_h11.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_OO_SULOOP(32, 16, 16, { + p_rd += sext32(p_rs1) * zext32(p_rs2); +} +) diff --git a/riscv/insns/pmaccu_w_h00.h b/riscv/insns/pmaccu_w_h00.h new file mode 100644 index 00000000..001f7f42 --- /dev/null +++ b/riscv/insns/pmaccu_w_h00.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_EE_ULOOP(32, 16, 16, { + p_rd += zext32(p_rs1) * zext32(p_rs2); +} +) diff --git a/riscv/insns/pmaccu_w_h01.h b/riscv/insns/pmaccu_w_h01.h new file mode 100644 index 00000000..da2a195c --- /dev/null +++ b/riscv/insns/pmaccu_w_h01.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_EO_ULOOP(32, 16, 16, { + p_rd += zext32(p_rs1) * zext32(p_rs2); +} +) diff --git a/riscv/insns/pmaccu_w_h11.h b/riscv/insns/pmaccu_w_h11.h new file mode 100644 index 00000000..9aa94bd0 --- /dev/null +++ b/riscv/insns/pmaccu_w_h11.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_OO_ULOOP(32, 16, 16, { + p_rd += zext32(p_rs1) * zext32(p_rs2); +} +) diff --git a/riscv/insns/pmax_b.h b/riscv/insns/pmax_b.h new file mode 100644 index 00000000..9ab92eb3 --- /dev/null +++ b/riscv/insns/pmax_b.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_LOOP(8,8,8, { + p_rd = (p_rs1 > p_rs2) ? p_rs1 : p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pmax_db.h b/riscv/insns/pmax_db.h new file mode 100644 index 00000000..83c08cbb --- /dev/null +++ b/riscv/insns/pmax_db.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(8, 8, 8, { + p_rd = (p_rs1 > p_rs2) ? p_rs1 : p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pmax_dh.h b/riscv/insns/pmax_dh.h new file mode 100644 index 00000000..02b641aa --- /dev/null +++ b/riscv/insns/pmax_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(16, 16, 16, { + p_rd = (p_rs1 > p_rs2) ? p_rs1 : p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pmax_dw.h b/riscv/insns/pmax_dw.h new file mode 100644 index 00000000..e9df1181 --- /dev/null +++ b/riscv/insns/pmax_dw.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(32, 32, 32, { + p_rd = (p_rs1 > p_rs2) ? p_rs1 : p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pmax_h.h b/riscv/insns/pmax_h.h new file mode 100644 index 00000000..b1e9c0ad --- /dev/null +++ b/riscv/insns/pmax_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_LOOP(16,16,16, { + p_rd = (p_rs1 > p_rs2) ? p_rs1 : p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pmax_w.h b/riscv/insns/pmax_w.h new file mode 100644 index 00000000..ce11a5bb --- /dev/null +++ b/riscv/insns/pmax_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_LOOP(32,32,32, { + p_rd = (p_rs1 > p_rs2) ? p_rs1 : p_rs2; +} +) diff --git a/riscv/insns/pmaxu_b.h b/riscv/insns/pmaxu_b.h new file mode 100644 index 00000000..82b60f67 --- /dev/null +++ b/riscv/insns/pmaxu_b.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_ULOOP(8,8,8, { + p_rd = (p_rs1 > p_rs2) ? p_rs1 : p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pmaxu_db.h b/riscv/insns/pmaxu_db.h new file mode 100644 index 00000000..43ad8537 --- /dev/null +++ b/riscv/insns/pmaxu_db.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(8, 8, 8, { + p_rd = (p_rs1 > p_rs2) ? p_rs1 : p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pmaxu_dh.h b/riscv/insns/pmaxu_dh.h new file mode 100644 index 00000000..7d04b443 --- /dev/null +++ b/riscv/insns/pmaxu_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(16, 16, 16, { + p_rd = (p_rs1 > p_rs2) ? p_rs1 : p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pmaxu_dw.h b/riscv/insns/pmaxu_dw.h new file mode 100644 index 00000000..5c3586d4 --- /dev/null +++ b/riscv/insns/pmaxu_dw.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(32, 32, 32, { + p_rd = (p_rs1 > p_rs2) ? p_rs1 : p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pmaxu_h.h b/riscv/insns/pmaxu_h.h new file mode 100644 index 00000000..ac6f6028 --- /dev/null +++ b/riscv/insns/pmaxu_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_ULOOP(16,16,16, { + p_rd = (p_rs1 > p_rs2) ? p_rs1 : p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pmaxu_w.h b/riscv/insns/pmaxu_w.h new file mode 100644 index 00000000..76648af7 --- /dev/null +++ b/riscv/insns/pmaxu_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_ULOOP(32,32,32, { + p_rd = (p_rs1 > p_rs2) ? p_rs1 : p_rs2; +} +) diff --git a/riscv/insns/pmhacc_h.h b/riscv/insns/pmhacc_h.h new file mode 100644 index 00000000..053c2858 --- /dev/null +++ b/riscv/insns/pmhacc_h.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_LOOP(16,16,16, { + int32_t mres = sext32(p_rs1) * sext32(p_rs2); + p_rd += mres>>16; +})
\ No newline at end of file diff --git a/riscv/insns/pmhacc_h_b0.h b/riscv/insns/pmhacc_h_b0.h new file mode 100644 index 00000000..60a1d5c2 --- /dev/null +++ b/riscv/insns/pmhacc_h_b0.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_E_LOOP(16,16,8, { + int32_t mres = sext32(p_rs1) * sext32(p_rs2); + p_rd += mres>>16; +})
\ No newline at end of file diff --git a/riscv/insns/pmhacc_h_b1.h b/riscv/insns/pmhacc_h_b1.h new file mode 100644 index 00000000..c7aa4d7a --- /dev/null +++ b/riscv/insns/pmhacc_h_b1.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_O_LOOP(16,16,8, { + int32_t mres = sext32(p_rs1) * sext32(p_rs2); + p_rd += mres>>16; +})
\ No newline at end of file diff --git a/riscv/insns/pmhacc_w.h b/riscv/insns/pmhacc_w.h new file mode 100644 index 00000000..49f01c3f --- /dev/null +++ b/riscv/insns/pmhacc_w.h @@ -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; +} +) diff --git a/riscv/insns/pmhacc_w_h0.h b/riscv/insns/pmhacc_w_h0.h new file mode 100644 index 00000000..76b33778 --- /dev/null +++ b/riscv/insns/pmhacc_w_h0.h @@ -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; +} +) diff --git a/riscv/insns/pmhacc_w_h1.h b/riscv/insns/pmhacc_w_h1.h new file mode 100644 index 00000000..9f103ad6 --- /dev/null +++ b/riscv/insns/pmhacc_w_h1.h @@ -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; +} +) diff --git a/riscv/insns/pmhaccsu_h.h b/riscv/insns/pmhaccsu_h.h new file mode 100644 index 00000000..10b0211c --- /dev/null +++ b/riscv/insns/pmhaccsu_h.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_SULOOP(16,16,16, { + int32_t mres = sext(p_rs1,32) * zext(p_rs2,32); + p_rd += mres>>16; +})
\ No newline at end of file diff --git a/riscv/insns/pmhaccsu_h_b0.h b/riscv/insns/pmhaccsu_h_b0.h new file mode 100644 index 00000000..3d14229b --- /dev/null +++ b/riscv/insns/pmhaccsu_h_b0.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_E_SULOOP(16,16,8, { + int32_t mres = sext(p_rs1,32) * zext(p_rs2,32); + p_rd += mres>>16; +})
\ No newline at end of file diff --git a/riscv/insns/pmhaccsu_h_b1.h b/riscv/insns/pmhaccsu_h_b1.h new file mode 100644 index 00000000..6a5a478f --- /dev/null +++ b/riscv/insns/pmhaccsu_h_b1.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_O_SULOOP(16,16,8, { + int32_t mres = sext(p_rs1,32) * zext(p_rs2,32); + p_rd += mres>>16; +})
\ No newline at end of file diff --git a/riscv/insns/pmhaccsu_w.h b/riscv/insns/pmhaccsu_w.h new file mode 100644 index 00000000..f82a283e --- /dev/null +++ b/riscv/insns/pmhaccsu_w.h @@ -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; +} +) diff --git a/riscv/insns/pmhaccsu_w_h0.h b/riscv/insns/pmhaccsu_w_h0.h new file mode 100644 index 00000000..400eaa92 --- /dev/null +++ b/riscv/insns/pmhaccsu_w_h0.h @@ -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; +} +) diff --git a/riscv/insns/pmhaccsu_w_h1.h b/riscv/insns/pmhaccsu_w_h1.h new file mode 100644 index 00000000..55b07f20 --- /dev/null +++ b/riscv/insns/pmhaccsu_w_h1.h @@ -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; +} +) diff --git a/riscv/insns/pmhaccu_h.h b/riscv/insns/pmhaccu_h.h new file mode 100644 index 00000000..de1c6eb1 --- /dev/null +++ b/riscv/insns/pmhaccu_h.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_ULOOP(16,16,16, { + uint32_t mres = zext(p_rs1,32) * zext(p_rs2,32); + p_rd += mres>>16; +})
\ No newline at end of file diff --git a/riscv/insns/pmhaccu_w.h b/riscv/insns/pmhaccu_w.h new file mode 100644 index 00000000..4e8950ac --- /dev/null +++ b/riscv/insns/pmhaccu_w.h @@ -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; +} +) diff --git a/riscv/insns/pmhracc_h.h b/riscv/insns/pmhracc_h.h new file mode 100644 index 00000000..1c79a71a --- /dev/null +++ b/riscv/insns/pmhracc_h.h @@ -0,0 +1,5 @@ +P_RD_RS1_RS2_LOOP(16,16,16, { + int32_t mres = sext(p_rs1,32) * sext(p_rs2,32); + int16_t round = ((mres >> 15) + 1) >> 1; + p_rd += round; +})
\ No newline at end of file diff --git a/riscv/insns/pmhracc_w.h b/riscv/insns/pmhracc_w.h new file mode 100644 index 00000000..1a07d5a4 --- /dev/null +++ b/riscv/insns/pmhracc_w.h @@ -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; +} +) diff --git a/riscv/insns/pmhraccsu_h.h b/riscv/insns/pmhraccsu_h.h new file mode 100644 index 00000000..c4302837 --- /dev/null +++ b/riscv/insns/pmhraccsu_h.h @@ -0,0 +1,5 @@ +P_RD_RS1_RS2_SULOOP(16,16,16, { + int32_t mres = sext(p_rs1,32) * zext(p_rs2,32); + int16_t round = ((mres >> 15) + 1) >> 1; + p_rd += round; +})
\ No newline at end of file diff --git a/riscv/insns/pmhraccsu_w.h b/riscv/insns/pmhraccsu_w.h new file mode 100644 index 00000000..7f1d648d --- /dev/null +++ b/riscv/insns/pmhraccsu_w.h @@ -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; +} +) diff --git a/riscv/insns/pmhraccu_h.h b/riscv/insns/pmhraccu_h.h new file mode 100644 index 00000000..41efaad8 --- /dev/null +++ b/riscv/insns/pmhraccu_h.h @@ -0,0 +1,5 @@ +P_RD_RS1_RS2_ULOOP(16,16,16, { + uint32_t mres = zext(p_rs1,32) * zext(p_rs2,32); + uint16_t round = ((mres >> 15) + 1) >> 1; + p_rd += round; +})
\ No newline at end of file diff --git a/riscv/insns/pmhraccu_w.h b/riscv/insns/pmhraccu_w.h new file mode 100644 index 00000000..d25a0786 --- /dev/null +++ b/riscv/insns/pmhraccu_w.h @@ -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; +} +) diff --git a/riscv/insns/pmin_b.h b/riscv/insns/pmin_b.h new file mode 100644 index 00000000..402301c0 --- /dev/null +++ b/riscv/insns/pmin_b.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_LOOP(8,8,8, { + p_rd = (p_rs1 < p_rs2) ? p_rs1 : p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pmin_db.h b/riscv/insns/pmin_db.h new file mode 100644 index 00000000..7da8293a --- /dev/null +++ b/riscv/insns/pmin_db.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(8, 8, 8, { + p_rd = (p_rs1 < p_rs2) ? p_rs1 : p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pmin_dh.h b/riscv/insns/pmin_dh.h new file mode 100644 index 00000000..709f9d94 --- /dev/null +++ b/riscv/insns/pmin_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(16, 16, 16, { + p_rd = (p_rs1 < p_rs2) ? p_rs1 : p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pmin_dw.h b/riscv/insns/pmin_dw.h new file mode 100644 index 00000000..ba14e5ac --- /dev/null +++ b/riscv/insns/pmin_dw.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(32, 32, 32, { + p_rd = (p_rs1 < p_rs2) ? p_rs1 : p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pmin_h.h b/riscv/insns/pmin_h.h new file mode 100644 index 00000000..2634f3cd --- /dev/null +++ b/riscv/insns/pmin_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_LOOP(16,16,16, { + p_rd = (p_rs1 < p_rs2) ? p_rs1 : p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pmin_w.h b/riscv/insns/pmin_w.h new file mode 100644 index 00000000..3afc921f --- /dev/null +++ b/riscv/insns/pmin_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_LOOP(32,32,32, { + p_rd = (p_rs1 < p_rs2) ? p_rs1 : p_rs2; +} +) diff --git a/riscv/insns/pminu_b.h b/riscv/insns/pminu_b.h new file mode 100644 index 00000000..1156ff22 --- /dev/null +++ b/riscv/insns/pminu_b.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_ULOOP(8,8,8, { + p_rd = (p_rs1 < p_rs2) ? p_rs1 : p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pminu_db.h b/riscv/insns/pminu_db.h new file mode 100644 index 00000000..fd4a3799 --- /dev/null +++ b/riscv/insns/pminu_db.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(8, 8, 8, { + p_rd = (p_rs1 < p_rs2) ? p_rs1 : p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pminu_dh.h b/riscv/insns/pminu_dh.h new file mode 100644 index 00000000..8932cf0a --- /dev/null +++ b/riscv/insns/pminu_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(16, 16, 16, { + p_rd = (p_rs1 < p_rs2) ? p_rs1 : p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pminu_dw.h b/riscv/insns/pminu_dw.h new file mode 100644 index 00000000..051fcb94 --- /dev/null +++ b/riscv/insns/pminu_dw.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(32, 32, 32, { + p_rd = (p_rs1 < p_rs2) ? p_rs1 : p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pminu_h.h b/riscv/insns/pminu_h.h new file mode 100644 index 00000000..734339c8 --- /dev/null +++ b/riscv/insns/pminu_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_ULOOP(16,16,16, { + p_rd = (p_rs1 < p_rs2) ? p_rs1 : p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pminu_w.h b/riscv/insns/pminu_w.h new file mode 100644 index 00000000..a3b671d5 --- /dev/null +++ b/riscv/insns/pminu_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_ULOOP(32,32,32, { + p_rd = (p_rs1 < p_rs2) ? p_rs1 : p_rs2; +} +) diff --git a/riscv/insns/pmq2add_h.h b/riscv/insns/pmq2add_h.h new file mode 100644 index 00000000..efa6e8ff --- /dev/null +++ b/riscv/insns/pmq2add_h.h @@ -0,0 +1,3 @@ +P_REDUCTION_LOOP(32, 16, false, false, { + p_res += (p_rs1 * p_rs2) >> 15; +})
\ No newline at end of file diff --git a/riscv/insns/pmq2add_w.h b/riscv/insns/pmq2add_w.h new file mode 100644 index 00000000..261dd846 --- /dev/null +++ b/riscv/insns/pmq2add_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_REDUCTION_LOOP(64, 32, false, false, { + p_res += ((sreg_t)p_rs1 * p_rs2) >> 31; +} +) diff --git a/riscv/insns/pmq2adda_h.h b/riscv/insns/pmq2adda_h.h new file mode 100644 index 00000000..70e4a5c2 --- /dev/null +++ b/riscv/insns/pmq2adda_h.h @@ -0,0 +1,3 @@ +P_REDUCTION_LOOP(32, 16, true, false, { + p_res += (p_rs1 * p_rs2) >> 15; +})
\ No newline at end of file diff --git a/riscv/insns/pmq2adda_w.h b/riscv/insns/pmq2adda_w.h new file mode 100644 index 00000000..5523d3f6 --- /dev/null +++ b/riscv/insns/pmq2adda_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_REDUCTION_LOOP(64, 32, true, false, { + p_res += ((sreg_t)p_rs1 * p_rs2) >> 31; +} +) diff --git a/riscv/insns/pmqacc_w_h00.h b/riscv/insns/pmqacc_w_h00.h new file mode 100644 index 00000000..467eeedb --- /dev/null +++ b/riscv/insns/pmqacc_w_h00.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_EE_LOOP(32, 16, 16, { + p_rd += (p_rs1 * p_rs2) >> 15; +}) + diff --git a/riscv/insns/pmqacc_w_h01.h b/riscv/insns/pmqacc_w_h01.h new file mode 100644 index 00000000..52e5fae0 --- /dev/null +++ b/riscv/insns/pmqacc_w_h01.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_EO_LOOP(32, 16, 16, { + p_rd += (p_rs1 * p_rs2) >> 15; +}) + diff --git a/riscv/insns/pmqacc_w_h11.h b/riscv/insns/pmqacc_w_h11.h new file mode 100644 index 00000000..a377e1af --- /dev/null +++ b/riscv/insns/pmqacc_w_h11.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_OO_LOOP(32, 16, 16, { + p_rd += (p_rs1 * p_rs2) >> 15; +}) + diff --git a/riscv/insns/pmqr2add_h.h b/riscv/insns/pmqr2add_h.h new file mode 100644 index 00000000..ee8ac64a --- /dev/null +++ b/riscv/insns/pmqr2add_h.h @@ -0,0 +1,3 @@ +P_REDUCTION_LOOP(32, 16, false, false, { + p_res += ((p_rs1 * p_rs2) + 0x4000) >> 15; +})
\ No newline at end of file diff --git a/riscv/insns/pmqr2add_w.h b/riscv/insns/pmqr2add_w.h new file mode 100644 index 00000000..ab46915b --- /dev/null +++ b/riscv/insns/pmqr2add_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_REDUCTION_LOOP(64, 32, false, false, { + p_res += (((sreg_t)p_rs1 * p_rs2) + 0x40000000) >> 31; +} +) diff --git a/riscv/insns/pmqr2adda_h.h b/riscv/insns/pmqr2adda_h.h new file mode 100644 index 00000000..7352e174 --- /dev/null +++ b/riscv/insns/pmqr2adda_h.h @@ -0,0 +1,3 @@ +P_REDUCTION_LOOP(32, 16, true, false, { + p_res += ((p_rs1 * p_rs2) + 0x4000) >> 15; +})
\ No newline at end of file diff --git a/riscv/insns/pmqr2adda_w.h b/riscv/insns/pmqr2adda_w.h new file mode 100644 index 00000000..36dce27e --- /dev/null +++ b/riscv/insns/pmqr2adda_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_REDUCTION_LOOP(64, 32, true, false, { + p_res += (((sreg_t)p_rs1 * p_rs2) + 0x40000000) >> 31; +} +) diff --git a/riscv/insns/pmqracc_w_h00.h b/riscv/insns/pmqracc_w_h00.h new file mode 100644 index 00000000..45b86be2 --- /dev/null +++ b/riscv/insns/pmqracc_w_h00.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_EE_LOOP(32, 16, 16, { + p_rd += (p_rs1 * p_rs2 + 0x4000) >> 15; +} +) diff --git a/riscv/insns/pmqracc_w_h01.h b/riscv/insns/pmqracc_w_h01.h new file mode 100644 index 00000000..3dd8a325 --- /dev/null +++ b/riscv/insns/pmqracc_w_h01.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_EO_LOOP(32, 16, 16, { + p_rd += (p_rs1 * p_rs2 + 0x4000) >> 15; +} +) diff --git a/riscv/insns/pmqracc_w_h11.h b/riscv/insns/pmqracc_w_h11.h new file mode 100644 index 00000000..a4250093 --- /dev/null +++ b/riscv/insns/pmqracc_w_h11.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_OO_LOOP(32, 16, 16, { + p_rd += (p_rs1 * p_rs2 + 0x4000) >> 15; +} +) diff --git a/riscv/insns/pmqrwacc_h.h b/riscv/insns/pmqrwacc_h.h new file mode 100644 index 00000000..41ab71ea --- /dev/null +++ b/riscv/insns/pmqrwacc_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_LOOP(16, 16, { + p_rd += (p_rs1 * p_rs2 + 0x4000) >> 15; +})
\ No newline at end of file diff --git a/riscv/insns/pmqwacc_h.h b/riscv/insns/pmqwacc_h.h new file mode 100644 index 00000000..e6629270 --- /dev/null +++ b/riscv/insns/pmqwacc_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_LOOP(16, 16, { + p_rd += (p_rs1 * p_rs2) >> 15; +})
\ No newline at end of file diff --git a/riscv/insns/pmseq_b.h b/riscv/insns/pmseq_b.h new file mode 100644 index 00000000..bd66522d --- /dev/null +++ b/riscv/insns/pmseq_b.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_LOOP(8,8,8, { + p_rd = (p_rs1 == p_rs2) ? -1 : 0; +})
\ No newline at end of file diff --git a/riscv/insns/pmseq_db.h b/riscv/insns/pmseq_db.h new file mode 100644 index 00000000..5013861a --- /dev/null +++ b/riscv/insns/pmseq_db.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(8, 8, 8, { + p_rd = (p_rs1 == p_rs2) ? -1 : 0; +})
\ No newline at end of file diff --git a/riscv/insns/pmseq_dh.h b/riscv/insns/pmseq_dh.h new file mode 100644 index 00000000..9abeae08 --- /dev/null +++ b/riscv/insns/pmseq_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(16, 16, 16, { + p_rd = (p_rs1 == p_rs2) ? -1 : 0; +})
\ No newline at end of file diff --git a/riscv/insns/pmseq_dw.h b/riscv/insns/pmseq_dw.h new file mode 100644 index 00000000..920020fd --- /dev/null +++ b/riscv/insns/pmseq_dw.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(32, 32, 32, { + p_rd = (p_rs1 == p_rs2) ? -1 : 0; +})
\ No newline at end of file diff --git a/riscv/insns/pmseq_h.h b/riscv/insns/pmseq_h.h new file mode 100644 index 00000000..3a9b42f8 --- /dev/null +++ b/riscv/insns/pmseq_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_LOOP(16,16,16, { + p_rd = (p_rs1 == p_rs2) ? -1 : 0; +})
\ No newline at end of file diff --git a/riscv/insns/pmseq_w.h b/riscv/insns/pmseq_w.h new file mode 100644 index 00000000..9bf60850 --- /dev/null +++ b/riscv/insns/pmseq_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_LOOP(32,32,32, { + p_rd = (p_rs1 == p_rs2) ? -1 : 0; +} +) diff --git a/riscv/insns/pmslt_b.h b/riscv/insns/pmslt_b.h new file mode 100644 index 00000000..d0c1d1a6 --- /dev/null +++ b/riscv/insns/pmslt_b.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_LOOP(8,8,8, { + p_rd = (p_rs1 < p_rs2) ? -1 : 0; +})
\ No newline at end of file diff --git a/riscv/insns/pmslt_db.h b/riscv/insns/pmslt_db.h new file mode 100644 index 00000000..807f65b5 --- /dev/null +++ b/riscv/insns/pmslt_db.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(8, 8, 8, { + p_rd = (p_rs1 < p_rs2) ? -1 : 0; +})
\ No newline at end of file diff --git a/riscv/insns/pmslt_dh.h b/riscv/insns/pmslt_dh.h new file mode 100644 index 00000000..6d6b997b --- /dev/null +++ b/riscv/insns/pmslt_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(16, 16, 16, { + p_rd = (p_rs1 < p_rs2) ? -1 : 0; +})
\ No newline at end of file diff --git a/riscv/insns/pmslt_dw.h b/riscv/insns/pmslt_dw.h new file mode 100644 index 00000000..889a368f --- /dev/null +++ b/riscv/insns/pmslt_dw.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(32, 32, 32, { + p_rd = (p_rs1 < p_rs2) ? -1 : 0; +})
\ No newline at end of file diff --git a/riscv/insns/pmslt_h.h b/riscv/insns/pmslt_h.h new file mode 100644 index 00000000..73f71531 --- /dev/null +++ b/riscv/insns/pmslt_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_LOOP(16,16,16, { + p_rd = (p_rs1 < p_rs2) ? -1 : 0; +})
\ No newline at end of file diff --git a/riscv/insns/pmslt_w.h b/riscv/insns/pmslt_w.h new file mode 100644 index 00000000..41ca2410 --- /dev/null +++ b/riscv/insns/pmslt_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_LOOP(32,32,32, { + p_rd = (p_rs1 < p_rs2) ? -1 : 0; +} +) diff --git a/riscv/insns/pmsltu_b.h b/riscv/insns/pmsltu_b.h new file mode 100644 index 00000000..8e39925b --- /dev/null +++ b/riscv/insns/pmsltu_b.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_ULOOP(8,8,8, { + p_rd = (p_rs1 < p_rs2) ? -1 : 0; +})
\ No newline at end of file diff --git a/riscv/insns/pmsltu_db.h b/riscv/insns/pmsltu_db.h new file mode 100644 index 00000000..e03d7e3a --- /dev/null +++ b/riscv/insns/pmsltu_db.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(8 ,8 ,8, { + p_rd = (p_rs1 < p_rs2) ? -1 : 0; +})
\ No newline at end of file diff --git a/riscv/insns/pmsltu_dh.h b/riscv/insns/pmsltu_dh.h new file mode 100644 index 00000000..84f3def2 --- /dev/null +++ b/riscv/insns/pmsltu_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(16, 16, 16, { + p_rd = (p_rs1 < p_rs2) ? -1 : 0; +})
\ No newline at end of file diff --git a/riscv/insns/pmsltu_dw.h b/riscv/insns/pmsltu_dw.h new file mode 100644 index 00000000..cc397ef9 --- /dev/null +++ b/riscv/insns/pmsltu_dw.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(32, 32, 32, { + p_rd = (p_rs1 < p_rs2) ? -1 : 0; +})
\ No newline at end of file diff --git a/riscv/insns/pmsltu_h.h b/riscv/insns/pmsltu_h.h new file mode 100644 index 00000000..90d21792 --- /dev/null +++ b/riscv/insns/pmsltu_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_ULOOP(16,16,16, { + p_rd = (p_rs1 < p_rs2) ? -1 : 0; +})
\ No newline at end of file diff --git a/riscv/insns/pmsltu_w.h b/riscv/insns/pmsltu_w.h new file mode 100644 index 00000000..a96e0486 --- /dev/null +++ b/riscv/insns/pmsltu_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_ULOOP(32,32,32, { + p_rd = (p_rs1 < p_rs2) ? -1 : 0; +} +) diff --git a/riscv/insns/pmul_h_b00.h b/riscv/insns/pmul_h_b00.h new file mode 100644 index 00000000..41af6b34 --- /dev/null +++ b/riscv/insns/pmul_h_b00.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_EE_LOOP(16, 8, 8, { + p_rd = sext32(p_rs1) * sext32(p_rs2); +})
\ No newline at end of file diff --git a/riscv/insns/pmul_h_b01.h b/riscv/insns/pmul_h_b01.h new file mode 100644 index 00000000..1cb85a1b --- /dev/null +++ b/riscv/insns/pmul_h_b01.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_EO_LOOP(16, 8, 8, { + p_rd = sext32(p_rs1) * sext32(p_rs2); +})
\ No newline at end of file diff --git a/riscv/insns/pmul_h_b11.h b/riscv/insns/pmul_h_b11.h new file mode 100644 index 00000000..8a1765d2 --- /dev/null +++ b/riscv/insns/pmul_h_b11.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_OO_LOOP(16, 8, 8, { + p_rd = sext32(p_rs1) * sext32(p_rs2); +})
\ No newline at end of file diff --git a/riscv/insns/pmul_w_h00.h b/riscv/insns/pmul_w_h00.h new file mode 100644 index 00000000..3181609f --- /dev/null +++ b/riscv/insns/pmul_w_h00.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_EE_LOOP(32, 16, 16, { + p_rd = sext32(p_rs1) * sext32(p_rs2); +} +) diff --git a/riscv/insns/pmul_w_h01.h b/riscv/insns/pmul_w_h01.h new file mode 100644 index 00000000..c7468696 --- /dev/null +++ b/riscv/insns/pmul_w_h01.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_EO_LOOP(32, 16, 16, { + p_rd = sext32(p_rs1) * sext32(p_rs2); +} +) diff --git a/riscv/insns/pmul_w_h11.h b/riscv/insns/pmul_w_h11.h new file mode 100644 index 00000000..4a719d04 --- /dev/null +++ b/riscv/insns/pmul_w_h11.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_OO_LOOP(32, 16, 16, { + p_rd = sext32(p_rs1) * sext32(p_rs2); +} +) diff --git a/riscv/insns/pmulh_h.h b/riscv/insns/pmulh_h.h new file mode 100644 index 00000000..0e199f7b --- /dev/null +++ b/riscv/insns/pmulh_h.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_LOOP(16,16,16, { + int32_t mres = sext(p_rs1,32) * sext(p_rs2,32); + p_rd = mres >> 16; +})
\ No newline at end of file diff --git a/riscv/insns/pmulh_h_b0.h b/riscv/insns/pmulh_h_b0.h new file mode 100644 index 00000000..5c69a9c6 --- /dev/null +++ b/riscv/insns/pmulh_h_b0.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_E_LOOP(16,16,8, { + int32_t mres = sext(p_rs1,32) * sext(p_rs2,32); + p_rd = mres >> 16; +})
\ No newline at end of file diff --git a/riscv/insns/pmulh_h_b1.h b/riscv/insns/pmulh_h_b1.h new file mode 100644 index 00000000..1cd5d680 --- /dev/null +++ b/riscv/insns/pmulh_h_b1.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_O_LOOP(16,16,8, { + int32_t mres = sext(p_rs1,32) * sext(p_rs2,32); + p_rd = mres >> 16; +})
\ No newline at end of file diff --git a/riscv/insns/pmulh_w.h b/riscv/insns/pmulh_w.h new file mode 100644 index 00000000..9e13219f --- /dev/null +++ b/riscv/insns/pmulh_w.h @@ -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; +} +) diff --git a/riscv/insns/pmulh_w_h0.h b/riscv/insns/pmulh_w_h0.h new file mode 100644 index 00000000..bff17442 --- /dev/null +++ b/riscv/insns/pmulh_w_h0.h @@ -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; +} +) diff --git a/riscv/insns/pmulh_w_h1.h b/riscv/insns/pmulh_w_h1.h new file mode 100644 index 00000000..3a62a4aa --- /dev/null +++ b/riscv/insns/pmulh_w_h1.h @@ -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; +} +) diff --git a/riscv/insns/pmulhr_h.h b/riscv/insns/pmulhr_h.h new file mode 100644 index 00000000..fbccf0fe --- /dev/null +++ b/riscv/insns/pmulhr_h.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_LOOP(16,16,16, { + int32_t mres = sext(p_rs1,32) * sext(p_rs2,32); + p_rd = ((mres >> 15) + 1) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/pmulhr_w.h b/riscv/insns/pmulhr_w.h new file mode 100644 index 00000000..24c32972 --- /dev/null +++ b/riscv/insns/pmulhr_w.h @@ -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; +} +) diff --git a/riscv/insns/pmulhrsu_h.h b/riscv/insns/pmulhrsu_h.h new file mode 100644 index 00000000..ab681ef0 --- /dev/null +++ b/riscv/insns/pmulhrsu_h.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_SULOOP(16,16,16, { + int32_t mres = sext(p_rs1,32) * zext(p_rs2,32); + p_rd = ((mres >> 15) + 1) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/pmulhrsu_w.h b/riscv/insns/pmulhrsu_w.h new file mode 100644 index 00000000..2e163636 --- /dev/null +++ b/riscv/insns/pmulhrsu_w.h @@ -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; +} +) diff --git a/riscv/insns/pmulhru_h.h b/riscv/insns/pmulhru_h.h new file mode 100644 index 00000000..82f1bfe5 --- /dev/null +++ b/riscv/insns/pmulhru_h.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_ULOOP(16,16,16, { + uint32_t mres = zext(p_rs1,32) * zext(p_rs2,32); + p_rd = ((mres >> 15) + 1) >> 1; +})
\ No newline at end of file diff --git a/riscv/insns/pmulhru_w.h b/riscv/insns/pmulhru_w.h new file mode 100644 index 00000000..b067d3f1 --- /dev/null +++ b/riscv/insns/pmulhru_w.h @@ -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; +} +) diff --git a/riscv/insns/pmulhsu_h.h b/riscv/insns/pmulhsu_h.h new file mode 100644 index 00000000..d4f07462 --- /dev/null +++ b/riscv/insns/pmulhsu_h.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_SULOOP(16,16,16, { + int32_t mres = sext(p_rs1,32) * zext(p_rs2,32); + p_rd = mres >> 16; +})
\ No newline at end of file diff --git a/riscv/insns/pmulhsu_h_b0.h b/riscv/insns/pmulhsu_h_b0.h new file mode 100644 index 00000000..3cfdd4b4 --- /dev/null +++ b/riscv/insns/pmulhsu_h_b0.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_E_SULOOP(16,16,8, { + int32_t mres = sext(p_rs1,32) * zext(p_rs2,32); + p_rd = mres >> 16; +})
\ No newline at end of file diff --git a/riscv/insns/pmulhsu_h_b1.h b/riscv/insns/pmulhsu_h_b1.h new file mode 100644 index 00000000..4e6b5bf3 --- /dev/null +++ b/riscv/insns/pmulhsu_h_b1.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_O_SULOOP(16,16,8, { + int32_t mres = sext(p_rs1,32) * zext(p_rs2,32); + p_rd = mres >> 16; +})
\ No newline at end of file diff --git a/riscv/insns/pmulhsu_w.h b/riscv/insns/pmulhsu_w.h new file mode 100644 index 00000000..7dbca256 --- /dev/null +++ b/riscv/insns/pmulhsu_w.h @@ -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; +} +) diff --git a/riscv/insns/pmulhsu_w_h0.h b/riscv/insns/pmulhsu_w_h0.h new file mode 100644 index 00000000..c4a28c74 --- /dev/null +++ b/riscv/insns/pmulhsu_w_h0.h @@ -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; +} +) diff --git a/riscv/insns/pmulhsu_w_h1.h b/riscv/insns/pmulhsu_w_h1.h new file mode 100644 index 00000000..fd5f2345 --- /dev/null +++ b/riscv/insns/pmulhsu_w_h1.h @@ -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; +} +) diff --git a/riscv/insns/pmulhu_h.h b/riscv/insns/pmulhu_h.h new file mode 100644 index 00000000..32a1b280 --- /dev/null +++ b/riscv/insns/pmulhu_h.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_ULOOP(16,16,16, { + uint32_t mres = zext(p_rs1,32) * zext(p_rs2,32); + p_rd = mres >> 16; +})
\ No newline at end of file diff --git a/riscv/insns/pmulhu_w.h b/riscv/insns/pmulhu_w.h new file mode 100644 index 00000000..a24e264e --- /dev/null +++ b/riscv/insns/pmulhu_w.h @@ -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; +} +) diff --git a/riscv/insns/pmulq_h.h b/riscv/insns/pmulq_h.h new file mode 100644 index 00000000..667f75bb --- /dev/null +++ b/riscv/insns/pmulq_h.h @@ -0,0 +1,8 @@ +P_RD_RS1_RS2_LOOP(16,16,16, { + if ((p_rs1 != INT16_MIN) | (p_rs2 != INT16_MIN)) { + p_rd = (p_rs1 * p_rs2) >> 15; + } else { + p_rd = INT16_MAX; + P.VU.vxsat->write(1); + } +})
\ No newline at end of file diff --git a/riscv/insns/pmulq_w.h b/riscv/insns/pmulq_w.h new file mode 100644 index 00000000..55d594ae --- /dev/null +++ b/riscv/insns/pmulq_w.h @@ -0,0 +1,10 @@ +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; + P.VU.vxsat->write(1); + } +} +) diff --git a/riscv/insns/pmulqr_h.h b/riscv/insns/pmulqr_h.h new file mode 100644 index 00000000..e6cd66a2 --- /dev/null +++ b/riscv/insns/pmulqr_h.h @@ -0,0 +1,8 @@ +P_RD_RS1_RS2_LOOP(16,16,16, { + if ((p_rs1 != INT16_MIN) | (p_rs2 != INT16_MIN)) { + p_rd = (((p_rs1 * p_rs2) >> 14) + 1) >> 1; + } else { + p_rd = INT16_MAX; + P.VU.vxsat->write(1); + } +})
\ No newline at end of file diff --git a/riscv/insns/pmulqr_w.h b/riscv/insns/pmulqr_w.h new file mode 100644 index 00000000..f52820ca --- /dev/null +++ b/riscv/insns/pmulqr_w.h @@ -0,0 +1,10 @@ +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; + P.VU.vxsat->write(1); + } +} +) diff --git a/riscv/insns/pmulsu_h_b00.h b/riscv/insns/pmulsu_h_b00.h new file mode 100644 index 00000000..4682257e --- /dev/null +++ b/riscv/insns/pmulsu_h_b00.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_EE_SULOOP(16, 8, 8, { + p_rd = sext32(p_rs1) * zext32(p_rs2); +})
\ No newline at end of file diff --git a/riscv/insns/pmulsu_h_b11.h b/riscv/insns/pmulsu_h_b11.h new file mode 100644 index 00000000..57436181 --- /dev/null +++ b/riscv/insns/pmulsu_h_b11.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_OO_SULOOP(16, 8, 8, { + p_rd = sext32(p_rs1) * zext32(p_rs2); +})
\ No newline at end of file diff --git a/riscv/insns/pmulsu_w_h00.h b/riscv/insns/pmulsu_w_h00.h new file mode 100644 index 00000000..2bb05fbd --- /dev/null +++ b/riscv/insns/pmulsu_w_h00.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_EE_SULOOP(32, 16, 16, { + p_rd = sext32(p_rs1) * zext32(p_rs2); +} +) diff --git a/riscv/insns/pmulsu_w_h11.h b/riscv/insns/pmulsu_w_h11.h new file mode 100644 index 00000000..ed08d452 --- /dev/null +++ b/riscv/insns/pmulsu_w_h11.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_OO_SULOOP(32, 16, 16, { + p_rd = sext32(p_rs1) * zext32(p_rs2); +} +) diff --git a/riscv/insns/pmulu_h_b00.h b/riscv/insns/pmulu_h_b00.h new file mode 100644 index 00000000..8ff863f0 --- /dev/null +++ b/riscv/insns/pmulu_h_b00.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_EE_ULOOP(16, 8, 8, { + p_rd = zext32(p_rs1) * zext32(p_rs2); +})
\ No newline at end of file diff --git a/riscv/insns/pmulu_h_b01.h b/riscv/insns/pmulu_h_b01.h new file mode 100644 index 00000000..24d782cf --- /dev/null +++ b/riscv/insns/pmulu_h_b01.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_EO_ULOOP(16, 8, 8, { + p_rd = zext32(p_rs1) * zext32(p_rs2); +})
\ No newline at end of file diff --git a/riscv/insns/pmulu_h_b11.h b/riscv/insns/pmulu_h_b11.h new file mode 100644 index 00000000..31316a1d --- /dev/null +++ b/riscv/insns/pmulu_h_b11.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_OO_ULOOP(16, 8, 8, { + p_rd = zext32(p_rs1) * zext32(p_rs2); +})
\ No newline at end of file diff --git a/riscv/insns/pmulu_w_h00.h b/riscv/insns/pmulu_w_h00.h new file mode 100644 index 00000000..441e46d6 --- /dev/null +++ b/riscv/insns/pmulu_w_h00.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_EE_ULOOP(32, 16, 16, { + p_rd = zext32(p_rs1) * zext32(p_rs2); +} +) diff --git a/riscv/insns/pmulu_w_h01.h b/riscv/insns/pmulu_w_h01.h new file mode 100644 index 00000000..36c83c97 --- /dev/null +++ b/riscv/insns/pmulu_w_h01.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_EO_ULOOP(32, 16, 16, { + p_rd = zext32(p_rs1) * zext32(p_rs2); +} +) diff --git a/riscv/insns/pmulu_w_h11.h b/riscv/insns/pmulu_w_h11.h new file mode 100644 index 00000000..05957239 --- /dev/null +++ b/riscv/insns/pmulu_w_h11.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_OO_ULOOP(32, 16, 16, { + p_rd = zext32(p_rs1) * zext32(p_rs2); +} +) diff --git a/riscv/insns/pnclip_bs.h b/riscv/insns/pnclip_bs.h new file mode 100644 index 00000000..267aac7c --- /dev/null +++ b/riscv/insns/pnclip_bs.h @@ -0,0 +1,4 @@ +require_rv32; +P_NARROW_RD_RS1_LOOP(8, 16, { + p_rd = P_SAT(8, p_rs1 >> (P_FIELD(RS2, 0, 8) & 0xF)); +})
\ No newline at end of file diff --git a/riscv/insns/pnclip_hs.h b/riscv/insns/pnclip_hs.h new file mode 100644 index 00000000..c0adb127 --- /dev/null +++ b/riscv/insns/pnclip_hs.h @@ -0,0 +1,4 @@ +require_rv32; +P_NARROW_RD_RS1_LOOP(16, 32, { + p_rd = P_SAT(16, p_rs1 >> (P_FIELD(RS2, 0, 16) & 0X1F)); +})
\ No newline at end of file diff --git a/riscv/insns/pnclipi_b.h b/riscv/insns/pnclipi_b.h new file mode 100644 index 00000000..d18b3f4e --- /dev/null +++ b/riscv/insns/pnclipi_b.h @@ -0,0 +1,4 @@ +require_rv32; +P_NARROW_RD_RS1_LOOP(8, 16, { + p_rd = P_SAT(8, p_rs1 >> insn.shamth()); +})
\ No newline at end of file diff --git a/riscv/insns/pnclipi_h.h b/riscv/insns/pnclipi_h.h new file mode 100644 index 00000000..470afa04 --- /dev/null +++ b/riscv/insns/pnclipi_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_NARROW_RD_RS1_LOOP(16, 32, { + p_rd = P_SAT(16, p_rs1 >> insn.shamtw()); +})
\ No newline at end of file diff --git a/riscv/insns/pnclipiu_b.h b/riscv/insns/pnclipiu_b.h new file mode 100644 index 00000000..fadf004d --- /dev/null +++ b/riscv/insns/pnclipiu_b.h @@ -0,0 +1,4 @@ +require_rv32; +P_NARROW_RD_RS1_ULOOP(8, 16, { + p_rd = P_USAT_FULL(8, (sreg_t)(p_rs1 >> insn.shamth())); +})
\ No newline at end of file diff --git a/riscv/insns/pnclipiu_h.h b/riscv/insns/pnclipiu_h.h new file mode 100644 index 00000000..ac490333 --- /dev/null +++ b/riscv/insns/pnclipiu_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_NARROW_RD_RS1_ULOOP(16, 32, { + p_rd = P_USAT_FULL(16, (sreg_t)(p_rs1 >> insn.shamtw())); +})
\ No newline at end of file diff --git a/riscv/insns/pnclipp_b.h b/riscv/insns/pnclipp_b.h new file mode 100644 index 00000000..4f4b1a01 --- /dev/null +++ b/riscv/insns/pnclipp_b.h @@ -0,0 +1,13 @@ +require_extension('P'); +require_rv64; +reg_t rd_tmp = 0; +reg_t s_low = RS1; +reg_t s_high = RS2; +for (int i = 0; i < 8; i++) { + sreg_t s_h = (i < 4) ? P_FIELD(s_low, i, 16) : P_FIELD(s_high, i - 4, 16); + sreg_t sat_val = P_SAT(8, s_h); + if (sat_val != s_h) P.VU.vxsat->write(1); + rd_tmp = set_field(rd_tmp, make_mask64(i * 8, 8), (uint8_t)sat_val); +} +WRITE_RD(rd_tmp); + diff --git a/riscv/insns/pnclipp_h.h b/riscv/insns/pnclipp_h.h new file mode 100644 index 00000000..6eee48e0 --- /dev/null +++ b/riscv/insns/pnclipp_h.h @@ -0,0 +1,13 @@ +require_extension('P'); +require_rv64; +reg_t rd_tmp = 0; +reg_t s_low = RS1; +reg_t s_high = RS2; +for (int i = 0; i < 4; i++) { + sreg_t s_w = (i < 2) ? P_FIELD(s_low, i, 32) : P_FIELD(s_high, i - 2, 32); + sreg_t sat_val = P_SAT(16, s_w); + if (sat_val != s_w) P.VU.vxsat->write(1); + rd_tmp = set_field(rd_tmp, make_mask64(i * 16, 16), (uint16_t)sat_val); +} +WRITE_RD(rd_tmp); + diff --git a/riscv/insns/pnclipp_w.h b/riscv/insns/pnclipp_w.h new file mode 100644 index 00000000..880a72af --- /dev/null +++ b/riscv/insns/pnclipp_w.h @@ -0,0 +1,13 @@ +require_extension('P'); +require_rv64; +int64_t s1 = (int64_t)RS1; +int64_t s2 = (int64_t)RS2; + +sreg_t sat_w0 = P_SAT(32, s1); +if (sat_w0 != s1) P.VU.vxsat->write(1); + +sreg_t sat_w1 = P_SAT(32, s2); +if (sat_w1 != s2) P.VU.vxsat->write(1); + +WRITE_RD(((uint64_t)(uint32_t)sat_w1 << 32) | (uint32_t)sat_w0); + diff --git a/riscv/insns/pnclipr_bs.h b/riscv/insns/pnclipr_bs.h new file mode 100644 index 00000000..0d668354 --- /dev/null +++ b/riscv/insns/pnclipr_bs.h @@ -0,0 +1,13 @@ +require_rv32; +P_NARROW_RD_RS1_LOOP(8, 16, { + uint16_t shamt = P_FIELD(RS2, 0, 8) & 0xF; + sreg_t result; + if (shamt == 0) { + result = p_rs1; + } else { + sreg_t shifted = (sreg_t)p_rs1 >> shamt; + sreg_t roundbit = ((sreg_t)p_rs1 >> (shamt - 1)) & 1; + result = shifted + roundbit; + } + p_rd = P_SAT(8, result); +})
\ No newline at end of file diff --git a/riscv/insns/pnclipr_hs.h b/riscv/insns/pnclipr_hs.h new file mode 100644 index 00000000..3755a641 --- /dev/null +++ b/riscv/insns/pnclipr_hs.h @@ -0,0 +1,13 @@ +require_rv32; +P_NARROW_RD_RS1_LOOP(16, 32, { + uint32_t shamt = P_FIELD(RS2, 0, 16) & 0x1F; + sreg_t result; + if (shamt == 0) { + result = p_rs1; + } else { + sreg_t shifted = (sreg_t)p_rs1 >> shamt; + sreg_t roundbit = ((sreg_t)p_rs1 >> (shamt - 1)) & 1; + result = shifted + roundbit; + } + p_rd = P_SAT(16, result); +})
\ No newline at end of file diff --git a/riscv/insns/pnclipri_b.h b/riscv/insns/pnclipri_b.h new file mode 100644 index 00000000..e2e21b63 --- /dev/null +++ b/riscv/insns/pnclipri_b.h @@ -0,0 +1,13 @@ +require_rv32; +P_NARROW_RD_RS1_LOOP(8, 16, { + uint16_t shamt = insn.shamth(); + sreg_t result; + if (shamt == 0) { + result = p_rs1; + } else { + sreg_t shifted = (sreg_t)p_rs1 >> shamt; + sreg_t roundbit = ((sreg_t)p_rs1 >> (shamt - 1)) & 1; + result = shifted + roundbit; + } + p_rd = P_SAT(8, result); +})
\ No newline at end of file diff --git a/riscv/insns/pnclipri_h.h b/riscv/insns/pnclipri_h.h new file mode 100644 index 00000000..67bdcad9 --- /dev/null +++ b/riscv/insns/pnclipri_h.h @@ -0,0 +1,13 @@ +require_rv32; +P_NARROW_RD_RS1_LOOP(16, 32, { + uint32_t shamt = insn.shamtw(); + sreg_t result; + if (shamt == 0) { + result = p_rs1; + } else { + sreg_t shifted = (sreg_t)p_rs1 >> shamt; + sreg_t roundbit = ((sreg_t)p_rs1 >> (shamt - 1)) & 1; + result = shifted + roundbit; + } + p_rd = P_SAT(16, result); +})
\ No newline at end of file diff --git a/riscv/insns/pnclipriu_b.h b/riscv/insns/pnclipriu_b.h new file mode 100644 index 00000000..bb55a149 --- /dev/null +++ b/riscv/insns/pnclipriu_b.h @@ -0,0 +1,13 @@ +require_rv32; +P_NARROW_RD_RS1_ULOOP(8, 16, { + uint32_t shamt = insn.shamth(); + uint32_t result; + if (shamt == 0) { + result = p_rs1; + } else { + uint32_t shifted = p_rs1 >> shamt; + uint32_t roundbit = (p_rs1 >> (shamt - 1)) & 1; + result = shifted + roundbit; + } + p_rd = P_USAT_FULL(8, (sreg_t)result); +})
\ No newline at end of file diff --git a/riscv/insns/pnclipriu_h.h b/riscv/insns/pnclipriu_h.h new file mode 100644 index 00000000..4d2dbd9b --- /dev/null +++ b/riscv/insns/pnclipriu_h.h @@ -0,0 +1,13 @@ +require_rv32; +P_NARROW_RD_RS1_ULOOP(16, 32, { + uint32_t shamt = insn.shamtw(); + uint32_t result; + if (shamt == 0) { + result = p_rs1; + } else { + uint32_t shifted = p_rs1 >> shamt; + uint32_t roundbit = (p_rs1 >> (shamt - 1)) & 1; + result = shifted + roundbit; + } + p_rd = P_USAT_FULL(16, (sreg_t)result); +})
\ No newline at end of file diff --git a/riscv/insns/pnclipru_bs.h b/riscv/insns/pnclipru_bs.h new file mode 100644 index 00000000..25921dc6 --- /dev/null +++ b/riscv/insns/pnclipru_bs.h @@ -0,0 +1,13 @@ +require_rv32; +P_NARROW_RD_RS1_ULOOP(8, 16, { + uint32_t shamt = P_UFIELD(RS2, 0, 8) & 0xF; + uint32_t result; + if (shamt == 0) { + result = p_rs1; + } else { + uint32_t shifted = p_rs1 >> shamt; + uint32_t roundbit = (p_rs1 >> (shamt - 1)) & 1; + result = shifted + roundbit; + } + p_rd = P_USAT_FULL(8, (sreg_t)result); +})
\ No newline at end of file diff --git a/riscv/insns/pnclipru_hs.h b/riscv/insns/pnclipru_hs.h new file mode 100644 index 00000000..d4f82e88 --- /dev/null +++ b/riscv/insns/pnclipru_hs.h @@ -0,0 +1,13 @@ +require_rv32; +P_NARROW_RD_RS1_ULOOP(16, 32, { + uint32_t shamt = P_UFIELD(RS2, 0, 16) & 0x1F; + uint32_t result; + if (shamt == 0) { + result = p_rs1; + } else { + uint32_t shifted = p_rs1 >> shamt; + uint32_t roundbit = (p_rs1 >> (shamt - 1)) & 1; + result = shifted + roundbit; + } + p_rd = P_USAT_FULL(16, (sreg_t)result); +})
\ No newline at end of file diff --git a/riscv/insns/pnclipu_bs.h b/riscv/insns/pnclipu_bs.h new file mode 100644 index 00000000..af10838c --- /dev/null +++ b/riscv/insns/pnclipu_bs.h @@ -0,0 +1,4 @@ +require_rv32; +P_NARROW_RD_RS1_ULOOP(8, 16, { + p_rd = P_USAT_FULL(8, (sreg_t)(p_rs1 >> (P_UFIELD(RS2, 0, 8) & 0xF))); +})
\ No newline at end of file diff --git a/riscv/insns/pnclipu_hs.h b/riscv/insns/pnclipu_hs.h new file mode 100644 index 00000000..377bd407 --- /dev/null +++ b/riscv/insns/pnclipu_hs.h @@ -0,0 +1,4 @@ +require_rv32; +P_NARROW_RD_RS1_ULOOP(16, 32, { + p_rd = P_USAT_FULL(16, (sreg_t)(p_rs1 >> (P_UFIELD(RS2, 0, 16) & 0X1F))); +})
\ No newline at end of file diff --git a/riscv/insns/pnclipup_b.h b/riscv/insns/pnclipup_b.h new file mode 100644 index 00000000..77e53e7b --- /dev/null +++ b/riscv/insns/pnclipup_b.h @@ -0,0 +1,13 @@ +require_extension('P'); +require_rv64; +reg_t rd_tmp = 0; +reg_t s_low = RS1; +reg_t s_high = RS2; +for (int i = 0; i < 8; i++) { + reg_t s_h = (i < 4) ? P_UFIELD(s_low, i, 16) : P_UFIELD(s_high, i - 4, 16); + reg_t sat_val = P_USAT_FULL(8, (sreg_t)s_h); + if (sat_val != s_h) P.VU.vxsat->write(1); + rd_tmp = set_field(rd_tmp, make_mask64(i * 8, 8), (uint8_t)sat_val); +} +WRITE_RD(rd_tmp); + diff --git a/riscv/insns/pnclipup_h.h b/riscv/insns/pnclipup_h.h new file mode 100644 index 00000000..e688ecf2 --- /dev/null +++ b/riscv/insns/pnclipup_h.h @@ -0,0 +1,13 @@ +require_extension('P'); +require_rv64; +reg_t rd_tmp = 0; +reg_t s_low = RS1; +reg_t s_high = RS2; +for (int i = 0; i < 4; i++) { + reg_t s_w = (i < 2) ? P_UFIELD(s_low, i, 32) : P_UFIELD(s_high, i - 2, 32); + reg_t sat_val = P_USAT_FULL(16, (sreg_t)s_w); + if (sat_val != s_w) P.VU.vxsat->write(1); + rd_tmp = set_field(rd_tmp, make_mask64(i * 16, 16), (uint16_t)sat_val); +} +WRITE_RD(rd_tmp); + diff --git a/riscv/insns/pnclipup_w.h b/riscv/insns/pnclipup_w.h new file mode 100644 index 00000000..72f8476b --- /dev/null +++ b/riscv/insns/pnclipup_w.h @@ -0,0 +1,13 @@ +require_extension('P'); +require_rv64; +uint64_t s1 = RS1; +uint64_t s2 = RS2; + +reg_t sat_w0 = P_USAT_FULL(32, (sreg_t)s1); +if (sat_w0 != s1) P.VU.vxsat->write(1); + +reg_t sat_w1 = P_USAT_FULL(32, (sreg_t)s2); +if (sat_w1 != s2) P.VU.vxsat->write(1); + +WRITE_RD(((uint64_t)(uint32_t)sat_w1 << 32) | (uint32_t)sat_w0); + diff --git a/riscv/insns/pnsra_bs.h b/riscv/insns/pnsra_bs.h new file mode 100644 index 00000000..6a6ad366 --- /dev/null +++ b/riscv/insns/pnsra_bs.h @@ -0,0 +1,4 @@ +require_rv32; +P_NARROW_RD_RS1_LOOP(8, 16, { + p_rd = p_rs1 >> (P_FIELD(RS2, 0, 8) & 0xF); +})
\ No newline at end of file diff --git a/riscv/insns/pnsra_hs.h b/riscv/insns/pnsra_hs.h new file mode 100644 index 00000000..0b6ee714 --- /dev/null +++ b/riscv/insns/pnsra_hs.h @@ -0,0 +1,4 @@ +require_rv32; +P_NARROW_RD_RS1_LOOP(16, 32, { + p_rd = p_rs1 >> (P_FIELD(RS2, 0, 16) & 0x1F); +})
\ No newline at end of file diff --git a/riscv/insns/pnsrai_b.h b/riscv/insns/pnsrai_b.h new file mode 100644 index 00000000..001bb3b3 --- /dev/null +++ b/riscv/insns/pnsrai_b.h @@ -0,0 +1,4 @@ +require_rv32; +P_NARROW_RD_RS1_LOOP(8, 16, { + p_rd = p_rs1 >> insn.shamth(); +})
\ No newline at end of file diff --git a/riscv/insns/pnsrai_h.h b/riscv/insns/pnsrai_h.h new file mode 100644 index 00000000..d673a763 --- /dev/null +++ b/riscv/insns/pnsrai_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_NARROW_RD_RS1_LOOP(16, 32, { + p_rd = p_rs1 >> insn.shamtw(); +})
\ No newline at end of file diff --git a/riscv/insns/pnsrar_bs.h b/riscv/insns/pnsrar_bs.h new file mode 100644 index 00000000..8b9291a9 --- /dev/null +++ b/riscv/insns/pnsrar_bs.h @@ -0,0 +1,12 @@ +require_rv32; +P_NARROW_RD_RS1_LOOP(8, 16, { + uint32_t shamt = P_FIELD(RS2, 0, 8) & 0xF; + if (shamt != 0) { + sreg_t val = (sreg_t)p_rs1; + sreg_t shifted = val >> shamt; + sreg_t roundbit = (val >> (shamt - 1)) & 1; + p_rd = (shifted + roundbit) & 0xFF; + } else { + p_rd = p_rs1 & 0xFF; + } +})
\ No newline at end of file diff --git a/riscv/insns/pnsrar_hs.h b/riscv/insns/pnsrar_hs.h new file mode 100644 index 00000000..602bdd57 --- /dev/null +++ b/riscv/insns/pnsrar_hs.h @@ -0,0 +1,12 @@ +require_rv32; +P_NARROW_RD_RS1_LOOP(16, 32, { + uint32_t shamt = P_FIELD(RS2, 0, 16) & 0x1F; + if (shamt != 0) { + sreg_t val = (sreg_t)p_rs1; + sreg_t shifted = val >> shamt; + sreg_t roundbit = (val >> (shamt - 1)) & 1; + p_rd = (shifted + roundbit) & 0xFFFF; + } else { + p_rd = p_rs1 & 0xFFFF; + } +})
\ No newline at end of file diff --git a/riscv/insns/pnsrari_b.h b/riscv/insns/pnsrari_b.h new file mode 100644 index 00000000..7ca82f5b --- /dev/null +++ b/riscv/insns/pnsrari_b.h @@ -0,0 +1,12 @@ +require_rv32; +P_NARROW_RD_RS1_LOOP(8, 16, { + uint32_t shamt = insn.shamth(); + if (shamt != 0) { + sreg_t val = (sreg_t)p_rs1; + sreg_t shifted = val >> shamt; + sreg_t roundbit = (val >> (shamt - 1)) & 1; + p_rd = (shifted + roundbit) & 0xFF; + } else { + p_rd = p_rs1 & 0xFF; + } +})
\ No newline at end of file diff --git a/riscv/insns/pnsrari_h.h b/riscv/insns/pnsrari_h.h new file mode 100644 index 00000000..84136826 --- /dev/null +++ b/riscv/insns/pnsrari_h.h @@ -0,0 +1,12 @@ +require_rv32; +P_NARROW_RD_RS1_LOOP(16, 32, { + uint32_t shamt = insn.shamtw(); + if (shamt != 0) { + sreg_t val = (sreg_t)p_rs1; + sreg_t shifted = val >> shamt; + sreg_t roundbit = (val >> (shamt - 1)) & 1; + p_rd = (shifted + roundbit) & 0xFFFF; + } else { + p_rd = p_rs1 & 0xFFFF; + } +})
\ No newline at end of file diff --git a/riscv/insns/pnsrl_bs.h b/riscv/insns/pnsrl_bs.h new file mode 100644 index 00000000..244bd6c9 --- /dev/null +++ b/riscv/insns/pnsrl_bs.h @@ -0,0 +1,5 @@ +require_rv32; +P_NARROW_RD_RS1_ULOOP(8, 16, { + uint8_t shamt = (uint8_t)(P_UFIELD(RS2, 0, 8) & 0xF); + p_rd = (uint8_t)((uint16_t)p_rs1 >> shamt); +}) diff --git a/riscv/insns/pnsrl_hs.h b/riscv/insns/pnsrl_hs.h new file mode 100644 index 00000000..42d28f5a --- /dev/null +++ b/riscv/insns/pnsrl_hs.h @@ -0,0 +1,5 @@ +require_rv32; +P_NARROW_RD_RS1_ULOOP(16, 32, { + uint16_t shamt = (uint16_t)(P_UFIELD(RS2, 0, 16) & 0x1F); + p_rd = (uint16_t)((uint32_t)p_rs1 >> shamt); +})
\ No newline at end of file diff --git a/riscv/insns/pnsrli_b.h b/riscv/insns/pnsrli_b.h new file mode 100644 index 00000000..55f19c6f --- /dev/null +++ b/riscv/insns/pnsrli_b.h @@ -0,0 +1,4 @@ +require_rv32; +P_NARROW_RD_RS1_ULOOP(8, 16, { + p_rd = (uint8_t)((uint16_t)p_rs1 >> insn.shamth()); +})
\ No newline at end of file diff --git a/riscv/insns/pnsrli_h.h b/riscv/insns/pnsrli_h.h new file mode 100644 index 00000000..80f17245 --- /dev/null +++ b/riscv/insns/pnsrli_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_NARROW_RD_RS1_ULOOP(16, 32, { + p_rd = (uint16_t)((uint32_t)p_rs1 >> insn.shamtw()); +})
\ No newline at end of file diff --git a/riscv/insns/ppaire_b.h b/riscv/insns/ppaire_b.h new file mode 100644 index 00000000..a1b9665a --- /dev/null +++ b/riscv/insns/ppaire_b.h @@ -0,0 +1 @@ +P_PACK(8, 0, 0);
\ No newline at end of file diff --git a/riscv/insns/ppaire_db.h b/riscv/insns/ppaire_db.h new file mode 100644 index 00000000..64f7c1c0 --- /dev/null +++ b/riscv/insns/ppaire_db.h @@ -0,0 +1,2 @@ +require_rv32; +P_PACK_DW(8, 0, 0);
\ No newline at end of file diff --git a/riscv/insns/ppaire_dh.h b/riscv/insns/ppaire_dh.h new file mode 100644 index 00000000..ada431d1 --- /dev/null +++ b/riscv/insns/ppaire_dh.h @@ -0,0 +1,2 @@ +require_rv32; +P_PACK_DW(16, 0, 0);
\ No newline at end of file diff --git a/riscv/insns/ppaire_h.h b/riscv/insns/ppaire_h.h new file mode 100644 index 00000000..a1fef4a9 --- /dev/null +++ b/riscv/insns/ppaire_h.h @@ -0,0 +1 @@ +P_PACK(16, 0, 0);
\ No newline at end of file diff --git a/riscv/insns/ppaireo_b.h b/riscv/insns/ppaireo_b.h new file mode 100644 index 00000000..1e02dc4c --- /dev/null +++ b/riscv/insns/ppaireo_b.h @@ -0,0 +1 @@ +P_PACK(8, 0, 1);
\ No newline at end of file diff --git a/riscv/insns/ppaireo_db.h b/riscv/insns/ppaireo_db.h new file mode 100644 index 00000000..4b6e1158 --- /dev/null +++ b/riscv/insns/ppaireo_db.h @@ -0,0 +1,2 @@ +require_rv32; +P_PACK_DW(8, 0, 1);
\ No newline at end of file diff --git a/riscv/insns/ppaireo_dh.h b/riscv/insns/ppaireo_dh.h new file mode 100644 index 00000000..46ef708d --- /dev/null +++ b/riscv/insns/ppaireo_dh.h @@ -0,0 +1,2 @@ +require_rv32; +P_PACK_DW(16, 0, 1);
\ No newline at end of file diff --git a/riscv/insns/ppaireo_h.h b/riscv/insns/ppaireo_h.h new file mode 100644 index 00000000..c5f043f5 --- /dev/null +++ b/riscv/insns/ppaireo_h.h @@ -0,0 +1 @@ +P_PACK(16, 0, 1);
\ No newline at end of file diff --git a/riscv/insns/ppaireo_w.h b/riscv/insns/ppaireo_w.h new file mode 100644 index 00000000..5dd3e2ef --- /dev/null +++ b/riscv/insns/ppaireo_w.h @@ -0,0 +1,2 @@ +require_rv64; +P_PACK(32, 0, 1);
\ No newline at end of file diff --git a/riscv/insns/ppairo_b.h b/riscv/insns/ppairo_b.h new file mode 100644 index 00000000..c691850b --- /dev/null +++ b/riscv/insns/ppairo_b.h @@ -0,0 +1 @@ +P_PACK(8, 1, 1);
\ No newline at end of file diff --git a/riscv/insns/ppairo_db.h b/riscv/insns/ppairo_db.h new file mode 100644 index 00000000..ad04f358 --- /dev/null +++ b/riscv/insns/ppairo_db.h @@ -0,0 +1,2 @@ +require_rv32; +P_PACK_DW(8, 1, 1);
\ No newline at end of file diff --git a/riscv/insns/ppairo_dh.h b/riscv/insns/ppairo_dh.h new file mode 100644 index 00000000..d9291d87 --- /dev/null +++ b/riscv/insns/ppairo_dh.h @@ -0,0 +1,2 @@ +require_rv32; +P_PACK_DW(16, 1, 1);
\ No newline at end of file diff --git a/riscv/insns/ppairo_h.h b/riscv/insns/ppairo_h.h new file mode 100644 index 00000000..600ee873 --- /dev/null +++ b/riscv/insns/ppairo_h.h @@ -0,0 +1 @@ +P_PACK(16, 1, 1);
\ No newline at end of file diff --git a/riscv/insns/ppairo_w.h b/riscv/insns/ppairo_w.h new file mode 100644 index 00000000..38d2dfd0 --- /dev/null +++ b/riscv/insns/ppairo_w.h @@ -0,0 +1,2 @@ +require_rv64; +P_PACK(32, 1, 1); diff --git a/riscv/insns/ppairoe_b.h b/riscv/insns/ppairoe_b.h new file mode 100644 index 00000000..37df7381 --- /dev/null +++ b/riscv/insns/ppairoe_b.h @@ -0,0 +1 @@ +P_PACK(8, 1, 0);
\ No newline at end of file diff --git a/riscv/insns/ppairoe_db.h b/riscv/insns/ppairoe_db.h new file mode 100644 index 00000000..61a334d7 --- /dev/null +++ b/riscv/insns/ppairoe_db.h @@ -0,0 +1,2 @@ +require_rv32; +P_PACK_DW(8, 1, 0);
\ No newline at end of file diff --git a/riscv/insns/ppairoe_dh.h b/riscv/insns/ppairoe_dh.h new file mode 100644 index 00000000..f9467db8 --- /dev/null +++ b/riscv/insns/ppairoe_dh.h @@ -0,0 +1,2 @@ +require_rv32; +P_PACK_DW(16, 1, 0);
\ No newline at end of file diff --git a/riscv/insns/ppairoe_h.h b/riscv/insns/ppairoe_h.h new file mode 100644 index 00000000..ecca5386 --- /dev/null +++ b/riscv/insns/ppairoe_h.h @@ -0,0 +1 @@ +P_PACK(16, 1, 0);
\ No newline at end of file diff --git a/riscv/insns/ppairoe_w.h b/riscv/insns/ppairoe_w.h new file mode 100644 index 00000000..df6a6683 --- /dev/null +++ b/riscv/insns/ppairoe_w.h @@ -0,0 +1,2 @@ +require_rv64; +P_PACK(32, 1, 0);
\ No newline at end of file diff --git a/riscv/insns/predsum_bs.h b/riscv/insns/predsum_bs.h new file mode 100644 index 00000000..9f110b6d --- /dev/null +++ b/riscv/insns/predsum_bs.h @@ -0,0 +1,5 @@ +reg_t rd_tmp = RS2; \ +P_RS1_LOOP_BASE(8) + P_RS1_PARAMS(8) + rd_tmp += sext_xlen(p_rs1); +P_RD_LOOP_END()
\ No newline at end of file diff --git a/riscv/insns/predsum_dbs.h b/riscv/insns/predsum_dbs.h new file mode 100644 index 00000000..0f8afe42 --- /dev/null +++ b/riscv/insns/predsum_dbs.h @@ -0,0 +1,5 @@ +require_rv32; +reg_t rd_tmp = RS2; +P_RS1_DW_LOOP(8, { + rd_tmp += sext_xlen(p_rs1); +})
\ No newline at end of file diff --git a/riscv/insns/predsum_dhs.h b/riscv/insns/predsum_dhs.h new file mode 100644 index 00000000..4c8e012c --- /dev/null +++ b/riscv/insns/predsum_dhs.h @@ -0,0 +1,5 @@ +require_rv32; +reg_t rd_tmp = RS2; +P_RS1_DW_LOOP(16, { + rd_tmp += sext_xlen(p_rs1); +})
\ No newline at end of file diff --git a/riscv/insns/predsum_hs.h b/riscv/insns/predsum_hs.h new file mode 100644 index 00000000..dd2c8242 --- /dev/null +++ b/riscv/insns/predsum_hs.h @@ -0,0 +1,5 @@ +reg_t rd_tmp = RS2; \ +P_RS1_LOOP_BASE(16) + P_RS1_PARAMS(16) + rd_tmp += sext_xlen(p_rs1); +P_RD_LOOP_END()
\ No newline at end of file diff --git a/riscv/insns/predsum_ws.h b/riscv/insns/predsum_ws.h new file mode 100644 index 00000000..ba5fc69a --- /dev/null +++ b/riscv/insns/predsum_ws.h @@ -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() diff --git a/riscv/insns/predsumu_bs.h b/riscv/insns/predsumu_bs.h new file mode 100644 index 00000000..e5c2f53a --- /dev/null +++ b/riscv/insns/predsumu_bs.h @@ -0,0 +1,5 @@ +reg_t rd_tmp = RS2; \ +P_RS1_LOOP_BASE(8) + P_RS1_UPARAMS(8) + rd_tmp += zext_xlen(p_rs1); +P_RD_LOOP_END()
\ No newline at end of file diff --git a/riscv/insns/predsumu_dbs.h b/riscv/insns/predsumu_dbs.h new file mode 100644 index 00000000..26cb2d39 --- /dev/null +++ b/riscv/insns/predsumu_dbs.h @@ -0,0 +1,5 @@ +require_rv32; +reg_t rd_tmp = RS2; +P_RS1_DW_ULOOP(8, { + rd_tmp += zext_xlen(p_rs1); +})
\ No newline at end of file diff --git a/riscv/insns/predsumu_dhs.h b/riscv/insns/predsumu_dhs.h new file mode 100644 index 00000000..a9393eeb --- /dev/null +++ b/riscv/insns/predsumu_dhs.h @@ -0,0 +1,5 @@ +require_rv32; +reg_t rd_tmp = RS2; +P_RS1_DW_ULOOP(16, { + rd_tmp += zext_xlen(p_rs1); +})
\ No newline at end of file diff --git a/riscv/insns/predsumu_hs.h b/riscv/insns/predsumu_hs.h new file mode 100644 index 00000000..bf2dc457 --- /dev/null +++ b/riscv/insns/predsumu_hs.h @@ -0,0 +1,5 @@ +reg_t rd_tmp = RS2; \ +P_RS1_LOOP_BASE(16) + P_RS1_UPARAMS(16) + rd_tmp += zext_xlen(p_rs1); +P_RD_LOOP_END()
\ No newline at end of file diff --git a/riscv/insns/predsumu_ws.h b/riscv/insns/predsumu_ws.h new file mode 100644 index 00000000..98a3aa91 --- /dev/null +++ b/riscv/insns/predsumu_ws.h @@ -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() diff --git a/riscv/insns/psa_dhx.h b/riscv/insns/psa_dhx.h new file mode 100644 index 00000000..f7b30af5 --- /dev/null +++ b/riscv/insns/psa_dhx.h @@ -0,0 +1,6 @@ +require_rv32; +P_CROSS_DW_LOOP(16, { + p_rd = p_rs1 - p_rs2; +}, { + p_rd = p_rs1 + p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/psa_hx.h b/riscv/insns/psa_hx.h new file mode 100644 index 00000000..864671e4 --- /dev/null +++ b/riscv/insns/psa_hx.h @@ -0,0 +1,5 @@ +P_CROSS_LOOP(16, { + p_rd = p_rs1 - p_rs2; +}, { + p_rd = p_rs1 + p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/psa_wx.h b/riscv/insns/psa_wx.h new file mode 100644 index 00000000..b930d5ea --- /dev/null +++ b/riscv/insns/psa_wx.h @@ -0,0 +1,7 @@ +require_rv64; +P_CROSS_LOOP(32, { + p_rd = p_rs1 - p_rs2; +}, { + p_rd = p_rs1 + p_rs2; +} +) diff --git a/riscv/insns/psabs_b.h b/riscv/insns/psabs_b.h new file mode 100644 index 00000000..8ca5085b --- /dev/null +++ b/riscv/insns/psabs_b.h @@ -0,0 +1,5 @@ +P_RD_RS1_LOOP(8, 8, { + sreg_t abs_val = p_rs1 > 0 ? p_rs1 : -sext32(p_rs1); + p_rd = P_SAT(8, abs_val); + if (p_rd != abs_val) P.VU.vxsat->write(1); +})
\ No newline at end of file diff --git a/riscv/insns/psabs_db.h b/riscv/insns/psabs_db.h new file mode 100644 index 00000000..5efe61d3 --- /dev/null +++ b/riscv/insns/psabs_db.h @@ -0,0 +1,6 @@ +require_rv32; +P_RD_RS1_DW_LOOP(8, 8, { + sreg_t abs_val = p_rs1 > 0 ? p_rs1 : -sext32(p_rs1); + p_rd = P_SAT(8, abs_val); + if (p_rd != abs_val) P.VU.vxsat->write(1); +})
\ No newline at end of file diff --git a/riscv/insns/psabs_dh.h b/riscv/insns/psabs_dh.h new file mode 100644 index 00000000..13411c9e --- /dev/null +++ b/riscv/insns/psabs_dh.h @@ -0,0 +1,6 @@ +require_rv32; +P_RD_RS1_DW_LOOP(16, 16, { + sreg_t abs_val = p_rs1 > 0 ? p_rs1 : -sext32(p_rs1); + p_rd = P_SAT(16, abs_val); + if (p_rd != abs_val) P.VU.vxsat->write(1); +})
\ No newline at end of file diff --git a/riscv/insns/psabs_h.h b/riscv/insns/psabs_h.h new file mode 100644 index 00000000..54564afe --- /dev/null +++ b/riscv/insns/psabs_h.h @@ -0,0 +1,5 @@ +P_RD_RS1_LOOP(16, 16, { + sreg_t abs_val = p_rs1 > 0 ? p_rs1 : -sext32(p_rs1); + p_rd = P_SAT(16, abs_val); + if (p_rd != abs_val) P.VU.vxsat->write(1); +})
\ No newline at end of file diff --git a/riscv/insns/psadd_b.h b/riscv/insns/psadd_b.h new file mode 100644 index 00000000..a024d4d0 --- /dev/null +++ b/riscv/insns/psadd_b.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_LOOP(8,8,8, { + bool sat = false; + p_rd = (sat_add<int8_t, uint8_t>(p_rs1, p_rs2, sat)); +})
\ No newline at end of file diff --git a/riscv/insns/psadd_db.h b/riscv/insns/psadd_db.h new file mode 100644 index 00000000..3c297868 --- /dev/null +++ b/riscv/insns/psadd_db.h @@ -0,0 +1,5 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(8,8,8, { + bool sat = false; + p_rd = (sat_add<int8_t, uint8_t>(p_rs1, p_rs2, sat)); +})
\ No newline at end of file diff --git a/riscv/insns/psadd_dh.h b/riscv/insns/psadd_dh.h new file mode 100644 index 00000000..bd14a581 --- /dev/null +++ b/riscv/insns/psadd_dh.h @@ -0,0 +1,5 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(16,16,16, { + bool sat = false; + p_rd = (sat_add<int16_t, uint16_t>(p_rs1, p_rs2, sat)); +})
\ No newline at end of file diff --git a/riscv/insns/psadd_dw.h b/riscv/insns/psadd_dw.h new file mode 100644 index 00000000..5ec3466d --- /dev/null +++ b/riscv/insns/psadd_dw.h @@ -0,0 +1,5 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(32,32,32, { + bool sat = false; + p_rd = (sat_add<int32_t, uint32_t>(p_rs1, p_rs2, sat)); +})
\ No newline at end of file diff --git a/riscv/insns/psadd_h.h b/riscv/insns/psadd_h.h new file mode 100644 index 00000000..47af97ad --- /dev/null +++ b/riscv/insns/psadd_h.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_LOOP(16,16,16, { + bool sat = false; + p_rd = (sat_add<int16_t, uint16_t>(p_rs1, p_rs2, sat)); +})
\ No newline at end of file diff --git a/riscv/insns/psadd_w.h b/riscv/insns/psadd_w.h new file mode 100644 index 00000000..7702b936 --- /dev/null +++ b/riscv/insns/psadd_w.h @@ -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)); +} +) diff --git a/riscv/insns/psaddu_b.h b/riscv/insns/psaddu_b.h new file mode 100644 index 00000000..491fc2d3 --- /dev/null +++ b/riscv/insns/psaddu_b.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_ULOOP(8,8,8, { + bool sat = false; + p_rd = (sat_addu<uint8_t>(p_rs1, p_rs2, sat)); +})
\ No newline at end of file diff --git a/riscv/insns/psaddu_db.h b/riscv/insns/psaddu_db.h new file mode 100644 index 00000000..a181f24a --- /dev/null +++ b/riscv/insns/psaddu_db.h @@ -0,0 +1,5 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(8,8,8, { + bool sat = false; + p_rd = (sat_addu<uint8_t>(p_rs1, p_rs2, sat)); +})
\ No newline at end of file diff --git a/riscv/insns/psaddu_dh.h b/riscv/insns/psaddu_dh.h new file mode 100644 index 00000000..035d91fc --- /dev/null +++ b/riscv/insns/psaddu_dh.h @@ -0,0 +1,5 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(16,16,16, { + bool sat = false; + p_rd = (sat_addu<uint16_t>(p_rs1, p_rs2, sat)); +})
\ No newline at end of file diff --git a/riscv/insns/psaddu_dw.h b/riscv/insns/psaddu_dw.h new file mode 100644 index 00000000..ebc4d8bb --- /dev/null +++ b/riscv/insns/psaddu_dw.h @@ -0,0 +1,5 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(32,32,32, { + bool sat = false; + p_rd = (sat_addu<uint32_t>(p_rs1, p_rs2, sat)); +})
\ No newline at end of file diff --git a/riscv/insns/psaddu_h.h b/riscv/insns/psaddu_h.h new file mode 100644 index 00000000..f28d0f32 --- /dev/null +++ b/riscv/insns/psaddu_h.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_ULOOP(16,16,16, { + bool sat = false; + p_rd = (sat_addu<uint16_t>(p_rs1, p_rs2, sat)); +})
\ No newline at end of file diff --git a/riscv/insns/psaddu_w.h b/riscv/insns/psaddu_w.h new file mode 100644 index 00000000..4ff52136 --- /dev/null +++ b/riscv/insns/psaddu_w.h @@ -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)); +} +) diff --git a/riscv/insns/psas_dhx.h b/riscv/insns/psas_dhx.h new file mode 100644 index 00000000..d14ccee6 --- /dev/null +++ b/riscv/insns/psas_dhx.h @@ -0,0 +1,10 @@ +require_rv32; +P_CROSS_DW_ULOOP(16, { + bool sat = false; + p_rd = (sat_add<int16_t, uint16_t>(p_rs1, p_rs2, sat)); + if (sat) P.VU.vxsat->write(1); +}, { + bool sat = false; + p_rd = (sat_sub<int16_t, uint16_t>(p_rs1, p_rs2, sat)); + if (sat) P.VU.vxsat->write(1); +})
\ No newline at end of file diff --git a/riscv/insns/psas_hx.h b/riscv/insns/psas_hx.h new file mode 100644 index 00000000..f1d8f189 --- /dev/null +++ b/riscv/insns/psas_hx.h @@ -0,0 +1,9 @@ +P_CROSS_ULOOP(16, { + bool sat = false; + p_rd = (sat_add<int16_t, uint16_t>(p_rs1, p_rs2, sat)); + if (sat) P.VU.vxsat->write(1); +}, { + bool sat = false; + p_rd = (sat_sub<int16_t, uint16_t>(p_rs1, p_rs2, sat)); + if (sat) P.VU.vxsat->write(1); +})
\ No newline at end of file diff --git a/riscv/insns/psas_wx.h b/riscv/insns/psas_wx.h new file mode 100644 index 00000000..4673a6ce --- /dev/null +++ b/riscv/insns/psas_wx.h @@ -0,0 +1,11 @@ +require_rv64; +P_CROSS_ULOOP(32, { + bool sat = false; + p_rd = (sat_add<int32_t, uint32_t>(p_rs1, p_rs2, sat)); + if (sat) P.VU.vxsat->write(1); +}, { + bool sat = false; + p_rd = (sat_sub<int32_t, uint32_t>(p_rs1, p_rs2, sat)); + if (sat) P.VU.vxsat->write(1); +} +) diff --git a/riscv/insns/psati_dh.h b/riscv/insns/psati_dh.h new file mode 100644 index 00000000..f95fe6e5 --- /dev/null +++ b/riscv/insns/psati_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_LOOP(16, 16, { + p_rd = P_SAT(insn.shamth() + 1, p_rs1); +})
\ No newline at end of file diff --git a/riscv/insns/psati_dw.h b/riscv/insns/psati_dw.h new file mode 100644 index 00000000..f49c44a0 --- /dev/null +++ b/riscv/insns/psati_dw.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_LOOP(32, 32, { + p_rd = P_SAT(insn.shamtw() + 1, p_rs1); +})
\ No newline at end of file diff --git a/riscv/insns/psati_h.h b/riscv/insns/psati_h.h new file mode 100644 index 00000000..b63f2233 --- /dev/null +++ b/riscv/insns/psati_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_LOOP(16, 16, { + p_rd = P_SAT(insn.shamth() + 1, p_rs1); +})
\ No newline at end of file diff --git a/riscv/insns/psati_w.h b/riscv/insns/psati_w.h new file mode 100644 index 00000000..499beceb --- /dev/null +++ b/riscv/insns/psati_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_LOOP(32, 32, { + p_rd = P_SAT(insn.shamtw() + 1, p_rs1); +} +) diff --git a/riscv/insns/psext_dh_b.h b/riscv/insns/psext_dh_b.h new file mode 100644 index 00000000..651246f9 --- /dev/null +++ b/riscv/insns/psext_dh_b.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_LOOP(16, 16, { + p_rd = (int16_t)(int8_t)p_rs1; +})
\ No newline at end of file diff --git a/riscv/insns/psext_dw_b.h b/riscv/insns/psext_dw_b.h new file mode 100644 index 00000000..996e00e0 --- /dev/null +++ b/riscv/insns/psext_dw_b.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_LOOP(32, 32, { + p_rd = (int32_t)(int8_t)p_rs1; +})
\ No newline at end of file diff --git a/riscv/insns/psext_dw_h.h b/riscv/insns/psext_dw_h.h new file mode 100644 index 00000000..e94d83bf --- /dev/null +++ b/riscv/insns/psext_dw_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_LOOP(32, 32, { + p_rd = (int32_t)(int16_t)p_rs1; +})
\ No newline at end of file diff --git a/riscv/insns/psext_h_b.h b/riscv/insns/psext_h_b.h new file mode 100644 index 00000000..1bc3dd0b --- /dev/null +++ b/riscv/insns/psext_h_b.h @@ -0,0 +1,3 @@ +P_RD_RS1_LOOP(16, 16, { + p_rd = (int16_t)(int8_t)p_rs1; +})
\ No newline at end of file diff --git a/riscv/insns/psext_w_b.h b/riscv/insns/psext_w_b.h new file mode 100644 index 00000000..cb5217f3 --- /dev/null +++ b/riscv/insns/psext_w_b.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_LOOP(32, 32, { + p_rd = (int32_t)(int8_t)p_rs1; +} +) diff --git a/riscv/insns/psext_w_h.h b/riscv/insns/psext_w_h.h new file mode 100644 index 00000000..a0a1ee09 --- /dev/null +++ b/riscv/insns/psext_w_h.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_LOOP(32, 32, { + p_rd = (int32_t)(int16_t)p_rs1; +} +) diff --git a/riscv/insns/psh1add_dh.h b/riscv/insns/psh1add_dh.h new file mode 100644 index 00000000..33787153 --- /dev/null +++ b/riscv/insns/psh1add_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(16, 16, 16, { + p_rd = (p_rs1 << 1) + p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/psh1add_dw.h b/riscv/insns/psh1add_dw.h new file mode 100644 index 00000000..e143e4b4 --- /dev/null +++ b/riscv/insns/psh1add_dw.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(32, 32, 32, { + p_rd = (p_rs1 << 1) + p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/psh1add_h.h b/riscv/insns/psh1add_h.h new file mode 100644 index 00000000..db41f6e4 --- /dev/null +++ b/riscv/insns/psh1add_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_LOOP(16, 16, 16, { + p_rd = (p_rs1 << 1) + p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/psh1add_w.h b/riscv/insns/psh1add_w.h new file mode 100644 index 00000000..8c280053 --- /dev/null +++ b/riscv/insns/psh1add_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_LOOP(32, 32, 32, { + p_rd = (p_rs1 << 1) + p_rs2; +} +) diff --git a/riscv/insns/psll_bs.h b/riscv/insns/psll_bs.h new file mode 100644 index 00000000..de0fa0df --- /dev/null +++ b/riscv/insns/psll_bs.h @@ -0,0 +1,3 @@ +P_RD_RS1_LOOP(8, 8, { + p_rd = p_rs1 << (RS2 & (8 - 1)); +})
\ No newline at end of file diff --git a/riscv/insns/psll_dbs.h b/riscv/insns/psll_dbs.h new file mode 100644 index 00000000..a5dea881 --- /dev/null +++ b/riscv/insns/psll_dbs.h @@ -0,0 +1,7 @@ +require_rv32; +P_RD_RS1_DW_LOOP(8, 8, { + uint8_t m = P_FIELD(RS2, 0, 8); + const uint64_t maskN = 0xFFull; + if (m >= 8) p_rd = 0; + else p_rd = (uint8_t)((p_rs1 << m) & maskN); +})
\ No newline at end of file diff --git a/riscv/insns/psll_dhs.h b/riscv/insns/psll_dhs.h new file mode 100644 index 00000000..33e31738 --- /dev/null +++ b/riscv/insns/psll_dhs.h @@ -0,0 +1,7 @@ +require_rv32; +P_RD_RS1_DW_LOOP(16, 16, { + uint8_t m = P_FIELD(RS2, 0, 8); + const uint64_t maskN = 0xFFFFull; + if (m >= 16) p_rd = 0; + else p_rd = (uint16_t)((p_rs1 << m) & maskN); +})
\ No newline at end of file diff --git a/riscv/insns/psll_dws.h b/riscv/insns/psll_dws.h new file mode 100644 index 00000000..ec71edbf --- /dev/null +++ b/riscv/insns/psll_dws.h @@ -0,0 +1,7 @@ +require_rv32; +P_RD_RS1_DW_LOOP(32, 32, { + uint8_t m = P_FIELD(RS2, 0, 8); + const uint64_t maskN = 0xFFFFFFFFull; + if (m >= 32) p_rd = 0; + else p_rd = (uint32_t)((p_rs1 << m) & maskN); +})
\ No newline at end of file diff --git a/riscv/insns/psll_hs.h b/riscv/insns/psll_hs.h new file mode 100644 index 00000000..5470506f --- /dev/null +++ b/riscv/insns/psll_hs.h @@ -0,0 +1,3 @@ +P_RD_RS1_LOOP(16, 16, { + p_rd = p_rs1 << (RS2 & (16 - 1)); +})
\ No newline at end of file diff --git a/riscv/insns/psll_ws.h b/riscv/insns/psll_ws.h new file mode 100644 index 00000000..d86c2b46 --- /dev/null +++ b/riscv/insns/psll_ws.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_LOOP(32, 32, { + p_rd = p_rs1 << (RS2 & (32 - 1)); +} +) diff --git a/riscv/insns/pslli_b.h b/riscv/insns/pslli_b.h new file mode 100644 index 00000000..79f8ebc5 --- /dev/null +++ b/riscv/insns/pslli_b.h @@ -0,0 +1,3 @@ +P_RD_RS1_LOOP(8, 8, { + p_rd = p_rs1 << insn.shamtb(); +})
\ No newline at end of file diff --git a/riscv/insns/pslli_db.h b/riscv/insns/pslli_db.h new file mode 100644 index 00000000..ab35e17c --- /dev/null +++ b/riscv/insns/pslli_db.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_LOOP(8, 8, { + p_rd = p_rs1 << insn.shamtb(); +})
\ No newline at end of file diff --git a/riscv/insns/pslli_dh.h b/riscv/insns/pslli_dh.h new file mode 100644 index 00000000..06a0b8af --- /dev/null +++ b/riscv/insns/pslli_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_LOOP(16, 16, { + p_rd = p_rs1 << insn.shamth(); +})
\ No newline at end of file diff --git a/riscv/insns/pslli_dw.h b/riscv/insns/pslli_dw.h new file mode 100644 index 00000000..2c654498 --- /dev/null +++ b/riscv/insns/pslli_dw.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_LOOP(32, 32, { + p_rd = p_rs1 << insn.shamtw(); +})
\ No newline at end of file diff --git a/riscv/insns/pslli_h.h b/riscv/insns/pslli_h.h new file mode 100644 index 00000000..65127f7e --- /dev/null +++ b/riscv/insns/pslli_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_LOOP(16, 16, { + p_rd = p_rs1 << insn.shamth(); +})
\ No newline at end of file diff --git a/riscv/insns/pslli_w.h b/riscv/insns/pslli_w.h new file mode 100644 index 00000000..cd19c7ac --- /dev/null +++ b/riscv/insns/pslli_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_LOOP(32, 32, { + p_rd = p_rs1 << insn.shamtw(); +} +) diff --git a/riscv/insns/psra_bs.h b/riscv/insns/psra_bs.h new file mode 100644 index 00000000..bdc00144 --- /dev/null +++ b/riscv/insns/psra_bs.h @@ -0,0 +1,3 @@ +P_RD_RS1_LOOP(8, 8, { + p_rd = p_rs1 >> (RS2 & (8 - 1)); +})
\ No newline at end of file diff --git a/riscv/insns/psra_dbs.h b/riscv/insns/psra_dbs.h new file mode 100644 index 00000000..f68e5488 --- /dev/null +++ b/riscv/insns/psra_dbs.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_LOOP(8, 8, { + p_rd = p_rs1 >> (RS2 & (8 - 1)); +})
\ No newline at end of file diff --git a/riscv/insns/psra_dhs.h b/riscv/insns/psra_dhs.h new file mode 100644 index 00000000..3689c9b1 --- /dev/null +++ b/riscv/insns/psra_dhs.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_LOOP(16, 16, { + p_rd = p_rs1 >> (RS2 & (16 - 1)); +})
\ No newline at end of file diff --git a/riscv/insns/psra_dws.h b/riscv/insns/psra_dws.h new file mode 100644 index 00000000..47ab0d56 --- /dev/null +++ b/riscv/insns/psra_dws.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_LOOP(32, 32, { + p_rd = p_rs1 >> (RS2 & (32 - 1)); +})
\ No newline at end of file diff --git a/riscv/insns/psra_hs.h b/riscv/insns/psra_hs.h new file mode 100644 index 00000000..3a719ac2 --- /dev/null +++ b/riscv/insns/psra_hs.h @@ -0,0 +1,3 @@ +P_RD_RS1_LOOP(16, 16, { + p_rd = p_rs1 >> (RS2 & (16 - 1)); +})
\ No newline at end of file diff --git a/riscv/insns/psra_ws.h b/riscv/insns/psra_ws.h new file mode 100644 index 00000000..3fd1539d --- /dev/null +++ b/riscv/insns/psra_ws.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_LOOP(32, 32, { + p_rd = p_rs1 >> (RS2 & (32 - 1)); +} +) diff --git a/riscv/insns/psrai_b.h b/riscv/insns/psrai_b.h new file mode 100644 index 00000000..dd109927 --- /dev/null +++ b/riscv/insns/psrai_b.h @@ -0,0 +1,3 @@ +P_RD_RS1_LOOP(8, 8, { + p_rd = p_rs1 >> insn.shamtb(); +})
\ No newline at end of file diff --git a/riscv/insns/psrai_db.h b/riscv/insns/psrai_db.h new file mode 100644 index 00000000..1949e200 --- /dev/null +++ b/riscv/insns/psrai_db.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_LOOP(8, 8, { + p_rd = p_rs1 >> insn.shamtb(); +})
\ No newline at end of file diff --git a/riscv/insns/psrai_dh.h b/riscv/insns/psrai_dh.h new file mode 100644 index 00000000..f2066098 --- /dev/null +++ b/riscv/insns/psrai_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_LOOP(16, 16, { + p_rd = p_rs1 >> insn.shamth(); +})
\ No newline at end of file diff --git a/riscv/insns/psrai_dw.h b/riscv/insns/psrai_dw.h new file mode 100644 index 00000000..0342780e --- /dev/null +++ b/riscv/insns/psrai_dw.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_LOOP(32, 32, { + p_rd = p_rs1 >> insn.shamtw(); +})
\ No newline at end of file diff --git a/riscv/insns/psrai_h.h b/riscv/insns/psrai_h.h new file mode 100644 index 00000000..89a1a686 --- /dev/null +++ b/riscv/insns/psrai_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_LOOP(16, 16, { + p_rd = p_rs1 >> insn.shamth(); +})
\ No newline at end of file diff --git a/riscv/insns/psrai_w.h b/riscv/insns/psrai_w.h new file mode 100644 index 00000000..06d81812 --- /dev/null +++ b/riscv/insns/psrai_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_LOOP(32, 32, { + p_rd = p_rs1 >> insn.shamtw(); +} +) diff --git a/riscv/insns/psrari_dh.h b/riscv/insns/psrari_dh.h new file mode 100644 index 00000000..4ccc49bd --- /dev/null +++ b/riscv/insns/psrari_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_LOOP(16, 16, { + p_rd = insn.shamth() ? ((p_rs1 >> insn.shamth()) + ((p_rs1 >> (insn.shamth() - 1)) & 1)) : p_rs1; +})
\ No newline at end of file diff --git a/riscv/insns/psrari_dw.h b/riscv/insns/psrari_dw.h new file mode 100644 index 00000000..c3c66216 --- /dev/null +++ b/riscv/insns/psrari_dw.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_LOOP(32, 32, { + p_rd = insn.shamtw() ? ((p_rs1 >> insn.shamtw()) + ((p_rs1 >> (insn.shamtw() - 1)) & 1)) : p_rs1; +})
\ No newline at end of file diff --git a/riscv/insns/psrari_h.h b/riscv/insns/psrari_h.h new file mode 100644 index 00000000..ace18a9a --- /dev/null +++ b/riscv/insns/psrari_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_LOOP(16, 16, { + p_rd = insn.shamth() ? ((p_rs1 >> insn.shamth()) + ((p_rs1 >> (insn.shamth() - 1)) & 1)) : p_rs1; +})
\ No newline at end of file diff --git a/riscv/insns/psrari_w.h b/riscv/insns/psrari_w.h new file mode 100644 index 00000000..a3d02f17 --- /dev/null +++ b/riscv/insns/psrari_w.h @@ -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; +} +) diff --git a/riscv/insns/psrl_bs.h b/riscv/insns/psrl_bs.h new file mode 100644 index 00000000..5e3c5953 --- /dev/null +++ b/riscv/insns/psrl_bs.h @@ -0,0 +1,3 @@ +P_RD_RS1_ULOOP(8, 8, { + p_rd = p_rs1 >> (RS2 & (8 - 1)); +})
\ No newline at end of file diff --git a/riscv/insns/psrl_dbs.h b/riscv/insns/psrl_dbs.h new file mode 100644 index 00000000..00d6b6d4 --- /dev/null +++ b/riscv/insns/psrl_dbs.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_ULOOP(8, 8, { + p_rd = p_rs1 >> (RS2 & (8 - 1)); +})
\ No newline at end of file diff --git a/riscv/insns/psrl_dhs.h b/riscv/insns/psrl_dhs.h new file mode 100644 index 00000000..add4b858 --- /dev/null +++ b/riscv/insns/psrl_dhs.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_ULOOP(16, 16, { + p_rd = p_rs1 >> (RS2 & (16 - 1)); +})
\ No newline at end of file diff --git a/riscv/insns/psrl_dws.h b/riscv/insns/psrl_dws.h new file mode 100644 index 00000000..0f102d7e --- /dev/null +++ b/riscv/insns/psrl_dws.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_ULOOP(32, 32, { + p_rd = p_rs1 >> (RS2 & (32 - 1)); +})
\ No newline at end of file diff --git a/riscv/insns/psrl_hs.h b/riscv/insns/psrl_hs.h new file mode 100644 index 00000000..d3389c05 --- /dev/null +++ b/riscv/insns/psrl_hs.h @@ -0,0 +1,3 @@ +P_RD_RS1_ULOOP(16, 16, { + p_rd = p_rs1 >> (RS2 & (16 - 1)); +})
\ No newline at end of file diff --git a/riscv/insns/psrl_ws.h b/riscv/insns/psrl_ws.h new file mode 100644 index 00000000..50f784d9 --- /dev/null +++ b/riscv/insns/psrl_ws.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_ULOOP(32, 32, { + p_rd = p_rs1 >> (RS2 & (32 - 1)); +} +) diff --git a/riscv/insns/psrli_b.h b/riscv/insns/psrli_b.h new file mode 100644 index 00000000..68b79e06 --- /dev/null +++ b/riscv/insns/psrli_b.h @@ -0,0 +1,3 @@ +P_RD_RS1_ULOOP(8, 8, { + p_rd = p_rs1 >> insn.shamtb(); +})
\ No newline at end of file diff --git a/riscv/insns/psrli_db.h b/riscv/insns/psrli_db.h new file mode 100644 index 00000000..91ef7964 --- /dev/null +++ b/riscv/insns/psrli_db.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_ULOOP(8, 8, { + p_rd = p_rs1 >> insn.shamtb(); +})
\ No newline at end of file diff --git a/riscv/insns/psrli_dh.h b/riscv/insns/psrli_dh.h new file mode 100644 index 00000000..c67229a5 --- /dev/null +++ b/riscv/insns/psrli_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_ULOOP(16, 16, { + p_rd = p_rs1 >> insn.shamth(); +})
\ No newline at end of file diff --git a/riscv/insns/psrli_dw.h b/riscv/insns/psrli_dw.h new file mode 100644 index 00000000..9702ff8c --- /dev/null +++ b/riscv/insns/psrli_dw.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_ULOOP(32, 32, { + p_rd = p_rs1 >> insn.shamtw(); +})
\ No newline at end of file diff --git a/riscv/insns/psrli_h.h b/riscv/insns/psrli_h.h new file mode 100644 index 00000000..b7b2a763 --- /dev/null +++ b/riscv/insns/psrli_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_ULOOP(16, 16, { + p_rd = p_rs1 >> insn.shamth(); +})
\ No newline at end of file diff --git a/riscv/insns/psrli_w.h b/riscv/insns/psrli_w.h new file mode 100644 index 00000000..a29bdba1 --- /dev/null +++ b/riscv/insns/psrli_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_ULOOP(32, 32, { + p_rd = p_rs1 >> insn.shamtw(); +} +) diff --git a/riscv/insns/pssa_dhx.h b/riscv/insns/pssa_dhx.h new file mode 100644 index 00000000..d5a64700 --- /dev/null +++ b/riscv/insns/pssa_dhx.h @@ -0,0 +1,10 @@ +require_rv32; +P_CROSS_DW_ULOOP(16, { + bool sat = false; + p_rd = (sat_sub<int16_t, uint16_t>(p_rs1, p_rs2, sat)); + if (sat) P.VU.vxsat->write(1); +}, { + bool sat = false; + p_rd = (sat_add<int16_t, uint16_t>(p_rs1, p_rs2, sat)); + if (sat) P.VU.vxsat->write(1); +})
\ No newline at end of file diff --git a/riscv/insns/pssa_hx.h b/riscv/insns/pssa_hx.h new file mode 100644 index 00000000..a5acf2fd --- /dev/null +++ b/riscv/insns/pssa_hx.h @@ -0,0 +1,9 @@ +P_CROSS_ULOOP(16, { + bool sat = false; + p_rd = (sat_sub<int16_t, uint16_t>(p_rs1, p_rs2, sat)); + if (sat) P.VU.vxsat->write(1); +}, { + bool sat = false; + p_rd = (sat_add<int16_t, uint16_t>(p_rs1, p_rs2, sat)); + if (sat) P.VU.vxsat->write(1); +})
\ No newline at end of file diff --git a/riscv/insns/pssa_wx.h b/riscv/insns/pssa_wx.h new file mode 100644 index 00000000..692d22a4 --- /dev/null +++ b/riscv/insns/pssa_wx.h @@ -0,0 +1,11 @@ +require_rv64; +P_CROSS_ULOOP(32, { + bool sat = false; + p_rd = (sat_sub<int32_t, uint32_t>(p_rs1, p_rs2, sat)); + if (sat) P.VU.vxsat->write(1); +}, { + bool sat = false; + p_rd = (sat_add<int32_t, uint32_t>(p_rs1, p_rs2, sat)); + if (sat) P.VU.vxsat->write(1); +} +) diff --git a/riscv/insns/pssh1sadd_dh.h b/riscv/insns/pssh1sadd_dh.h new file mode 100644 index 00000000..4939978d --- /dev/null +++ b/riscv/insns/pssh1sadd_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(16, 16, 16, { + p_rd = P_SAT(16, P_SAT(16, p_rs1 << 1) + p_rs2); +})
\ No newline at end of file diff --git a/riscv/insns/pssh1sadd_dw.h b/riscv/insns/pssh1sadd_dw.h new file mode 100644 index 00000000..4ae54950 --- /dev/null +++ b/riscv/insns/pssh1sadd_dw.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(32, 32, 32, { + p_rd = P_SAT(32, P_SAT(32, (sreg_t)p_rs1 << 1) + (sreg_t)p_rs2); +})
\ No newline at end of file diff --git a/riscv/insns/pssh1sadd_h.h b/riscv/insns/pssh1sadd_h.h new file mode 100644 index 00000000..dead4c71 --- /dev/null +++ b/riscv/insns/pssh1sadd_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_LOOP(16, 16, 16, { + p_rd = P_SAT(16, P_SAT(16, p_rs1 << 1) + p_rs2); +})
\ No newline at end of file diff --git a/riscv/insns/pssh1sadd_w.h b/riscv/insns/pssh1sadd_w.h new file mode 100644 index 00000000..a84c17b0 --- /dev/null +++ b/riscv/insns/pssh1sadd_w.h @@ -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); +} +) diff --git a/riscv/insns/pssha_dhs.h b/riscv/insns/pssha_dhs.h new file mode 100644 index 00000000..a85d2a5a --- /dev/null +++ b/riscv/insns/pssha_dhs.h @@ -0,0 +1,45 @@ +require_rv32; +P_RD_RS1_DW_LOOP(16, 16, { + uint64_t bits_SMIN = (uint64_t{1} << (16 - 1)); + uint64_t bits_SMAX = ((uint64_t{1} << (16 - 1)) - 1); + bool ov = false; + int8_t m = P_FIELD(RS2, 0, 8); + int8_t rev = static_cast<int8_t>(m); + rev = (m < 0) ? static_cast<uint8_t>(~m + 1u) : m; + uint64_t mask = ((uint64_t{1} << 16) - 1); + p_rs1 &= mask; + if(m < 0){ + unsigned sh = ((unsigned)(uint8_t)rev > 255u) ? 255u : (unsigned)(uint8_t)rev; + uint64_t sign = (p_rs1 >> (16 - 1)) & 1u; + + if(sh >= 16) p_rd = (uint16_t)(sign ? mask : 0u); + else{ + uint64_t shifted = (p_rs1 >> sh); + uint64_t fill = (~uint64_t{0}) << (16 - sh); + shifted |= fill; + p_rd = (uint16_t)(shifted & mask); + } + } + else{ + if(rev==0) p_rd = (uint16_t)p_rs1; + else if(rev >= 16){ + if(p_rs1==0) p_rd = 0; + else{ + ov = true; + uint64_t sign = (p_rs1 >> (16 - 1)) & 1u; + p_rd = (uint16_t)(sign ? bits_SMIN : bits_SMAX); + } + } + else{ + uint64_t sign = (p_rs1 >> (16 - 1)) & 1u; + uint64_t top = (p_rs1 >> (16 - rev)); + uint64_t need = sign ? ((uint64_t{1} << rev) - 1) : 0u; + ov = (top != need); + if(ov) + p_rd = (uint16_t)(sign ? bits_SMIN : bits_SMAX); + else + p_rd = (uint16_t)((p_rs1 << rev) & mask); + } + } + if (ov) P.VU.vxsat->write(1); +})
\ No newline at end of file diff --git a/riscv/insns/pssha_dws.h b/riscv/insns/pssha_dws.h new file mode 100644 index 00000000..6d861904 --- /dev/null +++ b/riscv/insns/pssha_dws.h @@ -0,0 +1,45 @@ +require_rv32; +P_RD_RS1_DW_LOOP(32, 32, { + uint64_t bits_SMIN = (uint64_t{1} << (32 - 1)); + uint64_t bits_SMAX = ((uint64_t{1} << (32 - 1)) - 1); + bool ov = false; + int8_t m = P_FIELD(RS2, 0, 8); + int8_t rev = static_cast<int8_t>(m); + rev = (m < 0) ? static_cast<uint8_t>(~m + 1u) : m; + uint64_t mask = ((uint64_t{1} << 32) - 1); + p_rs1 &= mask; + if(m < 0){ + unsigned sh = ((unsigned)(uint8_t)rev > 255u) ? 255u : (unsigned)(uint8_t)rev; + uint64_t sign = (p_rs1 >> (32 - 1)) & 1u; + + if(sh >= 32) p_rd = (uint32_t)(sign ? mask : 0u); + else{ + uint64_t shifted = (p_rs1 >> sh); + uint64_t fill = (~uint64_t{0}) << (32 - sh); + shifted |= fill; + p_rd = (uint32_t)(shifted & mask); + } + } + else{ + if(rev==0) p_rd = (uint32_t)p_rs1; + else if(rev >= 32){ + if(p_rs1==0) p_rd = 0; + else{ + ov = true; + uint64_t sign = (p_rs1 >> (32 - 1)) & 1u; + p_rd = (uint32_t)(sign ? bits_SMIN : bits_SMAX); + } + } + else{ + uint64_t sign = (p_rs1 >> (32 - 1)) & 1u; + uint64_t top = (p_rs1 >> (32 - rev)); + uint64_t need = sign ? ((uint64_t{1} << rev) - 1) : 0u; + ov = (top != need); + if(ov) + p_rd = (uint32_t)(sign ? bits_SMIN : bits_SMAX); + else + p_rd = (uint32_t)((p_rs1 << rev) & mask); + } + } + if (ov) P.VU.vxsat->write(1); +}) diff --git a/riscv/insns/pssha_hs.h b/riscv/insns/pssha_hs.h new file mode 100644 index 00000000..d88c41d8 --- /dev/null +++ b/riscv/insns/pssha_hs.h @@ -0,0 +1,13 @@ +sreg_t sshamt = P_FIELD(RS2, 0, 8); +P_RD_RS1_LOOP(16, 16, { + if (p_rs1 == 0) + p_rd = 0; + else if (sshamt >= 16) { + p_rd = (p_rs1 & 0x8000) ? 0x8000 : 0x7fff; + P.VU.vxsat->write(1); + } + else if (sshamt <= -16) + p_rd = (p_rs1 & 0x8000) ? 0xffff : 0; + else + p_rd = sshamt >= 0 ? P_SAT(16, sext32(p_rs1) << sshamt) : (p_rs1 >> -sshamt); +})
\ No newline at end of file diff --git a/riscv/insns/pssha_ws.h b/riscv/insns/pssha_ws.h new file mode 100644 index 00000000..4229aa0f --- /dev/null +++ b/riscv/insns/pssha_ws.h @@ -0,0 +1,15 @@ +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; + P.VU.vxsat->write(1); + } + 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); +} +) diff --git a/riscv/insns/psshar_dhs.h b/riscv/insns/psshar_dhs.h new file mode 100644 index 00000000..e3116570 --- /dev/null +++ b/riscv/insns/psshar_dhs.h @@ -0,0 +1,64 @@ +require_rv32; +P_RD_RS1_DW_LOOP(16, 16, { + uint64_t bits_SMIN = (uint64_t{1} << (16 - 1)); + uint64_t bits_SMAX = ((uint64_t{1} << (16 - 1)) - 1); + bool ov = false; + int8_t m = P_FIELD(RS2, 0, 8); + int8_t rev = static_cast<int8_t>(m); + rev = (m < 0) ? static_cast<uint8_t>(~m + 1u) : m; + uint64_t mask = ((uint64_t{1} << 16) - 1); + p_rs1 &= mask; + if(m < 0){ + if ((rev & 0xFFu) == 0u) + p_rd = (uint16_t)p_rs1; + else{ + int128_t v_sext; + bool neg = ((p_rs1 >> (16 - 1)) & 1u); + if(!neg) v_sext = static_cast<int128_t>(p_rs1); + else v_sext = static_cast<int128_t>((~static_cast<uint128_t>(0) << 16) | static_cast<uint128_t>(p_rs1)); + int128_t v_cat0 = v_sext << 1; + + unsigned sh = ((unsigned)(uint8_t)rev > 255u) ? 255u : (unsigned)(uint8_t)rev; + + int128_t sra_val; + if(sh == 0) + sra_val = v_cat0; + else if(sh >=127) + sra_val = (v_cat0 < 0) ? static_cast<int128_t>(-1) : static_cast<int128_t>(0); + else{ + int128_t ux = static_cast<uint128_t>(v_cat0); + int128_t shifted = ux >> sh; + if(v_cat0 < 0) + shifted |= (~static_cast<uint128_t>(0)) << (128 - sh); + sra_val = static_cast<int128_t>(shifted); + } + + int128_t plus1 = sra_val + static_cast<int128_t>(1); + uint128_t ures = static_cast<uint128_t>(plus1); + p_rd = (uint16_t)(static_cast<uint64_t>((ures >> 1) & static_cast<uint128_t>(mask))); + } + } + else{ + if(rev==0) p_rd = (uint16_t)p_rs1; + else if(rev >= 16){ + if(p_rs1==0) + p_rd = 0; + else{ + ov = true; + uint64_t sign = (p_rs1 >> (16 - 1)) & 1u; + p_rd = (uint16_t)(sign ? bits_SMIN : bits_SMAX); + } + } + else{ + uint64_t sign = (p_rs1 >> (16 - 1)) & 1u; + uint64_t top = (p_rs1 >> (16 - rev)); + uint64_t need = sign ? ((uint64_t{1} << rev) - 1) : 0u; + ov = (top != need); + if(ov) + p_rd = (uint16_t)(sign ? bits_SMIN : bits_SMAX); + else + p_rd = (uint16_t)((p_rs1 << rev) & mask); + } + } + if (ov) P.VU.vxsat->write(1); +}) diff --git a/riscv/insns/psshar_dws.h b/riscv/insns/psshar_dws.h new file mode 100644 index 00000000..1f530b39 --- /dev/null +++ b/riscv/insns/psshar_dws.h @@ -0,0 +1,64 @@ +require_rv32; +P_RD_RS1_DW_LOOP(32, 32, { + uint64_t bits_SMIN = (uint64_t{1} << (32 - 1)); + uint64_t bits_SMAX = ((uint64_t{1} << (32 - 1)) - 1); + bool ov = false; + int8_t m = P_FIELD(RS2, 0, 8); + int8_t rev = static_cast<int8_t>(m); + rev = (m < 0) ? static_cast<uint8_t>(~m + 1u) : m; + uint64_t mask = ((uint64_t{1} << 32) - 1); + p_rs1 &= mask; + if(m < 0){ + if ((rev & 0xFFu) == 0u) + p_rd = (uint32_t)p_rs1; + else{ + int128_t v_sext; + bool neg = ((p_rs1 >> (32 - 1)) & 1u); + if(!neg) v_sext = static_cast<int128_t>(p_rs1); + else v_sext = static_cast<int128_t>((~static_cast<uint128_t>(0) << 32) | static_cast<uint128_t>(p_rs1)); + int128_t v_cat0 = v_sext << 1; + + unsigned sh = ((unsigned)(uint8_t)rev > 255u) ? 255u : (unsigned)(uint8_t)rev; + + int128_t sra_val; + if(sh == 0) + sra_val = v_cat0; + else if(sh >=127) + sra_val = (v_cat0 < 0) ? static_cast<int128_t>(-1) : static_cast<int128_t>(0); + else{ + int128_t ux = static_cast<uint128_t>(v_cat0); + int128_t shifted = ux >> sh; + if(v_cat0 < 0) + shifted |= (~static_cast<uint128_t>(0)) << (128 - sh); + sra_val = static_cast<int128_t>(shifted); + } + + int128_t plus1 = sra_val + static_cast<int128_t>(1); + uint128_t ures = static_cast<uint128_t>(plus1); + p_rd = (uint32_t)(static_cast<uint64_t>((ures >> 1) & static_cast<uint128_t>(mask))); + } + } + else{ + if(rev==0) p_rd = (uint32_t)p_rs1; + else if(rev >= 32){ + if(p_rs1==0) + p_rd = 0; + else{ + ov = true; + uint64_t sign = (p_rs1 >> (32 - 1)) & 1u; + p_rd = (uint32_t)(sign ? bits_SMIN : bits_SMAX); + } + } + else{ + uint64_t sign = (p_rs1 >> (32 - 1)) & 1u; + uint64_t top = (p_rs1 >> (32 - rev)); + uint64_t need = sign ? ((uint64_t{1} << rev) - 1) : 0u; + ov = (top != need); + if(ov) + p_rd = (uint32_t)(sign ? bits_SMIN : bits_SMAX); + else + p_rd = (uint32_t)((p_rs1 << rev) & mask); + } + } + if (ov) P.VU.vxsat->write(1); +}) diff --git a/riscv/insns/psshar_hs.h b/riscv/insns/psshar_hs.h new file mode 100644 index 00000000..581d1427 --- /dev/null +++ b/riscv/insns/psshar_hs.h @@ -0,0 +1,13 @@ +sreg_t sshamt = P_FIELD(RS2, 0, 8); +P_RD_RS1_LOOP(16, 16, { + if (p_rs1 == 0) + p_rd = 0; + else if (sshamt >= 16) { + p_rd = (p_rs1 & 0x8000) ? 0x8000 : 0x7fff; + P.VU.vxsat->write(1); + } + else if (sshamt <= -16) + p_rd = 0; + else + p_rd = sshamt >= 0 ? P_SAT(16, sext32(p_rs1) << sshamt) : ((p_rs1 >> -sshamt) + ((p_rs1 >> (-sshamt - 1)) & 1)); +})
\ No newline at end of file diff --git a/riscv/insns/psshar_ws.h b/riscv/insns/psshar_ws.h new file mode 100644 index 00000000..d34dd16e --- /dev/null +++ b/riscv/insns/psshar_ws.h @@ -0,0 +1,15 @@ +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; + P.VU.vxsat->write(1); + } + 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)); +} +) diff --git a/riscv/insns/psshl_dhs.h b/riscv/insns/psshl_dhs.h new file mode 100644 index 00000000..d1fcade5 --- /dev/null +++ b/riscv/insns/psshl_dhs.h @@ -0,0 +1,19 @@ +require_rv32; +sreg_t sshamt = P_FIELD(RS2, 0, 8); +P_RD_RS1_DW_LOOP(16, 16, { + if (sshamt < 0) { + if (sshamt <= -16) + p_rd = 0; + else + p_rd = (uint16_t)p_rs1 >> (-sshamt); + } else { + uint32_t shx = (sshamt >= 16) ? ((uint32_t)(uint16_t)p_rs1 << 16) : ((uint32_t)(uint16_t)p_rs1 << sshamt); + if (shx > 0xFFFF) { + P.VU.vxsat->write(1); + p_rd = 0xFFFF; + } else { + p_rd = (uint16_t)shx; + } + } +}) + diff --git a/riscv/insns/psshl_dws.h b/riscv/insns/psshl_dws.h new file mode 100644 index 00000000..71569d2e --- /dev/null +++ b/riscv/insns/psshl_dws.h @@ -0,0 +1,19 @@ +require_rv32; +sreg_t sshamt = P_FIELD(RS2, 0, 8); +P_RD_RS1_DW_LOOP(32, 32, { + if (sshamt < 0) { + if (sshamt <= -32) + p_rd = 0; + else + p_rd = (uint32_t)p_rs1 >> (-sshamt); + } else { + uint64_t shx = (sshamt >= 32) ? ((uint64_t)(uint32_t)p_rs1 << 32) : ((uint64_t)(uint32_t)p_rs1 << sshamt); + if (shx > 0xFFFFFFFFULL) { + P.VU.vxsat->write(1); + p_rd = 0xFFFFFFFF; + } else { + p_rd = (uint32_t)shx; + } + } +}) + diff --git a/riscv/insns/psshl_hs.h b/riscv/insns/psshl_hs.h new file mode 100644 index 00000000..459289e1 --- /dev/null +++ b/riscv/insns/psshl_hs.h @@ -0,0 +1,18 @@ +sreg_t sshamt = P_FIELD(RS2, 0, 8); +P_RD_RS1_LOOP(16, 16, { + if (sshamt < 0) { + if (sshamt <= -16) + p_rd = 0; + else + p_rd = (uint16_t)p_rs1 >> (-sshamt); + } else { + uint32_t shx = (sshamt >= 16) ? ((uint32_t)(uint16_t)p_rs1 << 16) : ((uint32_t)(uint16_t)p_rs1 << sshamt); + if (shx > 0xFFFF) { + P.VU.vxsat->write(1); + p_rd = 0xFFFF; + } else { + p_rd = (uint16_t)shx; + } + } +}) + diff --git a/riscv/insns/psshl_ws.h b/riscv/insns/psshl_ws.h new file mode 100644 index 00000000..c67eddab --- /dev/null +++ b/riscv/insns/psshl_ws.h @@ -0,0 +1,19 @@ +require_rv64; +sreg_t sshamt = P_FIELD(RS2, 0, 8); +P_RD_RS1_LOOP(32, 32, { + if (sshamt < 0) { + if (sshamt <= -32) + p_rd = 0; + else + p_rd = (uint32_t)p_rs1 >> (-sshamt); + } else { + uint64_t shx = (sshamt >= 32) ? ((uint64_t)(uint32_t)p_rs1 << 32) : ((uint64_t)(uint32_t)p_rs1 << sshamt); + if (shx > 0xFFFFFFFFULL) { + P.VU.vxsat->write(1); + p_rd = 0xFFFFFFFF; + } else { + p_rd = (uint32_t)shx; + } + } +}) + diff --git a/riscv/insns/psshlr_dhs.h b/riscv/insns/psshlr_dhs.h new file mode 100644 index 00000000..d2616d6f --- /dev/null +++ b/riscv/insns/psshlr_dhs.h @@ -0,0 +1,23 @@ +require_rv32; +sreg_t sshamt = P_FIELD(RS2, 0, 8); +P_RD_RS1_DW_LOOP(16, 16, { + if (sshamt < 0) { + uint32_t shx; + if (sshamt < -16) + shx = 0; + else if (sshamt == -16) + shx = ((uint16_t)p_rs1 >> 15) & 1; + else + shx = ((uint32_t)(uint16_t)p_rs1 << 1) >> (-sshamt); + p_rd = (uint16_t)((shx + 1) >> 1); + } else { + uint32_t shx = (sshamt >= 16) ? ((uint32_t)(uint16_t)p_rs1 << 16) : ((uint32_t)(uint16_t)p_rs1 << sshamt); + if (shx > 0xFFFF) { + P.VU.vxsat->write(1); + p_rd = 0xFFFF; + } else { + p_rd = (uint16_t)shx; + } + } +}) + diff --git a/riscv/insns/psshlr_dws.h b/riscv/insns/psshlr_dws.h new file mode 100644 index 00000000..483d9d41 --- /dev/null +++ b/riscv/insns/psshlr_dws.h @@ -0,0 +1,23 @@ +require_rv32; +sreg_t sshamt = P_FIELD(RS2, 0, 8); +P_RD_RS1_DW_LOOP(32, 32, { + if (sshamt < 0) { + uint64_t shx; + if (sshamt < -32) + shx = 0; + else if (sshamt == -32) + shx = ((uint32_t)p_rs1 >> 31) & 1; + else + shx = ((uint64_t)(uint32_t)p_rs1 << 1) >> (-sshamt); + p_rd = (uint32_t)((shx + 1) >> 1); + } else { + uint64_t shx = (sshamt >= 32) ? ((uint64_t)(uint32_t)p_rs1 << 32) : ((uint64_t)(uint32_t)p_rs1 << sshamt); + if (shx > 0xFFFFFFFFULL) { + P.VU.vxsat->write(1); + p_rd = 0xFFFFFFFF; + } else { + p_rd = (uint32_t)shx; + } + } +}) + diff --git a/riscv/insns/psshlr_hs.h b/riscv/insns/psshlr_hs.h new file mode 100644 index 00000000..fd7df13d --- /dev/null +++ b/riscv/insns/psshlr_hs.h @@ -0,0 +1,22 @@ +sreg_t sshamt = P_FIELD(RS2, 0, 8); +P_RD_RS1_LOOP(16, 16, { + if (sshamt < 0) { + uint32_t shx; + if (sshamt < -16) + shx = 0; + else if (sshamt == -16) + shx = ((uint16_t)p_rs1 >> 15) & 1; + else + shx = ((uint32_t)(uint16_t)p_rs1 << 1) >> (-sshamt); + p_rd = (uint16_t)((shx + 1) >> 1); + } else { + uint32_t shx = (sshamt >= 16) ? ((uint32_t)(uint16_t)p_rs1 << 16) : ((uint32_t)(uint16_t)p_rs1 << sshamt); + if (shx > 0xFFFF) { + P.VU.vxsat->write(1); + p_rd = 0xFFFF; + } else { + p_rd = (uint16_t)shx; + } + } +}) + diff --git a/riscv/insns/psshlr_ws.h b/riscv/insns/psshlr_ws.h new file mode 100644 index 00000000..1935db20 --- /dev/null +++ b/riscv/insns/psshlr_ws.h @@ -0,0 +1,23 @@ +require_rv64; +sreg_t sshamt = P_FIELD(RS2, 0, 8); +P_RD_RS1_LOOP(32, 32, { + if (sshamt < 0) { + uint64_t shx; + if (sshamt < -32) + shx = 0; + else if (sshamt == -32) + shx = ((uint32_t)p_rs1 >> 31) & 1; + else + shx = ((uint64_t)(uint32_t)p_rs1 << 1) >> (-sshamt); + p_rd = (uint32_t)((shx + 1) >> 1); + } else { + uint64_t shx = (sshamt >= 32) ? ((uint64_t)(uint32_t)p_rs1 << 32) : ((uint64_t)(uint32_t)p_rs1 << sshamt); + if (shx > 0xFFFFFFFFULL) { + P.VU.vxsat->write(1); + p_rd = 0xFFFFFFFF; + } else { + p_rd = (uint32_t)shx; + } + } +}) + diff --git a/riscv/insns/psslai_dh.h b/riscv/insns/psslai_dh.h new file mode 100644 index 00000000..43b7dc07 --- /dev/null +++ b/riscv/insns/psslai_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_LOOP(16, 16, { + p_rd = P_SAT(16, sext32(p_rs1) << insn.shamth()); +})
\ No newline at end of file diff --git a/riscv/insns/psslai_dw.h b/riscv/insns/psslai_dw.h new file mode 100644 index 00000000..27280421 --- /dev/null +++ b/riscv/insns/psslai_dw.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_DW_LOOP(32, 32, { + p_rd = P_SAT(32, sext32(p_rs1) << insn.shamtw()); +})
\ No newline at end of file diff --git a/riscv/insns/psslai_h.h b/riscv/insns/psslai_h.h new file mode 100644 index 00000000..b5ae37e1 --- /dev/null +++ b/riscv/insns/psslai_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_LOOP(16, 16, { + p_rd = P_SAT(16, sext32(p_rs1) << insn.shamth()); +})
\ No newline at end of file diff --git a/riscv/insns/psslai_w.h b/riscv/insns/psslai_w.h new file mode 100644 index 00000000..d44cbada --- /dev/null +++ b/riscv/insns/psslai_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_LOOP(32, 32, { + p_rd = P_SAT(32, sext32(p_rs1) << insn.shamtw()); +} +) diff --git a/riscv/insns/pssub_b.h b/riscv/insns/pssub_b.h new file mode 100644 index 00000000..91a89aa1 --- /dev/null +++ b/riscv/insns/pssub_b.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_LOOP(8,8,8, { + bool sat = false; + p_rd = (sat_sub<int8_t, uint8_t>(p_rs1, p_rs2, sat)); +})
\ No newline at end of file diff --git a/riscv/insns/pssub_db.h b/riscv/insns/pssub_db.h new file mode 100644 index 00000000..1fd3d79e --- /dev/null +++ b/riscv/insns/pssub_db.h @@ -0,0 +1,5 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(8,8,8, { + bool sat = false; + p_rd = (sat_sub<int8_t, uint8_t>(p_rs1, p_rs2, sat)); +})
\ No newline at end of file diff --git a/riscv/insns/pssub_dh.h b/riscv/insns/pssub_dh.h new file mode 100644 index 00000000..8c16a47c --- /dev/null +++ b/riscv/insns/pssub_dh.h @@ -0,0 +1,5 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(16,16,16, { + bool sat = false; + p_rd = (sat_sub<int16_t, uint16_t>(p_rs1, p_rs2, sat)); +})
\ No newline at end of file diff --git a/riscv/insns/pssub_dw.h b/riscv/insns/pssub_dw.h new file mode 100644 index 00000000..be55dc5a --- /dev/null +++ b/riscv/insns/pssub_dw.h @@ -0,0 +1,5 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(32,32,32, { + bool sat = false; + p_rd = (sat_sub<int32_t, uint32_t>(p_rs1, p_rs2, sat)); +})
\ No newline at end of file diff --git a/riscv/insns/pssub_h.h b/riscv/insns/pssub_h.h new file mode 100644 index 00000000..db88d680 --- /dev/null +++ b/riscv/insns/pssub_h.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_LOOP(16,16,16, { + bool sat = false; + p_rd = (sat_sub<int16_t, uint16_t>(p_rs1, p_rs2, sat)); +})
\ No newline at end of file diff --git a/riscv/insns/pssub_w.h b/riscv/insns/pssub_w.h new file mode 100644 index 00000000..0cfa1072 --- /dev/null +++ b/riscv/insns/pssub_w.h @@ -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)); +} +) diff --git a/riscv/insns/pssubu_b.h b/riscv/insns/pssubu_b.h new file mode 100644 index 00000000..3fd44bee --- /dev/null +++ b/riscv/insns/pssubu_b.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_ULOOP(8,8,8, { + bool sat = false; + p_rd = (sat_subu<uint8_t>(p_rs1, p_rs2, sat)); +})
\ No newline at end of file diff --git a/riscv/insns/pssubu_db.h b/riscv/insns/pssubu_db.h new file mode 100644 index 00000000..fd564a5f --- /dev/null +++ b/riscv/insns/pssubu_db.h @@ -0,0 +1,5 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(8,8,8, { + bool sat = false; + p_rd = (sat_subu<uint8_t>(p_rs1, p_rs2, sat)); +})
\ No newline at end of file diff --git a/riscv/insns/pssubu_dh.h b/riscv/insns/pssubu_dh.h new file mode 100644 index 00000000..b910ce5d --- /dev/null +++ b/riscv/insns/pssubu_dh.h @@ -0,0 +1,5 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(16,16,16, { + bool sat = false; + p_rd = (sat_subu<uint16_t>(p_rs1, p_rs2, sat)); +})
\ No newline at end of file diff --git a/riscv/insns/pssubu_dw.h b/riscv/insns/pssubu_dw.h new file mode 100644 index 00000000..aa9063a2 --- /dev/null +++ b/riscv/insns/pssubu_dw.h @@ -0,0 +1,5 @@ +require_rv32; +P_RD_RS1_RS2_DW_ULOOP(32,32,32, { + bool sat = false; + p_rd = (sat_subu<uint32_t>(p_rs1, p_rs2, sat)); +})
\ No newline at end of file diff --git a/riscv/insns/pssubu_h.h b/riscv/insns/pssubu_h.h new file mode 100644 index 00000000..de3ff72a --- /dev/null +++ b/riscv/insns/pssubu_h.h @@ -0,0 +1,4 @@ +P_RD_RS1_RS2_ULOOP(16,16,16, { + bool sat = false; + p_rd = (sat_subu<uint16_t>(p_rs1, p_rs2, sat)); +})
\ No newline at end of file diff --git a/riscv/insns/pssubu_w.h b/riscv/insns/pssubu_w.h new file mode 100644 index 00000000..e4a42adc --- /dev/null +++ b/riscv/insns/pssubu_w.h @@ -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)); +} +) diff --git a/riscv/insns/psub_b.h b/riscv/insns/psub_b.h new file mode 100644 index 00000000..1dce95cf --- /dev/null +++ b/riscv/insns/psub_b.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_LOOP(8, 8, 8, { + p_rd = p_rs1 - p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/psub_db.h b/riscv/insns/psub_db.h new file mode 100644 index 00000000..9dd13238 --- /dev/null +++ b/riscv/insns/psub_db.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(8, 8, 8, { + p_rd = p_rs1 - p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/psub_dh.h b/riscv/insns/psub_dh.h new file mode 100644 index 00000000..ffb1c44e --- /dev/null +++ b/riscv/insns/psub_dh.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(16, 16, 16, { + p_rd = p_rs1 - p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/psub_dw.h b/riscv/insns/psub_dw.h new file mode 100644 index 00000000..cababad7 --- /dev/null +++ b/riscv/insns/psub_dw.h @@ -0,0 +1,4 @@ +require_rv32; +P_RD_RS1_RS2_DW_LOOP(32, 32, 32, { + p_rd = p_rs1 - p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/psub_h.h b/riscv/insns/psub_h.h new file mode 100644 index 00000000..a2d7c3b1 --- /dev/null +++ b/riscv/insns/psub_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_RS2_LOOP(16, 16, 16, { + p_rd = p_rs1 - p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/psub_w.h b/riscv/insns/psub_w.h new file mode 100644 index 00000000..3ccffe29 --- /dev/null +++ b/riscv/insns/psub_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_RS2_LOOP(32, 32, 32, { + p_rd = p_rs1 - p_rs2; +} +) diff --git a/riscv/insns/pusati_dh.h b/riscv/insns/pusati_dh.h new file mode 100644 index 00000000..16eb4332 --- /dev/null +++ b/riscv/insns/pusati_dh.h @@ -0,0 +1,13 @@ +require_rv32; +P_RD_RS1_DW_ULOOP(16, 16, { + uint64_t uint_max = insn.shamth() ? UINT64_MAX >> (64 - insn.shamth()) : 0; + int16_t s = (int16_t)p_rs1; + p_rd = p_rs1; + if (s < 0) { + p_rd = 0; + P.VU.vxsat->write(1); + } else if ((uint64_t)s > uint_max) { + p_rd = uint_max; + P.VU.vxsat->write(1); + } +})
\ No newline at end of file diff --git a/riscv/insns/pusati_dw.h b/riscv/insns/pusati_dw.h new file mode 100644 index 00000000..04f33a6c --- /dev/null +++ b/riscv/insns/pusati_dw.h @@ -0,0 +1,13 @@ +require_rv32; +P_RD_RS1_DW_ULOOP(32, 32, { + uint64_t uint_max = insn.shamtw() ? UINT64_MAX >> (64 - insn.shamtw()) : 0; + int32_t s = (int32_t)p_rs1; + p_rd = p_rs1; + if (s < 0) { + p_rd = 0; + P.VU.vxsat->write(1); + } else if ((uint64_t)s > uint_max) { + p_rd = uint_max; + P.VU.vxsat->write(1); + } +})
\ No newline at end of file diff --git a/riscv/insns/pusati_h.h b/riscv/insns/pusati_h.h new file mode 100644 index 00000000..d5857448 --- /dev/null +++ b/riscv/insns/pusati_h.h @@ -0,0 +1,3 @@ +P_RD_RS1_LOOP(16, 16, { + p_rd = P_USAT(insn.shamth() + 1, p_rs1); +})
\ No newline at end of file diff --git a/riscv/insns/pusati_w.h b/riscv/insns/pusati_w.h new file mode 100644 index 00000000..adc0bd28 --- /dev/null +++ b/riscv/insns/pusati_w.h @@ -0,0 +1,5 @@ +require_rv64; +P_RD_RS1_LOOP(32, 32, { + p_rd = P_USAT(insn.shamtw() + 1, p_rs1); +} +) diff --git a/riscv/insns/pwadd_b.h b/riscv/insns/pwadd_b.h new file mode 100644 index 00000000..2470b57e --- /dev/null +++ b/riscv/insns/pwadd_b.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_LOOP(8, 8, { + p_rd = p_rs1 + p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwadd_h.h b/riscv/insns/pwadd_h.h new file mode 100644 index 00000000..c139c3fc --- /dev/null +++ b/riscv/insns/pwadd_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_LOOP(16, 16, { + p_rd = p_rs1 + p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwadda_b.h b/riscv/insns/pwadda_b.h new file mode 100644 index 00000000..492fdbe9 --- /dev/null +++ b/riscv/insns/pwadda_b.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_LOOP(8, 8, { + p_rd += p_rs1 + p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwadda_h.h b/riscv/insns/pwadda_h.h new file mode 100644 index 00000000..0fbfc16e --- /dev/null +++ b/riscv/insns/pwadda_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_LOOP(16, 16, { + p_rd += p_rs1 + p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwaddau_b.h b/riscv/insns/pwaddau_b.h new file mode 100644 index 00000000..20e4b744 --- /dev/null +++ b/riscv/insns/pwaddau_b.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_ULOOP(8, 8, { + p_rd += p_rs1 + p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwaddau_h.h b/riscv/insns/pwaddau_h.h new file mode 100644 index 00000000..25a5720c --- /dev/null +++ b/riscv/insns/pwaddau_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_ULOOP(16, 16, { + p_rd += p_rs1 + p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwaddu_b.h b/riscv/insns/pwaddu_b.h new file mode 100644 index 00000000..e08f5d30 --- /dev/null +++ b/riscv/insns/pwaddu_b.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_ULOOP(8, 8, { + p_rd = p_rs1 + p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwaddu_h.h b/riscv/insns/pwaddu_h.h new file mode 100644 index 00000000..7da0db35 --- /dev/null +++ b/riscv/insns/pwaddu_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_ULOOP(16, 16, { + p_rd = p_rs1 + p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwmacc_h.h b/riscv/insns/pwmacc_h.h new file mode 100644 index 00000000..fcd8bc69 --- /dev/null +++ b/riscv/insns/pwmacc_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_LOOP(16, 16, { + p_rd += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwmaccsu_h.h b/riscv/insns/pwmaccsu_h.h new file mode 100644 index 00000000..9e8a07af --- /dev/null +++ b/riscv/insns/pwmaccsu_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_SULOOP(16, 16, { + p_rd += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwmaccu_h.h b/riscv/insns/pwmaccu_h.h new file mode 100644 index 00000000..0bf6df37 --- /dev/null +++ b/riscv/insns/pwmaccu_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_ULOOP(16, 16, { + p_rd += p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwmul_b.h b/riscv/insns/pwmul_b.h new file mode 100644 index 00000000..25fd0490 --- /dev/null +++ b/riscv/insns/pwmul_b.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_LOOP(8, 8, { + p_rd = p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwmul_h.h b/riscv/insns/pwmul_h.h new file mode 100644 index 00000000..5b7d431c --- /dev/null +++ b/riscv/insns/pwmul_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_LOOP(16, 16, { + p_rd = p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwmulsu_b.h b/riscv/insns/pwmulsu_b.h new file mode 100644 index 00000000..f94f1e1c --- /dev/null +++ b/riscv/insns/pwmulsu_b.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_SULOOP(8, 8, { + p_rd = p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwmulsu_h.h b/riscv/insns/pwmulsu_h.h new file mode 100644 index 00000000..0756787b --- /dev/null +++ b/riscv/insns/pwmulsu_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_SULOOP(16, 16, { + p_rd = p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwmulu_b.h b/riscv/insns/pwmulu_b.h new file mode 100644 index 00000000..886ac77e --- /dev/null +++ b/riscv/insns/pwmulu_b.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_ULOOP(8, 8, { + p_rd = p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwmulu_h.h b/riscv/insns/pwmulu_h.h new file mode 100644 index 00000000..ceeb9d56 --- /dev/null +++ b/riscv/insns/pwmulu_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_ULOOP(16, 16, { + p_rd = p_rs1 * p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwsla_bs.h b/riscv/insns/pwsla_bs.h new file mode 100644 index 00000000..6e4ef920 --- /dev/null +++ b/riscv/insns/pwsla_bs.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_LOOP(8, { + p_rd = p_rs1 << (RS2 & (16 - 1)); +})
\ No newline at end of file diff --git a/riscv/insns/pwsla_hs.h b/riscv/insns/pwsla_hs.h new file mode 100644 index 00000000..c63b9f45 --- /dev/null +++ b/riscv/insns/pwsla_hs.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_LOOP(16, { + p_rd = p_rs1 << (RS2 & (32 - 1)); +})
\ No newline at end of file diff --git a/riscv/insns/pwslai_b.h b/riscv/insns/pwslai_b.h new file mode 100644 index 00000000..df0a143c --- /dev/null +++ b/riscv/insns/pwslai_b.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_LOOP(8, { + p_rd = p_rs1 << insn.shamth(); +})
\ No newline at end of file diff --git a/riscv/insns/pwslai_h.h b/riscv/insns/pwslai_h.h new file mode 100644 index 00000000..6504974a --- /dev/null +++ b/riscv/insns/pwslai_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_LOOP(16, { + p_rd = p_rs1 << insn.shamtw(); +})
\ No newline at end of file diff --git a/riscv/insns/pwsll_bs.h b/riscv/insns/pwsll_bs.h new file mode 100644 index 00000000..24804320 --- /dev/null +++ b/riscv/insns/pwsll_bs.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_ULOOP(8, { + p_rd = p_rs1 << (RS2 & (16 - 1)); +})
\ No newline at end of file diff --git a/riscv/insns/pwsll_hs.h b/riscv/insns/pwsll_hs.h new file mode 100644 index 00000000..17a6326e --- /dev/null +++ b/riscv/insns/pwsll_hs.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_ULOOP(16, { + p_rd = p_rs1 << (RS2 & (32 - 1)); +})
\ No newline at end of file diff --git a/riscv/insns/pwslli_b.h b/riscv/insns/pwslli_b.h new file mode 100644 index 00000000..f2548cbe --- /dev/null +++ b/riscv/insns/pwslli_b.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_ULOOP(8, { + p_rd = (uint16_t)p_rs1 << insn.shamth(); +})
\ No newline at end of file diff --git a/riscv/insns/pwslli_h.h b/riscv/insns/pwslli_h.h new file mode 100644 index 00000000..59e8e41b --- /dev/null +++ b/riscv/insns/pwslli_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_ULOOP(16, { + p_rd = (uint32_t)p_rs1 << insn.shamtw(); +})
\ No newline at end of file diff --git a/riscv/insns/pwsub_b.h b/riscv/insns/pwsub_b.h new file mode 100644 index 00000000..97c09925 --- /dev/null +++ b/riscv/insns/pwsub_b.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_LOOP(8, 8, { + p_rd = p_rs1 - p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwsub_h.h b/riscv/insns/pwsub_h.h new file mode 100644 index 00000000..1be15dee --- /dev/null +++ b/riscv/insns/pwsub_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_LOOP(16, 16, { + p_rd = p_rs1 - p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwsuba_b.h b/riscv/insns/pwsuba_b.h new file mode 100644 index 00000000..99ad5357 --- /dev/null +++ b/riscv/insns/pwsuba_b.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_LOOP(8, 8, { + p_rd += p_rs1 - p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwsuba_h.h b/riscv/insns/pwsuba_h.h new file mode 100644 index 00000000..0107c690 --- /dev/null +++ b/riscv/insns/pwsuba_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_LOOP(16, 16, { + p_rd += p_rs1 - p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwsubau_b.h b/riscv/insns/pwsubau_b.h new file mode 100644 index 00000000..2b0b236a --- /dev/null +++ b/riscv/insns/pwsubau_b.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_ULOOP(8, 8, { + p_rd += p_rs1 - p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwsubau_h.h b/riscv/insns/pwsubau_h.h new file mode 100644 index 00000000..8281dcd1 --- /dev/null +++ b/riscv/insns/pwsubau_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_ULOOP(16, 16, { + p_rd += p_rs1 - p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwsubu_b.h b/riscv/insns/pwsubu_b.h new file mode 100644 index 00000000..a53818cd --- /dev/null +++ b/riscv/insns/pwsubu_b.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_ULOOP(8, 8, { + p_rd = p_rs1 - p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/pwsubu_h.h b/riscv/insns/pwsubu_h.h new file mode 100644 index 00000000..c944ea38 --- /dev/null +++ b/riscv/insns/pwsubu_h.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_ULOOP(16, 16, { + p_rd = p_rs1 - p_rs2; +})
\ No newline at end of file diff --git a/riscv/insns/rev.h b/riscv/insns/rev.h new file mode 100644 index 00000000..c2f9dd42 --- /dev/null +++ b/riscv/insns/rev.h @@ -0,0 +1,3 @@ +require_extension('P'); + +#include "grevi.h" diff --git a/riscv/insns/rev16.h b/riscv/insns/rev16.h new file mode 100644 index 00000000..877a1a13 --- /dev/null +++ b/riscv/insns/rev16.h @@ -0,0 +1,4 @@ +require_rv64; +require_extension('P'); + +#include "grevi.h" diff --git a/riscv/insns/rev_rv32.h b/riscv/insns/rev_rv32.h new file mode 100644 index 00000000..c2f9dd42 --- /dev/null +++ b/riscv/insns/rev_rv32.h @@ -0,0 +1,3 @@ +require_extension('P'); + +#include "grevi.h" diff --git a/riscv/insns/sadd.h b/riscv/insns/sadd.h new file mode 100644 index 00000000..94cc264c --- /dev/null +++ b/riscv/insns/sadd.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(P_SAT(xlen, sext_xlen((RS1 << 1) + RS2)));
\ No newline at end of file diff --git a/riscv/insns/saddu.h b/riscv/insns/saddu.h new file mode 100644 index 00000000..dec16b84 --- /dev/null +++ b/riscv/insns/saddu.h @@ -0,0 +1,4 @@ +require_extension('P'); +require_rv32; +bool sat = false; +WRITE_RD(sat_addu<uint32_t>(RS1, RS2, sat));
\ No newline at end of file diff --git a/riscv/insns/sati.h b/riscv/insns/sati.h new file mode 100644 index 00000000..bf8c4702 --- /dev/null +++ b/riscv/insns/sati.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv64; +WRITE_RD(P_SAT(insn.shamtd() + 1, (sreg_t)RS1)); diff --git a/riscv/insns/sati_rv32.h b/riscv/insns/sati_rv32.h new file mode 100644 index 00000000..a950d95c --- /dev/null +++ b/riscv/insns/sati_rv32.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(P_SAT(insn.shamtw() + 1, (sreg_t)RS1));
\ No newline at end of file diff --git a/riscv/insns/sha.h b/riscv/insns/sha.h new file mode 100644 index 00000000..fcec6249 --- /dev/null +++ b/riscv/insns/sha.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)); diff --git a/riscv/insns/shar.h b/riscv/insns/shar.h new file mode 100644 index 00000000..f6348277 --- /dev/null +++ b/riscv/insns/shar.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(0); +else + WRITE_RD(sshamt >= 0 ? (RS1 << sshamt) : (((sreg_t)RS1 >> -sshamt) + ((RS1 >> (-sshamt - 1)) & 1))); diff --git a/riscv/insns/shl.h b/riscv/insns/shl.h new file mode 100644 index 00000000..ef112422 --- /dev/null +++ b/riscv/insns/shl.h @@ -0,0 +1,15 @@ +require_extension('P'); +require_rv64; +sreg_t sshamt = P_FIELD(RS2, 0, 8); +if (sshamt < 0) { + if (sshamt <= -64) + WRITE_RD(0); + else + WRITE_RD(RS1 >> (-sshamt)); +} else { + if (sshamt >= 64) + WRITE_RD(0); + else + WRITE_RD(RS1 << sshamt); +} + diff --git a/riscv/insns/shlr.h b/riscv/insns/shlr.h new file mode 100644 index 00000000..29801fa9 --- /dev/null +++ b/riscv/insns/shlr.h @@ -0,0 +1,19 @@ +require_extension('P'); +require_rv64; +sreg_t sshamt = P_FIELD(RS2, 0, 8); +if (sshamt < 0) { + __uint128_t shx; + if (sshamt < -64) + shx = 0; + else if (sshamt == -64) + shx = (RS1 >> 63) & 1; + else + shx = ((__uint128_t)RS1 << 1) >> (-sshamt); + WRITE_RD((uint64_t)((shx + 1) >> 1)); +} else { + if (sshamt >= 64) + WRITE_RD(0); + else + WRITE_RD(RS1 << sshamt); +} + diff --git a/riscv/insns/slx.h b/riscv/insns/slx.h new file mode 100644 index 00000000..a6eb3e9c --- /dev/null +++ b/riscv/insns/slx.h @@ -0,0 +1,16 @@ +require_extension('P'); +if(xlen == 64){ + int shamt = RS2 & 63; + if(shamt == 0){ + WRITE_RD((uint64_t)RD); + }else{ + WRITE_RD(((uint64_t)RS1 >> (64 - shamt)) | ((uint64_t)RD << shamt)); + } +}else{ + int shamt = (uint32_t)RS2 & 31; + if (shamt == 0) { + WRITE_RD(sext_xlen((uint32_t)RD)); + } else { + WRITE_RD(sext_xlen(((uint32_t)RS1 >> (32 - shamt)) | ((uint32_t)RD << shamt))); + } +} diff --git a/riscv/insns/srari.h b/riscv/insns/srari.h new file mode 100644 index 00000000..02fe3a23 --- /dev/null +++ b/riscv/insns/srari.h @@ -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); diff --git a/riscv/insns/srari_rv32.h b/riscv/insns/srari_rv32.h new file mode 100644 index 00000000..25d4bee4 --- /dev/null +++ b/riscv/insns/srari_rv32.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(insn.shamtw() ? ((sext_xlen(RS1) >> insn.shamtw()) + ((sext_xlen(RS1) >> (insn.shamtw() - 1)) & 1)) : RS1);
\ No newline at end of file diff --git a/riscv/insns/srx.h b/riscv/insns/srx.h new file mode 100644 index 00000000..19460c74 --- /dev/null +++ b/riscv/insns/srx.h @@ -0,0 +1,16 @@ +require_extension('P'); +if(xlen == 64){ + int shamt = RS2 & 63; + if(shamt == 0){ + WRITE_RD((uint64_t)RD); + }else{ + WRITE_RD(((uint64_t)RS1 << (64 - shamt)) | ((uint64_t)RD >> shamt)); + } +}else{ + int shamt = (uint32_t)RS2 & 31; + if (shamt == 0) { + WRITE_RD(sext_xlen((uint32_t)RD)); + } else { + WRITE_RD(sext_xlen(((uint32_t)RS1 << (32 - shamt)) | ((uint32_t)RD >> shamt))); + } +} diff --git a/riscv/insns/ssh1sadd.h b/riscv/insns/ssh1sadd.h new file mode 100644 index 00000000..94cc264c --- /dev/null +++ b/riscv/insns/ssh1sadd.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(P_SAT(xlen, sext_xlen((RS1 << 1) + RS2)));
\ No newline at end of file diff --git a/riscv/insns/ssha.h b/riscv/insns/ssha.h new file mode 100644 index 00000000..44f7c009 --- /dev/null +++ b/riscv/insns/ssha.h @@ -0,0 +1,13 @@ +require_extension('P'); +require_rv32; +sreg_t sshamt = P_FIELD(RS2, 0, 8); +if (RS1 == 0) + WRITE_RD(0); +else if (sshamt >= 32) { + WRITE_RD((RS1 & 0x80000000) ? 0x80000000 : 0x7fffffff); + P.VU.vxsat->write(1); +} +else if (sshamt <= -32) + WRITE_RD((RS1 & 0x80000000) ? 0xffffffff : 0); +else + WRITE_RD(sshamt >= 0 ? P_SAT(32, static_cast<sreg_t> (RS1) << sshamt) : (RS1 >> -sshamt));
\ No newline at end of file diff --git a/riscv/insns/sshar.h b/riscv/insns/sshar.h new file mode 100644 index 00000000..2ebea187 --- /dev/null +++ b/riscv/insns/sshar.h @@ -0,0 +1,13 @@ +require_extension('P'); +require_rv32; +sreg_t sshamt = P_FIELD(RS2, 0, 8); +if (RS1 == 0) + WRITE_RD(0); +else if (sshamt >= 32) { + WRITE_RD((RS1 & 0x80000000) ? 0x80000000 : 0x7fffffff); + P.VU.vxsat->write(1); +} +else if (sshamt <= -32) + WRITE_RD(0); +else + WRITE_RD(sshamt >= 0 ? P_SAT(32, static_cast<sreg_t> (RS1) << sshamt) : ((RS1 >> -sshamt) + ((RS1 >> (-sshamt - 1)) & 1)));
\ No newline at end of file diff --git a/riscv/insns/sshl.h b/riscv/insns/sshl.h new file mode 100644 index 00000000..d2ba309d --- /dev/null +++ b/riscv/insns/sshl.h @@ -0,0 +1,18 @@ +require_extension('P'); +require_rv32; +sreg_t sshamt = P_FIELD(RS2, 0, 8); +if (sshamt < 0) { + if (sshamt <= -32) + WRITE_RD(0); + else + WRITE_RD(RS1 >> (-sshamt)); +} else { + uint64_t shx = (sshamt >= 32) ? ((uint64_t)RS1 << 32) : ((uint64_t)RS1 << sshamt); + if (shx > 0xFFFFFFFFULL) { + P.VU.vxsat->write(1); + WRITE_RD(0xFFFFFFFF); + } else { + WRITE_RD((uint32_t)shx); + } +} + diff --git a/riscv/insns/sshlr.h b/riscv/insns/sshlr.h new file mode 100644 index 00000000..d36b0052 --- /dev/null +++ b/riscv/insns/sshlr.h @@ -0,0 +1,22 @@ +require_extension('P'); +require_rv32; +sreg_t sshamt = P_FIELD(RS2, 0, 8); +if (sshamt < 0) { + uint64_t shx; + if (sshamt < -32) + shx = 0; + else if (sshamt == -32) + shx = (RS1 >> 31) & 1; + else + shx = ((uint64_t)RS1 << 1) >> (-sshamt); + WRITE_RD((uint32_t)((shx + 1) >> 1)); +} else { + uint64_t shx = (sshamt >= 32) ? ((uint64_t)RS1 << 32) : ((uint64_t)RS1 << sshamt); + if (shx > 0xFFFFFFFFULL) { + P.VU.vxsat->write(1); + WRITE_RD(0xFFFFFFFF); + } else { + WRITE_RD((uint32_t)shx); + } +} + diff --git a/riscv/insns/sslai.h b/riscv/insns/sslai.h new file mode 100644 index 00000000..5db6ab1a --- /dev/null +++ b/riscv/insns/sslai.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(P_SAT(32, static_cast<sreg_t> (RS1) << insn.shamtw()));
\ No newline at end of file diff --git a/riscv/insns/ssub.h b/riscv/insns/ssub.h new file mode 100644 index 00000000..f3db9b4b --- /dev/null +++ b/riscv/insns/ssub.h @@ -0,0 +1,5 @@ +require_extension('P'); +require_rv32; +bool sat = false; +int32_t p_rd = sat_sub<int32_t, uint32_t>(RS1, RS2, sat); +WRITE_RD(p_rd);
\ No newline at end of file diff --git a/riscv/insns/ssubu.h b/riscv/insns/ssubu.h new file mode 100644 index 00000000..c4aac5d3 --- /dev/null +++ b/riscv/insns/ssubu.h @@ -0,0 +1,4 @@ +require_extension('P'); +require_rv32; +bool sat = false; +WRITE_RD(sat_subu<uint32_t>(RS1, RS2, sat));
\ No newline at end of file diff --git a/riscv/insns/subd.h b/riscv/insns/subd.h new file mode 100644 index 00000000..768c8d40 --- /dev/null +++ b/riscv/insns/subd.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_P_RD_PAIR(P_RS1_PAIR - P_RS2_PAIR);
\ No newline at end of file diff --git a/riscv/insns/unzip16hp.h b/riscv/insns/unzip16hp.h new file mode 100644 index 00000000..15e2088d --- /dev/null +++ b/riscv/insns/unzip16hp.h @@ -0,0 +1 @@ +P_UNZIP(16, 1) diff --git a/riscv/insns/unzip16p.h b/riscv/insns/unzip16p.h new file mode 100644 index 00000000..6a3b7a06 --- /dev/null +++ b/riscv/insns/unzip16p.h @@ -0,0 +1 @@ +P_UNZIP(16, 0) diff --git a/riscv/insns/unzip8hp.h b/riscv/insns/unzip8hp.h new file mode 100644 index 00000000..365e9831 --- /dev/null +++ b/riscv/insns/unzip8hp.h @@ -0,0 +1 @@ +P_UNZIP(8, 1) diff --git a/riscv/insns/unzip8p.h b/riscv/insns/unzip8p.h new file mode 100644 index 00000000..d9b52d52 --- /dev/null +++ b/riscv/insns/unzip8p.h @@ -0,0 +1 @@ +P_UNZIP(8, 0) diff --git a/riscv/insns/usati.h b/riscv/insns/usati.h new file mode 100644 index 00000000..f08e9df7 --- /dev/null +++ b/riscv/insns/usati.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv64; +WRITE_RD(P_USAT(insn.shamtd() + 1, (sreg_t)RS1)); diff --git a/riscv/insns/usati_rv32.h b/riscv/insns/usati_rv32.h new file mode 100644 index 00000000..84ba83a1 --- /dev/null +++ b/riscv/insns/usati_rv32.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_RD(P_USAT(insn.shamtw() + 1, (sreg_t)RS1));
\ No newline at end of file diff --git a/riscv/insns/wadd.h b/riscv/insns/wadd.h new file mode 100644 index 00000000..351c8648 --- /dev/null +++ b/riscv/insns/wadd.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_P_RD_PAIR(RS1+RS2);
\ No newline at end of file diff --git a/riscv/insns/wadda.h b/riscv/insns/wadda.h new file mode 100644 index 00000000..7b011792 --- /dev/null +++ b/riscv/insns/wadda.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_P_RD_PAIR(P_RD_PAIR+RS1+RS2);
\ No newline at end of file diff --git a/riscv/insns/waddau.h b/riscv/insns/waddau.h new file mode 100644 index 00000000..33500295 --- /dev/null +++ b/riscv/insns/waddau.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_P_RD_PAIR((reg_t)P_RD_PAIR+(uint32_t)RS1+(uint32_t)RS2);
\ No newline at end of file diff --git a/riscv/insns/waddu.h b/riscv/insns/waddu.h new file mode 100644 index 00000000..e7b8c092 --- /dev/null +++ b/riscv/insns/waddu.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_P_RD_PAIR(0ULL + (uint32_t)RS1 + (uint32_t)RS2);
\ No newline at end of file diff --git a/riscv/insns/wmacc.h b/riscv/insns/wmacc.h new file mode 100644 index 00000000..e416e857 --- /dev/null +++ b/riscv/insns/wmacc.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_P_RD_PAIR(P_RD_PAIR+RS1*RS2);
\ No newline at end of file diff --git a/riscv/insns/wmaccsu.h b/riscv/insns/wmaccsu.h new file mode 100644 index 00000000..6f5be847 --- /dev/null +++ b/riscv/insns/wmaccsu.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_P_RD_PAIR((sreg_t)P_RD_PAIR+RS1*(uint32_t)RS2);
\ No newline at end of file diff --git a/riscv/insns/wmaccu.h b/riscv/insns/wmaccu.h new file mode 100644 index 00000000..bb84fc7a --- /dev/null +++ b/riscv/insns/wmaccu.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_P_RD_PAIR((reg_t)P_RD_PAIR+zext32(RS1)*zext32(RS2));
\ No newline at end of file diff --git a/riscv/insns/wmul.h b/riscv/insns/wmul.h new file mode 100644 index 00000000..67a1f1d3 --- /dev/null +++ b/riscv/insns/wmul.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_P_RD_PAIR(RS1*RS2);
\ No newline at end of file diff --git a/riscv/insns/wmulsu.h b/riscv/insns/wmulsu.h new file mode 100644 index 00000000..4447070a --- /dev/null +++ b/riscv/insns/wmulsu.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_P_RD_PAIR(RS1*(uint32_t)RS2);
\ No newline at end of file diff --git a/riscv/insns/wmulu.h b/riscv/insns/wmulu.h new file mode 100644 index 00000000..ffd284b6 --- /dev/null +++ b/riscv/insns/wmulu.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_P_RD_PAIR(zext32(RS1)*zext32(RS2));
\ No newline at end of file diff --git a/riscv/insns/wsla.h b/riscv/insns/wsla.h new file mode 100644 index 00000000..6f8a6451 --- /dev/null +++ b/riscv/insns/wsla.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_P_RD_PAIR(RS1 << (RS2 & (64 - 1)));
\ No newline at end of file diff --git a/riscv/insns/wslai.h b/riscv/insns/wslai.h new file mode 100644 index 00000000..41675a2b --- /dev/null +++ b/riscv/insns/wslai.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_P_RD_PAIR(RS1 << insn.shamtd());
\ No newline at end of file diff --git a/riscv/insns/wsll.h b/riscv/insns/wsll.h new file mode 100644 index 00000000..7aaf14f0 --- /dev/null +++ b/riscv/insns/wsll.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_P_RD_PAIR((uint64_t)(uint32_t)RS1 << (RS2 & (64 - 1)));
\ No newline at end of file diff --git a/riscv/insns/wslli.h b/riscv/insns/wslli.h new file mode 100644 index 00000000..cf9c9bec --- /dev/null +++ b/riscv/insns/wslli.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_P_RD_PAIR((uint64_t)(uint32_t)RS1 << insn.shamtd());
\ No newline at end of file diff --git a/riscv/insns/wsub.h b/riscv/insns/wsub.h new file mode 100644 index 00000000..ea3250df --- /dev/null +++ b/riscv/insns/wsub.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_P_RD_PAIR(RS1-RS2);
\ No newline at end of file diff --git a/riscv/insns/wsuba.h b/riscv/insns/wsuba.h new file mode 100644 index 00000000..ca81a9ca --- /dev/null +++ b/riscv/insns/wsuba.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_P_RD_PAIR(P_RD_PAIR+RS1-RS2);
\ No newline at end of file diff --git a/riscv/insns/wsubau.h b/riscv/insns/wsubau.h new file mode 100644 index 00000000..e668a33a --- /dev/null +++ b/riscv/insns/wsubau.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_P_RD_PAIR(P_RD_PAIR+(uint32_t)RS1-(uint32_t)RS2);
\ No newline at end of file diff --git a/riscv/insns/wsubu.h b/riscv/insns/wsubu.h new file mode 100644 index 00000000..b8de8368 --- /dev/null +++ b/riscv/insns/wsubu.h @@ -0,0 +1,3 @@ +require_extension('P'); +require_rv32; +WRITE_P_RD_PAIR(0ULL + (uint32_t)RS1-(uint32_t)RS2);
\ No newline at end of file diff --git a/riscv/insns/wzip16p.h b/riscv/insns/wzip16p.h new file mode 100644 index 00000000..a73e4197 --- /dev/null +++ b/riscv/insns/wzip16p.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_ZIP_LOOP(16, 16, { + p_rd = p_rs2 << 16 | p_rs1; +})
\ No newline at end of file diff --git a/riscv/insns/wzip8p.h b/riscv/insns/wzip8p.h new file mode 100644 index 00000000..bfcf04e0 --- /dev/null +++ b/riscv/insns/wzip8p.h @@ -0,0 +1,4 @@ +require_rv32; +P_WIDEN_RD_RS1_RS2_ZIP_LOOP(8, 8, { + p_rd = p_rs2 << 8 | p_rs1; +})
\ No newline at end of file diff --git a/riscv/insns/zip16hp.h b/riscv/insns/zip16hp.h new file mode 100644 index 00000000..4090fc5c --- /dev/null +++ b/riscv/insns/zip16hp.h @@ -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; +} +) diff --git a/riscv/insns/zip16p.h b/riscv/insns/zip16p.h new file mode 100644 index 00000000..0bb2e9c7 --- /dev/null +++ b/riscv/insns/zip16p.h @@ -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; +} +) diff --git a/riscv/insns/zip8hp.h b/riscv/insns/zip8hp.h new file mode 100644 index 00000000..9d323ef7 --- /dev/null +++ b/riscv/insns/zip8hp.h @@ -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; +} +) diff --git a/riscv/insns/zip8p.h b/riscv/insns/zip8p.h new file mode 100644 index 00000000..7f00c7a7 --- /dev/null +++ b/riscv/insns/zip8p.h @@ -0,0 +1,5 @@ +require_extension('P'); +P_RD_RS1_RS2_ZIP_LOOP(8, 8, 8, 0, { + p_rd = i % 2 ? p_rs2 : p_rs1; +} +) |
