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