@@ -577,7 +577,9 @@ multiclass RVVIndexedLoad<string op> {
577
577
foreach eew_list = EEWList[0-2] in {
578
578
defvar eew = eew_list[0];
579
579
defvar eew_type = eew_list[1];
580
- let Name = op # eew # "_v", IRName = op, MaskedIRName = op # "_mask" in {
580
+ let Name = op # eew # "_v", IRName = op, MaskedIRName = op # "_mask",
581
+ RequiredFeatures = !if(!eq(type, "x"), ["ZvfhminOrZvfh"],
582
+ []<string>) in {
581
583
def: RVVOutOp1Builtin<"v", "vPCe" # eew_type # "Uv", type>;
582
584
if !not(IsFloat<type>.val) then {
583
585
def: RVVOutOp1Builtin<"Uv", "UvPCUe" # eew_type # "Uv", type>;
@@ -587,7 +589,8 @@ multiclass RVVIndexedLoad<string op> {
587
589
defvar eew64 = "64";
588
590
defvar eew64_type = "(Log2EEW:6)";
589
591
let Name = op # eew64 # "_v", IRName = op, MaskedIRName = op # "_mask",
590
- RequiredFeatures = ["RV64"] in {
592
+ RequiredFeatures = !if(!eq(type, "x"), ["ZvfhminOrZvfh", "RV64"],
593
+ ["RV64"]) in {
591
594
def: RVVOutOp1Builtin<"v", "vPCe" # eew64_type # "Uv", type>;
592
595
if !not(IsFloat<type>.val) then {
593
596
def: RVVOutOp1Builtin<"Uv", "UvPCUe" # eew64_type # "Uv", type>;
@@ -682,7 +685,9 @@ multiclass RVVIndexedStore<string op> {
682
685
foreach eew_list = EEWList[0-2] in {
683
686
defvar eew = eew_list[0];
684
687
defvar eew_type = eew_list[1];
685
- let Name = op # eew # "_v", IRName = op, MaskedIRName = op # "_mask" in {
688
+ let Name = op # eew # "_v", IRName = op, MaskedIRName = op # "_mask",
689
+ RequiredFeatures = !if(!eq(type, "x"), ["ZvfhminOrZvfh"],
690
+ []<string>) in {
686
691
def : RVVBuiltin<"v", "0Pe" # eew_type # "Uvv", type>;
687
692
if !not(IsFloat<type>.val) then {
688
693
def : RVVBuiltin<"Uv", "0PUe" # eew_type # "UvUv", type>;
@@ -692,7 +697,8 @@ multiclass RVVIndexedStore<string op> {
692
697
defvar eew64 = "64";
693
698
defvar eew64_type = "(Log2EEW:6)";
694
699
let Name = op # eew64 # "_v", IRName = op, MaskedIRName = op # "_mask",
695
- RequiredFeatures = ["RV64"] in {
700
+ RequiredFeatures = !if(!eq(type, "x"), ["ZvfhminOrZvfh", "RV64"],
701
+ ["RV64"]) in {
696
702
def : RVVBuiltin<"v", "0Pe" # eew64_type # "Uvv", type>;
697
703
if !not(IsFloat<type>.val) then {
698
704
def : RVVBuiltin<"Uv", "0PUe" # eew64_type # "UvUv", type>;
@@ -1112,24 +1118,32 @@ let HasBuiltinAlias = false,
1112
1118
// 7.4. Vector Unit-Stride Instructions
1113
1119
def vlm: RVVVLEMaskBuiltin;
1114
1120
defm vle8: RVVVLEBuiltin<["c"]>;
1115
- defm vle16: RVVVLEBuiltin<["s","x"]>;
1121
+ defm vle16: RVVVLEBuiltin<["s"]>;
1122
+ let Name = "vle16_v", RequiredFeatures = ["ZvfhminOrZvfh"] in
1123
+ defm vle16_h: RVVVLEBuiltin<["x"]>;
1116
1124
defm vle32: RVVVLEBuiltin<["i","f"]>;
1117
1125
defm vle64: RVVVLEBuiltin<["l","d"]>;
1118
1126
1119
1127
def vsm : RVVVSEMaskBuiltin;
1120
1128
defm vse8 : RVVVSEBuiltin<["c"]>;
1121
- defm vse16: RVVVSEBuiltin<["s","x"]>;
1129
+ defm vse16: RVVVSEBuiltin<["s"]>;
1130
+ let Name = "vse16_v", RequiredFeatures = ["ZvfhminOrZvfh"] in
1131
+ defm vse16_h: RVVVSEBuiltin<["x"]>;
1122
1132
defm vse32: RVVVSEBuiltin<["i","f"]>;
1123
1133
defm vse64: RVVVSEBuiltin<["l","d"]>;
1124
1134
1125
1135
// 7.5. Vector Strided Instructions
1126
1136
defm vlse8: RVVVLSEBuiltin<["c"]>;
1127
- defm vlse16: RVVVLSEBuiltin<["s","x"]>;
1137
+ defm vlse16: RVVVLSEBuiltin<["s"]>;
1138
+ let Name = "vlse16_v", RequiredFeatures = ["ZvfhminOrZvfh"] in
1139
+ defm vlse16_h: RVVVLSEBuiltin<["x"]>;
1128
1140
defm vlse32: RVVVLSEBuiltin<["i","f"]>;
1129
1141
defm vlse64: RVVVLSEBuiltin<["l","d"]>;
1130
1142
1131
1143
defm vsse8 : RVVVSSEBuiltin<["c"]>;
1132
- defm vsse16: RVVVSSEBuiltin<["s","x"]>;
1144
+ defm vsse16: RVVVSSEBuiltin<["s"]>;
1145
+ let Name = "vsse16_v", RequiredFeatures = ["ZvfhminOrZvfh"] in
1146
+ defm vsse16_h: RVVVSSEBuiltin<["x"]>;
1133
1147
defm vsse32: RVVVSSEBuiltin<["i","f"]>;
1134
1148
defm vsse64: RVVVSSEBuiltin<["l","d"]>;
1135
1149
@@ -1142,7 +1156,9 @@ defm : RVVIndexedStore<"vsoxei">;
1142
1156
1143
1157
// 7.7. Unit-stride Fault-Only-First Loads
1144
1158
defm vle8ff: RVVVLEFFBuiltin<["c"]>;
1145
- defm vle16ff: RVVVLEFFBuiltin<["s","x"]>;
1159
+ defm vle16ff: RVVVLEFFBuiltin<["s"]>;
1160
+ let Name = "vle16ff_v", RequiredFeatures = ["ZvfhminOrZvfh"] in
1161
+ defm vle16ff: RVVVLEFFBuiltin<["x"]>;
1146
1162
defm vle32ff: RVVVLEFFBuiltin<["i", "f"]>;
1147
1163
defm vle64ff: RVVVLEFFBuiltin<["l", "d"]>;
1148
1164
@@ -1160,6 +1176,8 @@ multiclass RVVUnitStridedSegLoadTuple<string op> {
1160
1176
IRName = op # nf,
1161
1177
MaskedIRName = op # nf # "_mask",
1162
1178
NF = nf,
1179
+ RequiredFeatures = !if(!eq(type, "x"), ["ZvfhminOrZvfh"],
1180
+ []<string>),
1163
1181
ManualCodegen = [{
1164
1182
{
1165
1183
llvm::Type *ElementVectorType = cast<StructType>(ResultType)->elements()[0];
@@ -1220,6 +1238,8 @@ multiclass RVVUnitStridedSegStoreTuple<string op> {
1220
1238
MaskedIRName = op # nf # "_mask",
1221
1239
NF = nf,
1222
1240
HasMaskedOffOperand = false,
1241
+ RequiredFeatures = !if(!eq(type, "x"), ["ZvfhminOrZvfh"],
1242
+ []<string>),
1223
1243
ManualCodegen = [{
1224
1244
{
1225
1245
// Masked
@@ -1270,6 +1290,8 @@ multiclass RVVUnitStridedSegLoadFFTuple<string op> {
1270
1290
IRName = op # nf # "ff",
1271
1291
MaskedIRName = op # nf # "ff_mask",
1272
1292
NF = nf,
1293
+ RequiredFeatures = !if(!eq(type, "x"), ["ZvfhminOrZvfh"],
1294
+ []<string>),
1273
1295
ManualCodegen = [{
1274
1296
{
1275
1297
llvm::Type *ElementVectorType = cast<StructType>(ResultType)->elements()[0];
@@ -1343,6 +1365,8 @@ multiclass RVVStridedSegLoadTuple<string op> {
1343
1365
IRName = op # nf,
1344
1366
MaskedIRName = op # nf # "_mask",
1345
1367
NF = nf,
1368
+ RequiredFeatures = !if(!eq(type, "x"), ["ZvfhminOrZvfh"],
1369
+ []<string>),
1346
1370
ManualCodegen = [{
1347
1371
{
1348
1372
llvm::Type *ElementVectorType = cast<StructType>(ResultType)->elements()[0];
@@ -1405,6 +1429,8 @@ multiclass RVVStridedSegStoreTuple<string op> {
1405
1429
NF = nf,
1406
1430
HasMaskedOffOperand = false,
1407
1431
MaskedPolicyScheme = NonePolicy,
1432
+ RequiredFeatures = !if(!eq(type, "x"), ["ZvfhminOrZvfh"],
1433
+ []<string>),
1408
1434
ManualCodegen = [{
1409
1435
{
1410
1436
// Masked
@@ -1452,6 +1478,8 @@ multiclass RVVIndexedSegLoadTuple<string op> {
1452
1478
IRName = op # nf,
1453
1479
MaskedIRName = op # nf # "_mask",
1454
1480
NF = nf,
1481
+ RequiredFeatures = !if(!eq(type, "x"), ["ZvfhminOrZvfh"],
1482
+ []<string>),
1455
1483
ManualCodegen = [{
1456
1484
{
1457
1485
llvm::Type *ElementVectorType = cast<StructType>(ResultType)->elements()[0];
@@ -1513,6 +1541,8 @@ multiclass RVVIndexedSegStoreTuple<string op> {
1513
1541
NF = nf,
1514
1542
HasMaskedOffOperand = false,
1515
1543
MaskedPolicyScheme = NonePolicy,
1544
+ RequiredFeatures = !if(!eq(type, "x"), ["ZvfhminOrZvfh"],
1545
+ []<string>),
1516
1546
ManualCodegen = [{
1517
1547
{
1518
1548
// Masked
@@ -1751,8 +1781,11 @@ let HasMasked = false,
1751
1781
OverloadedName = "vmv_v" in {
1752
1782
defm vmv_v : RVVOutBuiltinSet<"vmv_v_v", "csil",
1753
1783
[["v", "Uv", "UvUv"]]>;
1754
- defm vmv_v : RVVOutBuiltinSet<"vmv_v_v", "csilxfd ",
1784
+ defm vmv_v : RVVOutBuiltinSet<"vmv_v_v", "csilfd ",
1755
1785
[["v", "v", "vv"]]>;
1786
+ let RequiredFeatures = ["ZvfhminOrZvfh"] in
1787
+ defm vmv_v : RVVOutBuiltinSet<"vmv_v_v", "x",
1788
+ [["v", "v", "vv"]]>;
1756
1789
let SupportOverloading = false in
1757
1790
defm vmv_v : RVVOutBuiltinSet<"vmv_v_x", "csil",
1758
1791
[["x", "v", "ve"],
@@ -2244,8 +2277,11 @@ let HasMasked = false,
2244
2277
Ops.insert(Ops.begin(), llvm::PoisonValue::get(ResultType));
2245
2278
IntrinsicTypes = {ResultType, Ops[2]->getType(), Ops.back()->getType()};
2246
2279
}] in {
2247
- defm vmerge : RVVOutOp1BuiltinSet<"vmerge", "xfd ",
2280
+ defm vmerge : RVVOutOp1BuiltinSet<"vmerge", "fd ",
2248
2281
[["vvm", "v", "vvvm"]]>;
2282
+ let RequiredFeatures = ["ZvfhminOrZvfh"] in
2283
+ defm vmerge : RVVOutOp1BuiltinSet<"vmerge", "x",
2284
+ [["vvm", "v", "vvvm"]]>;
2249
2285
defm vfmerge : RVVOutOp1BuiltinSet<"vfmerge", "xfd",
2250
2286
[["vfm", "v", "vvem"]]>;
2251
2287
}
@@ -2668,11 +2704,17 @@ let HasMasked = false, HasVL = false, IRName = "" in {
2668
2704
}] in {
2669
2705
// Reinterpret between different type under the same SEW and LMUL
2670
2706
def vreinterpret_i_u : RVVBuiltin<"Uvv", "vUv", "csil", "v">;
2671
- def vreinterpret_i_f : RVVBuiltin<"Fvv", "vFv", "sil ", "v">;
2707
+ def vreinterpret_i_f : RVVBuiltin<"Fvv", "vFv", "il ", "v">;
2672
2708
def vreinterpret_u_i : RVVBuiltin<"vUv", "Uvv", "csil", "Uv">;
2673
- def vreinterpret_u_f : RVVBuiltin<"FvUv", "UvFv", "sil", "Uv">;
2674
- def vreinterpret_f_i : RVVBuiltin<"vFv", "Fvv", "sil", "Fv">;
2675
- def vreinterpret_f_u : RVVBuiltin<"UvFv", "FvUv", "sil", "Fv">;
2709
+ def vreinterpret_u_f : RVVBuiltin<"FvUv", "UvFv", "il", "Uv">;
2710
+ def vreinterpret_f_i : RVVBuiltin<"vFv", "Fvv", "il", "Fv">;
2711
+ def vreinterpret_f_u : RVVBuiltin<"UvFv", "FvUv", "il", "Fv">;
2712
+ let RequiredFeatures = ["ZvfhminOrZvfh"] in {
2713
+ def vreinterpret_i_h : RVVBuiltin<"Fvv", "vFv", "s", "v">;
2714
+ def vreinterpret_u_h : RVVBuiltin<"FvUv", "UvFv", "s", "Uv">;
2715
+ def vreinterpret_h_i : RVVBuiltin<"vFv", "Fvv", "s", "Fv">;
2716
+ def vreinterpret_h_u : RVVBuiltin<"UvFv", "FvUv", "s", "Fv">;
2717
+ }
2676
2718
2677
2719
// Reinterpret between different SEW under the same LMUL
2678
2720
foreach dst_sew = ["(FixedSEW:8)", "(FixedSEW:16)", "(FixedSEW:32)",
0 commit comments