Browse Source

Merge pull request #2310 from chihminchao/fix-rvp

Fix rvp
pull/2338/head
Andrew Waterman 4 weeks ago
committed by GitHub
parent
commit
f7bd55744a
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 3
      riscv/check-opcode-overlap.t.cc
  2. 2
      riscv/insns/aadd.h
  3. 2
      riscv/insns/aaddu.h
  4. 2
      riscv/insns/asub.h
  5. 2
      riscv/insns/asubu.h
  6. 2
      riscv/insns/mhacc.h
  7. 2
      riscv/insns/mhacc_h0.h
  8. 2
      riscv/insns/mhacc_h1.h
  9. 2
      riscv/insns/mhaccsu.h
  10. 2
      riscv/insns/mhaccsu_h0.h
  11. 2
      riscv/insns/mhaccsu_h1.h
  12. 2
      riscv/insns/mhaccu.h
  13. 2
      riscv/insns/mhracc.h
  14. 2
      riscv/insns/mhraccsu.h
  15. 2
      riscv/insns/mhraccu.h
  16. 2
      riscv/insns/mqacc_h00.h
  17. 2
      riscv/insns/mqacc_h01.h
  18. 2
      riscv/insns/mqacc_h11.h
  19. 2
      riscv/insns/mqracc_h00.h
  20. 2
      riscv/insns/mqracc_h01.h
  21. 2
      riscv/insns/mqracc_h11.h
  22. 3
      riscv/insns/mqrwacc.h
  23. 3
      riscv/insns/mqwacc.h
  24. 2
      riscv/insns/mulh_h0.h
  25. 2
      riscv/insns/mulh_h1.h
  26. 2
      riscv/insns/mulhr.h
  27. 2
      riscv/insns/mulhrsu.h
  28. 2
      riscv/insns/mulhru.h
  29. 2
      riscv/insns/mulhsu_h0.h
  30. 2
      riscv/insns/mulhsu_h1.h
  31. 2
      riscv/insns/mulq.h
  32. 2
      riscv/insns/mulqr.h
  33. 2
      riscv/insns/nclip.h
  34. 2
      riscv/insns/nclipi.h
  35. 7
      riscv/insns/nclipiu.h
  36. 2
      riscv/insns/nclipr.h
  37. 6
      riscv/insns/nclipri.h
  38. 14
      riscv/insns/nclipriu.h
  39. 16
      riscv/insns/nclipru.h
  40. 8
      riscv/insns/nclipu.h
  41. 2
      riscv/insns/nsra.h
  42. 2
      riscv/insns/nsrai.h
  43. 6
      riscv/insns/nsrar.h
  44. 6
      riscv/insns/nsrari.h
  45. 2
      riscv/insns/nsrl.h
  46. 2
      riscv/insns/nsrli.h
  47. 4
      riscv/insns/pm2wsub_h.h
  48. 6
      riscv/insns/pm2wsub_hx.h
  49. 4
      riscv/insns/pm2wsuba_h.h
  50. 6
      riscv/insns/pm2wsuba_hx.h
  51. 4
      riscv/insns/pmhacc_h.h
  52. 4
      riscv/insns/pmhacc_h_b0.h
  53. 4
      riscv/insns/pmhacc_h_b1.h
  54. 2
      riscv/insns/pmhacc_w_h0.h
  55. 2
      riscv/insns/pmhacc_w_h1.h
  56. 4
      riscv/insns/pmhaccsu_h_b0.h
  57. 4
      riscv/insns/pmhaccsu_h_b1.h
  58. 2
      riscv/insns/pmhaccsu_w_h0.h
  59. 2
      riscv/insns/pmhaccsu_w_h1.h
  60. 5
      riscv/insns/pmqrwacc_h.h
  61. 5
      riscv/insns/pmqwacc_h.h
  62. 4
      riscv/insns/pmulh_h_b0.h
  63. 4
      riscv/insns/pmulh_h_b1.h
  64. 2
      riscv/insns/pmulh_w_h0.h
  65. 2
      riscv/insns/pmulh_w_h1.h
  66. 4
      riscv/insns/pmulhsu_h_b0.h
  67. 4
      riscv/insns/pmulhsu_h_b1.h
  68. 2
      riscv/insns/pmulhsu_w_h1.h
  69. 4
      riscv/insns/psadd_b.h
  70. 4
      riscv/insns/psadd_db.h
  71. 4
      riscv/insns/psadd_dh.h
  72. 4
      riscv/insns/psadd_dw.h
  73. 4
      riscv/insns/psadd_h.h
  74. 2
      riscv/insns/psadd_w.h
  75. 4
      riscv/insns/psaddu_b.h
  76. 4
      riscv/insns/psaddu_db.h
  77. 4
      riscv/insns/psaddu_dh.h
  78. 4
      riscv/insns/psaddu_dw.h
  79. 4
      riscv/insns/psaddu_h.h
  80. 2
      riscv/insns/psaddu_w.h
  81. 5
      riscv/insns/psll_dws.h
  82. 2
      riscv/insns/pssh1sadd_w.h
  83. 59
      riscv/insns/pssha_dhs.h
  84. 57
      riscv/insns/pssha_dws.h
  85. 6
      riscv/insns/pssha_hs.h
  86. 4
      riscv/insns/pssha_ws.h
  87. 81
      riscv/insns/psshar_dhs.h
  88. 81
      riscv/insns/psshar_dws.h
  89. 4
      riscv/insns/psshar_hs.h
  90. 2
      riscv/insns/psshar_ws.h
  91. 13
      riscv/insns/psshl_dhs.h
  92. 13
      riscv/insns/psshl_dws.h
  93. 13
      riscv/insns/psshl_hs.h
  94. 13
      riscv/insns/psshl_ws.h
  95. 16
      riscv/insns/psshlr_dhs.h
  96. 16
      riscv/insns/psshlr_dws.h
  97. 16
      riscv/insns/psshlr_hs.h
  98. 16
      riscv/insns/psshlr_ws.h
  99. 4
      riscv/insns/pssub_b.h
  100. 4
      riscv/insns/pssub_db.h

3
riscv/check-opcode-overlap.t.cc

@ -33,8 +33,11 @@ int main()
std::unordered_map<std::string, bool> overlap_list;
#define DECLARE_OVERLAP_INSN(name, ext) \
overlap_list[std::string(#name)] = false;
#define DECLARE_OVERLAP_INSN_RV64(name, ext) \
overlap_list[std::string(#name)] = false;
#include "overlap_list.h"
#undef DECLARE_OVERLAP_INSN
#undef DECLARE_OVERLAP_INSN_RV64
std::vector<const opcode*> list;
for (size_t i = 0; i < std::size(static_list); i++) {

2
riscv/insns/aadd.h

@ -1,3 +1,3 @@
require_extension('P');
require_rv32;
WRITE_RD((RS1 + RS2)>>1);
WRITE_RD(sext32((RS1 + RS2)>>1));

2
riscv/insns/aaddu.h

@ -1,3 +1,3 @@
require_extension('P');
require_rv32;
WRITE_RD((0ULL + (uint32_t)RS1 + (uint32_t)RS2)>>1);
WRITE_RD(sext32((0ULL + (uint32_t)RS1 + (uint32_t)RS2)>>1));

2
riscv/insns/asub.h

@ -1,3 +1,3 @@
require_extension('P');
require_rv32;
WRITE_RD((RS1 - RS2)>>1);
WRITE_RD(sext32((RS1 - RS2)>>1));

2
riscv/insns/asubu.h

@ -1,3 +1,3 @@
require_extension('P');
require_rv32;
WRITE_RD((0ULL + (uint32_t)RS1 - (uint32_t)RS2)>>1);
WRITE_RD((sext32(0ULL + (uint32_t)RS1 - (uint32_t)RS2)>>1));

2
riscv/insns/mhacc.h

@ -1,4 +1,4 @@
require_extension('P');
require_rv32;
sreg_t mres = sext32(RS1) * sext32(RS2);
WRITE_RD(RD + (mres >> 32));
WRITE_RD(sext32(RD + (mres >> 32)));

2
riscv/insns/mhacc_h0.h

@ -1,4 +1,4 @@
require_extension('P');
require_rv32;
sreg_t mres = sext32(RS1) * sext32(P_FIELD(RS2, 0, 16));
WRITE_RD(RD + (mres >> 32));
WRITE_RD(sext32(RD + (mres >> 16)));

2
riscv/insns/mhacc_h1.h

@ -1,4 +1,4 @@
require_extension('P');
require_rv32;
sreg_t mres = sext32(RS1) * sext32(P_FIELD(RS2, 1, 16));
WRITE_RD(RD + (mres >> 32));
WRITE_RD(sext32(RD + (mres >> 16)));

2
riscv/insns/mhaccsu.h

@ -1,4 +1,4 @@
require_extension('P');
require_rv32;
sreg_t mres = sext32(RS1) * reg_t((uint32_t)RS2);
WRITE_RD(RD + (mres >> 32));
WRITE_RD(sext32(RD + (mres >> 32)));

2
riscv/insns/mhaccsu_h0.h

@ -1,4 +1,4 @@
require_extension('P');
require_rv32;
sreg_t mres = sext32(RS1) * (uint32_t)P_FIELD(RS2, 0, 16);
WRITE_RD(RD + (mres >> 32));
WRITE_RD(sext32(RD + (mres >> 16)));

2
riscv/insns/mhaccsu_h1.h

@ -1,4 +1,4 @@
require_extension('P');
require_rv32;
sreg_t mres = sext32(RS1) * (uint32_t)P_FIELD(RS2, 1, 16);
WRITE_RD(RD + (mres >> 32));
WRITE_RD(sext32(RD + (mres >> 16)));

2
riscv/insns/mhaccu.h

@ -1,4 +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));
WRITE_RD(sext32(RD + (mres >> 32)));

2
riscv/insns/mhracc.h

@ -2,4 +2,4 @@ require_extension('P');
require_rv32;
sreg_t mres = sext32(RS1) * sext32(RS2);
int32_t round = ((mres >> 31) + 1) >> 1;
WRITE_RD(RD + round);
WRITE_RD(sext32(RD + round));

2
riscv/insns/mhraccsu.h

@ -2,4 +2,4 @@ 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);
WRITE_RD(sext32(RD + round));

2
riscv/insns/mhraccu.h

@ -2,4 +2,4 @@ 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);
WRITE_RD(sext32(RD + round));

2
riscv/insns/mqacc_h00.h

@ -1,3 +1,3 @@
require_extension('P');
require_rv32;
WRITE_RD(RD + (((int32_t)P_FIELD(RS1, 0, 16) * P_FIELD(RS2, 0, 16)) >> 15));
WRITE_RD(sext32(RD + (((int32_t)P_FIELD(RS1, 0, 16) * P_FIELD(RS2, 0, 16)) >> 15)));

2
riscv/insns/mqacc_h01.h

@ -1,3 +1,3 @@
require_extension('P');
require_rv32;
WRITE_RD(RD + (((int32_t)P_FIELD(RS1, 0, 16) * P_FIELD(RS2, 1, 16)) >> 15));
WRITE_RD(sext32(RD + (((int32_t)P_FIELD(RS1, 0, 16) * P_FIELD(RS2, 1, 16)) >> 15)));

2
riscv/insns/mqacc_h11.h

@ -1,3 +1,3 @@
require_extension('P');
require_rv32;
WRITE_RD(RD + (((int32_t)P_FIELD(RS1, 1, 16) * P_FIELD(RS2, 1, 16)) >> 15));
WRITE_RD(sext32(RD + (((int32_t)P_FIELD(RS1, 1, 16) * P_FIELD(RS2, 1, 16)) >> 15)));

2
riscv/insns/mqracc_h00.h

@ -1,3 +1,3 @@
require_extension('P');
require_rv32;
WRITE_RD(RD + (((int32_t)P_FIELD(RS1, 0, 16) * P_FIELD(RS2, 0, 16) + 0x4000) >> 15));
WRITE_RD(sext32(RD + (((int32_t)P_FIELD(RS1, 0, 16) * P_FIELD(RS2, 0, 16) + 0x4000) >> 15)));

2
riscv/insns/mqracc_h01.h

@ -1,3 +1,3 @@
require_extension('P');
require_rv32;
WRITE_RD(RD + (((int32_t)P_FIELD(RS1, 0, 16) * P_FIELD(RS2, 1, 16) + 0x4000) >> 15));
WRITE_RD(sext32(RD + (((int32_t)P_FIELD(RS1, 0, 16) * P_FIELD(RS2, 1, 16) + 0x4000) >> 15)));

2
riscv/insns/mqracc_h11.h

@ -1,3 +1,3 @@
require_extension('P');
require_rv32;
WRITE_RD(RD + (((int32_t)P_FIELD(RS1, 1, 16) * P_FIELD(RS2, 1, 16) + 0x4000) >> 15));
WRITE_RD(sext32(RD + (((int32_t)P_FIELD(RS1, 1, 16) * P_FIELD(RS2, 1, 16) + 0x4000) >> 15)));

3
riscv/insns/mqrwacc.h

@ -1,3 +1,4 @@
require_extension('P');
require_rv32;
WRITE_P_RD_PAIR(P_RD_PAIR + (((sreg_t)RS1*(sreg_t)RS2 + 0x40000000) >> 31));
int64_t tmp = (((int128_t)(int32_t)RS1 * (int32_t)RS2) + (1 << 30)) >> 31;
WRITE_P_RD_PAIR(P_RD_PAIR + tmp);

3
riscv/insns/mqwacc.h

@ -1,3 +1,4 @@
require_extension('P');
require_rv32;
WRITE_P_RD_PAIR(P_RD_PAIR + (((sreg_t)RS1*(sreg_t)RS2) >> 31));
int64_t tmp = (((int128_t)(int32_t)RS1 * (int32_t)RS2)) >> 31;
WRITE_P_RD_PAIR((P_RD_PAIR + tmp));

2
riscv/insns/mulh_h0.h

@ -1,4 +1,4 @@
require_extension('P');
require_rv32;
int64_t mres = sext(RS1,64) * sext(P_FIELD(RS2, 0, 16),64);
WRITE_RD(mres>>32);
WRITE_RD(sext32(mres>>16));

2
riscv/insns/mulh_h1.h

@ -1,4 +1,4 @@
require_extension('P');
require_rv32;
int64_t mres = sext(RS1,64) * sext(P_FIELD(RS2, 1, 16),64);
WRITE_RD(mres>>32);
WRITE_RD(sext32(mres>>16));

2
riscv/insns/mulhr.h

@ -1,4 +1,4 @@
require_extension('P');
require_rv32;
int64_t mres = sext(RS1,64) * sext(RS2,64);
WRITE_RD(((mres >> 31) + 1) >> 1);
WRITE_RD(sext32(((mres >> 31) + 1) >> 1));

2
riscv/insns/mulhrsu.h

@ -1,4 +1,4 @@
require_extension('P');
require_rv32;
sreg_t mres = sext(RS1,64) * reg_t((uint32_t)RS2);
WRITE_RD(((mres >> 31) + 1) >> 1);
WRITE_RD(sext32(((mres >> 31) + 1) >> 1));

2
riscv/insns/mulhru.h

@ -1,4 +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);
WRITE_RD(sext32(((mres >> 31) + 1) >> 1));

2
riscv/insns/mulhsu_h0.h

@ -1,4 +1,4 @@
require_extension('P');
require_rv32;
sreg_t mres = sext32(RS1) * (uint32_t)P_FIELD(RS2, 0, 16);
WRITE_RD(mres >> 32);
WRITE_RD(sext32(mres >> 16));

2
riscv/insns/mulhsu_h1.h

@ -1,4 +1,4 @@
require_extension('P');
require_rv32;
sreg_t mres = sext32(RS1) * (uint32_t)P_FIELD(RS2, 1, 16);
WRITE_RD(mres >> 32);
WRITE_RD(sext32(mres >> 16));

2
riscv/insns/mulq.h

@ -1,7 +1,7 @@
require_extension('P');
require_rv32;
if ((RS1 != (reg_t)INT32_MIN) || (RS2 != (reg_t)INT32_MIN)) {
WRITE_RD((RS1 * RS2) >> 31);
WRITE_RD(sext32((RS1 * RS2) >> 31));
} else {
WRITE_RD(INT32_MAX);
P.set_vxsat();

2
riscv/insns/mulqr.h

@ -1,7 +1,7 @@
require_extension('P');
require_rv32;
if ((RS1 != (reg_t)INT32_MIN) || (RS2 != (reg_t)INT32_MIN)) {
WRITE_RD((((RS1 * RS2) >> 30) + 1) >> 1);
WRITE_RD(sext32((((RS1 * RS2) >> 30) + 1) >> 1));
} else {
WRITE_RD(INT32_MAX);
P.set_vxsat();

2
riscv/insns/nclip.h

@ -2,4 +2,4 @@ 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);
WRITE_RD(sext32(result));

2
riscv/insns/nclipi.h

@ -2,4 +2,4 @@ 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);
WRITE_RD(sext32(result));

7
riscv/insns/nclipiu.h

@ -1,5 +1,8 @@
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);
if (tmp > UINT32_MAX) {
tmp = UINT32_MAX;
P.set_vxsat();
}
WRITE_RD(sext32(tmp));

2
riscv/insns/nclipr.h

@ -8,4 +8,4 @@ if (shamt == 0) {
} else {
result = P_SAT(32, (val >> shamt) + ((val >> (shamt - 1)) & 1));
}
WRITE_RD(result);
WRITE_RD(sext32(result));

6
riscv/insns/nclipri.h

@ -4,8 +4,8 @@ sreg_t val = (sreg_t)P_RS1_PAIR;
uint32_t shamt = insn.shamtd();
sreg_t result;
if (shamt == 0) {
result = P_SAT(32, val);
result = P_SAT(32, val);
} else {
result = P_SAT(32, (val >> shamt) + ((val >> (shamt - 1)) & 1));
result = P_SAT(32, (val >> shamt) + ((val >> (shamt - 1)) & 1));
}
WRITE_RD(result);
WRITE_RD(sext32(result));

14
riscv/insns/nclipriu.h

@ -1,11 +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)));
reg_t tmp = ((((uint128_t)P_RS1_PAIR << 1) >> shamt) + 1) >> 1;
if (tmp > UINT32_MAX) {
tmp = UINT32_MAX;
P.set_vxsat();
}
WRITE_RD(result);
WRITE_RD(sext32(tmp));

16
riscv/insns/nclipru.h

@ -1,11 +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);
reg_t tmp = ((((uint128_t)P_RS1_PAIR << 1) >> shamt) + 1) >> 1;
if (tmp > UINT32_MAX) {
tmp = UINT32_MAX;
P.set_vxsat();
}
WRITE_RD(sext32(tmp));

8
riscv/insns/nclipu.h

@ -1,5 +1,9 @@
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);
if (tmp > UINT32_MAX) {
tmp = UINT32_MAX;
P.set_vxsat();
}
WRITE_RD(sext32(tmp));

2
riscv/insns/nsra.h

@ -1,3 +1,3 @@
require_extension('P');
require_rv32;
WRITE_RD((sreg_t)P_RS1_PAIR >> (RS2 & 0x3f));
WRITE_RD(sext32((sreg_t)P_RS1_PAIR >> (RS2 & 0x3f)));

2
riscv/insns/nsrai.h

@ -1,3 +1,3 @@
require_extension('P');
require_rv32;
WRITE_RD((sreg_t)P_RS1_PAIR >> insn.shamtd());
WRITE_RD(sext32((sreg_t)P_RS1_PAIR >> insn.shamtd()));

6
riscv/insns/nsrar.h

@ -4,8 +4,8 @@ sreg_t val = (sreg_t)P_RS1_PAIR;
uint32_t shamt = RS2 & 0x3f;
sreg_t result;
if (shamt == 0) {
result = val;
result = val;
} else {
result = (val >> shamt) + ((val >> (shamt - 1)) & 1);
result = (val >> shamt) + ((val >> (shamt - 1)) & 1);
}
WRITE_RD(result);
WRITE_RD(sext32(result));

6
riscv/insns/nsrari.h

@ -4,8 +4,8 @@ sreg_t val = (sreg_t)P_RS1_PAIR;
uint32_t shamt = insn.shamtd();
sreg_t result;
if (shamt == 0) {
result = val;
result = val;
} else {
result = (val >> shamt) + ((val >> (shamt - 1)) & 1);
result = (val >> shamt) + ((val >> (shamt - 1)) & 1);
}
WRITE_RD(result);
WRITE_RD(sext32(result));

2
riscv/insns/nsrl.h

@ -1,3 +1,3 @@
require_extension('P');
require_rv32;
WRITE_RD(P_RS1_PAIR >> (RS2 & 0x3f));
WRITE_RD(sext32(P_RS1_PAIR >> (RS2 & 0x3f)));

2
riscv/insns/nsrli.h

@ -1,3 +1,3 @@
require_extension('P');
require_rv32;
WRITE_RD(P_RS1_PAIR >> insn.shamtd());
WRITE_RD(sext32(P_RS1_PAIR >> insn.shamtd()));

4
riscv/insns/pm2wsub_h.h

@ -1,7 +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;
else
p_res += p_rs1 * p_rs2;
})

6
riscv/insns/pm2wsub_hx.h

@ -1,7 +1,7 @@
require_rv32;
P_WIDEN_REDUCTION_CROSS_LOOP(32, 16, false, false, {
if (j & 1)
p_res += p_rs1 * p_rs2;
p_res -= (int64_t)p_rs1 * p_rs2;
else
p_res -= p_rs1 * p_rs2;
})
p_res += (int64_t)p_rs1 * p_rs2;
})

4
riscv/insns/pm2wsuba_h.h

@ -1,7 +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;
else
p_res += p_rs1 * p_rs2;
})

6
riscv/insns/pm2wsuba_hx.h

@ -1,7 +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;
})
else
p_res += p_rs1 * p_rs2;
})

4
riscv/insns/pmhacc_h.h

@ -1,4 +1,4 @@
P_RD_RS1_RS2_LOOP(16,16,16, {
int32_t mres = sext32(p_rs1) * sext32(p_rs2);
p_rd += mres>>16;
})
p_rd += mres>>16;
})

4
riscv/insns/pmhacc_h_b0.h

@ -1,4 +1,4 @@
P_RD_RS1_RS2_E_LOOP(16,16,8, {
int32_t mres = sext32(p_rs1) * sext32(p_rs2);
p_rd += mres>>16;
})
p_rd += mres>>8;
})

4
riscv/insns/pmhacc_h_b1.h

@ -1,4 +1,4 @@
P_RD_RS1_RS2_O_LOOP(16,16,8, {
int32_t mres = sext32(p_rs1) * sext32(p_rs2);
p_rd += mres>>16;
})
p_rd += mres>>8;
})

2
riscv/insns/pmhacc_w_h0.h

@ -1,6 +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;
p_rd += mres>>16;
}
)

2
riscv/insns/pmhacc_w_h1.h

@ -1,6 +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;
p_rd += mres>>16;
}
)

4
riscv/insns/pmhaccsu_h_b0.h

@ -1,4 +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;
})
p_rd += mres>>8;
})

4
riscv/insns/pmhaccsu_h_b1.h

@ -1,4 +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;
})
p_rd += mres>>8;
})

2
riscv/insns/pmhaccsu_w_h0.h

@ -1,6 +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;
p_rd += mres>>16;
}
)

2
riscv/insns/pmhaccsu_w_h1.h

@ -1,6 +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;
p_rd += mres>>16;
}
)

5
riscv/insns/pmqrwacc_h.h

@ -1,4 +1,5 @@
require_rv32;
P_WIDEN_RD_RS1_RS2_LOOP(16, 16, {
p_rd += (p_rs1 * p_rs2 + 0x4000) >> 15;
})
int64_t val = ((int64_t)(int16_t)p_rs1 * (int64_t)(int16_t)p_rs2 + 0x4000) >> 15;
p_rd += val;
})

5
riscv/insns/pmqwacc_h.h

@ -1,4 +1,5 @@
require_rv32;
P_WIDEN_RD_RS1_RS2_LOOP(16, 16, {
p_rd += (p_rs1 * p_rs2) >> 15;
})
int64_t val = ((int64_t)(int16_t)p_rs1 * (int64_t)(int16_t)p_rs2) >> 15;
p_rd += val;
})

4
riscv/insns/pmulh_h_b0.h

@ -1,4 +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;
})
p_rd = mres >> 8;
})

4
riscv/insns/pmulh_h_b1.h

@ -1,4 +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;
})
p_rd = mres >> 8;
})

2
riscv/insns/pmulh_w_h0.h

@ -1,6 +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;
p_rd = mres >> 16;
}
)

2
riscv/insns/pmulh_w_h1.h

@ -1,6 +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;
p_rd = mres >> 16;
}
)

4
riscv/insns/pmulhsu_h_b0.h

@ -1,4 +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;
})
p_rd = mres >> 8;
})

4
riscv/insns/pmulhsu_h_b1.h

@ -1,4 +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;
})
p_rd = mres >> 8;
})

2
riscv/insns/pmulhsu_w_h1.h

@ -1,6 +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;
p_rd = mres >> 16;
}
)

4
riscv/insns/psadd_b.h

@ -1,4 +1,6 @@
P_RD_RS1_RS2_LOOP(8,8,8, {
bool sat = false;
p_rd = (sat_add<int8_t, uint8_t>(p_rs1, p_rs2, sat));
})
if (sat)
P.set_vxsat();
})

4
riscv/insns/psadd_db.h

@ -2,4 +2,6 @@ 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));
})
if (sat)
P.set_vxsat();
})

4
riscv/insns/psadd_dh.h

@ -2,4 +2,6 @@ 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));
})
if (sat)
P.set_vxsat();
})

4
riscv/insns/psadd_dw.h

@ -2,4 +2,6 @@ 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));
})
if (sat)
P.set_vxsat();
})

4
riscv/insns/psadd_h.h

@ -1,4 +1,6 @@
P_RD_RS1_RS2_LOOP(16,16,16, {
bool sat = false;
p_rd = (sat_add<int16_t, uint16_t>(p_rs1, p_rs2, sat));
})
if (sat)
P.set_vxsat();
})

2
riscv/insns/psadd_w.h

@ -2,5 +2,7 @@ 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));
if (sat)
P.set_vxsat();
}
)

4
riscv/insns/psaddu_b.h

@ -1,4 +1,6 @@
P_RD_RS1_RS2_ULOOP(8,8,8, {
bool sat = false;
p_rd = (sat_addu<uint8_t>(p_rs1, p_rs2, sat));
})
if (sat)
P.set_vxsat();
})

4
riscv/insns/psaddu_db.h

@ -2,4 +2,6 @@ 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));
})
if (sat)
P.set_vxsat();
})

4
riscv/insns/psaddu_dh.h

@ -2,4 +2,6 @@ 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));
})
if (sat)
P.set_vxsat();
})

4
riscv/insns/psaddu_dw.h

@ -2,4 +2,6 @@ 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));
})
if (sat)
P.set_vxsat();
})

4
riscv/insns/psaddu_h.h

@ -1,4 +1,6 @@
P_RD_RS1_RS2_ULOOP(16,16,16, {
bool sat = false;
p_rd = (sat_addu<uint16_t>(p_rs1, p_rs2, sat));
})
if (sat)
P.set_vxsat();
})

2
riscv/insns/psaddu_w.h

@ -2,5 +2,7 @@ require_rv64;
P_RD_RS1_RS2_ULOOP(32,32,32, {
bool sat = false;
p_rd = (sat_addu<uint32_t>(p_rs1, p_rs2, sat));
if (sat)
P.set_vxsat();
}
)

5
riscv/insns/psll_dws.h

@ -1,7 +1,6 @@
require_rv32;
P_RD_RS1_DW_LOOP(32, 32, {
uint8_t m = P_FIELD(RS2, 0, 8);
uint8_t m = RS2 & 0x1F;
const uint64_t maskN = 0xFFFFFFFFull;
if (m >= 32) p_rd = 0;
else p_rd = (uint32_t)((p_rs1 << m) & maskN);
p_rd = (uint32_t)((p_rs1 << m) & maskN);
})

2
riscv/insns/pssh1sadd_w.h

@ -1,5 +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);
p_rd = P_SAT(32, P_SAT(32, (int64_t)p_rs1 << 1) + p_rs2);
}
)

59
riscv/insns/pssha_dhs.h

@ -1,45 +1,26 @@
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);
int8_t sshamt = P_FIELD(RS2, 0, 8);
int32_t val = p_rs1;
if (sshamt < 0) {
val = (int16_t)(val >> std::min(-sshamt, 16));
} else if (sshamt >= 16 && val != 0){
val = val > 0 ? INT16_MAX : INT16_MIN;
ov = true;
} else if (val != 0) {
int32_t tmp = (int32_t)val << sshamt;
if (tmp > INT16_MAX) {
val = INT16_MAX;
ov = true;
} else if (tmp < INT16_MIN) {
val = INT16_MIN;
ov = true;
} else {
val = tmp;
}
}
p_rd = val;
if (ov) P.set_vxsat();
})
})

57
riscv/insns/pssha_dws.h

@ -1,45 +1,26 @@
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);
int8_t sshamt = P_FIELD(RS2, 0, 8);
int64_t val = p_rs1;
if (sshamt < 0) {
val = (int32_t)(val >> std::min(-sshamt, 32));
} else if (sshamt >= 32 && val != 0){
val = val > 0 ? INT32_MAX : INT32_MIN;
ov = true;
} else if (val != 0) {
int64_t tmp = (int64_t)val << sshamt;
if (tmp > INT32_MAX) {
val = INT32_MAX;
ov = true;
} else if (tmp < INT32_MIN) {
val = INT32_MIN;
ov = true;
} else {
val = tmp;
}
}
p_rd = val;
if (ov) P.set_vxsat();
})

6
riscv/insns/pssha_hs.h

@ -3,11 +3,11 @@ 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_rd = (p_rs1 & 0x8000) ? INT16_MIN : INT16_MAX;
P.set_vxsat();
}
else if (sshamt <= -16)
p_rd = (p_rs1 & 0x8000) ? 0xffff : 0;
p_rd = (p_rs1 & 0x8000) ? (int16_t)UINT16_MAX : 0;
else
p_rd = sshamt >= 0 ? P_SAT(16, sext32(p_rs1) << sshamt) : (p_rs1 >> -sshamt);
})
})

4
riscv/insns/pssha_ws.h

@ -4,11 +4,11 @@ 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_rd = (p_rs1 & 0x80000000) ? INT32_MIN : INT32_MAX;
P.set_vxsat();
}
else if (sshamt <= -32)
p_rd = (p_rs1 & 0x80000000) ? 0xffffffff : 0;
p_rd = (p_rs1 & 0x80000000) ? (int32_t)UINT32_MAX : 0;
else
p_rd = sshamt >= 0 ? P_SAT(32, sext32(p_rs1) << sshamt) : (p_rs1 >> -sshamt);
}

81
riscv/insns/psshar_dhs.h

@ -1,64 +1,27 @@
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);
}
bool ov = false;
int8_t sshamt = P_FIELD(RS2, 0, 8);
int32_t val = p_rs1;
if (sshamt < 0) {
val = (val << 1) >> std::min(-sshamt, 16);
val = (int16_t)((val + 1) >> 1);
} else if (sshamt >= 16 && val != 0){
val = val > 0 ? INT16_MAX : INT16_MIN;
ov = true;
} else if (val != 0) {
int32_t tmp = (int32_t)val << sshamt;
if (tmp > INT16_MAX) {
val = INT16_MAX;
ov = true;
} else if (tmp < INT16_MIN) {
val = INT16_MIN;
ov = true;
} else {
val = tmp;
}
}
p_rd = val;
if (ov) P.set_vxsat();
})

81
riscv/insns/psshar_dws.h

@ -1,64 +1,27 @@
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);
}
bool ov = false;
int8_t sshamt = P_FIELD(RS2, 0, 8);
int64_t val = p_rs1;
if (sshamt < 0) {
val = (val << 1) >> std::min(-sshamt, 32);
val = (int32_t)((val + 1) >> 1);
} else if (sshamt >= 32 && val != 0){
val = val > 0 ? INT32_MAX : INT32_MIN;
ov = true;
} else if (val != 0) {
int64_t tmp = (int64_t)val << sshamt;
if (tmp > INT32_MAX) {
val = INT32_MAX;
ov = true;
} else if (tmp < INT32_MIN) {
val = INT32_MIN;
ov = true;
} else {
val = tmp;
}
}
p_rd = val;
if (ov) P.set_vxsat();
})

4
riscv/insns/psshar_hs.h

@ -3,11 +3,11 @@ 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_rd = (p_rs1 & 0x8000) ? INT16_MIN : INT16_MAX;
P.set_vxsat();
}
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));
})
})

2
riscv/insns/psshar_ws.h

@ -4,7 +4,7 @@ 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_rd = (p_rs1 & 0x80000000) ? INT32_MIN : INT32_MAX;
P.set_vxsat();
}
else if (sshamt <= -32)

13
riscv/insns/psshl_dhs.h

@ -1,16 +1,13 @@
require_rv32;
sreg_t sshamt = P_FIELD(RS2, 0, 8);
int 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);
p_rd = (uint32_t)(uint16_t)p_rs1 >> std::min(-sshamt, 16);
} else {
uint32_t shx = (sshamt >= 16) ? ((uint32_t)(uint16_t)p_rs1 << 16) : ((uint32_t)(uint16_t)p_rs1 << sshamt);
if (shx > 0xFFFF) {
uint32_t shx = (uint32_t)(uint16_t)p_rs1 << std::min(sshamt, 16);
if (shx > UINT16_MAX) {
P.set_vxsat();
p_rd = 0xFFFF;
p_rd = (uint16_t)UINT16_MAX;
} else {
p_rd = (uint16_t)shx;
}

13
riscv/insns/psshl_dws.h

@ -1,16 +1,13 @@
require_rv32;
sreg_t sshamt = P_FIELD(RS2, 0, 8);
int 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);
p_rd = (uint64_t)(uint32_t)p_rs1 >> std::min(-sshamt, 32);
} else {
uint64_t shx = (sshamt >= 32) ? ((uint64_t)(uint32_t)p_rs1 << 32) : ((uint64_t)(uint32_t)p_rs1 << sshamt);
if (shx > 0xFFFFFFFFULL) {
uint64_t shx = (uint64_t)(uint32_t)p_rs1 << std::min(sshamt, 32);
if (shx > UINT32_MAX) {
P.set_vxsat();
p_rd = 0xFFFFFFFF;
p_rd = UINT32_MAX;
} else {
p_rd = (uint32_t)shx;
}

13
riscv/insns/psshl_hs.h

@ -1,15 +1,12 @@
sreg_t sshamt = P_FIELD(RS2, 0, 8);
int 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);
p_rd = (uint32_t)(uint16_t)p_rs1 >> std::min(-sshamt, 16);
} else {
uint32_t shx = (sshamt >= 16) ? ((uint32_t)(uint16_t)p_rs1 << 16) : ((uint32_t)(uint16_t)p_rs1 << sshamt);
if (shx > 0xFFFF) {
uint32_t shx = (uint32_t)(uint16_t)p_rs1 << std::min(sshamt, 16);
if (shx > UINT16_MAX) {
P.set_vxsat();
p_rd = 0xFFFF;
p_rd = (uint16_t)UINT16_MAX;
} else {
p_rd = (uint16_t)shx;
}

13
riscv/insns/psshl_ws.h

@ -1,16 +1,13 @@
require_rv64;
sreg_t sshamt = P_FIELD(RS2, 0, 8);
int 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);
p_rd = (uint64_t)(uint32_t)p_rs1 >> std::min(-sshamt, 32);
} else {
uint64_t shx = (sshamt >= 32) ? ((uint64_t)(uint32_t)p_rs1 << 32) : ((uint64_t)(uint32_t)p_rs1 << sshamt);
if (shx > 0xFFFFFFFFULL) {
uint64_t shx = (uint64_t)(uint32_t)p_rs1 << std::min(sshamt, 32);
if (shx > UINT32_MAX) {
P.set_vxsat();
p_rd = 0xFFFFFFFF;
p_rd = UINT32_MAX;
} else {
p_rd = (uint32_t)shx;
}

16
riscv/insns/psshlr_dhs.h

@ -1,20 +1,14 @@
require_rv32;
sreg_t sshamt = P_FIELD(RS2, 0, 8);
int 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);
uint32_t shx = ((uint32_t)(uint16_t)p_rs1 << 1) >> std::min(-sshamt, 16);
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) {
uint32_t shx = (uint32_t)(uint16_t)p_rs1 << std::min(sshamt, 16);
if (shx > UINT16_MAX) {
P.set_vxsat();
p_rd = 0xFFFF;
p_rd = (uint16_t)UINT16_MAX;
} else {
p_rd = (uint16_t)shx;
}

16
riscv/insns/psshlr_dws.h

@ -1,20 +1,14 @@
require_rv32;
sreg_t sshamt = P_FIELD(RS2, 0, 8);
int 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);
uint64_t shx = ((uint64_t)(uint32_t)p_rs1 << 1) >> std::min(-sshamt, 32);
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) {
uint64_t shx = (uint64_t)(uint32_t)p_rs1 << std::min(sshamt, 32);
if (shx > UINT32_MAX) {
P.set_vxsat();
p_rd = 0xFFFFFFFF;
p_rd = UINT32_MAX;
} else {
p_rd = (uint32_t)shx;
}

16
riscv/insns/psshlr_hs.h

@ -1,19 +1,13 @@
sreg_t sshamt = P_FIELD(RS2, 0, 8);
int 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);
uint32_t shx = ((uint32_t)(uint16_t)p_rs1 << 1) >> std::min(-sshamt, 16);
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) {
uint32_t shx = (uint32_t)(uint16_t)p_rs1 << std::min(sshamt, 16);
if (shx > UINT16_MAX) {
P.set_vxsat();
p_rd = 0xFFFF;
p_rd = (uint16_t)UINT16_MAX;
} else {
p_rd = (uint16_t)shx;
}

16
riscv/insns/psshlr_ws.h

@ -1,20 +1,14 @@
require_rv64;
sreg_t sshamt = P_FIELD(RS2, 0, 8);
int 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);
uint64_t shx = ((uint64_t)(uint32_t)p_rs1 << 1) >> std::min(-sshamt, 32);
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) {
uint64_t shx = (uint64_t)(uint32_t)p_rs1 << std::min(sshamt, 32);
if (shx > UINT32_MAX) {
P.set_vxsat();
p_rd = 0xFFFFFFFF;
p_rd = UINT32_MAX;
} else {
p_rd = (uint32_t)shx;
}

4
riscv/insns/pssub_b.h

@ -1,4 +1,6 @@
P_RD_RS1_RS2_LOOP(8,8,8, {
bool sat = false;
p_rd = (sat_sub<int8_t, uint8_t>(p_rs1, p_rs2, sat));
})
if (sat)
P.set_vxsat();
})

4
riscv/insns/pssub_db.h

@ -2,4 +2,6 @@ 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));
})
if (sat)
P.set_vxsat();
})

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save