Skip to content

Commit 11072a0

Browse files
committed
[RISCV][Clang] Add RVV AMO builtins
Add vamo[swap/add/xor/and/or/min/max/minu/maxu] builtins. Reviewed By: khchen Differential Revision: https://reviews.llvm.org/D100448
1 parent 57ca65e commit 11072a0

File tree

16 files changed

+34074
-5
lines changed

16 files changed

+34074
-5
lines changed

clang/include/clang/Basic/riscv_vector.td

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,9 @@ class RVVBuiltin<string suffix, string prototype, string type_range,
206206
// an automatic definition in header is emitted.
207207
string HeaderCode = "";
208208

209+
// Sub extension of vector spec. Currently only support Zvamo or Zvlsseg.
210+
string RequiredExtension = "";
211+
209212
}
210213

211214
//===----------------------------------------------------------------------===//
@@ -754,6 +757,34 @@ multiclass RVVIndexedStore<string op> {
754757
}
755758
}
756759

760+
multiclass RVVAMOBuiltinSet<bit has_signed = false, bit has_unsigned = false,
761+
bit has_fp = false> {
762+
defvar type_list = !if(has_fp, ["i","l","f","d"], ["i","l"]);
763+
foreach type = type_list in
764+
foreach eew_list = EEWList in {
765+
defvar eew = eew_list[0];
766+
defvar eew_index = eew_list[1];
767+
let Name = NAME # "ei" # eew # "_" # "v",
768+
IRName = NAME,
769+
IRNameMask = NAME # "_mask",
770+
HasMaskedOffOperand = false,
771+
ManualCodegen = [{
772+
// base, bindex, value, vl
773+
IntrinsicTypes = {ResultType, Ops[1]->getType(), Ops[3]->getType()};
774+
Ops[0] = Builder.CreateBitCast(Ops[0], ResultType->getPointerTo());
775+
}],
776+
ManualCodegenMask = [{
777+
IntrinsicTypes = {ResultType, Ops[1]->getType(), Ops[4]->getType()};
778+
Ops[0] = Builder.CreateBitCast(Ops[0], ResultType->getPointerTo());
779+
}] in {
780+
if has_signed then
781+
def : RVVBuiltin<"v", "vPe" # eew_index # "Uvv", type>;
782+
if !and(!not(IsFloat<type>.val), has_unsigned) then
783+
def : RVVBuiltin<"Uv", "UvPUe" # eew_index # "UvUv", type>;
784+
}
785+
}
786+
}
787+
757788
// 6. Configuration-Setting Instructions
758789
// 6.1. vsetvli/vsetvl instructions
759790
let HasVL = false,
@@ -864,6 +895,19 @@ defm vle16ff: RVVVLEFFBuiltin<["s"]>;
864895
defm vle32ff: RVVVLEFFBuiltin<["i", "f"]>;
865896
defm vle64ff: RVVVLEFFBuiltin<["l", "d"]>;
866897

898+
// 8. Vector AMO Operations
899+
let RequiredExtension = "Zvamo" in {
900+
defm vamoswap : RVVAMOBuiltinSet< /* hasSigned */ true, /* hasUnsigned */ true, /* hasFP */ true>;
901+
defm vamoadd : RVVAMOBuiltinSet< /* hasSigned */ true, /* hasUnsigned */ true>;
902+
defm vamoxor : RVVAMOBuiltinSet< /* hasSigned */ true, /* hasUnsigned */ true>;
903+
defm vamoand : RVVAMOBuiltinSet< /* hasSigned */ true, /* hasUnsigned */ true>;
904+
defm vamoor : RVVAMOBuiltinSet< /* hasSigned */ true, /* hasUnsigned */ true>;
905+
defm vamomin : RVVAMOBuiltinSet< /* hasSigned */ true>;
906+
defm vamomax : RVVAMOBuiltinSet< /* hasSigned */ true>;
907+
defm vamominu : RVVAMOBuiltinSet< /* hasSigned */ false, /* hasUnsigned */ true>;
908+
defm vamomaxu : RVVAMOBuiltinSet< /* hasSigned */ false, /* hasUnsigned */ true>;
909+
}
910+
867911
// 12. Vector Integer Arithmetic Instructions
868912
// 12.1. Vector Single-Width Integer Add and Subtract
869913
defm vadd : RVVIntBinBuiltinSet;

clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vamoadd.c

Lines changed: 2247 additions & 0 deletions
Large diffs are not rendered by default.

clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vamoand.c

Lines changed: 2247 additions & 0 deletions
Large diffs are not rendered by default.

clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vamomax.c

Lines changed: 2247 additions & 0 deletions
Large diffs are not rendered by default.

clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vamomin.c

Lines changed: 2247 additions & 0 deletions
Large diffs are not rendered by default.

clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vamoor.c

Lines changed: 2247 additions & 0 deletions
Large diffs are not rendered by default.

clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vamoswap.c

Lines changed: 3683 additions & 0 deletions
Large diffs are not rendered by default.

clang/test/CodeGen/RISCV/rvv-intrinsics-overloaded/vamoxor.c

Lines changed: 2247 additions & 0 deletions
Large diffs are not rendered by default.

clang/test/CodeGen/RISCV/rvv-intrinsics/vamoadd.c

Lines changed: 2247 additions & 0 deletions
Large diffs are not rendered by default.

clang/test/CodeGen/RISCV/rvv-intrinsics/vamoand.c

Lines changed: 2247 additions & 0 deletions
Large diffs are not rendered by default.

clang/test/CodeGen/RISCV/rvv-intrinsics/vamomax.c

Lines changed: 2247 additions & 0 deletions
Large diffs are not rendered by default.

clang/test/CodeGen/RISCV/rvv-intrinsics/vamomin.c

Lines changed: 2247 additions & 0 deletions
Large diffs are not rendered by default.

clang/test/CodeGen/RISCV/rvv-intrinsics/vamoor.c

Lines changed: 2247 additions & 0 deletions
Large diffs are not rendered by default.

clang/test/CodeGen/RISCV/rvv-intrinsics/vamoswap.c

Lines changed: 3369 additions & 0 deletions
Large diffs are not rendered by default.

clang/test/CodeGen/RISCV/rvv-intrinsics/vamoxor.c

Lines changed: 2247 additions & 0 deletions
Large diffs are not rendered by default.

clang/utils/TableGen/RISCVVEmitter.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ enum RISCVExtension : uint8_t {
136136
Basic = 0,
137137
F = 1 << 1,
138138
D = 1 << 2,
139-
Zfh = 1 << 3
139+
Zfh = 1 << 3,
140+
Zvamo = 1 << 4,
140141
};
141142

142143
// TODO refactor RVVIntrinsic class design after support all intrinsic
@@ -171,7 +172,8 @@ class RVVIntrinsic {
171172
bool HasMaskedOffOperand, bool HasVL, bool HasNoMaskedOverloaded,
172173
bool HasAutoDef, StringRef ManualCodegen, const RVVTypes &Types,
173174
const std::vector<int64_t> &IntrinsicTypes,
174-
const std::vector<int64_t> &PermuteOperands);
175+
const std::vector<int64_t> &PermuteOperands,
176+
StringRef RequiredExtension);
175177
~RVVIntrinsic() = default;
176178

177179
StringRef getName() const { return Name; }
@@ -749,7 +751,8 @@ RVVIntrinsic::RVVIntrinsic(StringRef NewName, StringRef Suffix,
749751
bool HasNoMaskedOverloaded, bool HasAutoDef,
750752
StringRef ManualCodegen, const RVVTypes &OutInTypes,
751753
const std::vector<int64_t> &NewIntrinsicTypes,
752-
const std::vector<int64_t> &PermuteOperands)
754+
const std::vector<int64_t> &PermuteOperands,
755+
StringRef RequiredExtension)
753756
: IRName(IRName), HasSideEffects(HasSideEffects), IsMask(IsMask),
754757
HasMaskedOffOperand(HasMaskedOffOperand), HasVL(HasVL),
755758
HasNoMaskedOverloaded(HasNoMaskedOverloaded), HasAutoDef(HasAutoDef),
@@ -775,6 +778,8 @@ RVVIntrinsic::RVVIntrinsic(StringRef NewName, StringRef Suffix,
775778
else if (T->isFloatVector(64))
776779
RISCVExtensions |= RISCVExtension::D;
777780
}
781+
if (RequiredExtension == "Zvamo")
782+
RISCVExtensions |= RISCVExtension::Zvamo;
778783

779784
// Init OutputType and InputTypes
780785
OutputType = OutInTypes[0];
@@ -1108,6 +1113,7 @@ void RVVEmitter::createRVVIntrinsics(
11081113
R->getValueAsListOfInts("IntrinsicTypes");
11091114
std::vector<int64_t> PermuteOperands =
11101115
R->getValueAsListOfInts("PermuteOperands");
1116+
StringRef RequiredExtension = R->getValueAsString("RequiredExtension");
11111117
StringRef IRName = R->getValueAsString("IRName");
11121118
StringRef IRNameMask = R->getValueAsString("IRNameMask");
11131119

@@ -1152,7 +1158,7 @@ void RVVEmitter::createRVVIntrinsics(
11521158
Name, SuffixStr, MangledName, IRName, HasSideEffects,
11531159
/*IsMask=*/false, /*HasMaskedOffOperand=*/false, HasVL,
11541160
HasNoMaskedOverloaded, HasAutoDef, ManualCodegen, Types.getValue(),
1155-
IntrinsicTypes, PermuteOperands));
1161+
IntrinsicTypes, PermuteOperands, RequiredExtension));
11561162
if (HasMask) {
11571163
// Create a mask intrinsic
11581164
Optional<RVVTypes> MaskTypes =
@@ -1161,7 +1167,8 @@ void RVVEmitter::createRVVIntrinsics(
11611167
Name, SuffixStr, MangledName, IRNameMask, HasSideEffects,
11621168
/*IsMask=*/true, HasMaskedOffOperand, HasVL,
11631169
HasNoMaskedOverloaded, HasAutoDef, ManualCodegenMask,
1164-
MaskTypes.getValue(), IntrinsicTypes, PermuteOperands));
1170+
MaskTypes.getValue(), IntrinsicTypes, PermuteOperands,
1171+
RequiredExtension));
11651172
}
11661173
} // end for Log2LMULList
11671174
} // end for TypeRange
@@ -1234,6 +1241,8 @@ bool RVVEmitter::emitExtDefStr(uint8_t Extents, raw_ostream &OS) {
12341241
OS << LS << "defined(__riscv_d)";
12351242
if (Extents & RISCVExtension::Zfh)
12361243
OS << LS << "defined(__riscv_zfh)";
1244+
if (Extents & RISCVExtension::Zvamo)
1245+
OS << LS << "defined(__riscv_zvamo)";
12371246
OS << "\n";
12381247
return true;
12391248
}

0 commit comments

Comments
 (0)