[Clang][AArch64] Add FP8 variants of Neon store intrinsics (#145346)
Adds FP8 variants for existing VST1, VST2, VST3 & VST4 intrinsics.
This commit is contained in:
@@ -466,15 +466,15 @@ def VLD1_LANE : WInst<"vld1_lane", ".(c*!).I",
|
||||
def VLD1_DUP : WInst<"vld1_dup", ".(c*!)",
|
||||
"QUcQUsQUiQUlQcQsQiQlQfQPcQPsUcUsUiUlcsilfPcPsmQm">;
|
||||
def VST1 : WInst<"vst1", "v*(.!)",
|
||||
"QUcQUsQUiQUlQcQsQiQlQfQPcQPsUcUsUiUlcsilfPcPs">;
|
||||
"QUcQUsQUiQUlQcQsQiQlQfQPcQPsUcUsUiUlcsilfPcPsmQm">;
|
||||
def VST1_X2 : WInst<"vst1_x2", "v*(2!)",
|
||||
"cfilsUcUiUlUsQcQfQiQlQsQUcQUiQUlQUsPcPsQPcQPs">;
|
||||
"cfilsUcUiUlUsQcQfQiQlQsQUcQUiQUlQUsPcPsQPcQPsmQm">;
|
||||
def VST1_X3 : WInst<"vst1_x3", "v*(3!)",
|
||||
"cfilsUcUiUlUsQcQfQiQlQsQUcQUiQUlQUsPcPsQPcQPs">;
|
||||
"cfilsUcUiUlUsQcQfQiQlQsQUcQUiQUlQUsPcPsQPcQPsmQm">;
|
||||
def VST1_X4 : WInst<"vst1_x4", "v*(4!)",
|
||||
"cfilsUcUiUlUsQcQfQiQlQsQUcQUiQUlQUsPcPsQPcQPs">;
|
||||
"cfilsUcUiUlUsQcQfQiQlQsQUcQUiQUlQUsPcPsQPcQPsmQm">;
|
||||
def VST1_LANE : WInst<"vst1_lane", "v*(.!)I",
|
||||
"QUcQUsQUiQUlQcQsQiQlQfQPcQPsUcUsUiUlcsilfPcPs",
|
||||
"QUcQUsQUiQUlQcQsQiQlQfQPcQPsUcUsUiUlcsilfPcPsmQm",
|
||||
[ImmCheck<2, ImmCheckLaneIndex, 1>]>;
|
||||
|
||||
let ArchGuard = "(__ARM_FP & 2)" in {
|
||||
@@ -510,14 +510,14 @@ def VLD3_LANE : WInst<"vld3_lane", "3(c*!)3I", "QUsQUiQsQiQfQPsUcUsUicsifPcPsmQm
|
||||
[ImmCheck<5, ImmCheckLaneIndex, 1>]>;
|
||||
def VLD4_LANE : WInst<"vld4_lane", "4(c*!)4I", "QUsQUiQsQiQfQPsUcUsUicsifPcPsmQm",
|
||||
[ImmCheck<6, ImmCheckLaneIndex, 1>]>;
|
||||
def VST2 : WInst<"vst2", "v*(2!)", "QUcQUsQUiQcQsQiQfQPcQPsUcUsUiUlcsilfPcPs">;
|
||||
def VST3 : WInst<"vst3", "v*(3!)", "QUcQUsQUiQcQsQiQfQPcQPsUcUsUiUlcsilfPcPs">;
|
||||
def VST4 : WInst<"vst4", "v*(4!)", "QUcQUsQUiQcQsQiQfQPcQPsUcUsUiUlcsilfPcPs">;
|
||||
def VST2_LANE : WInst<"vst2_lane", "v*(2!)I", "QUsQUiQsQiQfQPsUcUsUicsifPcPs",
|
||||
def VST2 : WInst<"vst2", "v*(2!)", "QUcQUsQUiQcQsQiQfQPcQPsUcUsUiUlcsilfPcPsmQm">;
|
||||
def VST3 : WInst<"vst3", "v*(3!)", "QUcQUsQUiQcQsQiQfQPcQPsUcUsUiUlcsilfPcPsmQm">;
|
||||
def VST4 : WInst<"vst4", "v*(4!)", "QUcQUsQUiQcQsQiQfQPcQPsUcUsUiUlcsilfPcPsmQm">;
|
||||
def VST2_LANE : WInst<"vst2_lane", "v*(2!)I", "QUsQUiQsQiQfQPsUcUsUicsifPcPsmQm",
|
||||
[ImmCheck<3, ImmCheckLaneIndex, 1>]>;
|
||||
def VST3_LANE : WInst<"vst3_lane", "v*(3!)I", "QUsQUiQsQiQfQPsUcUsUicsifPcPs",
|
||||
def VST3_LANE : WInst<"vst3_lane", "v*(3!)I", "QUsQUiQsQiQfQPsUcUsUicsifPcPsmQm",
|
||||
[ImmCheck<4, ImmCheckLaneIndex, 1>]>;
|
||||
def VST4_LANE : WInst<"vst4_lane", "v*(4!)I", "QUsQUiQsQiQfQPsUcUsUicsifPcPs",
|
||||
def VST4_LANE : WInst<"vst4_lane", "v*(4!)I", "QUsQUiQsQiQfQPsUcUsUicsifPcPsmQm",
|
||||
[ImmCheck<5, ImmCheckLaneIndex, 1>]>;
|
||||
let ArchGuard = "(__ARM_FP & 2)" in {
|
||||
def VLD2_F16 : WInst<"vld2", "2(c*!)", "hQh">;
|
||||
@@ -2194,4 +2194,4 @@ let ArchGuard = "defined(__aarch64__)", TargetGuard = "fp8,neon" in {
|
||||
// fscale
|
||||
def FSCALE_V128 : WInst<"vscale", "..(.S)", "QdQfQh">;
|
||||
def FSCALE_V64 : WInst<"vscale", "(.q)(.q)(.qS)", "fh">;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14848,6 +14848,16 @@ void test_vst1q_s64(int64_t *a, int64x2_t b) {
|
||||
vst1q_s64(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst1q_mf8(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], <16 x i8> [[VAL:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: store <16 x i8> [[VAL]], ptr [[A]], align 1
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
void test_vst1q_mf8(mfloat8_t *a, mfloat8x16_t val) {
|
||||
vst1q_mf8(a, val);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst1q_f16(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
@@ -15001,6 +15011,16 @@ void test_vst1_s64(int64_t *a, int64x1_t b) {
|
||||
vst1_s64(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst1_mf8(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], <8 x i8> [[VAL:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: store <8 x i8> [[VAL]], ptr [[A]], align 1
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
void test_vst1_mf8(mfloat8_t *a, mfloat8x8_t val) {
|
||||
vst1_mf8(a, val);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst1_f16(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
@@ -15183,6 +15203,18 @@ void test_vst2q_s64(int64_t *a, int64x2x2_t b) {
|
||||
vst2q_s64(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst2q_mf8(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [2 x <16 x i8>] alignstack(16) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [2 x <16 x i8>] [[B_COERCE]], 0
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [2 x <16 x i8>] [[B_COERCE]], 1
|
||||
// CHECK-NEXT: call void @llvm.aarch64.neon.st2.v16i8.p0(<16 x i8> [[B_COERCE_FCA_0_EXTRACT]], <16 x i8> [[B_COERCE_FCA_1_EXTRACT]], ptr [[A]])
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
void test_vst2q_mf8(mfloat8_t *a, mfloat8x16x2_t b) {
|
||||
vst2q_mf8(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst2q_f16(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [2 x <8 x half>] alignstack(16) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
@@ -15385,6 +15417,18 @@ void test_vst2_s64(int64_t *a, int64x1x2_t b) {
|
||||
vst2_s64(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst2_mf8(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [2 x <8 x i8>] alignstack(8) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [2 x <8 x i8>] [[B_COERCE]], 0
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [2 x <8 x i8>] [[B_COERCE]], 1
|
||||
// CHECK-NEXT: call void @llvm.aarch64.neon.st2.v8i8.p0(<8 x i8> [[B_COERCE_FCA_0_EXTRACT]], <8 x i8> [[B_COERCE_FCA_1_EXTRACT]], ptr [[A]])
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
void test_vst2_mf8(mfloat8_t *a, mfloat8x8x2_t b) {
|
||||
vst2_mf8(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst2_f16(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [2 x <4 x half>] alignstack(8) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
@@ -15609,6 +15653,19 @@ void test_vst3q_s64(int64_t *a, int64x2x3_t b) {
|
||||
vst3q_s64(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst3q_mf8(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [3 x <16 x i8>] alignstack(16) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [3 x <16 x i8>] [[B_COERCE]], 0
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [3 x <16 x i8>] [[B_COERCE]], 1
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_2_EXTRACT:%.*]] = extractvalue [3 x <16 x i8>] [[B_COERCE]], 2
|
||||
// CHECK-NEXT: call void @llvm.aarch64.neon.st3.v16i8.p0(<16 x i8> [[B_COERCE_FCA_0_EXTRACT]], <16 x i8> [[B_COERCE_FCA_1_EXTRACT]], <16 x i8> [[B_COERCE_FCA_2_EXTRACT]], ptr [[A]])
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
void test_vst3q_mf8(mfloat8_t *a, mfloat8x16x3_t b) {
|
||||
vst3q_mf8(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst3q_f16(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [3 x <8 x half>] alignstack(16) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
@@ -15847,6 +15904,19 @@ void test_vst3_s64(int64_t *a, int64x1x3_t b) {
|
||||
vst3_s64(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst3_mf8(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [3 x <8 x i8>] alignstack(8) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [3 x <8 x i8>] [[B_COERCE]], 0
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [3 x <8 x i8>] [[B_COERCE]], 1
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_2_EXTRACT:%.*]] = extractvalue [3 x <8 x i8>] [[B_COERCE]], 2
|
||||
// CHECK-NEXT: call void @llvm.aarch64.neon.st3.v8i8.p0(<8 x i8> [[B_COERCE_FCA_0_EXTRACT]], <8 x i8> [[B_COERCE_FCA_1_EXTRACT]], <8 x i8> [[B_COERCE_FCA_2_EXTRACT]], ptr [[A]])
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
void test_vst3_mf8(mfloat8_t *a, mfloat8x8x3_t b) {
|
||||
vst3_mf8(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst3_f16(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [3 x <4 x half>] alignstack(8) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
@@ -16108,6 +16178,20 @@ void test_vst4q_s64(int64_t *a, int64x2x4_t b) {
|
||||
vst4q_s64(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst4q_mf8(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [4 x <16 x i8>] alignstack(16) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [4 x <16 x i8>] [[B_COERCE]], 0
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [4 x <16 x i8>] [[B_COERCE]], 1
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_2_EXTRACT:%.*]] = extractvalue [4 x <16 x i8>] [[B_COERCE]], 2
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_3_EXTRACT:%.*]] = extractvalue [4 x <16 x i8>] [[B_COERCE]], 3
|
||||
// CHECK-NEXT: call void @llvm.aarch64.neon.st4.v16i8.p0(<16 x i8> [[B_COERCE_FCA_0_EXTRACT]], <16 x i8> [[B_COERCE_FCA_1_EXTRACT]], <16 x i8> [[B_COERCE_FCA_2_EXTRACT]], <16 x i8> [[B_COERCE_FCA_3_EXTRACT]], ptr [[A]])
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
void test_vst4q_mf8(mfloat8_t *a, mfloat8x16x4_t b) {
|
||||
vst4q_mf8(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst4q_f16(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [4 x <8 x half>] alignstack(16) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
@@ -16382,6 +16466,20 @@ void test_vst4_s64(int64_t *a, int64x1x4_t b) {
|
||||
vst4_s64(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst4_mf8(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [4 x <8 x i8>] alignstack(8) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [4 x <8 x i8>] [[B_COERCE]], 0
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [4 x <8 x i8>] [[B_COERCE]], 1
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_2_EXTRACT:%.*]] = extractvalue [4 x <8 x i8>] [[B_COERCE]], 2
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_3_EXTRACT:%.*]] = extractvalue [4 x <8 x i8>] [[B_COERCE]], 3
|
||||
// CHECK-NEXT: call void @llvm.aarch64.neon.st4.v8i8.p0(<8 x i8> [[B_COERCE_FCA_0_EXTRACT]], <8 x i8> [[B_COERCE_FCA_1_EXTRACT]], <8 x i8> [[B_COERCE_FCA_2_EXTRACT]], <8 x i8> [[B_COERCE_FCA_3_EXTRACT]], ptr [[A]])
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
void test_vst4_mf8(mfloat8_t *a, mfloat8x8x4_t b) {
|
||||
vst4_mf8(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst4_f16(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [4 x <4 x half>] alignstack(8) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
@@ -16789,6 +16887,18 @@ poly64x1x4_t test_vld1_p64_x4(poly64_t const *a) {
|
||||
return vld1_p64_x4(a);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst1q_mf8_x2(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [2 x <16 x i8>] alignstack(16) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [2 x <16 x i8>] [[B_COERCE]], 0
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [2 x <16 x i8>] [[B_COERCE]], 1
|
||||
// CHECK-NEXT: call void @llvm.aarch64.neon.st1x2.v16i8.p0(<16 x i8> [[B_COERCE_FCA_0_EXTRACT]], <16 x i8> [[B_COERCE_FCA_1_EXTRACT]], ptr [[A]])
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
void test_vst1q_mf8_x2(mfloat8_t *a, mfloat8x16x2_t b) {
|
||||
vst1q_mf8_x2(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst1q_f64_x2(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [2 x <2 x double>] alignstack(16) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
@@ -16823,6 +16933,18 @@ void test_vst1q_p64_x2(poly64_t *a, poly64x2x2_t b) {
|
||||
vst1q_p64_x2(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst1_mf8_x2(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [2 x <8 x i8>] alignstack(8) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [2 x <8 x i8>] [[B_COERCE]], 0
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [2 x <8 x i8>] [[B_COERCE]], 1
|
||||
// CHECK-NEXT: call void @llvm.aarch64.neon.st1x2.v8i8.p0(<8 x i8> [[B_COERCE_FCA_0_EXTRACT]], <8 x i8> [[B_COERCE_FCA_1_EXTRACT]], ptr [[A]])
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
void test_vst1_mf8_x2(mfloat8_t *a, mfloat8x8x2_t b) {
|
||||
vst1_mf8_x2(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst1_f64_x2(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [2 x <1 x double>] alignstack(8) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
@@ -16859,6 +16981,19 @@ void test_vst1_p64_x2(poly64_t *a, poly64x1x2_t b) {
|
||||
vst1_p64_x2(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst1q_mf8_x3(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [3 x <16 x i8>] alignstack(16) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [3 x <16 x i8>] [[B_COERCE]], 0
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [3 x <16 x i8>] [[B_COERCE]], 1
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_2_EXTRACT:%.*]] = extractvalue [3 x <16 x i8>] [[B_COERCE]], 2
|
||||
// CHECK-NEXT: call void @llvm.aarch64.neon.st1x3.v16i8.p0(<16 x i8> [[B_COERCE_FCA_0_EXTRACT]], <16 x i8> [[B_COERCE_FCA_1_EXTRACT]], <16 x i8> [[B_COERCE_FCA_2_EXTRACT]], ptr [[A]])
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
void test_vst1q_mf8_x3(mfloat8_t *a, mfloat8x16x3_t b) {
|
||||
vst1q_mf8_x3(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst1q_f64_x3(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [3 x <2 x double>] alignstack(16) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
@@ -16900,6 +17035,19 @@ void test_vst1q_p64_x3(poly64_t *a, poly64x2x3_t b) {
|
||||
vst1q_p64_x3(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst1_mf8_x3(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [3 x <8 x i8>] alignstack(8) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [3 x <8 x i8>] [[B_COERCE]], 0
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [3 x <8 x i8>] [[B_COERCE]], 1
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_2_EXTRACT:%.*]] = extractvalue [3 x <8 x i8>] [[B_COERCE]], 2
|
||||
// CHECK-NEXT: call void @llvm.aarch64.neon.st1x3.v8i8.p0(<8 x i8> [[B_COERCE_FCA_0_EXTRACT]], <8 x i8> [[B_COERCE_FCA_1_EXTRACT]], <8 x i8> [[B_COERCE_FCA_2_EXTRACT]], ptr [[A]])
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
void test_vst1_mf8_x3(mfloat8_t *a, mfloat8x8x3_t b) {
|
||||
vst1_mf8_x3(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst1_f64_x3(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [3 x <1 x double>] alignstack(8) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
@@ -16944,6 +17092,20 @@ void test_vst1_p64_x3(poly64_t *a, poly64x1x3_t b) {
|
||||
vst1_p64_x3(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst1q_mf8_x4(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [4 x <16 x i8>] alignstack(16) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [4 x <16 x i8>] [[B_COERCE]], 0
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [4 x <16 x i8>] [[B_COERCE]], 1
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_2_EXTRACT:%.*]] = extractvalue [4 x <16 x i8>] [[B_COERCE]], 2
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_3_EXTRACT:%.*]] = extractvalue [4 x <16 x i8>] [[B_COERCE]], 3
|
||||
// CHECK-NEXT: call void @llvm.aarch64.neon.st1x4.v16i8.p0(<16 x i8> [[B_COERCE_FCA_0_EXTRACT]], <16 x i8> [[B_COERCE_FCA_1_EXTRACT]], <16 x i8> [[B_COERCE_FCA_2_EXTRACT]], <16 x i8> [[B_COERCE_FCA_3_EXTRACT]], ptr [[A]])
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
void test_vst1q_mf8_x4(mfloat8_t *a, mfloat8x16x4_t b) {
|
||||
vst1q_mf8_x4(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst1q_f64_x4(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [4 x <2 x double>] alignstack(16) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
@@ -16992,6 +17154,20 @@ void test_vst1q_p64_x4(poly64_t *a, poly64x2x4_t b) {
|
||||
vst1q_p64_x4(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst1_mf8_x4(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [4 x <8 x i8>] alignstack(8) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [4 x <8 x i8>] [[B_COERCE]], 0
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [4 x <8 x i8>] [[B_COERCE]], 1
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_2_EXTRACT:%.*]] = extractvalue [4 x <8 x i8>] [[B_COERCE]], 2
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_3_EXTRACT:%.*]] = extractvalue [4 x <8 x i8>] [[B_COERCE]], 3
|
||||
// CHECK-NEXT: call void @llvm.aarch64.neon.st1x4.v8i8.p0(<8 x i8> [[B_COERCE_FCA_0_EXTRACT]], <8 x i8> [[B_COERCE_FCA_1_EXTRACT]], <8 x i8> [[B_COERCE_FCA_2_EXTRACT]], <8 x i8> [[B_COERCE_FCA_3_EXTRACT]], ptr [[A]])
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
void test_vst1_mf8_x4(mfloat8_t *a, mfloat8x8x4_t b) {
|
||||
vst1_mf8_x4(a, b);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst1_f64_x4(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [4 x <1 x double>] alignstack(8) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
|
||||
@@ -3408,6 +3408,17 @@ void test_vst1q_lane_s64(int64_t *a, int64x2_t b) {
|
||||
vst1q_lane_s64(a, b, 1);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst1q_lane_mf8(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], <16 x i8> [[B:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = extractelement <16 x i8> [[B]], i32 15
|
||||
// CHECK-NEXT: store i8 [[TMP0]], ptr [[A]], align 1
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
void test_vst1q_lane_mf8(mfloat8_t *a, mfloat8x16_t b) {
|
||||
vst1q_lane_mf8(a, b, 15);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst1q_lane_f16(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
@@ -3587,6 +3598,17 @@ void test_vst1_lane_s64(int64_t *a, int64x1_t b) {
|
||||
vst1_lane_s64(a, b, 0);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst1_lane_mf8(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], <8 x i8> [[B:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[TMP0:%.*]] = extractelement <8 x i8> [[B]], i32 7
|
||||
// CHECK-NEXT: store i8 [[TMP0]], ptr [[A]], align 1
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
void test_vst1_lane_mf8(mfloat8_t *a, mfloat8x8_t b) {
|
||||
vst1_lane_mf8(a, b, 7);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst1_lane_f16(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
@@ -3787,6 +3809,18 @@ void test_vst2q_lane_s64(int64_t *a, int64x2x2_t b) {
|
||||
vst2q_lane_s64(a, b, 1);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst2q_lane_mf8(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [2 x <16 x i8>] alignstack(16) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [2 x <16 x i8>] [[B_COERCE]], 0
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [2 x <16 x i8>] [[B_COERCE]], 1
|
||||
// CHECK-NEXT: call void @llvm.aarch64.neon.st2lane.v16i8.p0(<16 x i8> [[B_COERCE_FCA_0_EXTRACT]], <16 x i8> [[B_COERCE_FCA_1_EXTRACT]], i64 15, ptr [[A]])
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
void test_vst2q_lane_mf8(mfloat8_t *a, mfloat8x16x2_t b) {
|
||||
vst2q_lane_mf8(a, b, 15);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst2q_lane_f16(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [2 x <8 x half>] alignstack(16) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
@@ -4005,6 +4039,18 @@ void test_vst2_lane_s64(int64_t *a, int64x1x2_t b) {
|
||||
vst2_lane_s64(a, b, 0);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst2_lane_mf8(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [2 x <8 x i8>] alignstack(8) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [2 x <8 x i8>] [[B_COERCE]], 0
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [2 x <8 x i8>] [[B_COERCE]], 1
|
||||
// CHECK-NEXT: call void @llvm.aarch64.neon.st2lane.v8i8.p0(<8 x i8> [[B_COERCE_FCA_0_EXTRACT]], <8 x i8> [[B_COERCE_FCA_1_EXTRACT]], i64 7, ptr [[A]])
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
void test_vst2_lane_mf8(mfloat8_t *a, mfloat8x8x2_t b) {
|
||||
vst2_lane_mf8(a, b, 7);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst2_lane_f16(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [2 x <4 x half>] alignstack(8) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
@@ -4245,6 +4291,19 @@ void test_vst3q_lane_s64(int64_t *a, int64x2x3_t b) {
|
||||
vst3q_lane_s64(a, b, 1);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst3q_lane_mf8(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [3 x <16 x i8>] alignstack(16) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [3 x <16 x i8>] [[B_COERCE]], 0
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [3 x <16 x i8>] [[B_COERCE]], 1
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_2_EXTRACT:%.*]] = extractvalue [3 x <16 x i8>] [[B_COERCE]], 2
|
||||
// CHECK-NEXT: call void @llvm.aarch64.neon.st3lane.v16i8.p0(<16 x i8> [[B_COERCE_FCA_0_EXTRACT]], <16 x i8> [[B_COERCE_FCA_1_EXTRACT]], <16 x i8> [[B_COERCE_FCA_2_EXTRACT]], i64 15, ptr [[A]])
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
void test_vst3q_lane_mf8(mfloat8_t *a, mfloat8x16x3_t b) {
|
||||
vst3q_lane_mf8(a, b, 15);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst3q_lane_f16(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [3 x <8 x half>] alignstack(16) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
@@ -4502,6 +4561,19 @@ void test_vst3_lane_s64(int64_t *a, int64x1x3_t b) {
|
||||
vst3_lane_s64(a, b, 0);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst3_lane_mf8(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [3 x <8 x i8>] alignstack(8) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [3 x <8 x i8>] [[B_COERCE]], 0
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [3 x <8 x i8>] [[B_COERCE]], 1
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_2_EXTRACT:%.*]] = extractvalue [3 x <8 x i8>] [[B_COERCE]], 2
|
||||
// CHECK-NEXT: call void @llvm.aarch64.neon.st3lane.v8i8.p0(<8 x i8> [[B_COERCE_FCA_0_EXTRACT]], <8 x i8> [[B_COERCE_FCA_1_EXTRACT]], <8 x i8> [[B_COERCE_FCA_2_EXTRACT]], i64 7, ptr [[A]])
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
void test_vst3_lane_mf8(mfloat8_t *a, mfloat8x8x3_t b) {
|
||||
vst3_lane_mf8(a, b, 7);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst3_lane_f16(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [3 x <4 x half>] alignstack(8) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
@@ -4782,6 +4854,20 @@ void test_vst4q_lane_s64(int64_t *a, int64x2x4_t b) {
|
||||
vst4q_lane_s64(a, b, 1);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst4q_lane_mf8(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [4 x <16 x i8>] alignstack(16) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [4 x <16 x i8>] [[B_COERCE]], 0
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [4 x <16 x i8>] [[B_COERCE]], 1
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_2_EXTRACT:%.*]] = extractvalue [4 x <16 x i8>] [[B_COERCE]], 2
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_3_EXTRACT:%.*]] = extractvalue [4 x <16 x i8>] [[B_COERCE]], 3
|
||||
// CHECK-NEXT: call void @llvm.aarch64.neon.st4lane.v16i8.p0(<16 x i8> [[B_COERCE_FCA_0_EXTRACT]], <16 x i8> [[B_COERCE_FCA_1_EXTRACT]], <16 x i8> [[B_COERCE_FCA_2_EXTRACT]], <16 x i8> [[B_COERCE_FCA_3_EXTRACT]], i64 15, ptr [[A]])
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
void test_vst4q_lane_mf8(mfloat8_t *a, mfloat8x16x4_t b) {
|
||||
vst4q_lane_mf8(a, b, 15);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst4q_lane_f16(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [4 x <8 x half>] alignstack(16) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
@@ -5078,6 +5164,20 @@ void test_vst4_lane_s64(int64_t *a, int64x1x4_t b) {
|
||||
vst4_lane_s64(a, b, 0);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst4_lane_mf8(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [4 x <8 x i8>] alignstack(8) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [4 x <8 x i8>] [[B_COERCE]], 0
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [4 x <8 x i8>] [[B_COERCE]], 1
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_2_EXTRACT:%.*]] = extractvalue [4 x <8 x i8>] [[B_COERCE]], 2
|
||||
// CHECK-NEXT: [[B_COERCE_FCA_3_EXTRACT:%.*]] = extractvalue [4 x <8 x i8>] [[B_COERCE]], 3
|
||||
// CHECK-NEXT: call void @llvm.aarch64.neon.st4lane.v8i8.p0(<8 x i8> [[B_COERCE_FCA_0_EXTRACT]], <8 x i8> [[B_COERCE_FCA_1_EXTRACT]], <8 x i8> [[B_COERCE_FCA_2_EXTRACT]], <8 x i8> [[B_COERCE_FCA_3_EXTRACT]], i64 7, ptr [[A]])
|
||||
// CHECK-NEXT: ret void
|
||||
//
|
||||
void test_vst4_lane_mf8(mfloat8_t *a, mfloat8x8x4_t b) {
|
||||
vst4_lane_mf8(a, b, 7);
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define dso_local void @test_vst4_lane_f16(
|
||||
// CHECK-SAME: ptr noundef [[A:%.*]], [4 x <4 x half>] alignstack(8) [[B_COERCE:%.*]]) #[[ATTR0]] {
|
||||
// CHECK-NEXT: [[ENTRY:.*:]]
|
||||
|
||||
Reference in New Issue
Block a user