xref: /aosp_15_r20/external/clang/test/CodeGen/aarch64-neon-vget-hilo.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple arm64-none-linux-gnu -target-feature +neon \
2*67e74705SXin Li // RUN:  -fallow-half-arguments-and-returns -emit-llvm -o - %s \
3*67e74705SXin Li // RUN: | opt -S -mem2reg | FileCheck %s
4*67e74705SXin Li // Test new aarch64 intrinsics and types
5*67e74705SXin Li 
6*67e74705SXin Li #include <arm_neon.h>
7*67e74705SXin Li 
8*67e74705SXin Li // CHECK-LABEL: define <8 x i8> @test_vget_high_s8(<16 x i8> %a) #0 {
9*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <16 x i8> %a, <16 x i8> %a, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
10*67e74705SXin Li // CHECK:   ret <8 x i8> [[SHUFFLE_I]]
test_vget_high_s8(int8x16_t a)11*67e74705SXin Li int8x8_t test_vget_high_s8(int8x16_t a) {
12*67e74705SXin Li   return vget_high_s8(a);
13*67e74705SXin Li }
14*67e74705SXin Li 
15*67e74705SXin Li // CHECK-LABEL: define <4 x i16> @test_vget_high_s16(<8 x i16> %a) #0 {
16*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i16> %a, <8 x i16> %a, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
17*67e74705SXin Li // CHECK:   ret <4 x i16> [[SHUFFLE_I]]
test_vget_high_s16(int16x8_t a)18*67e74705SXin Li int16x4_t test_vget_high_s16(int16x8_t a) {
19*67e74705SXin Li   return vget_high_s16(a);
20*67e74705SXin Li }
21*67e74705SXin Li 
22*67e74705SXin Li // CHECK-LABEL: define <2 x i32> @test_vget_high_s32(<4 x i32> %a) #0 {
23*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <4 x i32> %a, <4 x i32> %a, <2 x i32> <i32 2, i32 3>
24*67e74705SXin Li // CHECK:   ret <2 x i32> [[SHUFFLE_I]]
test_vget_high_s32(int32x4_t a)25*67e74705SXin Li int32x2_t test_vget_high_s32(int32x4_t a) {
26*67e74705SXin Li   return vget_high_s32(a);
27*67e74705SXin Li }
28*67e74705SXin Li 
29*67e74705SXin Li // CHECK-LABEL: define <1 x i64> @test_vget_high_s64(<2 x i64> %a) #0 {
30*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <2 x i64> %a, <2 x i64> %a, <1 x i32> <i32 1>
31*67e74705SXin Li // CHECK:   ret <1 x i64> [[SHUFFLE_I]]
test_vget_high_s64(int64x2_t a)32*67e74705SXin Li int64x1_t test_vget_high_s64(int64x2_t a) {
33*67e74705SXin Li   return vget_high_s64(a);
34*67e74705SXin Li }
35*67e74705SXin Li 
36*67e74705SXin Li // CHECK-LABEL: define <8 x i8> @test_vget_high_u8(<16 x i8> %a) #0 {
37*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <16 x i8> %a, <16 x i8> %a, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
38*67e74705SXin Li // CHECK:   ret <8 x i8> [[SHUFFLE_I]]
test_vget_high_u8(uint8x16_t a)39*67e74705SXin Li uint8x8_t test_vget_high_u8(uint8x16_t a) {
40*67e74705SXin Li   return vget_high_u8(a);
41*67e74705SXin Li }
42*67e74705SXin Li 
43*67e74705SXin Li // CHECK-LABEL: define <4 x i16> @test_vget_high_u16(<8 x i16> %a) #0 {
44*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i16> %a, <8 x i16> %a, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
45*67e74705SXin Li // CHECK:   ret <4 x i16> [[SHUFFLE_I]]
test_vget_high_u16(uint16x8_t a)46*67e74705SXin Li uint16x4_t test_vget_high_u16(uint16x8_t a) {
47*67e74705SXin Li   return vget_high_u16(a);
48*67e74705SXin Li }
49*67e74705SXin Li 
50*67e74705SXin Li // CHECK-LABEL: define <2 x i32> @test_vget_high_u32(<4 x i32> %a) #0 {
51*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <4 x i32> %a, <4 x i32> %a, <2 x i32> <i32 2, i32 3>
52*67e74705SXin Li // CHECK:   ret <2 x i32> [[SHUFFLE_I]]
test_vget_high_u32(uint32x4_t a)53*67e74705SXin Li uint32x2_t test_vget_high_u32(uint32x4_t a) {
54*67e74705SXin Li   return vget_high_u32(a);
55*67e74705SXin Li }
56*67e74705SXin Li 
57*67e74705SXin Li // CHECK-LABEL: define <1 x i64> @test_vget_high_u64(<2 x i64> %a) #0 {
58*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <2 x i64> %a, <2 x i64> %a, <1 x i32> <i32 1>
59*67e74705SXin Li // CHECK:   ret <1 x i64> [[SHUFFLE_I]]
test_vget_high_u64(uint64x2_t a)60*67e74705SXin Li uint64x1_t test_vget_high_u64(uint64x2_t a) {
61*67e74705SXin Li   return vget_high_u64(a);
62*67e74705SXin Li }
63*67e74705SXin Li 
64*67e74705SXin Li // CHECK-LABEL: define <1 x i64> @test_vget_high_p64(<2 x i64> %a) #0 {
65*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <2 x i64> %a, <2 x i64> %a, <1 x i32> <i32 1>
66*67e74705SXin Li // CHECK:   ret <1 x i64> [[SHUFFLE_I]]
test_vget_high_p64(poly64x2_t a)67*67e74705SXin Li poly64x1_t test_vget_high_p64(poly64x2_t a) {
68*67e74705SXin Li   return vget_high_p64(a);
69*67e74705SXin Li }
70*67e74705SXin Li 
71*67e74705SXin Li // CHECK-LABEL: define <4 x half> @test_vget_high_f16(<8 x half> %a) #0 {
72*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x half> %a, <8 x half> %a, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
73*67e74705SXin Li // CHECK:   ret <4 x half> [[SHUFFLE_I]]
test_vget_high_f16(float16x8_t a)74*67e74705SXin Li float16x4_t test_vget_high_f16(float16x8_t a) {
75*67e74705SXin Li   return vget_high_f16(a);
76*67e74705SXin Li }
77*67e74705SXin Li 
78*67e74705SXin Li // CHECK-LABEL: define <2 x float> @test_vget_high_f32(<4 x float> %a) #0 {
79*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <4 x float> %a, <4 x float> %a, <2 x i32> <i32 2, i32 3>
80*67e74705SXin Li // CHECK:   ret <2 x float> [[SHUFFLE_I]]
test_vget_high_f32(float32x4_t a)81*67e74705SXin Li float32x2_t test_vget_high_f32(float32x4_t a) {
82*67e74705SXin Li   return vget_high_f32(a);
83*67e74705SXin Li }
84*67e74705SXin Li 
85*67e74705SXin Li // CHECK-LABEL: define <8 x i8> @test_vget_high_p8(<16 x i8> %a) #0 {
86*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <16 x i8> %a, <16 x i8> %a, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
87*67e74705SXin Li // CHECK:   ret <8 x i8> [[SHUFFLE_I]]
test_vget_high_p8(poly8x16_t a)88*67e74705SXin Li poly8x8_t test_vget_high_p8(poly8x16_t a) {
89*67e74705SXin Li   return vget_high_p8(a);
90*67e74705SXin Li }
91*67e74705SXin Li 
92*67e74705SXin Li // CHECK-LABEL: define <4 x i16> @test_vget_high_p16(<8 x i16> %a) #0 {
93*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i16> %a, <8 x i16> %a, <4 x i32> <i32 4, i32 5, i32 6, i32 7>
94*67e74705SXin Li // CHECK:   ret <4 x i16> [[SHUFFLE_I]]
test_vget_high_p16(poly16x8_t a)95*67e74705SXin Li poly16x4_t test_vget_high_p16(poly16x8_t a) {
96*67e74705SXin Li   return vget_high_p16(a);
97*67e74705SXin Li }
98*67e74705SXin Li 
99*67e74705SXin Li // CHECK-LABEL: define <1 x double> @test_vget_high_f64(<2 x double> %a) #0 {
100*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <2 x double> %a, <2 x double> %a, <1 x i32> <i32 1>
101*67e74705SXin Li // CHECK:   ret <1 x double> [[SHUFFLE_I]]
test_vget_high_f64(float64x2_t a)102*67e74705SXin Li float64x1_t test_vget_high_f64(float64x2_t a) {
103*67e74705SXin Li   return vget_high_f64(a);
104*67e74705SXin Li }
105*67e74705SXin Li 
106*67e74705SXin Li // CHECK-LABEL: define <8 x i8> @test_vget_low_s8(<16 x i8> %a) #0 {
107*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <16 x i8> %a, <16 x i8> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
108*67e74705SXin Li // CHECK:   ret <8 x i8> [[SHUFFLE_I]]
test_vget_low_s8(int8x16_t a)109*67e74705SXin Li int8x8_t test_vget_low_s8(int8x16_t a) {
110*67e74705SXin Li   return vget_low_s8(a);
111*67e74705SXin Li }
112*67e74705SXin Li 
113*67e74705SXin Li // CHECK-LABEL: define <4 x i16> @test_vget_low_s16(<8 x i16> %a) #0 {
114*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i16> %a, <8 x i16> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
115*67e74705SXin Li // CHECK:   ret <4 x i16> [[SHUFFLE_I]]
test_vget_low_s16(int16x8_t a)116*67e74705SXin Li int16x4_t test_vget_low_s16(int16x8_t a) {
117*67e74705SXin Li   return vget_low_s16(a);
118*67e74705SXin Li }
119*67e74705SXin Li 
120*67e74705SXin Li // CHECK-LABEL: define <2 x i32> @test_vget_low_s32(<4 x i32> %a) #0 {
121*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <4 x i32> %a, <4 x i32> %a, <2 x i32> <i32 0, i32 1>
122*67e74705SXin Li // CHECK:   ret <2 x i32> [[SHUFFLE_I]]
test_vget_low_s32(int32x4_t a)123*67e74705SXin Li int32x2_t test_vget_low_s32(int32x4_t a) {
124*67e74705SXin Li   return vget_low_s32(a);
125*67e74705SXin Li }
126*67e74705SXin Li 
127*67e74705SXin Li // CHECK-LABEL: define <1 x i64> @test_vget_low_s64(<2 x i64> %a) #0 {
128*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <2 x i64> %a, <2 x i64> %a, <1 x i32> zeroinitializer
129*67e74705SXin Li // CHECK:   ret <1 x i64> [[SHUFFLE_I]]
test_vget_low_s64(int64x2_t a)130*67e74705SXin Li int64x1_t test_vget_low_s64(int64x2_t a) {
131*67e74705SXin Li   return vget_low_s64(a);
132*67e74705SXin Li }
133*67e74705SXin Li 
134*67e74705SXin Li // CHECK-LABEL: define <8 x i8> @test_vget_low_u8(<16 x i8> %a) #0 {
135*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <16 x i8> %a, <16 x i8> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
136*67e74705SXin Li // CHECK:   ret <8 x i8> [[SHUFFLE_I]]
test_vget_low_u8(uint8x16_t a)137*67e74705SXin Li uint8x8_t test_vget_low_u8(uint8x16_t a) {
138*67e74705SXin Li   return vget_low_u8(a);
139*67e74705SXin Li }
140*67e74705SXin Li 
141*67e74705SXin Li // CHECK-LABEL: define <4 x i16> @test_vget_low_u16(<8 x i16> %a) #0 {
142*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i16> %a, <8 x i16> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
143*67e74705SXin Li // CHECK:   ret <4 x i16> [[SHUFFLE_I]]
test_vget_low_u16(uint16x8_t a)144*67e74705SXin Li uint16x4_t test_vget_low_u16(uint16x8_t a) {
145*67e74705SXin Li   return vget_low_u16(a);
146*67e74705SXin Li }
147*67e74705SXin Li 
148*67e74705SXin Li // CHECK-LABEL: define <2 x i32> @test_vget_low_u32(<4 x i32> %a) #0 {
149*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <4 x i32> %a, <4 x i32> %a, <2 x i32> <i32 0, i32 1>
150*67e74705SXin Li // CHECK:   ret <2 x i32> [[SHUFFLE_I]]
test_vget_low_u32(uint32x4_t a)151*67e74705SXin Li uint32x2_t test_vget_low_u32(uint32x4_t a) {
152*67e74705SXin Li   return vget_low_u32(a);
153*67e74705SXin Li }
154*67e74705SXin Li 
155*67e74705SXin Li // CHECK-LABEL: define <1 x i64> @test_vget_low_u64(<2 x i64> %a) #0 {
156*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <2 x i64> %a, <2 x i64> %a, <1 x i32> zeroinitializer
157*67e74705SXin Li // CHECK:   ret <1 x i64> [[SHUFFLE_I]]
test_vget_low_u64(uint64x2_t a)158*67e74705SXin Li uint64x1_t test_vget_low_u64(uint64x2_t a) {
159*67e74705SXin Li   return vget_low_u64(a);
160*67e74705SXin Li }
161*67e74705SXin Li 
162*67e74705SXin Li // CHECK-LABEL: define <1 x i64> @test_vget_low_p64(<2 x i64> %a) #0 {
163*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <2 x i64> %a, <2 x i64> %a, <1 x i32> zeroinitializer
164*67e74705SXin Li // CHECK:   ret <1 x i64> [[SHUFFLE_I]]
test_vget_low_p64(poly64x2_t a)165*67e74705SXin Li poly64x1_t test_vget_low_p64(poly64x2_t a) {
166*67e74705SXin Li   return vget_low_p64(a);
167*67e74705SXin Li }
168*67e74705SXin Li 
169*67e74705SXin Li // CHECK-LABEL: define <4 x half> @test_vget_low_f16(<8 x half> %a) #0 {
170*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x half> %a, <8 x half> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
171*67e74705SXin Li // CHECK:   ret <4 x half> [[SHUFFLE_I]]
test_vget_low_f16(float16x8_t a)172*67e74705SXin Li float16x4_t test_vget_low_f16(float16x8_t a) {
173*67e74705SXin Li   return vget_low_f16(a);
174*67e74705SXin Li }
175*67e74705SXin Li 
176*67e74705SXin Li // CHECK-LABEL: define <2 x float> @test_vget_low_f32(<4 x float> %a) #0 {
177*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <4 x float> %a, <4 x float> %a, <2 x i32> <i32 0, i32 1>
178*67e74705SXin Li // CHECK:   ret <2 x float> [[SHUFFLE_I]]
test_vget_low_f32(float32x4_t a)179*67e74705SXin Li float32x2_t test_vget_low_f32(float32x4_t a) {
180*67e74705SXin Li   return vget_low_f32(a);
181*67e74705SXin Li }
182*67e74705SXin Li 
183*67e74705SXin Li // CHECK-LABEL: define <8 x i8> @test_vget_low_p8(<16 x i8> %a) #0 {
184*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <16 x i8> %a, <16 x i8> %a, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
185*67e74705SXin Li // CHECK:   ret <8 x i8> [[SHUFFLE_I]]
test_vget_low_p8(poly8x16_t a)186*67e74705SXin Li poly8x8_t test_vget_low_p8(poly8x16_t a) {
187*67e74705SXin Li   return vget_low_p8(a);
188*67e74705SXin Li }
189*67e74705SXin Li 
190*67e74705SXin Li // CHECK-LABEL: define <4 x i16> @test_vget_low_p16(<8 x i16> %a) #0 {
191*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <8 x i16> %a, <8 x i16> %a, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
192*67e74705SXin Li // CHECK:   ret <4 x i16> [[SHUFFLE_I]]
test_vget_low_p16(poly16x8_t a)193*67e74705SXin Li poly16x4_t test_vget_low_p16(poly16x8_t a) {
194*67e74705SXin Li   return vget_low_p16(a);
195*67e74705SXin Li }
196*67e74705SXin Li 
197*67e74705SXin Li // CHECK-LABEL: define <1 x double> @test_vget_low_f64(<2 x double> %a) #0 {
198*67e74705SXin Li // CHECK:   [[SHUFFLE_I:%.*]] = shufflevector <2 x double> %a, <2 x double> %a, <1 x i32> zeroinitializer
199*67e74705SXin Li // CHECK:   ret <1 x double> [[SHUFFLE_I]]
test_vget_low_f64(float64x2_t a)200*67e74705SXin Li float64x1_t test_vget_low_f64(float64x2_t a) {
201*67e74705SXin Li   return vget_low_f64(a);
202*67e74705SXin Li }
203*67e74705SXin Li 
204