@@ -132,6 +132,37 @@ class RVPNarrowingBase<bits<3> f, bit r, bits<4> funct4, dag outs, dag ins,
132132  let Inst{6-0}   = OPC_OP_IMM_32.Value;
133133}
134134
135+ // Common base for pair ops (non-widening nor narrowing)
136+ class RVPPairBase<bits<3> f, bit r, bit direction, dag outs, dag ins,
137+                   string opcodestr, string argstr>
138+   : RVInst<outs, ins, opcodestr, argstr, [], InstFormatOther> {
139+   bits<5> rs1;
140+   bits<5> rd;
141+ 
142+   let Inst{30-28} = f;
143+   let Inst{27}    = r;
144+   let Inst{19-16} = rs1{4-1};
145+   let Inst{15}    = direction;
146+   let Inst{14-12} = 0b110;
147+   let Inst{11-8}  = rd{4-1};
148+   let Inst{7}     = 0b0;
149+   let Inst{6-0}   = OPC_OP_IMM_32.Value;
150+ }
151+ 
152+ // Common base for pair binary ops
153+ class RVPPairBinaryBase_rr<bits<3> f, bit r, bits<2> w, bit pack, bit direction,
154+                            string opcodestr>
155+     : RVPPairBase<f, r, direction, (outs GPRPairRV32:$rd),
156+                   (ins GPRPairRV32:$rs1, GPRPairRV32:$rs2), opcodestr,
157+                   "$rd, $rs1, $rs2"> {
158+   bits<5> rs2;
159+ 
160+   let Inst{31}    = 0b1;
161+   let Inst{26-25} = w;
162+   let Inst{24-21} = rs2{4-1};
163+   let Inst{20}    = pack;
164+ }
165+ 
135166let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
136167class RVPShift_ri<bits<3> f, bits<3> funct3, string opcodestr, Operand ImmType>
137168    : RVInstIBase<funct3, OPC_OP_IMM_32, (outs GPR:$rd),
@@ -249,6 +280,39 @@ class RVPNarrowingShiftB_ri<bits<3> f, string opcodestr>
249280  let Inst{23-20} = shamt;
250281}
251282
283+ let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
284+ class RVPPairShift_ri<bits<3> f, string opcodestr, Operand ImmType, 
285+                       bit direction>
286+     : RVPPairBase<f, 0b0, direction, (outs GPRPairRV32:$rd),
287+                   (ins GPRPairRV32:$rs1, ImmType:$shamt), opcodestr,
288+                   "$rd, $rs1, $shamt"> {
289+   let Inst{31}    = 0b0;
290+ }
291+ 
292+ class RVPPairShiftW_ri<bits<3> f, string opcodestr, bit direction = 0b0>
293+     : RVPPairShift_ri<f, opcodestr, uimm5, direction> {
294+   bits<5> shamt;
295+ 
296+   let Inst{26-25} = 0b01;
297+   let Inst{24-20} = shamt;
298+ }
299+ 
300+ class RVPPairShiftH_ri<bits<3> f, string opcodestr, bit direction = 0b0>
301+     : RVPPairShift_ri<f, opcodestr, uimm4, direction> {
302+   bits<4> shamt;
303+ 
304+   let Inst{26-24} = 0b001;
305+   let Inst{23-20} = shamt;
306+ }
307+ 
308+ class RVPPairShiftB_ri<bits<3> f, string opcodestr, bit direction = 0b0>
309+     : RVPPairShift_ri<f, opcodestr, uimm3, direction> {
310+   bits<3> shamt;
311+ 
312+   let Inst{26-23} = 0b0001;
313+   let Inst{22-20} = shamt;
314+ }
315+ 
252316let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
253317class RVPNarrowingShift_rr<bits<3> f, bits<2> w, string opcodestr>
254318    : RVPNarrowingBase<f, 0b1, 0b1100, (outs GPR:$rd),
@@ -268,6 +332,18 @@ class RVPWideningShift_rr<bits<3> f, bits<2> w, string opcodestr>
268332  let Inst{27} = 0b1;
269333}
270334
335+ let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
336+ class RVPPairShift_rr<bits<3> f, bits<2> w, string opcodestr,
337+                       bit direction = 0b0>
338+     : RVPPairBase<f, 0b1, direction, (outs GPRPairRV32:$rd),
339+                   (ins GPRPairRV32:$rs1, GPR:$rs2), opcodestr,
340+                   "$rd, $rs1, $rs2"> {
341+   bits<5> rs2;
342+ 
343+   let Inst{26-25} = w;
344+   let Inst{24-20} = rs2;
345+ }
346+ 
271347let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
272348class RVPUnary_ri<bits<2> w, bits<5> uf, string opcodestr>
273349    : RVInstIBase<0b010, OPC_OP_IMM_32, (outs GPR:$rd), (ins GPR:$rs1),
@@ -277,6 +353,15 @@ class RVPUnary_ri<bits<2> w, bits<5> uf, string opcodestr>
277353  let Inst{24-20} = uf;
278354}
279355
356+ let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
357+ class RVPPairUnary_r<bits<2> w, bits<5> uf, string opcodestr>
358+     : RVPPairBase<0b110, 0b0, 0b0, (outs GPRPairRV32:$rd),
359+                   (ins GPRPairRV32:$rs1), opcodestr, "$rd, $rs1"> {
360+   let Inst{31}    = 0b0;
361+   let Inst{26-25} = w;
362+   let Inst{24-20} = uf;
363+ }
364+ 
280365let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
281366class RVPBinaryScalar_rr<bits<3> f, bits<2> w, bits<3> funct3, string opcodestr>
282367    : RVInstRBase<funct3, OPC_OP_IMM_32, (outs GPR:$rd),
@@ -314,6 +399,22 @@ class RVPNarrowingBinary_rr<bits<3> f, bits<2> w, string opcodestr>
314399  let Inst{24-20} = rs2;
315400}
316401
402+ let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
403+ class RVPPairBinary_rr<bits<4> f, bits<2> w, string opcodestr>
404+     : RVPPairBinaryBase_rr<f{3-1}, f{0}, w, 0b0, 0b0, opcodestr>;
405+ 
406+ let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
407+ class RVPPairBinaryShift_rr<bits<3> f, bits<2> w, string opcodestr>
408+     : RVPPairBinaryBase_rr<f, 0b0, w, 0b1, 0b0, opcodestr>;
409+ 
410+ let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
411+ class RVPPairBinaryPack_rr<bits<3> f, bits<2> w, string opcodestr>
412+     : RVPPairBinaryBase_rr<f, 0b0, w, 0b0, 0b1, opcodestr>;
413+ 
414+ let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
415+ class RVPPairBinaryExchanged_rr<bits<4> f, bits<2> w, string opcodestr>
416+     : RVPPairBinaryBase_rr<f{3-1}, f{0}, w, 0b1, 0b1, opcodestr>;
417+ 
317418let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
318419class RVPTernary_rrr<bits<4> f, bits<2> w, bits<3> funct3, string opcodestr>
319420    : RVInstRBase<funct3, OPC_OP_32, (outs GPR:$rd_wb),
@@ -1196,4 +1297,161 @@ let Predicates = [HasStdExtP, IsRV32] in {
11961297  def PNCLIPR_BS   : RVPNarrowingShift_rr<0b111, 0b00, "pnclipr.bs">;
11971298  def PNCLIPR_HS   : RVPNarrowingShift_rr<0b111, 0b01, "pnclipr.hs">;
11981299  def NCLIPR       : RVPNarrowingShift_rr<0b111, 0b11, "nclipr">;
1300+ 
1301+   def PSLLI_DB     : RVPPairShiftB_ri<0b000, "pslli.db">;
1302+   def PSLLI_DH     : RVPPairShiftH_ri<0b000, "pslli.dh">;
1303+   def PSLLI_DW     : RVPPairShiftW_ri<0b000, "pslli.dw">;
1304+ 
1305+   def PSSLAI_DH    : RVPPairShiftH_ri<0b101, "psslai.dh">;
1306+   def PSSLAI_DW    : RVPPairShiftW_ri<0b101, "psslai.dw">;
1307+ 
1308+   def PSEXT_DH_B   : RVPPairUnary_r<0b00, 0b00100, "psext.dh.b">;
1309+   def PSEXT_DW_B   : RVPPairUnary_r<0b01, 0b00100, "psext.dw.b">;
1310+ 
1311+   def PSEXT_DW_H   : RVPPairUnary_r<0b01, 0b00101, "psext.dw.h">;
1312+ 
1313+   def PSABS_DH     : RVPPairUnary_r<0b00, 0b00111, "psabs.dh">;
1314+   def PSABS_DB     : RVPPairUnary_r<0b10, 0b00111, "psabs.db">;
1315+ 
1316+   def PSLL_DHS     : RVPPairShift_rr<0b000, 0b00, "psll.dhs">;
1317+   def PSLL_DWS     : RVPPairShift_rr<0b000, 0b01, "psll.dws">;
1318+   def PSLL_DBS     : RVPPairShift_rr<0b000, 0b10, "psll.dbs">;
1319+ 
1320+   def PADD_DHS     : RVPPairShift_rr<0b001, 0b00, "padd.dhs">;
1321+   def PADD_DWS     : RVPPairShift_rr<0b001, 0b01, "padd.dws">;
1322+   def PADD_DBS     : RVPPairShift_rr<0b001, 0b10, "padd.dbs">;
1323+ 
1324+   def PSSHA_DHS    : RVPPairShift_rr<0b110, 0b00, "pssha.dhs">;
1325+   def PSSHA_DWS    : RVPPairShift_rr<0b110, 0b01, "pssha.dws">;
1326+ 
1327+   def PSSHAR_DHS   : RVPPairShift_rr<0b111, 0b00, "psshar.dhs">;
1328+   def PSSHAR_DWS   : RVPPairShift_rr<0b111, 0b01, "psshar.dws">;
1329+ 
1330+   def PSRLI_DB     : RVPPairShiftB_ri<0b000, "psrli.db",  0b1>;
1331+   def PSRLI_DH     : RVPPairShiftH_ri<0b000, "psrli.dh",  0b1>;
1332+   def PSRLI_DW     : RVPPairShiftW_ri<0b000, "psrli.dw",  0b1>;
1333+ 
1334+   def PUSATI_DH    : RVPPairShiftH_ri<0b010, "pusati.dh", 0b1>;
1335+   def PUSATI_DW    : RVPPairShiftW_ri<0b010, "pusati.dw", 0b1>;
1336+ 
1337+   def PSRAI_DB     : RVPPairShiftB_ri<0b100, "psrai.db",  0b1>;
1338+   def PSRAI_DH     : RVPPairShiftH_ri<0b100, "psrai.dh",  0b1>;
1339+   def PSRAI_DW     : RVPPairShiftW_ri<0b100, "psrai.dw",  0b1>;
1340+ 
1341+   def PSRARI_DH    : RVPPairShiftH_ri<0b101, "psrari.dh", 0b1>;
1342+   def PSRARI_DW    : RVPPairShiftW_ri<0b101, "psrari.dw", 0b1>;
1343+ 
1344+   def PSATI_DH     : RVPPairShiftH_ri<0b110, "psati.dh",  0b1>;
1345+   def PSATI_DW     : RVPPairShiftW_ri<0b110, "psati.dw",  0b1>;
1346+ 
1347+   def PSRL_DHS     : RVPPairShift_rr<0b000, 0b00, "psrl.dhs", 0b1>;
1348+   def PSRL_DWS     : RVPPairShift_rr<0b000, 0b01, "psrl.dws", 0b1>;
1349+   def PSRL_DBS     : RVPPairShift_rr<0b000, 0b10, "psrl.dbs", 0b1>;
1350+ 
1351+   def PSRA_DHS     : RVPPairShift_rr<0b100, 0b00, "psra.dhs", 0b1>;
1352+   def PSRA_DWS     : RVPPairShift_rr<0b100, 0b01, "psra.dws", 0b1>;
1353+   def PSRA_DBS     : RVPPairShift_rr<0b100, 0b10, "psra.dbs", 0b1>;
1354+ 
1355+   def PADD_DH      : RVPPairBinary_rr<0b0000, 0b00, "padd.dh">;
1356+   def PADD_DW      : RVPPairBinary_rr<0b0000, 0b01, "padd.dw">;
1357+   def PADD_DB      : RVPPairBinary_rr<0b0000, 0b10, "padd.db">;
1358+   def ADDD         : RVPPairBinary_rr<0b0000, 0b11, "addd">;
1359+ 
1360+   def PSADD_DH     : RVPPairBinary_rr<0b0010, 0b00, "psadd.dh">;
1361+   def PSADD_DW     : RVPPairBinary_rr<0b0010, 0b01, "psadd.dw">;
1362+   def PSADD_DB     : RVPPairBinary_rr<0b0010, 0b10, "psadd.db">;
1363+ 
1364+   def PAADD_DH     : RVPPairBinary_rr<0b0011, 0b00, "paadd.dh">;
1365+   def PAADD_DW     : RVPPairBinary_rr<0b0011, 0b01, "paadd.dw">;
1366+   def PAADD_DB     : RVPPairBinary_rr<0b0011, 0b10, "paadd.db">;
1367+ 
1368+   def PSADDU_DH    : RVPPairBinary_rr<0b0110, 0b00, "psaddu.dh">;
1369+   def PSADDU_DW    : RVPPairBinary_rr<0b0110, 0b01, "psaddu.dw">;
1370+   def PSADDU_DB    : RVPPairBinary_rr<0b0110, 0b10, "psaddu.db">;
1371+ 
1372+   def PAADDU_DH    : RVPPairBinary_rr<0b0111, 0b00, "paaddu.dh">;
1373+   def PAADDU_DW    : RVPPairBinary_rr<0b0111, 0b01, "paaddu.dw">;
1374+   def PAADDU_DB    : RVPPairBinary_rr<0b0111, 0b10, "paaddu.db">;
1375+ 
1376+   def PSUB_DH      : RVPPairBinary_rr<0b1000, 0b00, "psub.dh">;
1377+   def PSUB_DW      : RVPPairBinary_rr<0b1000, 0b01, "psub.dw">;
1378+   def PSUB_DB      : RVPPairBinary_rr<0b1000, 0b10, "psub.db">;
1379+   def SUBD         : RVPPairBinary_rr<0b1000, 0b11, "subd">;
1380+ 
1381+   def PDIF_DH      : RVPPairBinary_rr<0b1001, 0b00, "pdif.dh">;
1382+   def PDIF_DB      : RVPPairBinary_rr<0b1001, 0b10, "pdif.db">;
1383+ 
1384+   def PSSUB_DH     : RVPPairBinary_rr<0b1010, 0b00, "pssub.dh">;
1385+   def PSSUB_DW     : RVPPairBinary_rr<0b1010, 0b01, "pssub.dw">;
1386+   def PSSUB_DB     : RVPPairBinary_rr<0b1010, 0b10, "pssub.db">;
1387+ 
1388+   def PASUB_DH     : RVPPairBinary_rr<0b1011, 0b00, "pasub.dh">;
1389+   def PASUB_DW     : RVPPairBinary_rr<0b1011, 0b01, "pasub.dw">;
1390+   def PASUB_DB     : RVPPairBinary_rr<0b1011, 0b10, "pasub.db">;
1391+ 
1392+   def PDIFU_DH     : RVPPairBinary_rr<0b1101, 0b00, "pdifu.dh">;
1393+   def PDIFU_DB     : RVPPairBinary_rr<0b1101, 0b10, "pdifu.db">;
1394+ 
1395+   def PSSUBU_DH    : RVPPairBinary_rr<0b1110, 0b00, "pssubu.dh">;
1396+   def PSSUBU_DW    : RVPPairBinary_rr<0b1110, 0b01, "pssubu.dw">;
1397+   def PSSUBU_DB    : RVPPairBinary_rr<0b1110, 0b10, "pssubu.db">;
1398+ 
1399+   def PASUBU_DH    : RVPPairBinary_rr<0b1111, 0b00, "pasubu.dh">;
1400+   def PASUBU_DW    : RVPPairBinary_rr<0b1111, 0b01, "pasubu.dw">;
1401+   def PASUBU_DB    : RVPPairBinary_rr<0b1111, 0b10, "pasubu.db">;
1402+ 
1403+   def PSH1ADD_DH   : RVPPairBinaryShift_rr<0b010, 0b00, "psh1add.dh">;
1404+   def PSH1ADD_DW   : RVPPairBinaryShift_rr<0b010, 0b01, "psh1add.dw">;
1405+ 
1406+   def PSSH1SADD_DH : RVPPairBinaryShift_rr<0b011, 0b00, "pssh1sadd.dh">;
1407+   def PSSH1SADD_DW : RVPPairBinaryShift_rr<0b011, 0b01, "pssh1sadd.dw">;
1408+ 
1409+   def PPACK_DH     : RVPPairBinaryPack_rr<0b000, 0b00, "ppack.dh">;
1410+   def PPACK_DW     : RVPPairBinaryPack_rr<0b000, 0b01, "ppack.dw">;
1411+ 
1412+   def PPACKBT_DH   : RVPPairBinaryPack_rr<0b001, 0b00, "ppackbt.dh">;
1413+   def PPACKBT_DW   : RVPPairBinaryPack_rr<0b001, 0b01, "ppackbt.dw">;
1414+ 
1415+   def PPACKTB_DH   : RVPPairBinaryPack_rr<0b010, 0b00, "ppacktb.dh">;
1416+   def PPACKTB_DW   : RVPPairBinaryPack_rr<0b010, 0b01, "ppacktb.dw">;
1417+ 
1418+   def PPACKT_DH    : RVPPairBinaryPack_rr<0b011, 0b00, "ppackt.dh">;
1419+   def PPACKT_DW    : RVPPairBinaryPack_rr<0b011, 0b01, "ppackt.dw">;
1420+ 
1421+   def PAS_DHX      : RVPPairBinaryExchanged_rr<0b0000, 0b00, "pas.dhx">;
1422+   def PSA_DHX      : RVPPairBinaryExchanged_rr<0b0000, 0b10, "psa.dhx">;
1423+ 
1424+   def PSAS_DHX     : RVPPairBinaryExchanged_rr<0b0010, 0b00, "psas.dhx">;
1425+   def PSSA_DHX     : RVPPairBinaryExchanged_rr<0b0010, 0b10, "pssa.dhx">;
1426+ 
1427+   def PAAX_DHX     : RVPPairBinaryExchanged_rr<0b0011, 0b00, "paax.dhx">;
1428+   def PASA_DHX     : RVPPairBinaryExchanged_rr<0b0011, 0b10, "pasa.dhx">;
1429+ 
1430+   def PMSEQ_DH     : RVPPairBinaryExchanged_rr<0b1000, 0b00, "pmseq.dh">;
1431+   def PMSEQ_DW     : RVPPairBinaryExchanged_rr<0b1000, 0b01, "pmseq.dw">;
1432+   def PMSEQ_DB     : RVPPairBinaryExchanged_rr<0b1000, 0b10, "pmseq.db">;
1433+ 
1434+   def PMSLT_DH     : RVPPairBinaryExchanged_rr<0b1010, 0b00, "pmslt.dh">;
1435+   def PMSLT_DW     : RVPPairBinaryExchanged_rr<0b1010, 0b01, "pmslt.dw">;
1436+   def PMSLT_DB     : RVPPairBinaryExchanged_rr<0b1010, 0b10, "pmslt.db">;
1437+ 
1438+   def PMSLTU_DH    : RVPPairBinaryExchanged_rr<0b1011, 0b00, "pmsltu.dh">;
1439+   def PMSLTU_DW    : RVPPairBinaryExchanged_rr<0b1011, 0b01, "pmsltu.dw">;
1440+   def PMSLTU_DB    : RVPPairBinaryExchanged_rr<0b1011, 0b10, "pmsltu.db">;
1441+ 
1442+   def PMIN_DH      : RVPPairBinaryExchanged_rr<0b1100, 0b00, "pmin.dh">;
1443+   def PMIN_DW      : RVPPairBinaryExchanged_rr<0b1100, 0b01, "pmin.dw">;
1444+   def PMIN_DB      : RVPPairBinaryExchanged_rr<0b1100, 0b10, "pmin.db">;
1445+ 
1446+   def PMINU_DH     : RVPPairBinaryExchanged_rr<0b1101, 0b00, "pminu.dh">;
1447+   def PMINU_DW     : RVPPairBinaryExchanged_rr<0b1101, 0b01, "pminu.dw">;
1448+   def PMINU_DB     : RVPPairBinaryExchanged_rr<0b1101, 0b10, "pminu.db">;
1449+ 
1450+   def PMAX_DH      : RVPPairBinaryExchanged_rr<0b1110, 0b00, "pmax.dh">;
1451+   def PMAX_DW      : RVPPairBinaryExchanged_rr<0b1110, 0b01, "pmax.dw">;
1452+   def PMAX_DB      : RVPPairBinaryExchanged_rr<0b1110, 0b10, "pmax.db">;
1453+ 
1454+   def PMAXU_DH     : RVPPairBinaryExchanged_rr<0b1111, 0b00, "pmaxu.dh">;
1455+   def PMAXU_DW     : RVPPairBinaryExchanged_rr<0b1111, 0b01, "pmaxu.dw">;
1456+   def PMAXU_DB     : RVPPairBinaryExchanged_rr<0b1111, 0b10, "pmaxu.db">;
11991457} // Predicates = [HasStdExtP, IsRV32]
0 commit comments