aboutsummaryrefslogtreecommitdiff
path: root/riscv/insns
diff options
context:
space:
mode:
Diffstat (limited to 'riscv/insns')
-rw-r--r--riscv/insns/aadd.h3
-rw-r--r--riscv/insns/aaddu.h3
-rw-r--r--riscv/insns/abs.h4
-rw-r--r--riscv/insns/absw.h5
-rw-r--r--riscv/insns/addd.h3
-rw-r--r--riscv/insns/asub.h3
-rw-r--r--riscv/insns/asubu.h3
-rw-r--r--riscv/insns/cls.h10
-rw-r--r--riscv/insns/clsw.h11
-rw-r--r--riscv/insns/macc_h00.h3
-rw-r--r--riscv/insns/macc_h01.h3
-rw-r--r--riscv/insns/macc_h11.h3
-rw-r--r--riscv/insns/macc_w00.h3
-rw-r--r--riscv/insns/macc_w01.h3
-rw-r--r--riscv/insns/macc_w11.h3
-rw-r--r--riscv/insns/maccsu_h00.h3
-rw-r--r--riscv/insns/maccsu_h11.h3
-rw-r--r--riscv/insns/maccsu_w00.h3
-rw-r--r--riscv/insns/maccsu_w11.h3
-rw-r--r--riscv/insns/maccu_h00.h3
-rw-r--r--riscv/insns/maccu_h01.h3
-rw-r--r--riscv/insns/maccu_h11.h3
-rw-r--r--riscv/insns/maccu_w00.h3
-rw-r--r--riscv/insns/maccu_w01.h3
-rw-r--r--riscv/insns/maccu_w11.h3
-rw-r--r--riscv/insns/merge.h2
-rw-r--r--riscv/insns/mhacc.h4
-rw-r--r--riscv/insns/mhacc_h0.h4
-rw-r--r--riscv/insns/mhacc_h1.h4
-rw-r--r--riscv/insns/mhaccsu.h4
-rw-r--r--riscv/insns/mhaccsu_h0.h4
-rw-r--r--riscv/insns/mhaccsu_h1.h4
-rw-r--r--riscv/insns/mhaccu.h4
-rw-r--r--riscv/insns/mhracc.h5
-rw-r--r--riscv/insns/mhraccsu.h5
-rw-r--r--riscv/insns/mhraccu.h5
-rw-r--r--riscv/insns/mqacc_h00.h3
-rw-r--r--riscv/insns/mqacc_h01.h3
-rw-r--r--riscv/insns/mqacc_h11.h3
-rw-r--r--riscv/insns/mqacc_w00.h3
-rw-r--r--riscv/insns/mqacc_w01.h3
-rw-r--r--riscv/insns/mqacc_w11.h3
-rw-r--r--riscv/insns/mqracc_h00.h3
-rw-r--r--riscv/insns/mqracc_h01.h3
-rw-r--r--riscv/insns/mqracc_h11.h3
-rw-r--r--riscv/insns/mqracc_w00.h3
-rw-r--r--riscv/insns/mqracc_w01.h3
-rw-r--r--riscv/insns/mqracc_w11.h3
-rw-r--r--riscv/insns/mqrwacc.h3
-rw-r--r--riscv/insns/mqwacc.h3
-rw-r--r--riscv/insns/mseq.h3
-rw-r--r--riscv/insns/mslt.h3
-rw-r--r--riscv/insns/msltu.h3
-rw-r--r--riscv/insns/mul_h00.h3
-rw-r--r--riscv/insns/mul_h01.h3
-rw-r--r--riscv/insns/mul_h11.h3
-rw-r--r--riscv/insns/mul_w00.h3
-rw-r--r--riscv/insns/mul_w01.h3
-rw-r--r--riscv/insns/mul_w11.h3
-rw-r--r--riscv/insns/mulh_h0.h4
-rw-r--r--riscv/insns/mulh_h1.h4
-rw-r--r--riscv/insns/mulhr.h4
-rw-r--r--riscv/insns/mulhrsu.h4
-rw-r--r--riscv/insns/mulhru.h4
-rw-r--r--riscv/insns/mulhsu_h0.h4
-rw-r--r--riscv/insns/mulhsu_h1.h4
-rw-r--r--riscv/insns/mulq.h8
-rw-r--r--riscv/insns/mulqr.h8
-rw-r--r--riscv/insns/mulsu_h00.h3
-rw-r--r--riscv/insns/mulsu_h11.h3
-rw-r--r--riscv/insns/mulsu_w00.h3
-rw-r--r--riscv/insns/mulsu_w11.h3
-rw-r--r--riscv/insns/mulu_h00.h3
-rw-r--r--riscv/insns/mulu_h01.h3
-rw-r--r--riscv/insns/mulu_h11.h3
-rw-r--r--riscv/insns/mulu_w00.h3
-rw-r--r--riscv/insns/mulu_w01.h3
-rw-r--r--riscv/insns/mulu_w11.h3
-rw-r--r--riscv/insns/mvm.h2
-rw-r--r--riscv/insns/mvmn.h2
-rw-r--r--riscv/insns/nclip.h5
-rw-r--r--riscv/insns/nclipi.h5
-rw-r--r--riscv/insns/nclipiu.h5
-rw-r--r--riscv/insns/nclipr.h11
-rw-r--r--riscv/insns/nclipri.h11
-rw-r--r--riscv/insns/nclipriu.h11
-rw-r--r--riscv/insns/nclipru.h11
-rw-r--r--riscv/insns/nclipu.h5
-rw-r--r--riscv/insns/nsra.h3
-rw-r--r--riscv/insns/nsrai.h3
-rw-r--r--riscv/insns/nsrar.h11
-rw-r--r--riscv/insns/nsrari.h11
-rw-r--r--riscv/insns/nsrl.h3
-rw-r--r--riscv/insns/nsrli.h3
-rw-r--r--riscv/insns/paadd_b.h3
-rw-r--r--riscv/insns/paadd_db.h4
-rw-r--r--riscv/insns/paadd_dh.h4
-rw-r--r--riscv/insns/paadd_dw.h4
-rw-r--r--riscv/insns/paadd_h.h3
-rw-r--r--riscv/insns/paadd_w.h5
-rw-r--r--riscv/insns/paaddu_b.h3
-rw-r--r--riscv/insns/paaddu_db.h4
-rw-r--r--riscv/insns/paaddu_dh.h4
-rw-r--r--riscv/insns/paaddu_dw.h4
-rw-r--r--riscv/insns/paaddu_h.h3
-rw-r--r--riscv/insns/paaddu_w.h5
-rw-r--r--riscv/insns/paas_dhx.h6
-rw-r--r--riscv/insns/paas_hx.h5
-rw-r--r--riscv/insns/paas_wx.h7
-rw-r--r--riscv/insns/pabd_b.h4
-rw-r--r--riscv/insns/pabd_db.h5
-rw-r--r--riscv/insns/pabd_dh.h5
-rw-r--r--riscv/insns/pabd_h.h4
-rw-r--r--riscv/insns/pabdsumau_b.h3
-rw-r--r--riscv/insns/pabdsumu_b.h3
-rw-r--r--riscv/insns/pabdu_b.h3
-rw-r--r--riscv/insns/pabdu_db.h4
-rw-r--r--riscv/insns/pabdu_dh.h4
-rw-r--r--riscv/insns/pabdu_h.h3
-rw-r--r--riscv/insns/pack.h5
-rw-r--r--riscv/insns/padd_b.h3
-rw-r--r--riscv/insns/padd_bs.h3
-rw-r--r--riscv/insns/padd_db.h4
-rw-r--r--riscv/insns/padd_dbs.h4
-rw-r--r--riscv/insns/padd_dh.h4
-rw-r--r--riscv/insns/padd_dhs.h4
-rw-r--r--riscv/insns/padd_dw.h4
-rw-r--r--riscv/insns/padd_dws.h4
-rw-r--r--riscv/insns/padd_h.h3
-rw-r--r--riscv/insns/padd_hs.h3
-rw-r--r--riscv/insns/padd_w.h5
-rw-r--r--riscv/insns/padd_ws.h5
-rw-r--r--riscv/insns/pas_dhx.h6
-rw-r--r--riscv/insns/pas_hx.h5
-rw-r--r--riscv/insns/pas_wx.h7
-rw-r--r--riscv/insns/pasa_dhx.h6
-rw-r--r--riscv/insns/pasa_hx.h5
-rw-r--r--riscv/insns/pasa_wx.h7
-rw-r--r--riscv/insns/pasub_b.h3
-rw-r--r--riscv/insns/pasub_db.h4
-rw-r--r--riscv/insns/pasub_dh.h4
-rw-r--r--riscv/insns/pasub_dw.h4
-rw-r--r--riscv/insns/pasub_h.h3
-rw-r--r--riscv/insns/pasub_w.h5
-rw-r--r--riscv/insns/pasubu_b.h3
-rw-r--r--riscv/insns/pasubu_db.h4
-rw-r--r--riscv/insns/pasubu_dh.h4
-rw-r--r--riscv/insns/pasubu_dw.h4
-rw-r--r--riscv/insns/pasubu_h.h3
-rw-r--r--riscv/insns/pasubu_w.h5
-rw-r--r--riscv/insns/pli_b.h3
-rw-r--r--riscv/insns/pli_db.h4
-rw-r--r--riscv/insns/pli_dh.h4
-rw-r--r--riscv/insns/pli_h.h3
-rw-r--r--riscv/insns/pli_w.h5
-rw-r--r--riscv/insns/plui_dh.h4
-rw-r--r--riscv/insns/plui_h.h3
-rw-r--r--riscv/insns/plui_w.h5
-rw-r--r--riscv/insns/pm2add_h.h3
-rw-r--r--riscv/insns/pm2add_hx.h3
-rw-r--r--riscv/insns/pm2add_w.h5
-rw-r--r--riscv/insns/pm2add_wx.h5
-rw-r--r--riscv/insns/pm2adda_h.h3
-rw-r--r--riscv/insns/pm2adda_hx.h3
-rw-r--r--riscv/insns/pm2adda_w.h5
-rw-r--r--riscv/insns/pm2adda_wx.h5
-rw-r--r--riscv/insns/pm2addasu_h.h3
-rw-r--r--riscv/insns/pm2addasu_w.h5
-rw-r--r--riscv/insns/pm2addau_h.h3
-rw-r--r--riscv/insns/pm2addau_w.h5
-rw-r--r--riscv/insns/pm2addsu_h.h3
-rw-r--r--riscv/insns/pm2addsu_w.h5
-rw-r--r--riscv/insns/pm2addu_h.h3
-rw-r--r--riscv/insns/pm2addu_w.h5
-rw-r--r--riscv/insns/pm2sadd_h.h3
-rw-r--r--riscv/insns/pm2sadd_hx.h3
-rw-r--r--riscv/insns/pm2sub_h.h6
-rw-r--r--riscv/insns/pm2sub_hx.h6
-rw-r--r--riscv/insns/pm2sub_w.h8
-rw-r--r--riscv/insns/pm2sub_wx.h8
-rw-r--r--riscv/insns/pm2suba_h.h6
-rw-r--r--riscv/insns/pm2suba_hx.h6
-rw-r--r--riscv/insns/pm2suba_w.h8
-rw-r--r--riscv/insns/pm2suba_wx.h8
-rw-r--r--riscv/insns/pm2wadd_h.h4
-rw-r--r--riscv/insns/pm2wadd_hx.h4
-rw-r--r--riscv/insns/pm2wadda_h.h4
-rw-r--r--riscv/insns/pm2wadda_hx.h4
-rw-r--r--riscv/insns/pm2waddasu_h.h4
-rw-r--r--riscv/insns/pm2waddau_h.h4
-rw-r--r--riscv/insns/pm2waddsu_h.h4
-rw-r--r--riscv/insns/pm2waddu_h.h4
-rw-r--r--riscv/insns/pm2wsub_h.h7
-rw-r--r--riscv/insns/pm2wsub_hx.h7
-rw-r--r--riscv/insns/pm2wsuba_h.h7
-rw-r--r--riscv/insns/pm2wsuba_hx.h7
-rw-r--r--riscv/insns/pm4add_b.h3
-rw-r--r--riscv/insns/pm4add_h.h5
-rw-r--r--riscv/insns/pm4adda_b.h3
-rw-r--r--riscv/insns/pm4adda_h.h5
-rw-r--r--riscv/insns/pm4addasu_b.h3
-rw-r--r--riscv/insns/pm4addasu_h.h5
-rw-r--r--riscv/insns/pm4addau_b.h3
-rw-r--r--riscv/insns/pm4addau_h.h5
-rw-r--r--riscv/insns/pm4addsu_b.h3
-rw-r--r--riscv/insns/pm4addsu_h.h5
-rw-r--r--riscv/insns/pm4addu_b.h3
-rw-r--r--riscv/insns/pm4addu_h.h5
-rw-r--r--riscv/insns/pmacc_w_h00.h5
-rw-r--r--riscv/insns/pmacc_w_h01.h5
-rw-r--r--riscv/insns/pmacc_w_h11.h5
-rw-r--r--riscv/insns/pmaccsu_w_h00.h5
-rw-r--r--riscv/insns/pmaccsu_w_h11.h5
-rw-r--r--riscv/insns/pmaccu_w_h00.h5
-rw-r--r--riscv/insns/pmaccu_w_h01.h5
-rw-r--r--riscv/insns/pmaccu_w_h11.h5
-rw-r--r--riscv/insns/pmax_b.h3
-rw-r--r--riscv/insns/pmax_db.h4
-rw-r--r--riscv/insns/pmax_dh.h4
-rw-r--r--riscv/insns/pmax_dw.h4
-rw-r--r--riscv/insns/pmax_h.h3
-rw-r--r--riscv/insns/pmax_w.h5
-rw-r--r--riscv/insns/pmaxu_b.h3
-rw-r--r--riscv/insns/pmaxu_db.h4
-rw-r--r--riscv/insns/pmaxu_dh.h4
-rw-r--r--riscv/insns/pmaxu_dw.h4
-rw-r--r--riscv/insns/pmaxu_h.h3
-rw-r--r--riscv/insns/pmaxu_w.h5
-rw-r--r--riscv/insns/pmhacc_h.h4
-rw-r--r--riscv/insns/pmhacc_h_b0.h4
-rw-r--r--riscv/insns/pmhacc_h_b1.h4
-rw-r--r--riscv/insns/pmhacc_w.h6
-rw-r--r--riscv/insns/pmhacc_w_h0.h6
-rw-r--r--riscv/insns/pmhacc_w_h1.h6
-rw-r--r--riscv/insns/pmhaccsu_h.h4
-rw-r--r--riscv/insns/pmhaccsu_h_b0.h4
-rw-r--r--riscv/insns/pmhaccsu_h_b1.h4
-rw-r--r--riscv/insns/pmhaccsu_w.h6
-rw-r--r--riscv/insns/pmhaccsu_w_h0.h6
-rw-r--r--riscv/insns/pmhaccsu_w_h1.h6
-rw-r--r--riscv/insns/pmhaccu_h.h4
-rw-r--r--riscv/insns/pmhaccu_w.h6
-rw-r--r--riscv/insns/pmhracc_h.h5
-rw-r--r--riscv/insns/pmhracc_w.h7
-rw-r--r--riscv/insns/pmhraccsu_h.h5
-rw-r--r--riscv/insns/pmhraccsu_w.h7
-rw-r--r--riscv/insns/pmhraccu_h.h5
-rw-r--r--riscv/insns/pmhraccu_w.h7
-rw-r--r--riscv/insns/pmin_b.h3
-rw-r--r--riscv/insns/pmin_db.h4
-rw-r--r--riscv/insns/pmin_dh.h4
-rw-r--r--riscv/insns/pmin_dw.h4
-rw-r--r--riscv/insns/pmin_h.h3
-rw-r--r--riscv/insns/pmin_w.h5
-rw-r--r--riscv/insns/pminu_b.h3
-rw-r--r--riscv/insns/pminu_db.h4
-rw-r--r--riscv/insns/pminu_dh.h4
-rw-r--r--riscv/insns/pminu_dw.h4
-rw-r--r--riscv/insns/pminu_h.h3
-rw-r--r--riscv/insns/pminu_w.h5
-rw-r--r--riscv/insns/pmq2add_h.h3
-rw-r--r--riscv/insns/pmq2add_w.h5
-rw-r--r--riscv/insns/pmq2adda_h.h3
-rw-r--r--riscv/insns/pmq2adda_w.h5
-rw-r--r--riscv/insns/pmqacc_w_h00.h5
-rw-r--r--riscv/insns/pmqacc_w_h01.h5
-rw-r--r--riscv/insns/pmqacc_w_h11.h5
-rw-r--r--riscv/insns/pmqr2add_h.h3
-rw-r--r--riscv/insns/pmqr2add_w.h5
-rw-r--r--riscv/insns/pmqr2adda_h.h3
-rw-r--r--riscv/insns/pmqr2adda_w.h5
-rw-r--r--riscv/insns/pmqracc_w_h00.h5
-rw-r--r--riscv/insns/pmqracc_w_h01.h5
-rw-r--r--riscv/insns/pmqracc_w_h11.h5
-rw-r--r--riscv/insns/pmqrwacc_h.h4
-rw-r--r--riscv/insns/pmqwacc_h.h4
-rw-r--r--riscv/insns/pmseq_b.h3
-rw-r--r--riscv/insns/pmseq_db.h4
-rw-r--r--riscv/insns/pmseq_dh.h4
-rw-r--r--riscv/insns/pmseq_dw.h4
-rw-r--r--riscv/insns/pmseq_h.h3
-rw-r--r--riscv/insns/pmseq_w.h5
-rw-r--r--riscv/insns/pmslt_b.h3
-rw-r--r--riscv/insns/pmslt_db.h4
-rw-r--r--riscv/insns/pmslt_dh.h4
-rw-r--r--riscv/insns/pmslt_dw.h4
-rw-r--r--riscv/insns/pmslt_h.h3
-rw-r--r--riscv/insns/pmslt_w.h5
-rw-r--r--riscv/insns/pmsltu_b.h3
-rw-r--r--riscv/insns/pmsltu_db.h4
-rw-r--r--riscv/insns/pmsltu_dh.h4
-rw-r--r--riscv/insns/pmsltu_dw.h4
-rw-r--r--riscv/insns/pmsltu_h.h3
-rw-r--r--riscv/insns/pmsltu_w.h5
-rw-r--r--riscv/insns/pmul_h_b00.h3
-rw-r--r--riscv/insns/pmul_h_b01.h3
-rw-r--r--riscv/insns/pmul_h_b11.h3
-rw-r--r--riscv/insns/pmul_w_h00.h5
-rw-r--r--riscv/insns/pmul_w_h01.h5
-rw-r--r--riscv/insns/pmul_w_h11.h5
-rw-r--r--riscv/insns/pmulh_h.h4
-rw-r--r--riscv/insns/pmulh_h_b0.h4
-rw-r--r--riscv/insns/pmulh_h_b1.h4
-rw-r--r--riscv/insns/pmulh_w.h6
-rw-r--r--riscv/insns/pmulh_w_h0.h6
-rw-r--r--riscv/insns/pmulh_w_h1.h6
-rw-r--r--riscv/insns/pmulhr_h.h4
-rw-r--r--riscv/insns/pmulhr_w.h6
-rw-r--r--riscv/insns/pmulhrsu_h.h4
-rw-r--r--riscv/insns/pmulhrsu_w.h6
-rw-r--r--riscv/insns/pmulhru_h.h4
-rw-r--r--riscv/insns/pmulhru_w.h6
-rw-r--r--riscv/insns/pmulhsu_h.h4
-rw-r--r--riscv/insns/pmulhsu_h_b0.h4
-rw-r--r--riscv/insns/pmulhsu_h_b1.h4
-rw-r--r--riscv/insns/pmulhsu_w.h6
-rw-r--r--riscv/insns/pmulhsu_w_h0.h6
-rw-r--r--riscv/insns/pmulhsu_w_h1.h6
-rw-r--r--riscv/insns/pmulhu_h.h4
-rw-r--r--riscv/insns/pmulhu_w.h6
-rw-r--r--riscv/insns/pmulq_h.h8
-rw-r--r--riscv/insns/pmulq_w.h10
-rw-r--r--riscv/insns/pmulqr_h.h8
-rw-r--r--riscv/insns/pmulqr_w.h10
-rw-r--r--riscv/insns/pmulsu_h_b00.h3
-rw-r--r--riscv/insns/pmulsu_h_b11.h3
-rw-r--r--riscv/insns/pmulsu_w_h00.h5
-rw-r--r--riscv/insns/pmulsu_w_h11.h5
-rw-r--r--riscv/insns/pmulu_h_b00.h3
-rw-r--r--riscv/insns/pmulu_h_b01.h3
-rw-r--r--riscv/insns/pmulu_h_b11.h3
-rw-r--r--riscv/insns/pmulu_w_h00.h5
-rw-r--r--riscv/insns/pmulu_w_h01.h5
-rw-r--r--riscv/insns/pmulu_w_h11.h5
-rw-r--r--riscv/insns/pnclip_bs.h4
-rw-r--r--riscv/insns/pnclip_hs.h4
-rw-r--r--riscv/insns/pnclipi_b.h4
-rw-r--r--riscv/insns/pnclipi_h.h4
-rw-r--r--riscv/insns/pnclipiu_b.h4
-rw-r--r--riscv/insns/pnclipiu_h.h4
-rw-r--r--riscv/insns/pnclipp_b.h13
-rw-r--r--riscv/insns/pnclipp_h.h13
-rw-r--r--riscv/insns/pnclipp_w.h13
-rw-r--r--riscv/insns/pnclipr_bs.h13
-rw-r--r--riscv/insns/pnclipr_hs.h13
-rw-r--r--riscv/insns/pnclipri_b.h13
-rw-r--r--riscv/insns/pnclipri_h.h13
-rw-r--r--riscv/insns/pnclipriu_b.h13
-rw-r--r--riscv/insns/pnclipriu_h.h13
-rw-r--r--riscv/insns/pnclipru_bs.h13
-rw-r--r--riscv/insns/pnclipru_hs.h13
-rw-r--r--riscv/insns/pnclipu_bs.h4
-rw-r--r--riscv/insns/pnclipu_hs.h4
-rw-r--r--riscv/insns/pnclipup_b.h13
-rw-r--r--riscv/insns/pnclipup_h.h13
-rw-r--r--riscv/insns/pnclipup_w.h13
-rw-r--r--riscv/insns/pnsra_bs.h4
-rw-r--r--riscv/insns/pnsra_hs.h4
-rw-r--r--riscv/insns/pnsrai_b.h4
-rw-r--r--riscv/insns/pnsrai_h.h4
-rw-r--r--riscv/insns/pnsrar_bs.h12
-rw-r--r--riscv/insns/pnsrar_hs.h12
-rw-r--r--riscv/insns/pnsrari_b.h12
-rw-r--r--riscv/insns/pnsrari_h.h12
-rw-r--r--riscv/insns/pnsrl_bs.h5
-rw-r--r--riscv/insns/pnsrl_hs.h5
-rw-r--r--riscv/insns/pnsrli_b.h4
-rw-r--r--riscv/insns/pnsrli_h.h4
-rw-r--r--riscv/insns/ppaire_b.h1
-rw-r--r--riscv/insns/ppaire_db.h2
-rw-r--r--riscv/insns/ppaire_dh.h2
-rw-r--r--riscv/insns/ppaire_h.h1
-rw-r--r--riscv/insns/ppaireo_b.h1
-rw-r--r--riscv/insns/ppaireo_db.h2
-rw-r--r--riscv/insns/ppaireo_dh.h2
-rw-r--r--riscv/insns/ppaireo_h.h1
-rw-r--r--riscv/insns/ppaireo_w.h2
-rw-r--r--riscv/insns/ppairo_b.h1
-rw-r--r--riscv/insns/ppairo_db.h2
-rw-r--r--riscv/insns/ppairo_dh.h2
-rw-r--r--riscv/insns/ppairo_h.h1
-rw-r--r--riscv/insns/ppairo_w.h2
-rw-r--r--riscv/insns/ppairoe_b.h1
-rw-r--r--riscv/insns/ppairoe_db.h2
-rw-r--r--riscv/insns/ppairoe_dh.h2
-rw-r--r--riscv/insns/ppairoe_h.h1
-rw-r--r--riscv/insns/ppairoe_w.h2
-rw-r--r--riscv/insns/predsum_bs.h5
-rw-r--r--riscv/insns/predsum_dbs.h5
-rw-r--r--riscv/insns/predsum_dhs.h5
-rw-r--r--riscv/insns/predsum_hs.h5
-rw-r--r--riscv/insns/predsum_ws.h6
-rw-r--r--riscv/insns/predsumu_bs.h5
-rw-r--r--riscv/insns/predsumu_dbs.h5
-rw-r--r--riscv/insns/predsumu_dhs.h5
-rw-r--r--riscv/insns/predsumu_hs.h5
-rw-r--r--riscv/insns/predsumu_ws.h6
-rw-r--r--riscv/insns/psa_dhx.h6
-rw-r--r--riscv/insns/psa_hx.h5
-rw-r--r--riscv/insns/psa_wx.h7
-rw-r--r--riscv/insns/psabs_b.h5
-rw-r--r--riscv/insns/psabs_db.h6
-rw-r--r--riscv/insns/psabs_dh.h6
-rw-r--r--riscv/insns/psabs_h.h5
-rw-r--r--riscv/insns/psadd_b.h4
-rw-r--r--riscv/insns/psadd_db.h5
-rw-r--r--riscv/insns/psadd_dh.h5
-rw-r--r--riscv/insns/psadd_dw.h5
-rw-r--r--riscv/insns/psadd_h.h4
-rw-r--r--riscv/insns/psadd_w.h6
-rw-r--r--riscv/insns/psaddu_b.h4
-rw-r--r--riscv/insns/psaddu_db.h5
-rw-r--r--riscv/insns/psaddu_dh.h5
-rw-r--r--riscv/insns/psaddu_dw.h5
-rw-r--r--riscv/insns/psaddu_h.h4
-rw-r--r--riscv/insns/psaddu_w.h6
-rw-r--r--riscv/insns/psas_dhx.h10
-rw-r--r--riscv/insns/psas_hx.h9
-rw-r--r--riscv/insns/psas_wx.h11
-rw-r--r--riscv/insns/psati_dh.h4
-rw-r--r--riscv/insns/psati_dw.h4
-rw-r--r--riscv/insns/psati_h.h3
-rw-r--r--riscv/insns/psati_w.h5
-rw-r--r--riscv/insns/psext_dh_b.h4
-rw-r--r--riscv/insns/psext_dw_b.h4
-rw-r--r--riscv/insns/psext_dw_h.h4
-rw-r--r--riscv/insns/psext_h_b.h3
-rw-r--r--riscv/insns/psext_w_b.h5
-rw-r--r--riscv/insns/psext_w_h.h5
-rw-r--r--riscv/insns/psh1add_dh.h4
-rw-r--r--riscv/insns/psh1add_dw.h4
-rw-r--r--riscv/insns/psh1add_h.h3
-rw-r--r--riscv/insns/psh1add_w.h5
-rw-r--r--riscv/insns/psll_bs.h3
-rw-r--r--riscv/insns/psll_dbs.h7
-rw-r--r--riscv/insns/psll_dhs.h7
-rw-r--r--riscv/insns/psll_dws.h7
-rw-r--r--riscv/insns/psll_hs.h3
-rw-r--r--riscv/insns/psll_ws.h5
-rw-r--r--riscv/insns/pslli_b.h3
-rw-r--r--riscv/insns/pslli_db.h4
-rw-r--r--riscv/insns/pslli_dh.h4
-rw-r--r--riscv/insns/pslli_dw.h4
-rw-r--r--riscv/insns/pslli_h.h3
-rw-r--r--riscv/insns/pslli_w.h5
-rw-r--r--riscv/insns/psra_bs.h3
-rw-r--r--riscv/insns/psra_dbs.h4
-rw-r--r--riscv/insns/psra_dhs.h4
-rw-r--r--riscv/insns/psra_dws.h4
-rw-r--r--riscv/insns/psra_hs.h3
-rw-r--r--riscv/insns/psra_ws.h5
-rw-r--r--riscv/insns/psrai_b.h3
-rw-r--r--riscv/insns/psrai_db.h4
-rw-r--r--riscv/insns/psrai_dh.h4
-rw-r--r--riscv/insns/psrai_dw.h4
-rw-r--r--riscv/insns/psrai_h.h3
-rw-r--r--riscv/insns/psrai_w.h5
-rw-r--r--riscv/insns/psrari_dh.h4
-rw-r--r--riscv/insns/psrari_dw.h4
-rw-r--r--riscv/insns/psrari_h.h3
-rw-r--r--riscv/insns/psrari_w.h5
-rw-r--r--riscv/insns/psrl_bs.h3
-rw-r--r--riscv/insns/psrl_dbs.h4
-rw-r--r--riscv/insns/psrl_dhs.h4
-rw-r--r--riscv/insns/psrl_dws.h4
-rw-r--r--riscv/insns/psrl_hs.h3
-rw-r--r--riscv/insns/psrl_ws.h5
-rw-r--r--riscv/insns/psrli_b.h3
-rw-r--r--riscv/insns/psrli_db.h4
-rw-r--r--riscv/insns/psrli_dh.h4
-rw-r--r--riscv/insns/psrli_dw.h4
-rw-r--r--riscv/insns/psrli_h.h3
-rw-r--r--riscv/insns/psrli_w.h5
-rw-r--r--riscv/insns/pssa_dhx.h10
-rw-r--r--riscv/insns/pssa_hx.h9
-rw-r--r--riscv/insns/pssa_wx.h11
-rw-r--r--riscv/insns/pssh1sadd_dh.h4
-rw-r--r--riscv/insns/pssh1sadd_dw.h4
-rw-r--r--riscv/insns/pssh1sadd_h.h3
-rw-r--r--riscv/insns/pssh1sadd_w.h5
-rw-r--r--riscv/insns/pssha_dhs.h45
-rw-r--r--riscv/insns/pssha_dws.h45
-rw-r--r--riscv/insns/pssha_hs.h13
-rw-r--r--riscv/insns/pssha_ws.h15
-rw-r--r--riscv/insns/psshar_dhs.h64
-rw-r--r--riscv/insns/psshar_dws.h64
-rw-r--r--riscv/insns/psshar_hs.h13
-rw-r--r--riscv/insns/psshar_ws.h15
-rw-r--r--riscv/insns/psshl_dhs.h19
-rw-r--r--riscv/insns/psshl_dws.h19
-rw-r--r--riscv/insns/psshl_hs.h18
-rw-r--r--riscv/insns/psshl_ws.h19
-rw-r--r--riscv/insns/psshlr_dhs.h23
-rw-r--r--riscv/insns/psshlr_dws.h23
-rw-r--r--riscv/insns/psshlr_hs.h22
-rw-r--r--riscv/insns/psshlr_ws.h23
-rw-r--r--riscv/insns/psslai_dh.h4
-rw-r--r--riscv/insns/psslai_dw.h4
-rw-r--r--riscv/insns/psslai_h.h3
-rw-r--r--riscv/insns/psslai_w.h5
-rw-r--r--riscv/insns/pssub_b.h4
-rw-r--r--riscv/insns/pssub_db.h5
-rw-r--r--riscv/insns/pssub_dh.h5
-rw-r--r--riscv/insns/pssub_dw.h5
-rw-r--r--riscv/insns/pssub_h.h4
-rw-r--r--riscv/insns/pssub_w.h6
-rw-r--r--riscv/insns/pssubu_b.h4
-rw-r--r--riscv/insns/pssubu_db.h5
-rw-r--r--riscv/insns/pssubu_dh.h5
-rw-r--r--riscv/insns/pssubu_dw.h5
-rw-r--r--riscv/insns/pssubu_h.h4
-rw-r--r--riscv/insns/pssubu_w.h6
-rw-r--r--riscv/insns/psub_b.h3
-rw-r--r--riscv/insns/psub_db.h4
-rw-r--r--riscv/insns/psub_dh.h4
-rw-r--r--riscv/insns/psub_dw.h4
-rw-r--r--riscv/insns/psub_h.h3
-rw-r--r--riscv/insns/psub_w.h5
-rw-r--r--riscv/insns/pusati_dh.h13
-rw-r--r--riscv/insns/pusati_dw.h13
-rw-r--r--riscv/insns/pusati_h.h3
-rw-r--r--riscv/insns/pusati_w.h5
-rw-r--r--riscv/insns/pwadd_b.h4
-rw-r--r--riscv/insns/pwadd_h.h4
-rw-r--r--riscv/insns/pwadda_b.h4
-rw-r--r--riscv/insns/pwadda_h.h4
-rw-r--r--riscv/insns/pwaddau_b.h4
-rw-r--r--riscv/insns/pwaddau_h.h4
-rw-r--r--riscv/insns/pwaddu_b.h4
-rw-r--r--riscv/insns/pwaddu_h.h4
-rw-r--r--riscv/insns/pwmacc_h.h4
-rw-r--r--riscv/insns/pwmaccsu_h.h4
-rw-r--r--riscv/insns/pwmaccu_h.h4
-rw-r--r--riscv/insns/pwmul_b.h4
-rw-r--r--riscv/insns/pwmul_h.h4
-rw-r--r--riscv/insns/pwmulsu_b.h4
-rw-r--r--riscv/insns/pwmulsu_h.h4
-rw-r--r--riscv/insns/pwmulu_b.h4
-rw-r--r--riscv/insns/pwmulu_h.h4
-rw-r--r--riscv/insns/pwsla_bs.h4
-rw-r--r--riscv/insns/pwsla_hs.h4
-rw-r--r--riscv/insns/pwslai_b.h4
-rw-r--r--riscv/insns/pwslai_h.h4
-rw-r--r--riscv/insns/pwsll_bs.h4
-rw-r--r--riscv/insns/pwsll_hs.h4
-rw-r--r--riscv/insns/pwslli_b.h4
-rw-r--r--riscv/insns/pwslli_h.h4
-rw-r--r--riscv/insns/pwsub_b.h4
-rw-r--r--riscv/insns/pwsub_h.h4
-rw-r--r--riscv/insns/pwsuba_b.h4
-rw-r--r--riscv/insns/pwsuba_h.h4
-rw-r--r--riscv/insns/pwsubau_b.h4
-rw-r--r--riscv/insns/pwsubau_h.h4
-rw-r--r--riscv/insns/pwsubu_b.h4
-rw-r--r--riscv/insns/pwsubu_h.h4
-rw-r--r--riscv/insns/rev.h3
-rw-r--r--riscv/insns/rev16.h4
-rw-r--r--riscv/insns/rev_rv32.h3
-rw-r--r--riscv/insns/sadd.h3
-rw-r--r--riscv/insns/saddu.h4
-rw-r--r--riscv/insns/sati.h3
-rw-r--r--riscv/insns/sati_rv32.h3
-rw-r--r--riscv/insns/sha.h11
-rw-r--r--riscv/insns/shar.h11
-rw-r--r--riscv/insns/shl.h15
-rw-r--r--riscv/insns/shlr.h19
-rw-r--r--riscv/insns/slx.h16
-rw-r--r--riscv/insns/srari.h3
-rw-r--r--riscv/insns/srari_rv32.h3
-rw-r--r--riscv/insns/srx.h16
-rw-r--r--riscv/insns/ssh1sadd.h3
-rw-r--r--riscv/insns/ssha.h13
-rw-r--r--riscv/insns/sshar.h13
-rw-r--r--riscv/insns/sshl.h18
-rw-r--r--riscv/insns/sshlr.h22
-rw-r--r--riscv/insns/sslai.h3
-rw-r--r--riscv/insns/ssub.h5
-rw-r--r--riscv/insns/ssubu.h4
-rw-r--r--riscv/insns/subd.h3
-rw-r--r--riscv/insns/unzip16hp.h1
-rw-r--r--riscv/insns/unzip16p.h1
-rw-r--r--riscv/insns/unzip8hp.h1
-rw-r--r--riscv/insns/unzip8p.h1
-rw-r--r--riscv/insns/usati.h3
-rw-r--r--riscv/insns/usati_rv32.h3
-rw-r--r--riscv/insns/wadd.h3
-rw-r--r--riscv/insns/wadda.h3
-rw-r--r--riscv/insns/waddau.h3
-rw-r--r--riscv/insns/waddu.h3
-rw-r--r--riscv/insns/wmacc.h3
-rw-r--r--riscv/insns/wmaccsu.h3
-rw-r--r--riscv/insns/wmaccu.h3
-rw-r--r--riscv/insns/wmul.h3
-rw-r--r--riscv/insns/wmulsu.h3
-rw-r--r--riscv/insns/wmulu.h3
-rw-r--r--riscv/insns/wsla.h3
-rw-r--r--riscv/insns/wslai.h3
-rw-r--r--riscv/insns/wsll.h3
-rw-r--r--riscv/insns/wslli.h3
-rw-r--r--riscv/insns/wsub.h3
-rw-r--r--riscv/insns/wsuba.h3
-rw-r--r--riscv/insns/wsubau.h3
-rw-r--r--riscv/insns/wsubu.h3
-rw-r--r--riscv/insns/wzip16p.h4
-rw-r--r--riscv/insns/wzip8p.h4
-rw-r--r--riscv/insns/zip16hp.h6
-rw-r--r--riscv/insns/zip16p.h6
-rw-r--r--riscv/insns/zip8hp.h5
-rw-r--r--riscv/insns/zip8p.h5
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;
+}
+)