@@ -542,6 +542,8 @@ let Predicates = [HasStdExtP] in {
542542 def PASUBU_H : RVPBinary_rr<0b1111, 0b00, 0b000, "pasubu.h">;
543543 def PASUBU_B : RVPBinary_rr<0b1111, 0b10, 0b000, "pasubu.b">;
544544} // Predicates = [HasStdExtP]
545+
546+
545547let Predicates = [HasStdExtP, IsRV32], DecoderNamespace = "RV32Only" in {
546548 def SADD : RVPBinary_rr<0b0010, 0b01, 0b000, "sadd">;
547549
@@ -1197,3 +1199,127 @@ let Predicates = [HasStdExtP, IsRV32] in {
11971199 def PNCLIPR_HS : RVPNarrowingShift_rr<0b111, 0b01, "pnclipr.hs">;
11981200 def NCLIPR : RVPNarrowingShift_rr<0b111, 0b11, "nclipr">;
11991201} // Predicates = [HasStdExtP, IsRV32]
1202+
1203+ let Predicates = [HasStdExtP, IsRV64] in {
1204+ // Basic arithmetic patterns for v4i16 (16-bit elements in 64-bit GPR)
1205+ def: Pat<(v4i16 (add v4i16:$rs1, v4i16:$rs2)), (!cast<Instruction>("PADD_H") GPR:$rs1, GPR:$rs2)>;
1206+ def: Pat<(v4i16 (sub v4i16:$rs1, v4i16:$rs2)), (!cast<Instruction>("PSUB_H") GPR:$rs1, GPR:$rs2)>;
1207+
1208+ // Saturating add/sub patterns for v4i16
1209+ def: Pat<(v4i16 (saddsat v4i16:$rs1, v4i16:$rs2)), (!cast<Instruction>("PSADD_H") GPR:$rs1, GPR:$rs2)>;
1210+ def: Pat<(v4i16 (uaddsat v4i16:$rs1, v4i16:$rs2)), (!cast<Instruction>("PSADDU_H") GPR:$rs1, GPR:$rs2)>;
1211+ def: Pat<(v4i16 (ssubsat v4i16:$rs1, v4i16:$rs2)), (!cast<Instruction>("PSSUB_H") GPR:$rs1, GPR:$rs2)>;
1212+ def: Pat<(v4i16 (usubsat v4i16:$rs1, v4i16:$rs2)), (!cast<Instruction>("PSSUBU_H") GPR:$rs1, GPR:$rs2)>;
1213+
1214+ // Averaging patterns for v4i16
1215+ def: Pat<(v4i16 (avgfloors v4i16:$rs1, v4i16:$rs2)), (!cast<Instruction>("PAADD_H") GPR:$rs1, GPR:$rs2)>;
1216+ def: Pat<(v4i16 (avgflooru v4i16:$rs1, v4i16:$rs2)), (!cast<Instruction>("PAADDU_H") GPR:$rs1, GPR:$rs2)>;
1217+
1218+ // Averaging subtraction patterns for v4i16
1219+ // PASUB_H: signed (a - b) >> 1
1220+ def: Pat<(v4i16 (sra (sub v4i16:$rs1, v4i16:$rs2), (v4i16 (build_vector (XLenVT 1))))),
1221+ (!cast<Instruction>("PASUB_H") GPR:$rs1, GPR:$rs2)>;
1222+ // PASUBU_H: unsigned (a - b) >> 1
1223+ def: Pat<(v4i16 (srl (sub v4i16:$rs1, v4i16:$rs2), (v4i16 (build_vector (XLenVT 1))))),
1224+ (!cast<Instruction>("PASUBU_H") GPR:$rs1, GPR:$rs2)>;
1225+
1226+ // Absolute difference patterns for v4i16
1227+ def: Pat<(v4i16 (abds v4i16:$rs1, v4i16:$rs2)), (!cast<Instruction>("PDIF_H") GPR:$rs1, GPR:$rs2)>;
1228+ def: Pat<(v4i16 (abdu v4i16:$rs1, v4i16:$rs2)), (!cast<Instruction>("PDIFU_H") GPR:$rs1, GPR:$rs2)>;
1229+
1230+ // Basic arithmetic patterns for v8i8 (8-bit elements in 64-bit GPR)
1231+ def: Pat<(v8i8 (add v8i8:$rs1, v8i8:$rs2)), (!cast<Instruction>("PADD_B") GPR:$rs1, GPR:$rs2)>;
1232+ def: Pat<(v8i8 (sub v8i8:$rs1, v8i8:$rs2)), (!cast<Instruction>("PSUB_B") GPR:$rs1, GPR:$rs2)>;
1233+
1234+ // Saturating add/sub patterns for v8i8
1235+ def: Pat<(v8i8 (saddsat v8i8:$rs1, v8i8:$rs2)), (!cast<Instruction>("PSADD_B") GPR:$rs1, GPR:$rs2)>;
1236+ def: Pat<(v8i8 (uaddsat v8i8:$rs1, v8i8:$rs2)), (!cast<Instruction>("PSADDU_B") GPR:$rs1, GPR:$rs2)>;
1237+ def: Pat<(v8i8 (ssubsat v8i8:$rs1, v8i8:$rs2)), (!cast<Instruction>("PSSUB_B") GPR:$rs1, GPR:$rs2)>;
1238+ def: Pat<(v8i8 (usubsat v8i8:$rs1, v8i8:$rs2)), (!cast<Instruction>("PSSUBU_B") GPR:$rs1, GPR:$rs2)>;
1239+
1240+ // Averaging patterns for v8i8
1241+ def: Pat<(v8i8 (avgfloors v8i8:$rs1, v8i8:$rs2)), (!cast<Instruction>("PAADD_B") GPR:$rs1, GPR:$rs2)>;
1242+ def: Pat<(v8i8 (avgflooru v8i8:$rs1, v8i8:$rs2)), (!cast<Instruction>("PAADDU_B") GPR:$rs1, GPR:$rs2)>;
1243+
1244+ // Averaging subtraction patterns for v8i8
1245+ // PASUB_B: signed (a - b) >> 1
1246+ def: Pat<(v8i8 (sra (sub v8i8:$rs1, v8i8:$rs2), (v8i8 (build_vector (XLenVT 1))))),
1247+ (!cast<Instruction>("PASUB_B") GPR:$rs1, GPR:$rs2)>;
1248+ // PASUBU_B: unsigned (a - b) >> 1
1249+ def: Pat<(v8i8 (srl (sub v8i8:$rs1, v8i8:$rs2), (v8i8 (build_vector (XLenVT 1))))),
1250+ (!cast<Instruction>("PASUBU_B") GPR:$rs1, GPR:$rs2)>;
1251+
1252+ // Absolute difference patterns for v8i8
1253+ def: Pat<(v8i8 (abds v8i8:$rs1, v8i8:$rs2)), (!cast<Instruction>("PDIF_B") GPR:$rs1, GPR:$rs2)>;
1254+ def: Pat<(v8i8 (abdu v8i8:$rs1, v8i8:$rs2)), (!cast<Instruction>("PDIFU_B") GPR:$rs1, GPR:$rs2)>;
1255+
1256+ // Load/Store patterns for v4i16 and v8i8 (use regular GPR load/store since they're in GPRs)
1257+ def : StPat<store, SD, GPR, v4i16>;
1258+ def : LdPat<load, LD, v4i16>;
1259+ def : StPat<store, SD, GPR, v8i8>;
1260+ def : LdPat<load, LD, v8i8>;
1261+
1262+ // Load/Store patterns for v2i32 (32-bit elements in 64-bit GPR)
1263+ def : StPat<store, SD, GPR, v2i32>;
1264+ def : LdPat<load, LD, v2i32>;
1265+ } // Predicates = [HasStdExtP, IsRV64]
1266+
1267+ let Predicates = [HasStdExtP, IsRV32] in {
1268+ // Basic arithmetic patterns for v2i16 (16-bit elements in 32-bit GPR)
1269+ def: Pat<(v2i16 (add v2i16:$rs1, v2i16:$rs2)), (!cast<Instruction>("PADD_H") GPR:$rs1, GPR:$rs2)>;
1270+ def: Pat<(v2i16 (sub v2i16:$rs1, v2i16:$rs2)), (!cast<Instruction>("PSUB_H") GPR:$rs1, GPR:$rs2)>;
1271+
1272+ // Saturating add/sub patterns for v2i16
1273+ def: Pat<(v2i16 (saddsat v2i16:$rs1, v2i16:$rs2)), (!cast<Instruction>("PSADD_H") GPR:$rs1, GPR:$rs2)>;
1274+ def: Pat<(v2i16 (uaddsat v2i16:$rs1, v2i16:$rs2)), (!cast<Instruction>("PSADDU_H") GPR:$rs1, GPR:$rs2)>;
1275+ def: Pat<(v2i16 (ssubsat v2i16:$rs1, v2i16:$rs2)), (!cast<Instruction>("PSSUB_H") GPR:$rs1, GPR:$rs2)>;
1276+ def: Pat<(v2i16 (usubsat v2i16:$rs1, v2i16:$rs2)), (!cast<Instruction>("PSSUBU_H") GPR:$rs1, GPR:$rs2)>;
1277+
1278+ // Averaging patterns for v2i16
1279+ def: Pat<(v2i16 (avgfloors v2i16:$rs1, v2i16:$rs2)), (!cast<Instruction>("PAADD_H") GPR:$rs1, GPR:$rs2)>;
1280+ def: Pat<(v2i16 (avgflooru v2i16:$rs1, v2i16:$rs2)), (!cast<Instruction>("PAADDU_H") GPR:$rs1, GPR:$rs2)>;
1281+
1282+ // Averaging subtraction patterns for v2i16
1283+ // PASUB_H: signed (a - b) >> 1
1284+ def: Pat<(v2i16 (sra (sub v2i16:$rs1, v2i16:$rs2), (v2i16 (build_vector (XLenVT 1))))),
1285+ (!cast<Instruction>("PASUB_H") GPR:$rs1, GPR:$rs2)>;
1286+ // PASUBU_H: unsigned (a - b) >> 1
1287+ def: Pat<(v2i16 (srl (sub v2i16:$rs1, v2i16:$rs2), (v2i16 (build_vector (XLenVT 1))))),
1288+ (!cast<Instruction>("PASUBU_H") GPR:$rs1, GPR:$rs2)>;
1289+
1290+ // Absolute difference patterns for v2i16
1291+ def: Pat<(v2i16 (abds v2i16:$rs1, v2i16:$rs2)), (!cast<Instruction>("PDIF_H") GPR:$rs1, GPR:$rs2)>;
1292+ def: Pat<(v2i16 (abdu v2i16:$rs1, v2i16:$rs2)), (!cast<Instruction>("PDIFU_H") GPR:$rs1, GPR:$rs2)>;
1293+
1294+ // Basic arithmetic patterns for v4i8 (8-bit elements in 32-bit GPR)
1295+ def: Pat<(v4i8 (add v4i8:$rs1, v4i8:$rs2)), (!cast<Instruction>("PADD_B") GPR:$rs1, GPR:$rs2)>;
1296+ def: Pat<(v4i8 (sub v4i8:$rs1, v4i8:$rs2)), (!cast<Instruction>("PSUB_B") GPR:$rs1, GPR:$rs2)>;
1297+
1298+ // Saturating add/sub patterns for v4i8
1299+ def: Pat<(v4i8 (saddsat v4i8:$rs1, v4i8:$rs2)), (!cast<Instruction>("PSADD_B") GPR:$rs1, GPR:$rs2)>;
1300+ def: Pat<(v4i8 (uaddsat v4i8:$rs1, v4i8:$rs2)), (!cast<Instruction>("PSADDU_B") GPR:$rs1, GPR:$rs2)>;
1301+ def: Pat<(v4i8 (ssubsat v4i8:$rs1, v4i8:$rs2)), (!cast<Instruction>("PSSUB_B") GPR:$rs1, GPR:$rs2)>;
1302+ def: Pat<(v4i8 (usubsat v4i8:$rs1, v4i8:$rs2)), (!cast<Instruction>("PSSUBU_B") GPR:$rs1, GPR:$rs2)>;
1303+
1304+ // Averaging patterns for v4i8
1305+ def: Pat<(v4i8 (avgfloors v4i8:$rs1, v4i8:$rs2)), (!cast<Instruction>("PAADD_B") GPR:$rs1, GPR:$rs2)>;
1306+ def: Pat<(v4i8 (avgflooru v4i8:$rs1, v4i8:$rs2)), (!cast<Instruction>("PAADDU_B") GPR:$rs1, GPR:$rs2)>;
1307+
1308+ // Averaging subtraction patterns for v4i8
1309+ // PASUB_B: signed (a - b) >> 1
1310+ def: Pat<(v4i8 (sra (sub v4i8:$rs1, v4i8:$rs2), (v4i8 (build_vector (XLenVT 1))))),
1311+ (!cast<Instruction>("PASUB_B") GPR:$rs1, GPR:$rs2)>;
1312+ // PASUBU_B: unsigned (a - b) >> 1
1313+ def: Pat<(v4i8 (srl (sub v4i8:$rs1, v4i8:$rs2), (v4i8 (build_vector (XLenVT 1))))),
1314+ (!cast<Instruction>("PASUBU_B") GPR:$rs1, GPR:$rs2)>;
1315+
1316+ // Absolute difference patterns for v4i8
1317+ def: Pat<(v4i8 (abds v4i8:$rs1, v4i8:$rs2)), (!cast<Instruction>("PDIF_B") GPR:$rs1, GPR:$rs2)>;
1318+ def: Pat<(v4i8 (abdu v4i8:$rs1, v4i8:$rs2)), (!cast<Instruction>("PDIFU_B") GPR:$rs1, GPR:$rs2)>;
1319+
1320+ // Load/Store patterns for v2i16 and v4i8 (use regular GPR load/store since they're in GPRs)
1321+ def : StPat<store, SW, GPR, v2i16>;
1322+ def : LdPat<load, LW, v2i16>;
1323+ def : StPat<store, SW, GPR, v4i8>;
1324+ def : LdPat<load, LW, v4i8>;
1325+ } // Predicates = [HasStdExtP, IsRV32]
0 commit comments