Skip to content

Commit ae5ed2a

Browse files
authored
[RISCV][clang] Add Zvfbfwma C intrinsics support (#79615)
1 parent f035c01 commit ae5ed2a

File tree

9 files changed

+2732
-1
lines changed

9 files changed

+2732
-1
lines changed

clang/include/clang/Basic/riscv_vector.td

+16
Original file line numberDiff line numberDiff line change
@@ -1730,12 +1730,28 @@ let ManualCodegen = [{
17301730
defm vfwnmacc : RVVFloatingWidenTerBuiltinSetRoundingMode;
17311731
defm vfwmsac : RVVFloatingWidenTerBuiltinSetRoundingMode;
17321732
defm vfwnmsac : RVVFloatingWidenTerBuiltinSetRoundingMode;
1733+
1734+
// Vector BF16 widening multiply-accumulate
1735+
let Log2LMUL = [-2, -1, 0, 1, 2],
1736+
RequiredFeatures = ["Zvfbfwma"],
1737+
HasMaskedOffOperand = false in
1738+
defm vfwmaccbf16 : RVVOutOp1Op2BuiltinSet<"vfwmaccbf16", "y",
1739+
[["vv", "Fw", "FwFwvvu"],
1740+
["vf", "Fw", "FwFwevu"]]>;
17331741
}
17341742
// 13.7. Vector Widening Floating-Point Fused Multiply-Add Instructions
17351743
defm vfwmacc : RVVFloatingWidenTerBuiltinSet;
17361744
defm vfwnmacc : RVVFloatingWidenTerBuiltinSet;
17371745
defm vfwmsac : RVVFloatingWidenTerBuiltinSet;
17381746
defm vfwnmsac : RVVFloatingWidenTerBuiltinSet;
1747+
1748+
// Vector BF16 widening multiply-accumulate
1749+
let Log2LMUL = [-2, -1, 0, 1, 2],
1750+
RequiredFeatures = ["Zvfbfwma"],
1751+
HasMaskedOffOperand = false in
1752+
defm vfwmaccbf16 : RVVOutOp1Op2BuiltinSet<"vfwmaccbf16", "y",
1753+
[["vv", "Fw", "FwFwvv"],
1754+
["vf", "Fw", "FwFwev"]]>;
17391755
}
17401756

17411757
}

clang/include/clang/Support/RISCVVIntrinsicUtils.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,8 @@ enum RVVRequire : uint32_t {
501501
RVV_REQ_Zvknhb = 1 << 13,
502502
RVV_REQ_Zvksed = 1 << 14,
503503
RVV_REQ_Zvksh = 1 << 15,
504-
RVV_REQ_Experimental = 1 << 16,
504+
RVV_REQ_Zvfbfwma = 1 << 16,
505+
RVV_REQ_Experimental = 1 << 17,
505506

506507
LLVM_MARK_AS_BITMASK_ENUM(RVV_REQ_Experimental)
507508
};

clang/lib/Sema/SemaRISCVVectorLookup.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ void RISCVIntrinsicManagerImpl::ConstructRVVIntrinsics(
215215
{"zvknhb", RVV_REQ_Zvknhb},
216216
{"zvksed", RVV_REQ_Zvksed},
217217
{"zvksh", RVV_REQ_Zvksh},
218+
{"zvfbfwma", RVV_REQ_Zvfbfwma},
218219
{"experimental", RVV_REQ_Experimental}};
219220

220221
// Construction of RVVIntrinsicRecords need to sync with createRVVIntrinsics

clang/test/CodeGen/RISCV/rvv-intrinsics-autogenerated/non-policy/non-overloaded/vfwmaccbf16.c

+479
Large diffs are not rendered by default.

clang/test/CodeGen/RISCV/rvv-intrinsics-autogenerated/non-policy/overloaded/vfwmaccbf16.c

+469
Large diffs are not rendered by default.

clang/test/CodeGen/RISCV/rvv-intrinsics-autogenerated/policy/non-overloaded/vfwmaccbf16.c

+808
Large diffs are not rendered by default.

clang/test/CodeGen/RISCV/rvv-intrinsics-autogenerated/policy/overloaded/vfwmaccbf16.c

+952
Large diffs are not rendered by default.

clang/test/Sema/rvv-required-features-invalid.c

+4
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,7 @@ void test_xsfvfnrclipxfqf() {
3535
void test_xsfvfnrclipxufqf() {
3636
__riscv_sf_vfnrclip_xu_f_qf(); // expected-error {{call to undeclared function '__riscv_sf_vfnrclip_xu_f_qf'}}
3737
}
38+
39+
void test_zvfbfwma_vfwmaccbf16() {
40+
__riscv_vfwmaccbf16(); // expected-error {{call to undeclared function '__riscv_vfwmaccbf16'}}
41+
}

clang/utils/TableGen/RISCVVEmitter.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,7 @@ void RVVEmitter::createRVVIntrinsics(
671671
.Case("Zvknhb", RVV_REQ_Zvknhb)
672672
.Case("Zvksed", RVV_REQ_Zvksed)
673673
.Case("Zvksh", RVV_REQ_Zvksh)
674+
.Case("Zvfbfwma", RVV_REQ_Zvfbfwma)
674675
.Case("Experimental", RVV_REQ_Experimental)
675676
.Default(RVV_REQ_None);
676677
assert(RequireExt != RVV_REQ_None && "Unrecognized required feature?");

0 commit comments

Comments
 (0)