@@ -201,6 +201,19 @@ defset list<VTypeInfoToWide> AllWidenableIntVectors = {
201
201
def : VTypeInfoToWide<VI32M4, VI64M8>;
202
202
}
203
203
204
+ defset list<VTypeInfoToWide> AllWidenableFloatVectors = {
205
+ def : VTypeInfoToWide<VF16MF4, VF32MF2>;
206
+ def : VTypeInfoToWide<VF16MF2, VF32M1>;
207
+ def : VTypeInfoToWide<VF16M1, VF32M2>;
208
+ def : VTypeInfoToWide<VF16M2, VF32M4>;
209
+ def : VTypeInfoToWide<VF16M4, VF32M8>;
210
+
211
+ def : VTypeInfoToWide<VF32MF2, VF64M1>;
212
+ def : VTypeInfoToWide<VF32M1, VF64M2>;
213
+ def : VTypeInfoToWide<VF32M2, VF64M4>;
214
+ def : VTypeInfoToWide<VF32M4, VF64M8>;
215
+ }
216
+
204
217
// This class holds the record of the RISCVVPseudoTable below.
205
218
// This represents the information we need in codegen for each pseudo.
206
219
// The definition should be consistent with `struct PseudoInfo` in
@@ -662,9 +675,10 @@ multiclass VPseudoBinaryW_VV {
662
675
"@earlyclobber $rd">;
663
676
}
664
677
665
- multiclass VPseudoBinaryW_VX {
678
+ multiclass VPseudoBinaryW_VX<bit IsFloat> {
666
679
foreach m = MxList.m[0-5] in
667
- defm _VX : VPseudoBinary<m.wvrclass, m.vrclass, GPR, m,
680
+ defm !if(!eq(IsFloat, 0), "_VX", "_VF") : VPseudoBinary<m.wvrclass, m.vrclass,
681
+ !if(!eq(IsFloat, 0), GPR, FPR32), m,
668
682
"@earlyclobber $rd">;
669
683
}
670
684
@@ -674,9 +688,10 @@ multiclass VPseudoBinaryW_WV {
674
688
"@earlyclobber $rd">;
675
689
}
676
690
677
- multiclass VPseudoBinaryW_WX {
691
+ multiclass VPseudoBinaryW_WX<bit IsFloat> {
678
692
foreach m = MxList.m[0-5] in
679
- defm _WX : VPseudoBinary<m.wvrclass, m.wvrclass, GPR, m,
693
+ defm !if(!eq(IsFloat, 0), "_WX", "_WF") : VPseudoBinary<m.wvrclass, m.wvrclass,
694
+ !if(!eq(IsFloat, 0), GPR, FPR32), m,
680
695
"@earlyclobber $rd">;
681
696
}
682
697
@@ -757,14 +772,14 @@ multiclass VPseudoBinaryV_VX_VI<Operand ImmType = simm5> {
757
772
defm "" : VPseudoBinaryV_VI<ImmType>;
758
773
}
759
774
760
- multiclass VPseudoBinaryW_VV_VX {
775
+ multiclass VPseudoBinaryW_VV_VX<bit IsFloat = 0> {
761
776
defm "" : VPseudoBinaryW_VV;
762
- defm "" : VPseudoBinaryW_VX;
777
+ defm "" : VPseudoBinaryW_VX<IsFloat> ;
763
778
}
764
779
765
- multiclass VPseudoBinaryW_WV_WX {
780
+ multiclass VPseudoBinaryW_WV_WX<bit IsFloat = 0> {
766
781
defm "" : VPseudoBinaryW_WV;
767
- defm "" : VPseudoBinaryW_WX;
782
+ defm "" : VPseudoBinaryW_WX<IsFloat> ;
768
783
}
769
784
770
785
multiclass VPseudoBinaryV_VM_XM_IM {
@@ -1120,8 +1135,9 @@ multiclass VPatBinaryV_VI<string intrinsic, string instruction,
1120
1135
vti.RegClass, imm_type>;
1121
1136
}
1122
1137
1123
- multiclass VPatBinaryW_VV<string intrinsic, string instruction> {
1124
- foreach VtiToWti = AllWidenableIntVectors in {
1138
+ multiclass VPatBinaryW_VV<string intrinsic, string instruction,
1139
+ list<VTypeInfoToWide> vtilist> {
1140
+ foreach VtiToWti = vtilist in {
1125
1141
defvar Vti = VtiToWti.Vti;
1126
1142
defvar Wti = VtiToWti.Wti;
1127
1143
defm : VPatBinary<intrinsic, instruction, "VV",
@@ -1131,19 +1147,22 @@ multiclass VPatBinaryW_VV<string intrinsic, string instruction> {
1131
1147
}
1132
1148
}
1133
1149
1134
- multiclass VPatBinaryW_VX<string intrinsic, string instruction> {
1135
- foreach VtiToWti = AllWidenableIntVectors in {
1150
+ multiclass VPatBinaryW_VX<string intrinsic, string instruction,
1151
+ list<VTypeInfoToWide> vtilist> {
1152
+ foreach VtiToWti = vtilist in {
1136
1153
defvar Vti = VtiToWti.Vti;
1137
1154
defvar Wti = VtiToWti.Wti;
1138
- defm : VPatBinary<intrinsic, instruction, "VX",
1139
- Wti.Vector, Vti.Vector, XLenVT, Vti.Mask,
1155
+ defm : VPatBinary<intrinsic, instruction,
1156
+ !if(!eq(Vti.Scalar, XLenVT), "VX", "VF"),
1157
+ Wti.Vector, Vti.Vector, Vti.Scalar, Vti.Mask,
1140
1158
Vti.SEW, Vti.LMul, Wti.RegClass,
1141
- Vti.RegClass, GPR >;
1159
+ Vti.RegClass, Vti.ScalarRegClass >;
1142
1160
}
1143
1161
}
1144
1162
1145
- multiclass VPatBinaryW_WV<string intrinsic, string instruction> {
1146
- foreach VtiToWti = AllWidenableIntVectors in {
1163
+ multiclass VPatBinaryW_WV<string intrinsic, string instruction,
1164
+ list<VTypeInfoToWide> vtilist> {
1165
+ foreach VtiToWti = vtilist in {
1147
1166
defvar Vti = VtiToWti.Vti;
1148
1167
defvar Wti = VtiToWti.Wti;
1149
1168
defm : VPatBinary<intrinsic, instruction, "WV",
@@ -1153,19 +1172,22 @@ multiclass VPatBinaryW_WV<string intrinsic, string instruction> {
1153
1172
}
1154
1173
}
1155
1174
1156
- multiclass VPatBinaryW_WX<string intrinsic, string instruction> {
1157
- foreach VtiToWti = AllWidenableIntVectors in {
1175
+ multiclass VPatBinaryW_WX<string intrinsic, string instruction,
1176
+ list<VTypeInfoToWide> vtilist> {
1177
+ foreach VtiToWti = vtilist in {
1158
1178
defvar Vti = VtiToWti.Vti;
1159
1179
defvar Wti = VtiToWti.Wti;
1160
- defm : VPatBinary<intrinsic, instruction, "WX",
1161
- Wti.Vector, Wti.Vector, XLenVT, Vti.Mask,
1180
+ defm : VPatBinary<intrinsic, instruction,
1181
+ !if(!eq(Vti.Scalar, XLenVT), "WX", "WF"),
1182
+ Wti.Vector, Wti.Vector, Vti.Scalar, Vti.Mask,
1162
1183
Vti.SEW, Vti.LMul, Wti.RegClass,
1163
- Wti.RegClass, GPR >;
1184
+ Wti.RegClass, Vti.ScalarRegClass >;
1164
1185
}
1165
1186
}
1166
1187
1167
- multiclass VPatBinaryV_WV<string intrinsic, string instruction> {
1168
- foreach VtiToWti = AllWidenableIntVectors in {
1188
+ multiclass VPatBinaryV_WV<string intrinsic, string instruction,
1189
+ list<VTypeInfoToWide> vtilist> {
1190
+ foreach VtiToWti = vtilist in {
1169
1191
defvar Vti = VtiToWti.Vti;
1170
1192
defvar Wti = VtiToWti.Wti;
1171
1193
defm : VPatBinary<intrinsic, instruction, "WV",
@@ -1175,19 +1197,22 @@ multiclass VPatBinaryV_WV<string intrinsic, string instruction> {
1175
1197
}
1176
1198
}
1177
1199
1178
- multiclass VPatBinaryV_WX<string intrinsic, string instruction> {
1179
- foreach VtiToWti = AllWidenableIntVectors in {
1200
+ multiclass VPatBinaryV_WX<string intrinsic, string instruction,
1201
+ list<VTypeInfoToWide> vtilist> {
1202
+ foreach VtiToWti = vtilist in {
1180
1203
defvar Vti = VtiToWti.Vti;
1181
1204
defvar Wti = VtiToWti.Wti;
1182
- defm : VPatBinary<intrinsic, instruction, "WX",
1183
- Vti.Vector, Wti.Vector, XLenVT, Vti.Mask,
1205
+ defm : VPatBinary<intrinsic, instruction,
1206
+ !if(!eq(Vti.Scalar, XLenVT), "WX", "WF"),
1207
+ Vti.Vector, Wti.Vector, Vti.Scalar, Vti.Mask,
1184
1208
Vti.SEW, Vti.LMul, Vti.RegClass,
1185
- Wti.RegClass, GPR >;
1209
+ Wti.RegClass, Vti.ScalarRegClass >;
1186
1210
}
1187
1211
}
1188
1212
1189
- multiclass VPatBinaryV_WI<string intrinsic, string instruction> {
1190
- foreach VtiToWti = AllWidenableIntVectors in {
1213
+ multiclass VPatBinaryV_WI<string intrinsic, string instruction,
1214
+ list<VTypeInfoToWide> vtilist> {
1215
+ foreach VtiToWti = vtilist in {
1191
1216
defvar Vti = VtiToWti.Vti;
1192
1217
defvar Wti = VtiToWti.Wti;
1193
1218
defm : VPatBinary<intrinsic, instruction, "WI",
@@ -1273,23 +1298,26 @@ multiclass VPatBinaryV_VX_VI<string intrinsic, string instruction,
1273
1298
defm "" : VPatBinaryV_VI<intrinsic, instruction, vtilist, simm5>;
1274
1299
}
1275
1300
1276
- multiclass VPatBinaryW_VV_VX<string intrinsic, string instruction>
1301
+ multiclass VPatBinaryW_VV_VX<string intrinsic, string instruction,
1302
+ list<VTypeInfoToWide> vtilist>
1277
1303
{
1278
- defm "" : VPatBinaryW_VV<intrinsic, instruction>;
1279
- defm "" : VPatBinaryW_VX<intrinsic, instruction>;
1304
+ defm "" : VPatBinaryW_VV<intrinsic, instruction, vtilist >;
1305
+ defm "" : VPatBinaryW_VX<intrinsic, instruction, vtilist >;
1280
1306
}
1281
1307
1282
- multiclass VPatBinaryW_WV_WX<string intrinsic, string instruction>
1308
+ multiclass VPatBinaryW_WV_WX<string intrinsic, string instruction,
1309
+ list<VTypeInfoToWide> vtilist>
1283
1310
{
1284
- defm "" : VPatBinaryW_WV<intrinsic, instruction>;
1285
- defm "" : VPatBinaryW_WX<intrinsic, instruction>;
1311
+ defm "" : VPatBinaryW_WV<intrinsic, instruction, vtilist >;
1312
+ defm "" : VPatBinaryW_WX<intrinsic, instruction, vtilist >;
1286
1313
}
1287
1314
1288
- multiclass VPatBinaryV_WV_WX_WI<string intrinsic, string instruction>
1315
+ multiclass VPatBinaryV_WV_WX_WI<string intrinsic, string instruction,
1316
+ list<VTypeInfoToWide> vtilist>
1289
1317
{
1290
- defm "" : VPatBinaryV_WV<intrinsic, instruction>;
1291
- defm "" : VPatBinaryV_WX<intrinsic, instruction>;
1292
- defm "" : VPatBinaryV_WI<intrinsic, instruction>;
1318
+ defm "" : VPatBinaryV_WV<intrinsic, instruction, vtilist >;
1319
+ defm "" : VPatBinaryV_WX<intrinsic, instruction, vtilist >;
1320
+ defm "" : VPatBinaryV_WI<intrinsic, instruction, vtilist >;
1293
1321
}
1294
1322
1295
1323
multiclass VPatBinaryV_VM_XM_IM<string intrinsic, string instruction>
@@ -1500,6 +1528,14 @@ defm PseudoVFADD : VPseudoBinaryV_VV_VX</*IsFloat=*/1>;
1500
1528
defm PseudoVFSUB : VPseudoBinaryV_VV_VX</*IsFloat=*/1>;
1501
1529
defm PseudoVFRSUB : VPseudoBinaryV_VX</*IsFloat=*/1>;
1502
1530
1531
+ //===----------------------------------------------------------------------===//
1532
+ // 14.3. Vector Widening Floating-Point Add/Subtract Instructions
1533
+ //===----------------------------------------------------------------------===//
1534
+ defm PseudoVFWADD : VPseudoBinaryW_VV_VX</*IsFloat=*/1>;
1535
+ defm PseudoVFWSUB : VPseudoBinaryW_VV_VX</*IsFloat=*/1>;
1536
+ defm PseudoVFWADD : VPseudoBinaryW_WV_WX</*IsFloat=*/1>;
1537
+ defm PseudoVFWSUB : VPseudoBinaryW_WV_WX</*IsFloat=*/1>;
1538
+
1503
1539
//===----------------------------------------------------------------------===//
1504
1540
// 14.4. Vector Single-Width Floating-Point Multiply/Divide Instructions
1505
1541
//===----------------------------------------------------------------------===//
@@ -1674,14 +1710,14 @@ defm "" : VPatBinaryV_VX_VI<"int_riscv_vrsub", "PseudoVRSUB", AllIntegerVectors>
1674
1710
//===----------------------------------------------------------------------===//
1675
1711
// 12.2. Vector Widening Integer Add/Subtract
1676
1712
//===----------------------------------------------------------------------===//
1677
- defm "" : VPatBinaryW_VV_VX<"int_riscv_vwaddu", "PseudoVWADDU">;
1678
- defm "" : VPatBinaryW_VV_VX<"int_riscv_vwsubu", "PseudoVWSUBU">;
1679
- defm "" : VPatBinaryW_VV_VX<"int_riscv_vwadd", "PseudoVWADD">;
1680
- defm "" : VPatBinaryW_VV_VX<"int_riscv_vwsub", "PseudoVWSUB">;
1681
- defm "" : VPatBinaryW_WV_WX<"int_riscv_vwaddu_w", "PseudoVWADDU">;
1682
- defm "" : VPatBinaryW_WV_WX<"int_riscv_vwsubu_w", "PseudoVWSUBU">;
1683
- defm "" : VPatBinaryW_WV_WX<"int_riscv_vwadd_w", "PseudoVWADD">;
1684
- defm "" : VPatBinaryW_WV_WX<"int_riscv_vwsub_w", "PseudoVWSUB">;
1713
+ defm "" : VPatBinaryW_VV_VX<"int_riscv_vwaddu", "PseudoVWADDU", AllWidenableIntVectors >;
1714
+ defm "" : VPatBinaryW_VV_VX<"int_riscv_vwsubu", "PseudoVWSUBU", AllWidenableIntVectors >;
1715
+ defm "" : VPatBinaryW_VV_VX<"int_riscv_vwadd", "PseudoVWADD", AllWidenableIntVectors >;
1716
+ defm "" : VPatBinaryW_VV_VX<"int_riscv_vwsub", "PseudoVWSUB", AllWidenableIntVectors >;
1717
+ defm "" : VPatBinaryW_WV_WX<"int_riscv_vwaddu_w", "PseudoVWADDU", AllWidenableIntVectors >;
1718
+ defm "" : VPatBinaryW_WV_WX<"int_riscv_vwsubu_w", "PseudoVWSUBU", AllWidenableIntVectors >;
1719
+ defm "" : VPatBinaryW_WV_WX<"int_riscv_vwadd_w", "PseudoVWADD", AllWidenableIntVectors >;
1720
+ defm "" : VPatBinaryW_WV_WX<"int_riscv_vwsub_w", "PseudoVWSUB", AllWidenableIntVectors >;
1685
1721
1686
1722
//===----------------------------------------------------------------------===//
1687
1723
// 12.4. Vector Integer Add-with-Carry / Subtract-with-Borrow Instructions
@@ -1707,8 +1743,8 @@ defm "" : VPatBinaryV_VV_VX_VI<"int_riscv_vsra", "PseudoVSRA", AllIntegerVectors
1707
1743
//===----------------------------------------------------------------------===//
1708
1744
// 12.7. Vector Narrowing Integer Right Shift Instructions
1709
1745
//===----------------------------------------------------------------------===//
1710
- defm "" : VPatBinaryV_WV_WX_WI<"int_riscv_vnsrl", "PseudoVNSRL">;
1711
- defm "" : VPatBinaryV_WV_WX_WI<"int_riscv_vnsra", "PseudoVNSRA">;
1746
+ defm "" : VPatBinaryV_WV_WX_WI<"int_riscv_vnsrl", "PseudoVNSRL", AllWidenableIntVectors >;
1747
+ defm "" : VPatBinaryV_WV_WX_WI<"int_riscv_vnsra", "PseudoVNSRA", AllWidenableIntVectors >;
1712
1748
1713
1749
//===----------------------------------------------------------------------===//
1714
1750
// 12.9. Vector Integer Min/Max Instructions
@@ -1737,9 +1773,9 @@ defm "" : VPatBinaryV_VV_VX<"int_riscv_vrem", "PseudoVREM", AllIntegerVectors>;
1737
1773
//===----------------------------------------------------------------------===//
1738
1774
// 12.12. Vector Widening Integer Multiply Instructions
1739
1775
//===----------------------------------------------------------------------===//
1740
- defm "" : VPatBinaryW_VV_VX<"int_riscv_vwmul", "PseudoVWMUL">;
1741
- defm "" : VPatBinaryW_VV_VX<"int_riscv_vwmulu", "PseudoVWMULU">;
1742
- defm "" : VPatBinaryW_VV_VX<"int_riscv_vwmulsu", "PseudoVWMULSU">;
1776
+ defm "" : VPatBinaryW_VV_VX<"int_riscv_vwmul", "PseudoVWMUL", AllWidenableIntVectors >;
1777
+ defm "" : VPatBinaryW_VV_VX<"int_riscv_vwmulu", "PseudoVWMULU", AllWidenableIntVectors >;
1778
+ defm "" : VPatBinaryW_VV_VX<"int_riscv_vwmulsu", "PseudoVWMULSU", AllWidenableIntVectors >;
1743
1779
1744
1780
//===----------------------------------------------------------------------===//
1745
1781
// 12.17. Vector Integer Move Instructions
@@ -1778,6 +1814,14 @@ defm "" : VPatBinaryV_VV_VX<"int_riscv_vfadd", "PseudoVFADD", AllFloatVectors>;
1778
1814
defm "" : VPatBinaryV_VV_VX<"int_riscv_vfsub", "PseudoVFSUB", AllFloatVectors>;
1779
1815
defm "" : VPatBinaryV_VX<"int_riscv_vfrsub", "PseudoVFRSUB", AllFloatVectors>;
1780
1816
1817
+ //===----------------------------------------------------------------------===//
1818
+ // 14.3. Vector Widening Floating-Point Add/Subtract Instructions
1819
+ //===----------------------------------------------------------------------===//
1820
+ defm "" : VPatBinaryW_VV_VX<"int_riscv_vfwadd", "PseudoVFWADD", AllWidenableFloatVectors>;
1821
+ defm "" : VPatBinaryW_VV_VX<"int_riscv_vfwsub", "PseudoVFWSUB", AllWidenableFloatVectors>;
1822
+ defm "" : VPatBinaryW_WV_WX<"int_riscv_vfwadd_w", "PseudoVFWADD", AllWidenableFloatVectors>;
1823
+ defm "" : VPatBinaryW_WV_WX<"int_riscv_vfwsub_w", "PseudoVFWSUB", AllWidenableFloatVectors>;
1824
+
1781
1825
//===----------------------------------------------------------------------===//
1782
1826
// 14.4. Vector Single-Width Floating-Point Multiply/Divide Instructions
1783
1827
//===----------------------------------------------------------------------===//
0 commit comments