xref: /aosp_15_r20/external/clang/test/CodeGen/regparm-struct.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o - | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li __attribute__((regparm(3))) void f1(int a, int b, int c, int d);
4*67e74705SXin Li // CHECK: declare void @f1(i32 inreg, i32 inreg, i32 inreg, i32)
g1()5*67e74705SXin Li void g1() {
6*67e74705SXin Li   f1(41, 42, 43, 44);
7*67e74705SXin Li }
8*67e74705SXin Li 
9*67e74705SXin Li struct s1 {
10*67e74705SXin Li   int x1;
11*67e74705SXin Li };
12*67e74705SXin Li __attribute__((regparm(3))) void f2(int a, int b, struct s1 c, int d);
13*67e74705SXin Li // CHECK: declare void @f2(i32 inreg, i32 inreg, i32 inreg, i32)
g2()14*67e74705SXin Li void g2() {
15*67e74705SXin Li   struct s1 x = {43};
16*67e74705SXin Li   f2(41, 42, x, 44);
17*67e74705SXin Li }
18*67e74705SXin Li 
19*67e74705SXin Li struct s2 {
20*67e74705SXin Li   int x1;
21*67e74705SXin Li   int x2;
22*67e74705SXin Li };
23*67e74705SXin Li __attribute__((regparm(3))) void f3(int a, int b, struct s2 c, int d);
24*67e74705SXin Li // CHECK: declare void @f3(i32 inreg, i32 inreg, i32, i32, i32)
g3()25*67e74705SXin Li void g3() {
26*67e74705SXin Li   struct s2 x = {43, 44};
27*67e74705SXin Li   f3(41, 42, x, 45);
28*67e74705SXin Li }
29*67e74705SXin Li __attribute__((regparm(3))) void f4(int a, struct s2 b, int c);
30*67e74705SXin Li // CHECK: declare void @f4(i32 inreg, i32 inreg, i32 inreg, i32)
g4()31*67e74705SXin Li void g4() {
32*67e74705SXin Li   struct s2 x = {42, 43};
33*67e74705SXin Li   f4(41, x, 44);
34*67e74705SXin Li }
35*67e74705SXin Li 
36*67e74705SXin Li struct s3 {
37*67e74705SXin Li   int x1;
38*67e74705SXin Li   int x2;
39*67e74705SXin Li   int x3;
40*67e74705SXin Li };
41*67e74705SXin Li __attribute__((regparm(3))) void f5(int a, struct s3 b, int c);
42*67e74705SXin Li // CHECK: declare void @f5(i32 inreg, i32, i32, i32, i32)
g5()43*67e74705SXin Li void g5() {
44*67e74705SXin Li   struct s3 x = {42, 43, 44};
45*67e74705SXin Li   f5(41, x, 45);
46*67e74705SXin Li }
47*67e74705SXin Li __attribute__((regparm(3))) void f6(struct s3 a, int b);
48*67e74705SXin Li // CHECK: declare void @f6(i32 inreg, i32 inreg, i32 inreg, i32)
g6()49*67e74705SXin Li void g6() {
50*67e74705SXin Li   struct s3 x = {41, 42, 43};
51*67e74705SXin Li   f6(x, 44);
52*67e74705SXin Li }
53*67e74705SXin Li 
54*67e74705SXin Li struct s4 {
55*67e74705SXin Li   int x1;
56*67e74705SXin Li   int x2;
57*67e74705SXin Li   int x3;
58*67e74705SXin Li   int x4;
59*67e74705SXin Li };
60*67e74705SXin Li __attribute__((regparm(3))) void f7(struct s4 a, int b);
61*67e74705SXin Li // CHECK: declare void @f7(i32, i32, i32, i32, i32)
g7()62*67e74705SXin Li void g7() {
63*67e74705SXin Li   struct s4 x = {41, 42, 43, 44};
64*67e74705SXin Li   f7(x, 45);
65*67e74705SXin Li }
66*67e74705SXin Li 
67*67e74705SXin Li __attribute__((regparm(3))) void f8(float a, int b);
68*67e74705SXin Li // CHECK: declare void @f8(float, i32 inreg)
g8(void)69*67e74705SXin Li void g8(void) {
70*67e74705SXin Li   f8(41, 42);
71*67e74705SXin Li }
72*67e74705SXin Li 
73*67e74705SXin Li struct s5 {
74*67e74705SXin Li   float x1;
75*67e74705SXin Li };
76*67e74705SXin Li __attribute__((regparm(3))) void f9(struct s5 a, int b);
77*67e74705SXin Li // CHECK: declare void @f9(float, i32 inreg)
g9(void)78*67e74705SXin Li void g9(void) {
79*67e74705SXin Li   struct s5 x = {41};
80*67e74705SXin Li   f9(x, 42);
81*67e74705SXin Li }
82*67e74705SXin Li 
83*67e74705SXin Li struct s6 {
84*67e74705SXin Li   float x1;
85*67e74705SXin Li   int x2;
86*67e74705SXin Li };
87*67e74705SXin Li __attribute__((regparm(3))) void f10(struct s6 a, int b);
88*67e74705SXin Li // CHECK: declare void @f10(i32 inreg, i32 inreg, i32 inreg)
g10(void)89*67e74705SXin Li void g10(void) {
90*67e74705SXin Li   struct s6 x = {41, 42};
91*67e74705SXin Li   f10(x, 43);
92*67e74705SXin Li }
93*67e74705SXin Li 
94*67e74705SXin Li struct s7 {
95*67e74705SXin Li   float x1;
96*67e74705SXin Li   int x2;
97*67e74705SXin Li   float x3;
98*67e74705SXin Li };
99*67e74705SXin Li __attribute__((regparm(3))) void f11(struct s7 a, int b);
100*67e74705SXin Li // CHECK: declare void @f11(i32 inreg, i32 inreg, i32 inreg, i32)
g11(void)101*67e74705SXin Li void g11(void) {
102*67e74705SXin Li   struct s7 x = {41, 42, 43};
103*67e74705SXin Li   f11(x, 44);
104*67e74705SXin Li }
105*67e74705SXin Li 
106*67e74705SXin Li struct s8 {
107*67e74705SXin Li   float x1;
108*67e74705SXin Li   float x2;
109*67e74705SXin Li };
110*67e74705SXin Li __attribute__((regparm(3))) void f12(struct s8 a, int b);
111*67e74705SXin Li // CHECK: declare void @f12(i32 inreg, i32 inreg, i32 inreg)
g12(void)112*67e74705SXin Li void g12(void) {
113*67e74705SXin Li   struct s8 x = {41, 42};
114*67e74705SXin Li   f12(x, 43);
115*67e74705SXin Li }
116*67e74705SXin Li 
117*67e74705SXin Li struct s9 {
118*67e74705SXin Li   float x1;
119*67e74705SXin Li   float x2;
120*67e74705SXin Li   float x3;
121*67e74705SXin Li };
122*67e74705SXin Li __attribute__((regparm(3))) void f13(struct s9 a, int b);
123*67e74705SXin Li // CHECK: declare void @f13(i32 inreg, i32 inreg, i32 inreg, i32)
g13(void)124*67e74705SXin Li void g13(void) {
125*67e74705SXin Li   struct s9 x = {41, 42, 43};
126*67e74705SXin Li   f13(x, 44);
127*67e74705SXin Li }
128*67e74705SXin Li 
129*67e74705SXin Li struct s10 {
130*67e74705SXin Li   double x1;
131*67e74705SXin Li };
132*67e74705SXin Li __attribute__((regparm(3))) void f14(struct s10 a, int b, int c);
133*67e74705SXin Li // CHECK: declare void @f14(double, i32 inreg, i32 inreg)
g14(void)134*67e74705SXin Li void g14(void) {
135*67e74705SXin Li   struct s10 x = { 41 };
136*67e74705SXin Li   f14(x, 42, 43);
137*67e74705SXin Li }
138*67e74705SXin Li 
139*67e74705SXin Li struct s11 {
140*67e74705SXin Li   double x1;
141*67e74705SXin Li   double x2;
142*67e74705SXin Li };
143*67e74705SXin Li __attribute__((regparm(3))) void f15(struct s11 a, int b);
144*67e74705SXin Li // CHECK: declare void @f15(double, double, i32)
g15(void)145*67e74705SXin Li void g15(void) {
146*67e74705SXin Li   struct s11 x = { 41, 42 };
147*67e74705SXin Li   f15(x, 43);
148*67e74705SXin Li }
149*67e74705SXin Li 
150*67e74705SXin Li struct s12 {
151*67e74705SXin Li   double x1;
152*67e74705SXin Li   float x2;
153*67e74705SXin Li };
154*67e74705SXin Li __attribute__((regparm(3))) void f16(struct s12 a, int b);
155*67e74705SXin Li // CHECK: declare void @f16(i32 inreg, i32 inreg, i32 inreg, i32)
g16(void)156*67e74705SXin Li void g16(void) {
157*67e74705SXin Li   struct s12 x = { 41, 42 };
158*67e74705SXin Li   f16(x, 43);
159*67e74705SXin Li }
160*67e74705SXin Li 
161*67e74705SXin Li __attribute__((regparm(3))) struct s12 f17(int a, int b, int c);
162*67e74705SXin Li // CHECK: declare void @f17(%struct.s12* inreg sret, i32 inreg, i32 inreg, i32)
g17(void)163*67e74705SXin Li void g17(void) {
164*67e74705SXin Li   f17(41, 42, 43);
165*67e74705SXin Li }
166*67e74705SXin Li 
167*67e74705SXin Li struct s13 {
168*67e74705SXin Li   struct inner {
169*67e74705SXin Li     float x;
170*67e74705SXin Li   } y;
171*67e74705SXin Li };
172*67e74705SXin Li __attribute__((regparm(3))) void f18(struct s13 a, int b, int c, int d);
173*67e74705SXin Li // CHECK: declare void @f18(%struct.s13* byval align 4, i32 inreg, i32 inreg, i32 inreg)
g18(void)174*67e74705SXin Li void g18(void) {
175*67e74705SXin Li   struct s13 x = {{41}};
176*67e74705SXin Li   f18(x, 42, 43, 44);
177*67e74705SXin Li }
178