Skip to content

Commit 2df2022

Browse files
authored
[CIR][CIRGen][Builtin][Neon] Lower vgetq_lane_bf16, vduph f16 and fb16 (#1372)
Lower vgetq_lane_bf16, vduph f16 and fb16
1 parent 27154ac commit 2df2022

File tree

3 files changed

+26
-18
lines changed

3 files changed

+26
-18
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -3909,7 +3909,8 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E,
39093909
case NEON::BI__builtin_neon_vgetq_lane_bf16:
39103910
case NEON::BI__builtin_neon_vduph_laneq_bf16:
39113911
case NEON::BI__builtin_neon_vduph_laneq_f16: {
3912-
llvm_unreachable("NEON::BI__builtin_neon_vduph_laneq_f16 NYI");
3912+
return builder.create<cir::VecExtractOp>(getLoc(E->getExprLoc()), Ops[0],
3913+
emitScalarExpr(E->getArg(1)));
39133914
}
39143915
case NEON::BI__builtin_neon_vcvt_bf16_f32:
39153916
case NEON::BI__builtin_neon_vcvtq_low_bf16_f32:

clang/test/CIR/CodeGen/AArch64/bf16-getset-intrinsics.c

+12-8
Original file line numberDiff line numberDiff line change
@@ -140,14 +140,18 @@ bfloat16_t test_vget_lane_bf16(bfloat16x4_t v) {
140140
// LLVM: ret bfloat [[VGET_LANE]]
141141
}
142142

143-
// CHECK-LABEL: @test_vgetq_lane_bf16(
144-
// CHECK-NEXT: entry:
145-
// CHECK-NEXT: [[VGETQ_LANE:%.*]] = extractelement <8 x bfloat> [[V:%.*]], i32 7
146-
// CHECK-NEXT: ret bfloat [[VGETQ_LANE]]
147-
//
148-
// bfloat16_t test_vgetq_lane_bf16(bfloat16x8_t v) {
149-
// return vgetq_lane_bf16(v, 7);
150-
// }
143+
bfloat16_t test_vgetq_lane_bf16(bfloat16x8_t v) {
144+
return vgetq_lane_bf16(v, 7);
145+
146+
// CIR-LABEL: vgetq_lane_bf16
147+
// CIR: [[TMP0:%.*]] = cir.const #cir.int<7> : !s32i
148+
// CIR: [[TMP1:%.*]] = cir.vec.extract {{.*}}[{{.*}} : !s32i] : !cir.vector<!cir.bf16 x 8>
149+
150+
// LLVM-LABEL: test_vgetq_lane_bf16
151+
// LLVM-SAME: (<8 x bfloat> [[VEC:%.*]])
152+
// LLVM: [[VGET_LANE:%.*]] = extractelement <8 x bfloat> [[VEC]], i32 7
153+
// LLVM: ret bfloat [[VGET_LANE]]
154+
}
151155

152156
// CHECK-LABEL: @test_vset_lane_bf16(
153157
// CHECK-NEXT: entry:

clang/test/CIR/CodeGen/AArch64/v8.2a-neon-intrinsics-generic.c

+12-9
Original file line numberDiff line numberDiff line change
@@ -471,15 +471,18 @@
471471
// return vtrn2q_f16(a, b);
472472
// }
473473

474-
// CHECK-LABEL: define {{[^@]+}}@test_vduph_laneq_f16
475-
// CHECK-SAME: (<8 x half> noundef [[VEC:%.*]]) #[[ATTR0]] {
476-
// CHECK-NEXT: entry:
477-
// CHECK-NEXT: [[VGETQ_LANE:%.*]] = extractelement <8 x half> [[VEC]], i32 7
478-
// CHECK-NEXT: ret half [[VGETQ_LANE]]
479-
//
480-
// float16_t test_vduph_laneq_f16(float16x8_t vec) {
481-
// return vduph_laneq_f16(vec, 7);
482-
// }
474+
float16_t test_vduph_laneq_f16(float16x8_t vec) {
475+
return vduph_laneq_f16(vec, 7);
476+
477+
// CIR-LABEL: vduph_laneq_f16
478+
// CIR: [[TMP0:%.*]] = cir.const #cir.int<7> : !s32i
479+
// CIR: [[TMP1:%.*]] = cir.vec.extract {{.*}}[{{.*}} : !s32i] : !cir.vector<!cir.f16 x 8>
480+
481+
// LLVM-LABEL: test_vduph_laneq_f16
482+
// LLVM-SAME: (<8 x half> [[VEC:%.*]])
483+
// LLVM: [[VGET_LANE:%.*]] = extractelement <8 x half> [[VEC]], i32 7
484+
// LLVM: ret half [[VGET_LANE]]
485+
}
483486

484487
float16_t test_vduph_lane_f16(float16x4_t vec) {
485488
return vduph_lane_f16(vec, 3);

0 commit comments

Comments
 (0)