Skip to content

Commit d44a8e7

Browse files
authored
[CIR][CIRGen][Builtin][Neon] Lower vrnd32z and vrnd32zq (#1399)
Lower vrnd32z and vrnd32zq
1 parent db3e279 commit d44a8e7

File tree

2 files changed

+48
-30
lines changed

2 files changed

+48
-30
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2566,6 +2566,14 @@ mlir::Value CIRGenFunction::emitCommonNeonBuiltinExpr(
25662566
argTypes.push_back(vTy);
25672567
break;
25682568
}
2569+
case NEON::BI__builtin_neon_vrnd32z_f32:
2570+
case NEON::BI__builtin_neon_vrnd32zq_f32:
2571+
case NEON::BI__builtin_neon_vrnd32z_f64:
2572+
case NEON::BI__builtin_neon_vrnd32zq_f64: {
2573+
intrincsName = "aarch64.neon.frint32z";
2574+
argTypes.push_back(vTy);
2575+
break;
2576+
}
25692577
case NEON::BI__builtin_neon_vshl_v:
25702578
case NEON::BI__builtin_neon_vshlq_v: {
25712579
return builder.create<cir::ShiftOp>(
@@ -4133,12 +4141,6 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E,
41334141
case NEON::BI__builtin_neon_vrndh_f16: {
41344142
llvm_unreachable("NEON::BI__builtin_neon_vrndh_f16 NYI");
41354143
}
4136-
case NEON::BI__builtin_neon_vrnd32z_f32:
4137-
case NEON::BI__builtin_neon_vrnd32zq_f32:
4138-
case NEON::BI__builtin_neon_vrnd32z_f64:
4139-
case NEON::BI__builtin_neon_vrnd32zq_f64: {
4140-
llvm_unreachable("NEON::BI__builtin_neon_vrnd32zq_f64 NYI");
4141-
}
41424144
case NEON::BI__builtin_neon_vrnd64x_f32:
41434145
case NEON::BI__builtin_neon_vrnd64xq_f32:
41444146
case NEON::BI__builtin_neon_vrnd64x_f64:

clang/test/CIR/CodeGen/AArch64/v8.5a-neon-frint3264-intrinsic.c

Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,27 @@ float32x4_t test_vrnd32xq_f32(float32x4_t a) {
4242
// LLVM: ret <4 x float> [[RND]]
4343
}
4444

45-
// CHECK-LABEL: test_vrnd32z_f32
46-
// CHECK: [[RND:%.*]] = call <2 x float> @llvm.aarch64.neon.frint32z.v2f32(<2 x float> %a)
47-
// CHECK: ret <2 x float> [[RND]]
48-
// float32x2_t test_vrnd32z_f32(float32x2_t a) {
49-
// return vrnd32z_f32(a);
50-
// }
45+
float32x2_t test_vrnd32z_f32(float32x2_t a) {
46+
return vrnd32z_f32(a);
5147

52-
// CHECK-LABEL: test_vrnd32zq_f32
53-
// CHECK: [[RND:%.*]] = call <4 x float> @llvm.aarch64.neon.frint32z.v4f32(<4 x float> %a)
54-
// CHECK: ret <4 x float> [[RND]]
55-
// float32x4_t test_vrnd32zq_f32(float32x4_t a) {
56-
// return vrnd32zq_f32(a);
57-
// }
48+
// CIR-LABEL: vrnd32z_f32
49+
// CIR: [[TMP0:%.*]] = cir.llvm.intrinsic "aarch64.neon.frint32z" {{.*}} : (!cir.vector<!cir.float x 2>) -> !cir.vector<!cir.float x 2>
50+
51+
// LLVM-LABEL: @test_vrnd32z_f32
52+
// LLVM: [[RND:%.*]] = call <2 x float> @llvm.aarch64.neon.frint32z.v2f32(<2 x float> %0)
53+
// LLVM: ret <2 x float> [[RND]]
54+
}
55+
56+
float32x4_t test_vrnd32zq_f32(float32x4_t a) {
57+
return vrnd32zq_f32(a);
58+
59+
// CIR-LABEL: vrnd32zq_f32
60+
// CIR: [[TMP0:%.*]] = cir.llvm.intrinsic "aarch64.neon.frint32z" {{.*}} : (!cir.vector<!cir.float x 4>) -> !cir.vector<!cir.float x 4>
61+
62+
// LLVM-LABEL: @test_vrnd32zq_f32
63+
// LLVM: [[RND:%.*]] = call <4 x float> @llvm.aarch64.neon.frint32z.v4f32(<4 x float> %0)
64+
// LLVM: ret <4 x float> [[RND]]
65+
}
5866

5967
// CHECK-LABEL: test_vrnd64x_f32
6068
// CHECK: [[RND:%.*]] = call <2 x float> @llvm.aarch64.neon.frint64x.v2f32(<2 x float> %a)
@@ -107,19 +115,27 @@ float64x2_t test_vrnd32xq_f64(float64x2_t a) {
107115
// LLVM: ret <2 x double> [[RND]]
108116
}
109117

110-
// CHECK-LABEL: test_vrnd32z_f64
111-
// CHECK: [[RND:%.*]] = call <1 x double> @llvm.aarch64.neon.frint32z.v1f64(<1 x double> %a)
112-
// CHECK: ret <1 x double> [[RND]]
113-
// float64x1_t test_vrnd32z_f64(float64x1_t a) {
114-
// return vrnd32z_f64(a);
115-
// }
118+
float64x1_t test_vrnd32z_f64(float64x1_t a) {
119+
return vrnd32z_f64(a);
116120

117-
// CHECK-LABEL: test_vrnd32zq_f64
118-
// CHECK: [[RND:%.*]] = call <2 x double> @llvm.aarch64.neon.frint32z.v2f64(<2 x double> %a)
119-
// CHECK: ret <2 x double> [[RND]]
120-
// float64x2_t test_vrnd32zq_f64(float64x2_t a) {
121-
// return vrnd32zq_f64(a);
122-
// }
121+
// CIR-LABEL: vrnd32z_f64
122+
// CIR: [[TMP0:%.*]] = cir.llvm.intrinsic "aarch64.neon.frint32z" {{.*}} : (!cir.vector<!cir.double x 1>) -> !cir.vector<!cir.double x 1>
123+
124+
// LLVM-LABEL: @test_vrnd32z_f64
125+
// LLVM: [[RND:%.*]] = call <1 x double> @llvm.aarch64.neon.frint32z.v1f64(<1 x double> %0)
126+
// LLVM: ret <1 x double> [[RND]]
127+
}
128+
129+
float64x2_t test_vrnd32zq_f64(float64x2_t a) {
130+
return vrnd32zq_f64(a);
131+
132+
// CIR-LABEL: vrnd32zq_f64
133+
// CIR: [[TMP0:%.*]] = cir.llvm.intrinsic "aarch64.neon.frint32z" {{.*}} : (!cir.vector<!cir.double x 2>) -> !cir.vector<!cir.double x 2>
134+
135+
// LLVM-LABEL: @test_vrnd32zq_f64
136+
// LLVM: [[RND:%.*]] = call <2 x double> @llvm.aarch64.neon.frint32z.v2f64(<2 x double> %0)
137+
// LLVM: ret <2 x double> [[RND]]
138+
}
123139

124140
// CHECK-LABEL: test_vrnd64x_f64
125141
// CHECK: [[RND:%.*]] = call <1 x double> @llvm.aarch64.neon.frint64x.v1f64(<1 x double> %a)

0 commit comments

Comments
 (0)