Skip to content

Commit 77c5c44

Browse files
author
Dinar Temirbulatov
authored
[AArch64][SME2] Add SME2 MLA/MLS builtins. (#75584)
Add SME2 MLA/MLS builtins.
1 parent 411cba2 commit 77c5c44

File tree

8 files changed

+4048
-0
lines changed

8 files changed

+4048
-0
lines changed

clang/include/clang/Basic/arm_sme.td

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

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10318,6 +10318,28 @@ Value *CodeGenFunction::EmitAArch64SVEBuiltinExpr(unsigned BuiltinID,
1031810318
return nullptr;
1031910319
}
1032010320

10321+
static void swapCommutativeSMEOperands(unsigned BuiltinID,
10322+
SmallVectorImpl<Value *> &Ops) {
10323+
unsigned MultiVec;
10324+
switch (BuiltinID) {
10325+
default:
10326+
return;
10327+
case SME::BI__builtin_sme_svsumla_za32_s8_vg4x1:
10328+
MultiVec = 1;
10329+
break;
10330+
case SME::BI__builtin_sme_svsumla_za32_s8_vg4x2:
10331+
MultiVec = 2;
10332+
break;
10333+
case SME::BI__builtin_sme_svsumla_za32_s8_vg4x4:
10334+
MultiVec = 4;
10335+
break;
10336+
}
10337+
10338+
if (MultiVec > 0)
10339+
for (unsigned I = 0; I < MultiVec; ++I)
10340+
std::swap(Ops[I + 1], Ops[I + 1 + MultiVec]);
10341+
}
10342+
1032110343
Value *CodeGenFunction::EmitAArch64SMEBuiltinExpr(unsigned BuiltinID,
1032210344
const CallExpr *E) {
1032310345
auto *Builtin = findARMVectorIntrinsicInMap(AArch64SMEIntrinsicMap, BuiltinID,
@@ -10340,6 +10362,9 @@ Value *CodeGenFunction::EmitAArch64SMEBuiltinExpr(unsigned BuiltinID,
1034010362
BuiltinID == SME::BI__builtin_sme_svstr_za)
1034110363
return EmitSMELdrStr(TypeFlags, Ops, Builtin->LLVMIntrinsic);
1034210364

10365+
// Handle builtins which require their multi-vector operands to be swapped
10366+
swapCommutativeSMEOperands(BuiltinID, Ops);
10367+
1034310368
// Should not happen!
1034410369
if (Builtin->LLVMIntrinsic == 0)
1034510370
return nullptr;

clang/test/CodeGen/aarch64-sme2-intrinsics/acle_sme2_mla.c

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

clang/test/CodeGen/aarch64-sme2-intrinsics/acle_sme2_mlal.c

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

clang/test/CodeGen/aarch64-sme2-intrinsics/acle_sme2_mlall.c

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

clang/test/CodeGen/aarch64-sme2-intrinsics/acle_sme2_mls.c

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

clang/test/CodeGen/aarch64-sme2-intrinsics/acle_sme2_mlsl.c

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

clang/test/Sema/aarch64-sme2-intrinsics/acle_sme2_imm.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,3 +241,47 @@ void test_bfmlslb_bad_lane(svfloat32_t zda, svbfloat16_t zn, svbfloat16_t zm) __
241241
svbfmlslb_lane_f32(zda, zn, zm, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}}
242242
svbfmlslt_lane_f32(zda, zn, zm, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}}
243243
}
244+
245+
void test_multiply_add_sub_long(uint32_t base, svint8_t s8, svuint8_t u8,
246+
svint16_t s16, svuint16_t u16, svint8x2_t s8x2,
247+
svuint8x2_t u8x2, svint16x2_t s16x2, svuint16x2_t u16x2,
248+
svint8x4_t s8x4, svuint8x4_t u8x4, svint16x4_t s16x4, svuint16x4_t u16x4) __arm_streaming __arm_shared_za {
249+
250+
svmla_lane_za32_s8_vg4x1(base, s8, s8, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}}
251+
svmla_lane_za32_u8_vg4x1(base, u8, u8, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}}
252+
svmla_lane_za64_s16_vg4x1(base, s16, s16, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}}
253+
svmla_lane_za64_u16_vg4x1(base, u16, u16, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}}
254+
255+
svmla_lane_za32_s8_vg4x2(base, s8x2, s8, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}}
256+
svmla_lane_za32_u8_vg4x2(base, u8x2, u8, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}}
257+
svmla_lane_za64_s16_vg4x2(base, s16x2, s16, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}}
258+
svmla_lane_za64_u16_vg4x2(base, u16x2, u16, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}}
259+
260+
svmla_lane_za32_s8_vg4x4(base, s8x4, s8, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}}
261+
svmla_lane_za32_u8_vg4x4(base, u8x4, u8, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}}
262+
svmla_lane_za64_s16_vg4x4(base, s16x4, s16, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}}
263+
svmla_lane_za64_u16_vg4x4(base, u16x4, u16, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}}
264+
265+
svmls_lane_za32_s8_vg4x1(base, s8, s8, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}}
266+
svmls_lane_za32_u8_vg4x1(base, u8, u8, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}}
267+
svmls_lane_za64_s16_vg4x1(base, s16, s16, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}}
268+
svmls_lane_za64_u16_vg4x1(base, u16, u16, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}}
269+
270+
svmls_lane_za32_s8_vg4x2(base, s8x2, s8, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}}
271+
svmls_lane_za32_u8_vg4x2(base, u8x2, u8, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}}
272+
svmls_lane_za64_s16_vg4x2(base, s16x2, s16, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}}
273+
svmls_lane_za64_u16_vg4x2(base, u16x2, u16, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}}
274+
275+
svmls_lane_za32_s8_vg4x4(base, s8x4, s8, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}}
276+
svmls_lane_za32_u8_vg4x4(base, u8x4, u8, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}}
277+
svmls_lane_za64_s16_vg4x4(base, s16x4, s16, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}}
278+
svmls_lane_za64_u16_vg4x4(base, u16x4, u16, 8); // expected-error {{argument value 8 is outside the valid range [0, 7]}}
279+
280+
svsumla_lane_za32_s8_vg4x1(base, s8, u8, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}}
281+
svsumla_lane_za32_s8_vg4x2(base, s8x2, u8, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}}
282+
svsumla_lane_za32_s8_vg4x4(base, s8x4, u8, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}}
283+
284+
svusmla_lane_za32_u8_vg4x1(base, u8, s8, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}}
285+
svusmla_lane_za32_u8_vg4x2(base, u8x2, s8, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}}
286+
svusmla_lane_za32_u8_vg4x4(base, u8x4, s8, 16); // expected-error {{argument value 16 is outside the valid range [0, 15]}}
287+
}

0 commit comments

Comments
 (0)