xref: /aosp_15_r20/external/clang/test/CodeGen/arm-neon-vcvtX.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple thumbv8-linux-gnueabihf -target-cpu cortex-a57 -ffreestanding -emit-llvm %s -o - | opt -S -mem2reg | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li #include <arm_neon.h>
4*67e74705SXin Li 
5*67e74705SXin Li // CHECK-LABEL: define <2 x i32> @test_vcvta_s32_f32(<2 x float> %a) #0 {
6*67e74705SXin Li // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
7*67e74705SXin Li // CHECK:   [[VCVTA_S32_V_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x float>
8*67e74705SXin Li // CHECK:   [[VCVTA_S32_V1_I:%.*]] = call <2 x i32> @llvm.arm.neon.vcvtas.v2i32.v2f32(<2 x float> [[VCVTA_S32_V_I]]) #2
9*67e74705SXin Li // CHECK:   ret <2 x i32> [[VCVTA_S32_V1_I]]
test_vcvta_s32_f32(float32x2_t a)10*67e74705SXin Li int32x2_t test_vcvta_s32_f32(float32x2_t a) {
11*67e74705SXin Li   return vcvta_s32_f32(a);
12*67e74705SXin Li }
13*67e74705SXin Li 
14*67e74705SXin Li // CHECK-LABEL: define <2 x i32> @test_vcvta_u32_f32(<2 x float> %a) #0 {
15*67e74705SXin Li // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
16*67e74705SXin Li // CHECK:   [[VCVTA_U32_V_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x float>
17*67e74705SXin Li // CHECK:   [[VCVTA_U32_V1_I:%.*]] = call <2 x i32> @llvm.arm.neon.vcvtau.v2i32.v2f32(<2 x float> [[VCVTA_U32_V_I]]) #2
18*67e74705SXin Li // CHECK:   ret <2 x i32> [[VCVTA_U32_V1_I]]
test_vcvta_u32_f32(float32x2_t a)19*67e74705SXin Li uint32x2_t test_vcvta_u32_f32(float32x2_t a) {
20*67e74705SXin Li   return vcvta_u32_f32(a);
21*67e74705SXin Li }
22*67e74705SXin Li 
23*67e74705SXin Li // CHECK-LABEL: define <4 x i32> @test_vcvtaq_s32_f32(<4 x float> %a) #0 {
24*67e74705SXin Li // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
25*67e74705SXin Li // CHECK:   [[VCVTAQ_S32_V_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x float>
26*67e74705SXin Li // CHECK:   [[VCVTAQ_S32_V1_I:%.*]] = call <4 x i32> @llvm.arm.neon.vcvtas.v4i32.v4f32(<4 x float> [[VCVTAQ_S32_V_I]]) #2
27*67e74705SXin Li // CHECK:   ret <4 x i32> [[VCVTAQ_S32_V1_I]]
test_vcvtaq_s32_f32(float32x4_t a)28*67e74705SXin Li int32x4_t test_vcvtaq_s32_f32(float32x4_t a) {
29*67e74705SXin Li   return vcvtaq_s32_f32(a);
30*67e74705SXin Li }
31*67e74705SXin Li 
32*67e74705SXin Li // CHECK-LABEL: define <4 x i32> @test_vcvtaq_u32_f32(<4 x float> %a) #0 {
33*67e74705SXin Li // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
34*67e74705SXin Li // CHECK:   [[VCVTAQ_U32_V_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x float>
35*67e74705SXin Li // CHECK:   [[VCVTAQ_U32_V1_I:%.*]] = call <4 x i32> @llvm.arm.neon.vcvtau.v4i32.v4f32(<4 x float> [[VCVTAQ_U32_V_I]]) #2
36*67e74705SXin Li // CHECK:   ret <4 x i32> [[VCVTAQ_U32_V1_I]]
test_vcvtaq_u32_f32(float32x4_t a)37*67e74705SXin Li uint32x4_t test_vcvtaq_u32_f32(float32x4_t a) {
38*67e74705SXin Li   return vcvtaq_u32_f32(a);
39*67e74705SXin Li }
40*67e74705SXin Li 
41*67e74705SXin Li // CHECK-LABEL: define <2 x i32> @test_vcvtn_s32_f32(<2 x float> %a) #0 {
42*67e74705SXin Li // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
43*67e74705SXin Li // CHECK:   [[VCVTN_S32_V_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x float>
44*67e74705SXin Li // CHECK:   [[VCVTN_S32_V1_I:%.*]] = call <2 x i32> @llvm.arm.neon.vcvtns.v2i32.v2f32(<2 x float> [[VCVTN_S32_V_I]]) #2
45*67e74705SXin Li // CHECK:   ret <2 x i32> [[VCVTN_S32_V1_I]]
test_vcvtn_s32_f32(float32x2_t a)46*67e74705SXin Li int32x2_t test_vcvtn_s32_f32(float32x2_t a) {
47*67e74705SXin Li   return vcvtn_s32_f32(a);
48*67e74705SXin Li }
49*67e74705SXin Li 
50*67e74705SXin Li // CHECK-LABEL: define <2 x i32> @test_vcvtn_u32_f32(<2 x float> %a) #0 {
51*67e74705SXin Li // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
52*67e74705SXin Li // CHECK:   [[VCVTN_U32_V_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x float>
53*67e74705SXin Li // CHECK:   [[VCVTN_U32_V1_I:%.*]] = call <2 x i32> @llvm.arm.neon.vcvtnu.v2i32.v2f32(<2 x float> [[VCVTN_U32_V_I]]) #2
54*67e74705SXin Li // CHECK:   ret <2 x i32> [[VCVTN_U32_V1_I]]
test_vcvtn_u32_f32(float32x2_t a)55*67e74705SXin Li uint32x2_t test_vcvtn_u32_f32(float32x2_t a) {
56*67e74705SXin Li   return vcvtn_u32_f32(a);
57*67e74705SXin Li }
58*67e74705SXin Li 
59*67e74705SXin Li // CHECK-LABEL: define <4 x i32> @test_vcvtnq_s32_f32(<4 x float> %a) #0 {
60*67e74705SXin Li // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
61*67e74705SXin Li // CHECK:   [[VCVTNQ_S32_V_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x float>
62*67e74705SXin Li // CHECK:   [[VCVTNQ_S32_V1_I:%.*]] = call <4 x i32> @llvm.arm.neon.vcvtns.v4i32.v4f32(<4 x float> [[VCVTNQ_S32_V_I]]) #2
63*67e74705SXin Li // CHECK:   ret <4 x i32> [[VCVTNQ_S32_V1_I]]
test_vcvtnq_s32_f32(float32x4_t a)64*67e74705SXin Li int32x4_t test_vcvtnq_s32_f32(float32x4_t a) {
65*67e74705SXin Li   return vcvtnq_s32_f32(a);
66*67e74705SXin Li }
67*67e74705SXin Li 
68*67e74705SXin Li // CHECK-LABEL: define <4 x i32> @test_vcvtnq_u32_f32(<4 x float> %a) #0 {
69*67e74705SXin Li // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
70*67e74705SXin Li // CHECK:   [[VCVTNQ_U32_V_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x float>
71*67e74705SXin Li // CHECK:   [[VCVTNQ_U32_V1_I:%.*]] = call <4 x i32> @llvm.arm.neon.vcvtnu.v4i32.v4f32(<4 x float> [[VCVTNQ_U32_V_I]]) #2
72*67e74705SXin Li // CHECK:   ret <4 x i32> [[VCVTNQ_U32_V1_I]]
test_vcvtnq_u32_f32(float32x4_t a)73*67e74705SXin Li uint32x4_t test_vcvtnq_u32_f32(float32x4_t a) {
74*67e74705SXin Li   return vcvtnq_u32_f32(a);
75*67e74705SXin Li }
76*67e74705SXin Li 
77*67e74705SXin Li // CHECK-LABEL: define <2 x i32> @test_vcvtp_s32_f32(<2 x float> %a) #0 {
78*67e74705SXin Li // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
79*67e74705SXin Li // CHECK:   [[VCVTP_S32_V_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x float>
80*67e74705SXin Li // CHECK:   [[VCVTP_S32_V1_I:%.*]] = call <2 x i32> @llvm.arm.neon.vcvtps.v2i32.v2f32(<2 x float> [[VCVTP_S32_V_I]]) #2
81*67e74705SXin Li // CHECK:   ret <2 x i32> [[VCVTP_S32_V1_I]]
test_vcvtp_s32_f32(float32x2_t a)82*67e74705SXin Li int32x2_t test_vcvtp_s32_f32(float32x2_t a) {
83*67e74705SXin Li   return vcvtp_s32_f32(a);
84*67e74705SXin Li }
85*67e74705SXin Li 
86*67e74705SXin Li // CHECK-LABEL: define <2 x i32> @test_vcvtp_u32_f32(<2 x float> %a) #0 {
87*67e74705SXin Li // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
88*67e74705SXin Li // CHECK:   [[VCVTP_U32_V_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x float>
89*67e74705SXin Li // CHECK:   [[VCVTP_U32_V1_I:%.*]] = call <2 x i32> @llvm.arm.neon.vcvtpu.v2i32.v2f32(<2 x float> [[VCVTP_U32_V_I]]) #2
90*67e74705SXin Li // CHECK:   ret <2 x i32> [[VCVTP_U32_V1_I]]
test_vcvtp_u32_f32(float32x2_t a)91*67e74705SXin Li uint32x2_t test_vcvtp_u32_f32(float32x2_t a) {
92*67e74705SXin Li   return vcvtp_u32_f32(a);
93*67e74705SXin Li }
94*67e74705SXin Li 
95*67e74705SXin Li // CHECK-LABEL: define <4 x i32> @test_vcvtpq_s32_f32(<4 x float> %a) #0 {
96*67e74705SXin Li // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
97*67e74705SXin Li // CHECK:   [[VCVTPQ_S32_V_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x float>
98*67e74705SXin Li // CHECK:   [[VCVTPQ_S32_V1_I:%.*]] = call <4 x i32> @llvm.arm.neon.vcvtps.v4i32.v4f32(<4 x float> [[VCVTPQ_S32_V_I]]) #2
99*67e74705SXin Li // CHECK:   ret <4 x i32> [[VCVTPQ_S32_V1_I]]
test_vcvtpq_s32_f32(float32x4_t a)100*67e74705SXin Li int32x4_t test_vcvtpq_s32_f32(float32x4_t a) {
101*67e74705SXin Li   return vcvtpq_s32_f32(a);
102*67e74705SXin Li }
103*67e74705SXin Li 
104*67e74705SXin Li // CHECK-LABEL: define <4 x i32> @test_vcvtpq_u32_f32(<4 x float> %a) #0 {
105*67e74705SXin Li // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
106*67e74705SXin Li // CHECK:   [[VCVTPQ_U32_V_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x float>
107*67e74705SXin Li // CHECK:   [[VCVTPQ_U32_V1_I:%.*]] = call <4 x i32> @llvm.arm.neon.vcvtpu.v4i32.v4f32(<4 x float> [[VCVTPQ_U32_V_I]]) #2
108*67e74705SXin Li // CHECK:   ret <4 x i32> [[VCVTPQ_U32_V1_I]]
test_vcvtpq_u32_f32(float32x4_t a)109*67e74705SXin Li uint32x4_t test_vcvtpq_u32_f32(float32x4_t a) {
110*67e74705SXin Li   return vcvtpq_u32_f32(a);
111*67e74705SXin Li }
112*67e74705SXin Li 
113*67e74705SXin Li // CHECK-LABEL: define <2 x i32> @test_vcvtm_s32_f32(<2 x float> %a) #0 {
114*67e74705SXin Li // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
115*67e74705SXin Li // CHECK:   [[VCVTM_S32_V_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x float>
116*67e74705SXin Li // CHECK:   [[VCVTM_S32_V1_I:%.*]] = call <2 x i32> @llvm.arm.neon.vcvtms.v2i32.v2f32(<2 x float> [[VCVTM_S32_V_I]]) #2
117*67e74705SXin Li // CHECK:   ret <2 x i32> [[VCVTM_S32_V1_I]]
test_vcvtm_s32_f32(float32x2_t a)118*67e74705SXin Li int32x2_t test_vcvtm_s32_f32(float32x2_t a) {
119*67e74705SXin Li   return vcvtm_s32_f32(a);
120*67e74705SXin Li }
121*67e74705SXin Li 
122*67e74705SXin Li // CHECK-LABEL: define <2 x i32> @test_vcvtm_u32_f32(<2 x float> %a) #0 {
123*67e74705SXin Li // CHECK:   [[TMP0:%.*]] = bitcast <2 x float> %a to <8 x i8>
124*67e74705SXin Li // CHECK:   [[VCVTM_U32_V_I:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x float>
125*67e74705SXin Li // CHECK:   [[VCVTM_U32_V1_I:%.*]] = call <2 x i32> @llvm.arm.neon.vcvtmu.v2i32.v2f32(<2 x float> [[VCVTM_U32_V_I]]) #2
126*67e74705SXin Li // CHECK:   ret <2 x i32> [[VCVTM_U32_V1_I]]
test_vcvtm_u32_f32(float32x2_t a)127*67e74705SXin Li uint32x2_t test_vcvtm_u32_f32(float32x2_t a) {
128*67e74705SXin Li   return vcvtm_u32_f32(a);
129*67e74705SXin Li }
130*67e74705SXin Li 
131*67e74705SXin Li // CHECK-LABEL: define <4 x i32> @test_vcvtmq_s32_f32(<4 x float> %a) #0 {
132*67e74705SXin Li // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
133*67e74705SXin Li // CHECK:   [[VCVTMQ_S32_V_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x float>
134*67e74705SXin Li // CHECK:   [[VCVTMQ_S32_V1_I:%.*]] = call <4 x i32> @llvm.arm.neon.vcvtms.v4i32.v4f32(<4 x float> [[VCVTMQ_S32_V_I]]) #2
135*67e74705SXin Li // CHECK:   ret <4 x i32> [[VCVTMQ_S32_V1_I]]
test_vcvtmq_s32_f32(float32x4_t a)136*67e74705SXin Li int32x4_t test_vcvtmq_s32_f32(float32x4_t a) {
137*67e74705SXin Li   return vcvtmq_s32_f32(a);
138*67e74705SXin Li }
139*67e74705SXin Li 
140*67e74705SXin Li // CHECK-LABEL: define <4 x i32> @test_vcvtmq_u32_f32(<4 x float> %a) #0 {
141*67e74705SXin Li // CHECK:   [[TMP0:%.*]] = bitcast <4 x float> %a to <16 x i8>
142*67e74705SXin Li // CHECK:   [[VCVTMQ_U32_V_I:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x float>
143*67e74705SXin Li // CHECK:   [[VCVTMQ_U32_V1_I:%.*]] = call <4 x i32> @llvm.arm.neon.vcvtmu.v4i32.v4f32(<4 x float> [[VCVTMQ_U32_V_I]]) #2
144*67e74705SXin Li // CHECK:   ret <4 x i32> [[VCVTMQ_U32_V1_I]]
test_vcvtmq_u32_f32(float32x4_t a)145*67e74705SXin Li uint32x4_t test_vcvtmq_u32_f32(float32x4_t a) {
146*67e74705SXin Li   return vcvtmq_u32_f32(a);
147*67e74705SXin Li }
148