@@ -1165,29 +1165,59 @@ foreach vti = AllFloatVectors in {
1165
1165
(!cast<Instruction>("PseudoVFMSUB_VV_"# suffix)
1166
1166
vti.RegClass:$rd, vti.RegClass:$rs1, vti.RegClass:$rs2,
1167
1167
GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>;
1168
+ def : Pat<(vti.Vector (riscv_fma_vl vti.RegClass:$rs1, vti.RegClass:$rd,
1169
+ (riscv_fneg_vl vti.RegClass:$rs2,
1170
+ (vti.Mask srcvalue),
1171
+ VLOpFrag),
1172
+ (vti.Mask V0),
1173
+ VLOpFrag)),
1174
+ (!cast<Instruction>("PseudoVFMSUB_VV_"# suffix #"_MASK")
1175
+ vti.RegClass:$rd, vti.RegClass:$rs1, vti.RegClass:$rs2,
1176
+ (vti.Mask V0), GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>;
1168
1177
1169
1178
def : Pat<(vti.Vector (riscv_fma_vl (riscv_fneg_vl vti.RegClass:$rs1,
1170
- (vti.Mask true_mask ),
1179
+ (vti.Mask srcvalue ),
1171
1180
VLOpFrag),
1172
1181
vti.RegClass:$rd,
1173
1182
(riscv_fneg_vl vti.RegClass:$rs2,
1174
- (vti.Mask true_mask ),
1183
+ (vti.Mask srcvalue ),
1175
1184
VLOpFrag),
1176
1185
(vti.Mask true_mask),
1177
1186
VLOpFrag)),
1178
1187
(!cast<Instruction>("PseudoVFNMADD_VV_"# suffix)
1179
1188
vti.RegClass:$rd, vti.RegClass:$rs1, vti.RegClass:$rs2,
1180
1189
GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>;
1190
+ def : Pat<(vti.Vector (riscv_fma_vl (riscv_fneg_vl vti.RegClass:$rs1,
1191
+ (vti.Mask srcvalue),
1192
+ VLOpFrag),
1193
+ vti.RegClass:$rd,
1194
+ (riscv_fneg_vl vti.RegClass:$rs2,
1195
+ (vti.Mask srcvalue),
1196
+ VLOpFrag),
1197
+ (vti.Mask V0),
1198
+ VLOpFrag)),
1199
+ (!cast<Instruction>("PseudoVFNMADD_VV_"# suffix #"_MASK")
1200
+ vti.RegClass:$rd, vti.RegClass:$rs1, vti.RegClass:$rs2,
1201
+ (vti.Mask V0), GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>;
1181
1202
1182
1203
def : Pat<(vti.Vector (riscv_fma_vl (riscv_fneg_vl vti.RegClass:$rs1,
1183
- (vti.Mask true_mask ),
1204
+ (vti.Mask srcvalue ),
1184
1205
VLOpFrag),
1185
1206
vti.RegClass:$rd, vti.RegClass:$rs2,
1186
1207
(vti.Mask true_mask),
1187
1208
VLOpFrag)),
1188
1209
(!cast<Instruction>("PseudoVFNMSUB_VV_"# suffix)
1189
1210
vti.RegClass:$rd, vti.RegClass:$rs1, vti.RegClass:$rs2,
1190
1211
GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>;
1212
+ def : Pat<(vti.Vector (riscv_fma_vl (riscv_fneg_vl vti.RegClass:$rs1,
1213
+ (vti.Mask srcvalue),
1214
+ VLOpFrag),
1215
+ vti.RegClass:$rd, vti.RegClass:$rs2,
1216
+ (vti.Mask V0),
1217
+ VLOpFrag)),
1218
+ (!cast<Instruction>("PseudoVFNMSUB_VV_"# suffix #"_MASK")
1219
+ vti.RegClass:$rd, vti.RegClass:$rs1, vti.RegClass:$rs2,
1220
+ (vti.Mask V0), GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>;
1191
1221
1192
1222
// The choice of VFMADD here is arbitrary, vfmadd.vf and vfmacc.vf are equally
1193
1223
// commutable.
@@ -1209,19 +1239,30 @@ foreach vti = AllFloatVectors in {
1209
1239
def : Pat<(vti.Vector (riscv_fma_vl (SplatFPOp vti.ScalarRegClass:$rs1),
1210
1240
vti.RegClass:$rd,
1211
1241
(riscv_fneg_vl vti.RegClass:$rs2,
1212
- (vti.Mask true_mask ),
1242
+ (vti.Mask srcvalue ),
1213
1243
VLOpFrag),
1214
1244
(vti.Mask true_mask),
1215
1245
VLOpFrag)),
1216
1246
(!cast<Instruction>("PseudoVFMSUB_V" # vti.ScalarSuffix # "_" # suffix)
1217
1247
vti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2,
1218
1248
GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>;
1249
+ def : Pat<(vti.Vector (riscv_fma_vl (SplatFPOp vti.ScalarRegClass:$rs1),
1250
+ vti.RegClass:$rd,
1251
+ (riscv_fneg_vl vti.RegClass:$rs2,
1252
+ (vti.Mask srcvalue),
1253
+ VLOpFrag),
1254
+ (vti.Mask V0),
1255
+ VLOpFrag)),
1256
+ (!cast<Instruction>("PseudoVFMSUB_V" # vti.ScalarSuffix # "_" # suffix # "_MASK")
1257
+ vti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2,
1258
+ (vti.Mask V0), GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>;
1259
+
1219
1260
def : Pat<(vti.Vector (riscv_fma_vl (SplatFPOp vti.ScalarRegClass:$rs1),
1220
1261
(riscv_fneg_vl vti.RegClass:$rd,
1221
- (vti.Mask true_mask ),
1262
+ (vti.Mask srcvalue ),
1222
1263
VLOpFrag),
1223
1264
(riscv_fneg_vl vti.RegClass:$rs2,
1224
- (vti.Mask true_mask ),
1265
+ (vti.Mask srcvalue ),
1225
1266
VLOpFrag),
1226
1267
(vti.Mask true_mask),
1227
1268
VLOpFrag)),
@@ -1230,37 +1271,82 @@ foreach vti = AllFloatVectors in {
1230
1271
GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>;
1231
1272
def : Pat<(vti.Vector (riscv_fma_vl (SplatFPOp vti.ScalarRegClass:$rs1),
1232
1273
(riscv_fneg_vl vti.RegClass:$rd,
1233
- (vti.Mask true_mask),
1274
+ (vti.Mask srcvalue),
1275
+ VLOpFrag),
1276
+ (riscv_fneg_vl vti.RegClass:$rs2,
1277
+ (vti.Mask srcvalue),
1278
+ VLOpFrag),
1279
+ (vti.Mask V0),
1280
+ VLOpFrag)),
1281
+ (!cast<Instruction>("PseudoVFNMADD_V" # vti.ScalarSuffix # "_" # suffix # "_MASK")
1282
+ vti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2,
1283
+ (vti.Mask V0), GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>;
1284
+
1285
+ def : Pat<(vti.Vector (riscv_fma_vl (SplatFPOp vti.ScalarRegClass:$rs1),
1286
+ (riscv_fneg_vl vti.RegClass:$rd,
1287
+ (vti.Mask srcvalue),
1234
1288
VLOpFrag),
1235
1289
vti.RegClass:$rs2,
1236
1290
(vti.Mask true_mask),
1237
1291
VLOpFrag)),
1238
1292
(!cast<Instruction>("PseudoVFNMSUB_V" # vti.ScalarSuffix # "_" # suffix)
1239
1293
vti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2,
1240
1294
GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>;
1295
+ def : Pat<(vti.Vector (riscv_fma_vl (SplatFPOp vti.ScalarRegClass:$rs1),
1296
+ (riscv_fneg_vl vti.RegClass:$rd,
1297
+ (vti.Mask srcvalue),
1298
+ VLOpFrag),
1299
+ vti.RegClass:$rs2,
1300
+ (vti.Mask V0),
1301
+ VLOpFrag)),
1302
+ (!cast<Instruction>("PseudoVFNMSUB_V" # vti.ScalarSuffix # "_" # suffix # "_MASK")
1303
+ vti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2,
1304
+ (vti.Mask V0), GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>;
1241
1305
1242
1306
// The splat might be negated.
1243
1307
def : Pat<(vti.Vector (riscv_fma_vl (riscv_fneg_vl (SplatFPOp vti.ScalarRegClass:$rs1),
1244
- (vti.Mask true_mask ),
1308
+ (vti.Mask srcvalue ),
1245
1309
VLOpFrag),
1246
1310
vti.RegClass:$rd,
1247
1311
(riscv_fneg_vl vti.RegClass:$rs2,
1248
- (vti.Mask true_mask ),
1312
+ (vti.Mask srcvalue ),
1249
1313
VLOpFrag),
1250
1314
(vti.Mask true_mask),
1251
1315
VLOpFrag)),
1252
1316
(!cast<Instruction>("PseudoVFNMADD_V" # vti.ScalarSuffix # "_" # suffix)
1253
1317
vti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2,
1254
1318
GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>;
1255
1319
def : Pat<(vti.Vector (riscv_fma_vl (riscv_fneg_vl (SplatFPOp vti.ScalarRegClass:$rs1),
1256
- (vti.Mask true_mask),
1320
+ (vti.Mask srcvalue),
1321
+ VLOpFrag),
1322
+ vti.RegClass:$rd,
1323
+ (riscv_fneg_vl vti.RegClass:$rs2,
1324
+ (vti.Mask srcvalue),
1325
+ VLOpFrag),
1326
+ (vti.Mask V0),
1327
+ VLOpFrag)),
1328
+ (!cast<Instruction>("PseudoVFNMADD_V" # vti.ScalarSuffix # "_" # suffix # "_MASK")
1329
+ vti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2,
1330
+ (vti.Mask V0), GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>;
1331
+
1332
+ def : Pat<(vti.Vector (riscv_fma_vl (riscv_fneg_vl (SplatFPOp vti.ScalarRegClass:$rs1),
1333
+ (vti.Mask srcvalue),
1257
1334
VLOpFrag),
1258
1335
vti.RegClass:$rd, vti.RegClass:$rs2,
1259
1336
(vti.Mask true_mask),
1260
1337
VLOpFrag)),
1261
1338
(!cast<Instruction>("PseudoVFNMSUB_V" # vti.ScalarSuffix # "_" # suffix)
1262
1339
vti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2,
1263
1340
GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>;
1341
+ def : Pat<(vti.Vector (riscv_fma_vl (riscv_fneg_vl (SplatFPOp vti.ScalarRegClass:$rs1),
1342
+ (vti.Mask srcvalue),
1343
+ VLOpFrag),
1344
+ vti.RegClass:$rd, vti.RegClass:$rs2,
1345
+ (vti.Mask V0),
1346
+ VLOpFrag)),
1347
+ (!cast<Instruction>("PseudoVFNMSUB_V" # vti.ScalarSuffix # "_" # suffix # "_MASK")
1348
+ vti.RegClass:$rd, vti.ScalarRegClass:$rs1, vti.RegClass:$rs2,
1349
+ (vti.Mask V0), GPR:$vl, vti.Log2SEW, TAIL_AGNOSTIC)>;
1264
1350
}
1265
1351
1266
1352
// 14.11. Vector Floating-Point MIN/MAX Instructions
0 commit comments