xref: /aosp_15_r20/external/clang/test/CodeGen/arm-arguments.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // REQUIRES: arm-registered-target
2*67e74705SXin Li // RUN: %clang_cc1 -triple armv7-apple-darwin9 -target-feature +neon -target-abi apcs-gnu -emit-llvm -w -o - %s | FileCheck -check-prefix=APCS-GNU %s
3*67e74705SXin Li // RUN: %clang_cc1 -triple armv7-apple-darwin9 -target-feature +neon -target-abi aapcs -emit-llvm -w -o - %s | FileCheck -check-prefix=AAPCS %s
4*67e74705SXin Li 
5*67e74705SXin Li // APCS-GNU-LABEL: define signext i8 @f0()
6*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc signext i8 @f0()
f0(void)7*67e74705SXin Li char f0(void) {
8*67e74705SXin Li   return 0;
9*67e74705SXin Li }
10*67e74705SXin Li 
11*67e74705SXin Li // APCS-GNU-LABEL: define i8 @f1()
12*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc i8 @f1()
13*67e74705SXin Li struct s1 { char f0; };
f1(void)14*67e74705SXin Li struct s1 f1(void) {}
15*67e74705SXin Li 
16*67e74705SXin Li // APCS-GNU-LABEL: define i16 @f2()
17*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc i16 @f2()
18*67e74705SXin Li struct s2 { short f0; };
f2(void)19*67e74705SXin Li struct s2 f2(void) {}
20*67e74705SXin Li 
21*67e74705SXin Li // APCS-GNU-LABEL: define i32 @f3()
22*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc i32 @f3()
23*67e74705SXin Li struct s3 { int f0; };
f3(void)24*67e74705SXin Li struct s3 f3(void) {}
25*67e74705SXin Li 
26*67e74705SXin Li // APCS-GNU-LABEL: define i32 @f4()
27*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc i32 @f4()
28*67e74705SXin Li struct s4 { struct s4_0 { int f0; } f0; };
f4(void)29*67e74705SXin Li struct s4 f4(void) {}
30*67e74705SXin Li 
31*67e74705SXin Li // APCS-GNU-LABEL: define void @f5(
32*67e74705SXin Li // APCS-GNU: struct.s5* noalias sret
33*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc i32 @f5()
34*67e74705SXin Li struct s5 { struct { } f0; int f1; };
f5(void)35*67e74705SXin Li struct s5 f5(void) {}
36*67e74705SXin Li 
37*67e74705SXin Li // APCS-GNU-LABEL: define void @f6(
38*67e74705SXin Li // APCS-GNU: struct.s6* noalias sret
39*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc i32 @f6()
40*67e74705SXin Li struct s6 { int f0[1]; };
f6(void)41*67e74705SXin Li struct s6 f6(void) {}
42*67e74705SXin Li 
43*67e74705SXin Li // APCS-GNU-LABEL: define void @f7()
44*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc void @f7()
45*67e74705SXin Li struct s7 { struct { int : 0; } f0; };
f7(void)46*67e74705SXin Li struct s7 f7(void) {}
47*67e74705SXin Li 
48*67e74705SXin Li // APCS-GNU-LABEL: define void @f8(
49*67e74705SXin Li // APCS-GNU: struct.s8* noalias sret
50*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc void @f8()
51*67e74705SXin Li struct s8 { struct { int : 0; } f0[1]; };
f8(void)52*67e74705SXin Li struct s8 f8(void) {}
53*67e74705SXin Li 
54*67e74705SXin Li // APCS-GNU-LABEL: define i32 @f9()
55*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc i32 @f9()
56*67e74705SXin Li struct s9 { int f0; int : 0; };
f9(void)57*67e74705SXin Li struct s9 f9(void) {}
58*67e74705SXin Li 
59*67e74705SXin Li // APCS-GNU-LABEL: define i32 @f10()
60*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc i32 @f10()
61*67e74705SXin Li struct s10 { int f0; int : 0; int : 0; };
f10(void)62*67e74705SXin Li struct s10 f10(void) {}
63*67e74705SXin Li 
64*67e74705SXin Li // APCS-GNU-LABEL: define void @f11(
65*67e74705SXin Li // APCS-GNU: struct.s11* noalias sret
66*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc i32 @f11()
67*67e74705SXin Li struct s11 { int : 0; int f0; };
f11(void)68*67e74705SXin Li struct s11 f11(void) {}
69*67e74705SXin Li 
70*67e74705SXin Li // APCS-GNU-LABEL: define i32 @f12()
71*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc i32 @f12()
72*67e74705SXin Li union u12 { char f0; short f1; int f2; };
f12(void)73*67e74705SXin Li union u12 f12(void) {}
74*67e74705SXin Li 
75*67e74705SXin Li // APCS-GNU-LABEL: define void @f13(
76*67e74705SXin Li // APCS-GNU: struct.s13* noalias sret
77*67e74705SXin Li 
78*67e74705SXin Li // FIXME: This should return a float.
79*67e74705SXin Li // AAPCS-FIXME: darm_aapcscc efine float @f13()
80*67e74705SXin Li struct s13 { float f0; };
f13(void)81*67e74705SXin Li struct s13 f13(void) {}
82*67e74705SXin Li 
83*67e74705SXin Li // APCS-GNU-LABEL: define void @f14(
84*67e74705SXin Li // APCS-GNU: union.u14* noalias sret
85*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc i32 @f14()
86*67e74705SXin Li union u14 { float f0; };
f14(void)87*67e74705SXin Li union u14 f14(void) {}
88*67e74705SXin Li 
89*67e74705SXin Li // APCS-GNU-LABEL: define void @f15()
90*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc void @f15()
f15(struct s7 a0)91*67e74705SXin Li void f15(struct s7 a0) {}
92*67e74705SXin Li 
93*67e74705SXin Li // APCS-GNU-LABEL: define void @f16()
94*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc void @f16()
f16(struct s8 a0)95*67e74705SXin Li void f16(struct s8 a0) {}
96*67e74705SXin Li 
97*67e74705SXin Li // APCS-GNU-LABEL: define i32 @f17()
98*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc i32 @f17()
99*67e74705SXin Li struct s17 { short f0 : 13; char f1 : 4; };
f17(void)100*67e74705SXin Li struct s17 f17(void) {}
101*67e74705SXin Li 
102*67e74705SXin Li // APCS-GNU-LABEL: define i32 @f18()
103*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc i32 @f18()
104*67e74705SXin Li struct s18 { short f0; char f1 : 4; };
f18(void)105*67e74705SXin Li struct s18 f18(void) {}
106*67e74705SXin Li 
107*67e74705SXin Li // APCS-GNU-LABEL: define void @f19(
108*67e74705SXin Li // APCS-GNU: struct.s19* noalias sret
109*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc i32 @f19()
110*67e74705SXin Li struct s19 { int f0; struct s8 f1; };
f19(void)111*67e74705SXin Li struct s19 f19(void) {}
112*67e74705SXin Li 
113*67e74705SXin Li // APCS-GNU-LABEL: define void @f20(
114*67e74705SXin Li // APCS-GNU: struct.s20* noalias sret
115*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc i32 @f20()
116*67e74705SXin Li struct s20 { struct s8 f1; int f0; };
f20(void)117*67e74705SXin Li struct s20 f20(void) {}
118*67e74705SXin Li 
119*67e74705SXin Li // APCS-GNU-LABEL: define i8 @f21()
120*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc i32 @f21()
121*67e74705SXin Li struct s21 { struct {} f1; int f0 : 4; };
f21(void)122*67e74705SXin Li struct s21 f21(void) {}
123*67e74705SXin Li 
124*67e74705SXin Li // APCS-GNU-LABEL: define i16 @f22()
125*67e74705SXin Li // APCS-GNU-LABEL: define i32 @f23()
126*67e74705SXin Li // APCS-GNU-LABEL: define i64 @f24()
127*67e74705SXin Li // APCS-GNU-LABEL: define i128 @f25()
128*67e74705SXin Li // APCS-GNU-LABEL: define i64 @f26()
129*67e74705SXin Li // APCS-GNU-LABEL: define i128 @f27()
130*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc i16 @f22()
131*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc i32 @f23()
132*67e74705SXin Li // AAPCS: define arm_aapcscc void @f24({{.*}} noalias sret
133*67e74705SXin Li // AAPCS: define arm_aapcscc void @f25({{.*}} noalias sret
134*67e74705SXin Li // AAPCS: define arm_aapcscc void @f26({{.*}} noalias sret
135*67e74705SXin Li // AAPCS: define arm_aapcscc void @f27({{.*}} noalias sret
f22(void)136*67e74705SXin Li _Complex char       f22(void) {}
f23(void)137*67e74705SXin Li _Complex short      f23(void) {}
f24(void)138*67e74705SXin Li _Complex int        f24(void) {}
f25(void)139*67e74705SXin Li _Complex long long  f25(void) {}
f26(void)140*67e74705SXin Li _Complex float      f26(void) {}
f27(void)141*67e74705SXin Li _Complex double     f27(void) {}
142*67e74705SXin Li 
143*67e74705SXin Li // APCS-GNU-LABEL: define i16 @f28()
144*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc i16 @f28()
145*67e74705SXin Li struct s28 { _Complex char f0; };
f28()146*67e74705SXin Li struct s28 f28() {}
147*67e74705SXin Li 
148*67e74705SXin Li // APCS-GNU-LABEL: define i32 @f29()
149*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc i32 @f29()
150*67e74705SXin Li struct s29 { _Complex short f0; };
f29()151*67e74705SXin Li struct s29 f29() {}
152*67e74705SXin Li 
153*67e74705SXin Li // APCS-GNU: define void @f30({{.*}} noalias sret
154*67e74705SXin Li // AAPCS: define arm_aapcscc void @f30({{.*}} noalias sret
155*67e74705SXin Li struct s30 { _Complex int f0; };
f30()156*67e74705SXin Li struct s30 f30() {}
157*67e74705SXin Li 
158*67e74705SXin Li // PR11905
159*67e74705SXin Li struct s31 { char x; };
f31(struct s31 s)160*67e74705SXin Li void f31(struct s31 s) { }
161*67e74705SXin Li // AAPCS: @f31([1 x i32] %s.coerce)
162*67e74705SXin Li // AAPCS: %s = alloca %struct.s31, align 1
163*67e74705SXin Li // AAPCS: [[TEMP:%.*]] = alloca [1 x i32], align 4
164*67e74705SXin Li // AAPCS: store [1 x i32] %s.coerce, [1 x i32]* [[TEMP]], align 4
165*67e74705SXin Li // APCS-GNU: @f31([1 x i32] %s.coerce)
166*67e74705SXin Li // APCS-GNU: %s = alloca %struct.s31, align 1
167*67e74705SXin Li // APCS-GNU: [[TEMP:%.*]] = alloca [1 x i32], align 4
168*67e74705SXin Li // APCS-GNU: store [1 x i32] %s.coerce, [1 x i32]* [[TEMP]], align 4
169*67e74705SXin Li 
170*67e74705SXin Li // PR13562
171*67e74705SXin Li struct s32 { double x; };
f32(struct s32 s)172*67e74705SXin Li void f32(struct s32 s) { }
173*67e74705SXin Li // AAPCS: @f32([1 x i64] %s.coerce)
174*67e74705SXin Li // APCS-GNU: @f32([2 x i32] %s.coerce)
175*67e74705SXin Li 
176*67e74705SXin Li // PR13350
177*67e74705SXin Li struct s33 { char buf[32*32]; };
f33(struct s33 s)178*67e74705SXin Li void f33(struct s33 s) { }
179*67e74705SXin Li // APCS-GNU-LABEL: define void @f33(%struct.s33* byval align 4 %s)
180*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc void @f33(%struct.s33* byval align 4 %s)
181*67e74705SXin Li 
182*67e74705SXin Li // PR14048
183*67e74705SXin Li struct s34 { char c; };
184*67e74705SXin Li void f34(struct s34 s);
g34(struct s34 * s)185*67e74705SXin Li void g34(struct s34 *s) { f34(*s); }
186*67e74705SXin Li // AAPCS: @g34(%struct.s34* %s)
187*67e74705SXin Li // AAPCS: %[[a:.*]] = alloca [1 x i32]
188*67e74705SXin Li // AAPCS: load [1 x i32], [1 x i32]* %[[a]]
189*67e74705SXin Li 
190*67e74705SXin Li // rdar://12596507
191*67e74705SXin Li struct s35
192*67e74705SXin Li {
193*67e74705SXin Li    float v[18]; //make sure byval is on.
194*67e74705SXin Li } __attribute__((aligned(16)));
195*67e74705SXin Li typedef struct s35 s35_with_align;
196*67e74705SXin Li 
197*67e74705SXin Li typedef __attribute__((neon_vector_type(4))) float float32x4_t;
vaddq_f32(float32x4_t __a,float32x4_t __b)198*67e74705SXin Li static __attribute__((__always_inline__, __nodebug__)) float32x4_t vaddq_f32(
199*67e74705SXin Li        float32x4_t __a, float32x4_t __b) {
200*67e74705SXin Li  return __a + __b;
201*67e74705SXin Li }
f35(int i,s35_with_align s1,s35_with_align s2)202*67e74705SXin Li float32x4_t f35(int i, s35_with_align s1, s35_with_align s2) {
203*67e74705SXin Li   float32x4_t v = vaddq_f32(*(float32x4_t *)&s1,
204*67e74705SXin Li                             *(float32x4_t *)&s2);
205*67e74705SXin Li   return v;
206*67e74705SXin Li }
207*67e74705SXin Li // APCS-GNU-LABEL: define <4 x float> @f35(i32 %i, %struct.s35* byval align 4, %struct.s35* byval align 4)
208*67e74705SXin Li // APCS-GNU: %[[a:.*]] = alloca %struct.s35, align 16
209*67e74705SXin Li // APCS-GNU: %[[b:.*]] = bitcast %struct.s35* %[[a]] to i8*
210*67e74705SXin Li // APCS-GNU: %[[c:.*]] = bitcast %struct.s35* %0 to i8*
211*67e74705SXin Li // APCS-GNU: call void @llvm.memcpy.p0i8.p0i8.i32(i8* %[[b]], i8* %[[c]]
212*67e74705SXin Li // APCS-GNU: %[[d:.*]] = bitcast %struct.s35* %[[a]] to <4 x float>*
213*67e74705SXin Li // APCS-GNU: load <4 x float>, <4 x float>* %[[d]], align 16
214*67e74705SXin Li // AAPCS-LABEL: define arm_aapcscc <4 x float> @f35(i32 %i, %struct.s35* byval align 8, %struct.s35* byval align 8)
215*67e74705SXin Li // AAPCS: %[[a:.*]] = alloca %struct.s35, align 16
216*67e74705SXin Li // AAPCS: %[[b:.*]] = bitcast %struct.s35* %[[a]] to i8*
217*67e74705SXin Li // AAPCS: %[[c:.*]] = bitcast %struct.s35* %0 to i8*
218*67e74705SXin Li // AAPCS: call void @llvm.memcpy.p0i8.p0i8.i32(i8* %[[b]], i8* %[[c]]
219*67e74705SXin Li // AAPCS: %[[d:.*]] = bitcast %struct.s35* %[[a]] to <4 x float>*
220*67e74705SXin Li // AAPCS: load <4 x float>, <4 x float>* %[[d]], align 16
221