@@ -843,22 +843,29 @@ multiclass RVVUnitStridedSegLoad<string op> {
843
843
IRName = op # nf,
844
844
MaskedIRName = op # nf # "_mask",
845
845
NF = nf,
846
- SupportOverloading = false,
847
846
ManualCodegen = [{
848
847
{
849
- // builtin: (val0 address, val1 address, ..., ptr, vl)
850
848
ResultType = ConvertType(E->getArg(0)->getType()->getPointeeType());
851
- IntrinsicTypes = {ResultType, Ops[NF + 1]->getType()};
849
+ // TA builtin: (val0 address, val1 address, ..., ptr, vl)
850
+ // TU builtin: (val0 address, ..., passthru0, ..., ptr, vl)
851
+ IntrinsicTypes = {ResultType, Ops.back()->getType()};
852
852
// intrinsic: (passthru0, passthru1, ..., ptr, vl)
853
853
SmallVector<llvm::Value*, 10> Operands;
854
- for (unsigned I = 0; I < NF; ++I)
855
- Operands.push_back(llvm::UndefValue::get(ResultType));
856
- Operands.push_back(Ops[NF]);
857
- Operands.push_back(Ops[NF + 1]);
854
+ if (DefaultPolicy == TAIL_AGNOSTIC) {
855
+ for (unsigned I = 0; I < NF; ++I)
856
+ Operands.push_back(llvm::UndefValue::get(ResultType));
857
+ Operands.push_back(Ops[NF]);
858
+ Operands.push_back(Ops[NF + 1]);
859
+ } else {
860
+ for (unsigned I = 0; I < NF; ++I)
861
+ Operands.push_back(Ops[NF + I]);
862
+ Operands.push_back(Ops[2 * NF]);
863
+ Operands.push_back(Ops[2 * NF + 1]);
864
+ }
858
865
llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
859
866
llvm::Value *LoadValue = Builder.CreateCall(F, Operands, "");
860
867
clang::CharUnits Align =
861
- CGM.getNaturalPointeeTypeAlignment(E->getArg(NF )->getType());
868
+ CGM.getNaturalPointeeTypeAlignment(E->getArg(0 )->getType());
862
869
llvm::Value *V;
863
870
for (unsigned I = 0; I < NF; ++I) {
864
871
llvm::Value *Val = Builder.CreateExtractValue(LoadValue, {I});
@@ -869,17 +876,26 @@ multiclass RVVUnitStridedSegLoad<string op> {
869
876
}],
870
877
MaskedManualCodegen = [{
871
878
{
879
+ // TAMA builtin: (val0 address, ..., mask, ptr, vl)
872
880
// builtin: (val0 address, ..., mask, maskedoff0, ..., ptr, vl)
873
881
// intrinsic: (maskedoff0, ..., ptr, mask, vl)
874
- IntrinsicTypes = { ConvertType(E->getArg(0)->getType()->getPointeeType()),
875
- Ops[2 * NF + 2] ->getType()};
882
+ ResultType = ConvertType(E->getArg(0)->getType()->getPointeeType());
883
+ IntrinsicTypes = {ResultType, Ops.back() ->getType()};
876
884
SmallVector<llvm::Value*, 12> Operands;
877
- for (unsigned I = 0; I < NF; ++I)
878
- Operands.push_back(Ops[NF + I + 1]);
879
- Operands.push_back(Ops[2 * NF + 1]);
880
- Operands.push_back(Ops[NF]);
881
- Operands.push_back(Ops[2 * NF + 2]);
882
- Operands.push_back(ConstantInt::get(Ops.back()->getType(), TAIL_UNDISTURBED));
885
+ if (DefaultPolicy == TAIL_AGNOSTIC_MASK_AGNOSTIC) {
886
+ for (unsigned I = 0; I < NF; ++I)
887
+ Operands.push_back(llvm::UndefValue::get(ResultType));
888
+ Operands.push_back(Ops[NF + 1]);
889
+ Operands.push_back(Ops[NF]);
890
+ Operands.push_back(Ops[NF + 2]);
891
+ } else {
892
+ for (unsigned I = 0; I < NF; ++I)
893
+ Operands.push_back(Ops[NF + I + 1]);
894
+ Operands.push_back(Ops[2 * NF + 1]);
895
+ Operands.push_back(Ops[NF]);
896
+ Operands.push_back(Ops[2 * NF + 2]);
897
+ }
898
+ Operands.push_back(ConstantInt::get(Ops.back()->getType(), DefaultPolicy));
883
899
assert(Operands.size() == NF + 4);
884
900
llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
885
901
llvm::Value *LoadValue = Builder.CreateCall(F, Operands, "");
@@ -918,19 +934,28 @@ multiclass RVVUnitStridedSegLoadFF<string op> {
918
934
IRName = op # nf # "ff",
919
935
MaskedIRName = op # nf # "ff_mask",
920
936
NF = nf,
921
- SupportOverloading = false,
922
937
ManualCodegen = [{
923
938
{
924
- // builtin: (val0 address, val1 address, ..., ptr, new_vl, vl)
939
+ // TA builtin: (val0 address, val1 address, ..., ptr, new_vl, vl)
940
+ // TU builtin: (val0 address, ..., passthru0, ..., ptr, new_vl, vl)
925
941
ResultType = ConvertType(E->getArg(0)->getType()->getPointeeType());
926
- IntrinsicTypes = {ResultType, Ops[NF + 2] ->getType()};
942
+ IntrinsicTypes = {ResultType, Ops.back() ->getType()};
927
943
// intrinsic: (passthru0, passthru1, ..., ptr, vl)
928
944
SmallVector<llvm::Value*, 12> Operands;
929
- for (unsigned I = 0; I < NF; ++I)
930
- Operands.push_back(llvm::UndefValue::get(ResultType));
931
- Operands.push_back(Ops[NF]);
932
- Operands.push_back(Ops[NF + 2]);
933
- Value *NewVL = Ops[NF + 1];
945
+ Value *NewVL;
946
+ if (DefaultPolicy == TAIL_AGNOSTIC) {
947
+ for (unsigned I = 0; I < NF; ++I)
948
+ Operands.push_back(llvm::UndefValue::get(ResultType));
949
+ Operands.push_back(Ops[NF]);
950
+ Operands.push_back(Ops[NF + 2]);
951
+ NewVL = Ops[NF + 1];
952
+ } else {
953
+ for (unsigned I = 0; I < NF; ++I)
954
+ Operands.push_back(Ops[NF + I]);
955
+ Operands.push_back(Ops[2 * NF]);
956
+ Operands.push_back(Ops[2 * NF + 2]);
957
+ NewVL = Ops[2 * NF + 1];
958
+ }
934
959
llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
935
960
llvm::Value *LoadValue = Builder.CreateCall(F, Operands, "");
936
961
clang::CharUnits Align =
@@ -946,18 +971,29 @@ multiclass RVVUnitStridedSegLoadFF<string op> {
946
971
}],
947
972
MaskedManualCodegen = [{
948
973
{
974
+ // TAMA builtin: (val0 address, ..., mask, ptr, new_vl, vl)
949
975
// builtin: (val0 address, ..., mask, maskedoff0, ..., ptr, new_vl, vl)
950
976
// intrinsic: (maskedoff0, ..., ptr, mask, vl)
951
- IntrinsicTypes = { ConvertType(E->getArg(0)->getType()->getPointeeType()),
952
- Ops[2 * NF + 3] ->getType()};
977
+ ResultType = ConvertType(E->getArg(0)->getType()->getPointeeType());
978
+ IntrinsicTypes = {ResultType, Ops.back() ->getType()};
953
979
SmallVector<llvm::Value*, 12> Operands;
954
- for (unsigned I = 0; I < NF; ++I)
955
- Operands.push_back(Ops[NF + I + 1]);
956
- Operands.push_back(Ops[2 * NF + 1]);
957
- Operands.push_back(Ops[NF]);
958
- Operands.push_back(Ops[2 * NF + 3]);
959
- Operands.push_back(ConstantInt::get(Ops.back()->getType(), TAIL_UNDISTURBED));
960
- Value *NewVL = Ops[2 * NF + 2];
980
+ Value *NewVL;
981
+ if (DefaultPolicy == TAIL_AGNOSTIC_MASK_AGNOSTIC) {
982
+ for (unsigned I = 0; I < NF; ++I)
983
+ Operands.push_back(llvm::UndefValue::get(ResultType));
984
+ Operands.push_back(Ops[NF + 1]);
985
+ Operands.push_back(Ops[NF]);
986
+ Operands.push_back(Ops[NF + 3]);
987
+ NewVL = Ops[NF + 2];
988
+ } else {
989
+ for (unsigned I = 0; I < NF; ++I)
990
+ Operands.push_back(Ops[NF + I + 1]);
991
+ Operands.push_back(Ops[2 * NF + 1]);
992
+ Operands.push_back(Ops[NF]);
993
+ Operands.push_back(Ops[2 * NF + 3]);
994
+ NewVL = Ops[2 * NF + 2];
995
+ }
996
+ Operands.push_back(ConstantInt::get(Ops.back()->getType(), DefaultPolicy));
961
997
assert(Operands.size() == NF + 4);
962
998
llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
963
999
llvm::Value *LoadValue = Builder.CreateCall(F, Operands, "");
@@ -997,19 +1033,27 @@ multiclass RVVStridedSegLoad<string op> {
997
1033
IRName = op # nf,
998
1034
MaskedIRName = op # nf # "_mask",
999
1035
NF = nf,
1000
- SupportOverloading = false,
1001
1036
ManualCodegen = [{
1002
1037
{
1003
- // builtin: (val0 address, val1 address, ..., ptr, stride, vl)
1038
+ // TA builtin: (val0 address, val1 address, ..., ptr, stride, vl)
1039
+ // TU builtin: (val0 address, ..., passthru0, ..., ptr, stride, vl)
1004
1040
ResultType = ConvertType(E->getArg(0)->getType()->getPointeeType());
1005
- IntrinsicTypes = {ResultType, Ops[NF + 2] ->getType()};
1041
+ IntrinsicTypes = {ResultType, Ops.back() ->getType()};
1006
1042
// intrinsic: (passthru0, passthru1, ..., ptr, stride, vl)
1007
1043
SmallVector<llvm::Value*, 12> Operands;
1008
- for (unsigned I = 0; I < NF; ++I)
1009
- Operands.push_back(llvm::UndefValue::get(ResultType));
1010
- Operands.push_back(Ops[NF]);
1011
- Operands.push_back(Ops[NF + 1]);
1012
- Operands.push_back(Ops[NF + 2]);
1044
+ if (DefaultPolicy == TAIL_AGNOSTIC) {
1045
+ for (unsigned I = 0; I < NF; ++I)
1046
+ Operands.push_back(llvm::UndefValue::get(ResultType));
1047
+ Operands.push_back(Ops[NF]);
1048
+ Operands.push_back(Ops[NF + 1]);
1049
+ Operands.push_back(Ops[NF + 2]);
1050
+ } else {
1051
+ for (unsigned I = 0; I < NF; ++I)
1052
+ Operands.push_back(Ops[NF + I]);
1053
+ Operands.push_back(Ops[2 * NF]);
1054
+ Operands.push_back(Ops[2 * NF + 1]);
1055
+ Operands.push_back(Ops[2 * NF + 2]);
1056
+ }
1013
1057
llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
1014
1058
llvm::Value *LoadValue = Builder.CreateCall(F, Operands, "");
1015
1059
clang::CharUnits Align =
@@ -1024,18 +1068,28 @@ multiclass RVVStridedSegLoad<string op> {
1024
1068
}],
1025
1069
MaskedManualCodegen = [{
1026
1070
{
1071
+ //TAMA builtin: (val0 address, ..., mask, ptr, stride, vl)
1027
1072
// builtin: (val0 address, ..., mask, maskedoff0, ..., ptr, stride, vl)
1028
1073
// intrinsic: (maskedoff0, ..., ptr, stride, mask, vl)
1029
- IntrinsicTypes = { ConvertType(E->getArg(0)->getType()->getPointeeType()),
1030
- Ops[2 * NF + 3] ->getType()};
1074
+ ResultType = ConvertType(E->getArg(0)->getType()->getPointeeType());
1075
+ IntrinsicTypes = {ResultType, Ops.back() ->getType()};
1031
1076
SmallVector<llvm::Value*, 12> Operands;
1032
- for (unsigned I = 0; I < NF; ++I)
1033
- Operands.push_back(Ops[NF + I + 1]);
1034
- Operands.push_back(Ops[2 * NF + 1]);
1035
- Operands.push_back(Ops[2 * NF + 2]);
1036
- Operands.push_back(Ops[NF]);
1037
- Operands.push_back(Ops[2 * NF + 3]);
1038
- Operands.push_back(ConstantInt::get(Ops.back()->getType(), TAIL_UNDISTURBED));
1077
+ if (DefaultPolicy == TAIL_AGNOSTIC_MASK_AGNOSTIC) {
1078
+ for (unsigned I = 0; I < NF; ++I)
1079
+ Operands.push_back(llvm::UndefValue::get(ResultType));
1080
+ Operands.push_back(Ops[NF + 1]);
1081
+ Operands.push_back(Ops[NF + 2]);
1082
+ Operands.push_back(Ops[NF]);
1083
+ Operands.push_back(Ops[NF + 3]);
1084
+ } else {
1085
+ for (unsigned I = 0; I < NF; ++I)
1086
+ Operands.push_back(Ops[NF + I + 1]);
1087
+ Operands.push_back(Ops[2 * NF + 1]);
1088
+ Operands.push_back(Ops[2 * NF + 2]);
1089
+ Operands.push_back(Ops[NF]);
1090
+ Operands.push_back(Ops[2 * NF + 3]);
1091
+ }
1092
+ Operands.push_back(ConstantInt::get(Ops.back()->getType(), DefaultPolicy));
1039
1093
assert(Operands.size() == NF + 5);
1040
1094
llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
1041
1095
llvm::Value *LoadValue = Builder.CreateCall(F, Operands, "");
@@ -1072,16 +1126,26 @@ multiclass RVVIndexedSegLoad<string op> {
1072
1126
NF = nf,
1073
1127
ManualCodegen = [{
1074
1128
{
1075
- // builtin: (val0 address, val1 address, ..., ptr, index, vl)
1129
+ // TA builtin: (val0 address, val1 address, ..., ptr, index, vl)
1130
+ // TU builtin: (val0 address, ..., passthru0, ..., ptr, index, vl)
1076
1131
ResultType = ConvertType(E->getArg(0)->getType()->getPointeeType());
1077
- IntrinsicTypes = {ResultType, Ops[NF + 1]->getType(), Ops[NF + 2]->getType()};
1078
1132
// intrinsic: (passthru0, passthru1, ..., ptr, index, vl)
1079
1133
SmallVector<llvm::Value*, 12> Operands;
1080
- for (unsigned I = 0; I < NF; ++I)
1081
- Operands.push_back(llvm::UndefValue::get(ResultType));
1082
- Operands.push_back(Ops[NF]);
1083
- Operands.push_back(Ops[NF + 1]);
1084
- Operands.push_back(Ops[NF + 2]);
1134
+ if (DefaultPolicy == TAIL_AGNOSTIC) {
1135
+ for (unsigned I = 0; I < NF; ++I)
1136
+ Operands.push_back(llvm::UndefValue::get(ResultType));
1137
+ Operands.push_back(Ops[NF]);
1138
+ Operands.push_back(Ops[NF + 1]);
1139
+ Operands.push_back(Ops[NF + 2]);
1140
+ IntrinsicTypes = {ResultType, Ops[NF + 1]->getType(), Ops.back()->getType()};
1141
+ } else {
1142
+ for (unsigned I = 0; I < NF; ++I)
1143
+ Operands.push_back(Ops[NF + I]);
1144
+ Operands.push_back(Ops[2 * NF]);
1145
+ Operands.push_back(Ops[2 * NF + 1]);
1146
+ Operands.push_back(Ops[2 * NF + 2]);
1147
+ IntrinsicTypes = {ResultType, Ops[2 * NF + 1]->getType(), Ops.back()->getType()};
1148
+ }
1085
1149
llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
1086
1150
llvm::Value *LoadValue = Builder.CreateCall(F, Operands, "");
1087
1151
clang::CharUnits Align =
@@ -1096,18 +1160,29 @@ multiclass RVVIndexedSegLoad<string op> {
1096
1160
}],
1097
1161
MaskedManualCodegen = [{
1098
1162
{
1163
+ // TAMA builtin: (val0 address, ..., mask, ptr, index, vl)
1099
1164
// builtin: (val0 address, ..., mask, maskedoff0, ..., ptr, index, vl)
1100
- IntrinsicTypes = {ConvertType(E->getArg(0)->getType()->getPointeeType()),
1101
- Ops[2 * NF + 2]->getType(), Ops[2 * NF + 3]->getType()};
1165
+ ResultType = ConvertType(E->getArg(0)->getType()->getPointeeType());
1102
1166
// intrinsic: (maskedoff0, ..., ptr, index, mask, vl)
1103
1167
SmallVector<llvm::Value*, 12> Operands;
1104
- for (unsigned I = 0; I < NF; ++I)
1105
- Operands.push_back(Ops[NF + I + 1]);
1106
- Operands.push_back(Ops[2 * NF + 1]);
1107
- Operands.push_back(Ops[2 * NF + 2]);
1108
- Operands.push_back(Ops[NF]);
1109
- Operands.push_back(Ops[2 * NF + 3]);
1110
- Operands.push_back(ConstantInt::get(Ops.back()->getType(), TAIL_UNDISTURBED));
1168
+ if (DefaultPolicy == TAIL_AGNOSTIC_MASK_AGNOSTIC) {
1169
+ for (unsigned I = 0; I < NF; ++I)
1170
+ Operands.push_back(llvm::UndefValue::get(ResultType));
1171
+ Operands.push_back(Ops[NF + 1]);
1172
+ Operands.push_back(Ops[NF + 2]);
1173
+ Operands.push_back(Ops[NF]);
1174
+ Operands.push_back(Ops[NF + 3]);
1175
+ IntrinsicTypes = {ResultType, Ops[NF + 2]->getType(), Ops.back()->getType()};
1176
+ } else {
1177
+ for (unsigned I = 0; I < NF; ++I)
1178
+ Operands.push_back(Ops[NF + I + 1]);
1179
+ Operands.push_back(Ops[2 * NF + 1]);
1180
+ Operands.push_back(Ops[2 * NF + 2]);
1181
+ Operands.push_back(Ops[NF]);
1182
+ Operands.push_back(Ops[2 * NF + 3]);
1183
+ IntrinsicTypes = {ResultType, Ops[2 * NF + 2]->getType(), Ops.back()->getType()};
1184
+ }
1185
+ Operands.push_back(ConstantInt::get(Ops.back()->getType(), DefaultPolicy));
1111
1186
assert(Operands.size() == NF + 5);
1112
1187
llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
1113
1188
llvm::Value *LoadValue = Builder.CreateCall(F, Operands, "");
@@ -1649,14 +1724,15 @@ defm vle32ff: RVVVLEFFBuiltin<["i", "f"]>;
1649
1724
defm vle64ff: RVVVLEFFBuiltin<["l", "d"]>;
1650
1725
1651
1726
// 7.8 Vector Load/Store Segment Instructions
1652
- // TODO: Support policy function for segment load.
1653
- let UnMaskedPolicyScheme = NonePolicy,
1654
- MaskedPolicyScheme = NonePolicy in {
1727
+ let UnMaskedPolicyScheme = HasPassthruOperand in {
1655
1728
defm : RVVUnitStridedSegLoad<"vlseg">;
1656
1729
defm : RVVUnitStridedSegLoadFF<"vlseg">;
1657
1730
defm : RVVStridedSegLoad<"vlsseg">;
1658
1731
defm : RVVIndexedSegLoad<"vluxseg">;
1659
1732
defm : RVVIndexedSegLoad<"vloxseg">;
1733
+ }
1734
+ let UnMaskedPolicyScheme = NonePolicy,
1735
+ MaskedPolicyScheme = NonePolicy in {
1660
1736
defm : RVVUnitStridedSegStore<"vsseg">;
1661
1737
defm : RVVStridedSegStore<"vssseg">;
1662
1738
defm : RVVIndexedSegStore<"vsuxseg">;
0 commit comments