1 ; RUN: llc < %s -mtriple=i386-pc-win32 -mattr=+sse | FileCheck --check-prefix=WIN32 %s
2 ; RUN: llc < %s -mtriple=x86_64-win32 -mattr=+sse | FileCheck --check-prefix=WIN64 %s
3 ; RUN: llc < %s -mtriple=x86_64-linux-gnu -mattr=+sse | FileCheck --check-prefix=LINUXOSX %s
5 ; WIN32-LABEL: test_argReti1:
9 ; WIN64-LABEL: test_argReti1:
13 ; Test regcall when receiving/returning i1
14 define x86_regcallcc i1 @test_argReti1(i1 %a) {
19 ; WIN32-LABEL: test_CallargReti1:
20 ; WIN32: movzbl %al, %eax
21 ; WIN32: call{{.*}} {{.*}}test_argReti1
25 ; WIN64-LABEL: test_CallargReti1:
26 ; WIN64: movzbl %al, %eax
27 ; WIN64: call{{.*}} {{.*}}test_argReti1
31 ; Test regcall when passing/retrieving i1
32 define x86_regcallcc i1 @test_CallargReti1(i1 %a) {
34 %c = call x86_regcallcc i1 @test_argReti1(i1 %b)
39 ; WIN64-LABEL: testf32_inp
40 ; WIN64: movaps {{%xmm(1[2-5])}}, {{.*(%r(b|s)p).*}} {{#+}} 16-byte Spill
41 ; WIN64: movaps {{%xmm(1[2-5])}}, {{.*(%r(b|s)p).*}} {{#+}} 16-byte Spill
42 ; WIN64: movaps {{%xmm(1[2-5])}}, {{.*(%r(b|s)p).*}} {{#+}} 16-byte Spill
43 ; WIN64: movaps {{%xmm(1[2-5])}}, {{.*(%r(b|s)p).*}} {{#+}} 16-byte Spill
44 ; WIN64: {{.*}} {{%xmm([0-9]|1[0-1])}}, {{%xmm(1[2-5])}}
45 ; WIN64: {{.*}} {{%xmm([0-9]|1[0-1])}}, {{%xmm(1[2-5])}}
46 ; WIN64: {{.*}} {{%xmm([0-9]|1[0-1])}}, {{%xmm(1[2-5])}}
47 ; WIN64: {{.*}} {{%xmm([0-9]|1[0-1])}}, {{%xmm(1[2-5])}}
48 ; WIN64: movaps {{.*(%r(b|s)p).*}}, {{%xmm(1[2-5])}} {{#+}} 16-byte Reload
49 ; WIN64: movaps {{.*(%r(b|s)p).*}}, {{%xmm(1[2-5])}} {{#+}} 16-byte Reload
50 ; WIN64: movaps {{.*(%r(b|s)p).*}}, {{%xmm(1[2-5])}} {{#+}} 16-byte Reload
51 ; WIN64: movaps {{.*(%r(b|s)p).*}}, {{%xmm(1[2-5])}} {{#+}} 16-byte Reload
54 ; WIN32-LABEL: testf32_inp
55 ; WIN32: movaps {{%xmm([0-7])}}, {{.*(%e(b|s)p).*}} {{#+}} 16-byte Spill
56 ; WIN32: {{.*}} {{%xmm[0-7]}}, {{%xmm[4-7]}}
57 ; WIN32: {{.*}} {{%xmm[0-7]}}, {{%xmm[4-7]}}
58 ; WIN32: {{.*}} {{%xmm[0-7]}}, {{%xmm[4-7]}}
59 ; WIN32: {{.*}} {{%xmm[0-7]}}, {{%xmm[4-7]}}
60 ; WIN32: movaps {{.*(%e(b|s)p).*}}, {{%xmm([0-7])}} {{#+}} 16-byte Reload
63 ; LINUXOSX-LABEL: testf32_inp
64 ; LINUXOSX: movaps {{%xmm(1[2-5])}}, {{.*(%r(b|s)p).*}} {{#+}} 16-byte Spill
65 ; LINUXOSX: movaps {{%xmm(1[2-5])}}, {{.*(%r(b|s)p).*}} {{#+}} 16-byte Spill
66 ; LINUXOSX: movaps {{%xmm(1[2-5])}}, {{.*(%r(b|s)p).*}} {{#+}} 16-byte Spill
67 ; LINUXOSX: movaps {{%xmm(1[2-5])}}, {{.*(%r(b|s)p).*}} {{#+}} 16-byte Spill
68 ; LINUXOSX: {{.*}} {{%xmm([0-9]|1[0-1])}}, {{%xmm(1[2-5])}}
69 ; LINUXOSX: {{.*}} {{%xmm([0-9]|1[0-1])}}, {{%xmm(1[2-5])}}
70 ; LINUXOSX: {{.*}} {{%xmm([0-9]|1[0-1])}}, {{%xmm(1[2-5])}}
71 ; LINUXOSX: {{.*}} {{%xmm([0-9]|1[0-1])}}, {{%xmm(1[2-5])}}
72 ; LINUXOSX: movaps {{.*(%r(b|s)p).*}}, {{%xmm(1[2-5])}} {{#+}} 16-byte Reload
73 ; LINUXOSX: movaps {{.*(%r(b|s)p).*}}, {{%xmm(1[2-5])}} {{#+}} 16-byte Reload
74 ; LINUXOSX: movaps {{.*(%r(b|s)p).*}}, {{%xmm(1[2-5])}} {{#+}} 16-byte Reload
75 ; LINUXOSX: movaps {{.*(%r(b|s)p).*}}, {{%xmm(1[2-5])}} {{#+}} 16-byte Reload
78 ;test calling conventions - input parameters, callee saved xmms
79 define x86_regcallcc <16 x float> @testf32_inp(<16 x float> %a, <16 x float> %b, <16 x float> %c) nounwind {
80 %x1 = fadd <16 x float> %a, %b
81 %x2 = fmul <16 x float> %a, %b
82 %x3 = fsub <16 x float> %x1, %x2
83 %x4 = fadd <16 x float> %x3, %c
87 ; WIN32-LABEL: testi32_inp
88 ; WIN32: pushl {{%e(si|di|bx|bp)}}
89 ; WIN32: pushl {{%e(si|di|bx|bp)}}
90 ; WIN32: popl {{%e(si|di|bx|bp)}}
91 ; WIN32: popl {{%e(si|di|bx|bp)}}
94 ; WIN64-LABEL: testi32_inp
95 ; WIN64: pushq {{%r(bp|bx|1[0-5])}}
96 ; WIN64: pushq {{%r(bp|bx|1[0-5])}}
97 ; WIN64: pushq {{%r(bp|bx|1[0-5])}}
98 ; WIN64: popq {{%r(bp|bx|1[0-5])}}
99 ; WIN64: popq {{%r(bp|bx|1[0-5])}}
100 ; WIN64: popq {{%r(bp|bx|1[0-5])}}
103 ; LINUXOSX-LABEL: testi32_inp
104 ; LINUXOSX: pushq {{%r(bp|bx|1[2-5])}}
105 ; LINUXOSX: pushq {{%r(bp|bx|1[2-5])}}
106 ; LINUXOSX: popq {{%r(bp|bx|1[2-5])}}
107 ; LINUXOSX: popq {{%r(bp|bx|1[2-5])}}
110 ;test calling conventions - input parameters, callee saved GPRs
111 define x86_regcallcc i32 @testi32_inp(i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6,
112 i32 %b1, i32 %b2, i32 %b3, i32 %b4, i32 %b5, i32 %b6) nounwind {
113 %x1 = sub i32 %a1, %a2
114 %x2 = sub i32 %a3, %a4
115 %x3 = sub i32 %a5, %a6
116 %y1 = sub i32 %b1, %b2
117 %y2 = sub i32 %b3, %b4
118 %y3 = sub i32 %b5, %b6
119 %v1 = add i32 %a1, %a2
120 %v2 = add i32 %a3, %a4
121 %v3 = add i32 %a5, %a6
122 %w1 = add i32 %b1, %b2
123 %w2 = add i32 %b3, %b4
124 %w3 = add i32 %b5, %b6
125 %s1 = mul i32 %x1, %y1
126 %s2 = mul i32 %x2, %y2
127 %s3 = mul i32 %x3, %y3
128 %t1 = mul i32 %v1, %w1
129 %t2 = mul i32 %v2, %w2
130 %t3 = mul i32 %v3, %w3
131 %m1 = add i32 %s1, %s2
132 %m2 = add i32 %m1, %s3
133 %n1 = add i32 %t1, %t2
134 %n2 = add i32 %n1, %t3
135 %r1 = add i32 %m2, %n2
140 ; X32: movaps {{%xmm([0-7])}}, {{(-*[0-9])+}}(%ebp)
141 ; X32: movaps {{%xmm([0-7])}}, {{(-*[0-9])+}}(%ebp)
142 ; X32: movaps {{%xmm([0-7])}}, {{(-*[0-9])+}}(%ebp)
143 ; X32: movaps {{%xmm([0-7])}}, {{(-*[0-9])+}}(%ebp)
144 ; X32: addps {{([0-9])+}}(%ebp), {{%xmm([0-7])}}
145 ; X32: addps {{([0-9])+}}(%ebp), {{%xmm([0-7])}}
146 ; X32: addps {{([0-9])+}}(%ebp), {{%xmm([0-7])}}
147 ; X32: addps {{([0-9])+}}(%ebp), {{%xmm([0-7])}}
148 ; X32: addps {{([0-9])+}}(%ebp), {{%xmm([0-7])}}
149 ; X32: addps {{([0-9])+}}(%ebp), {{%xmm([0-7])}}
150 ; X32: addps {{([0-9])+}}(%ebp), {{%xmm([0-7])}}
151 ; X32: addps {{([0-9])+}}(%ebp), {{%xmm([0-7])}}
152 ; X32: addps {{([0-9])+}}(%ebp), {{%xmm([0-7])}}
153 ; X32: addps {{([0-9])+}}(%ebp), {{%xmm([0-7])}}
154 ; X32: addps {{([0-9])+}}(%ebp), {{%xmm([0-7])}}
155 ; X32: addps {{([0-9])+}}(%ebp), {{%xmm([0-7])}}
156 ; X32: addps {{([0-9])+}}(%ebp), {{%xmm([0-7])}}
157 ; X32: addps {{([0-9])+}}(%ebp), {{%xmm([0-7])}}
158 ; X32: addps {{([0-9])+}}(%ebp), {{%xmm([0-7])}}
159 ; X32: addps {{([0-9])+}}(%ebp), {{%xmm([0-7])}}
160 ; X32: movaps {{(-*[0-9])+}}(%ebp), {{%xmm([0-7])}}
161 ; X32: movaps {{(-*[0-9])+}}(%ebp), {{%xmm([0-7])}}
162 ; X32: movaps {{(-*[0-9])+}}(%ebp), {{%xmm([0-7])}}
163 ; X32: movaps {{(-*[0-9])+}}(%ebp), {{%xmm([0-7])}}
165 ; LINUXOSX: testf32_stack
166 ; LINUXOSX: addps {{%xmm([0-9]+)}}, {{%xmm([0-9]+)}}
167 ; LINUXOSX: addps {{%xmm([0-9]+)}}, {{%xmm([0-9]+)}}
168 ; LINUXOSX: addps {{%xmm([0-9]+)}}, {{%xmm([0-9]+)}}
169 ; LINUXOSX: addps {{%xmm([0-9]+)}}, {{%xmm([0-9]+)}}
170 ; LINUXOSX: addps {{%xmm([0-9]+)}}, {{%xmm([0-9]+)}}
171 ; LINUXOSX: addps {{%xmm([0-9]+)}}, {{%xmm([0-9]+)}}
172 ; LINUXOSX: addps {{%xmm([0-9]+)}}, {{%xmm([0-9]+)}}
173 ; LINUXOSX: addps {{%xmm([0-9]+)}}, {{%xmm([0-9]+)}}
174 ; LINUXOSX: addps {{([0-9])+}}(%rsp), {{%xmm([0-7])}}
175 ; LINUXOSX: addps {{([0-9])+}}(%rsp), {{%xmm([0-7])}}
176 ; LINUXOSX: addps {{([0-9])+}}(%rsp), {{%xmm([0-7])}}
177 ; LINUXOSX: addps {{([0-9])+}}(%rsp), {{%xmm([0-7])}}
178 ; LINUXOSX: addps {{([0-9])+}}(%rsp), {{%xmm([0-7])}}
179 ; LINUXOSX: addps {{([0-9])+}}(%rsp), {{%xmm([0-7])}}
180 ; LINUXOSX: addps {{([0-9])+}}(%rsp), {{%xmm([0-7])}}
181 ; LINUXOSX: addps {{([0-9])+}}(%rsp), {{%xmm([0-7])}}
184 ; Test that parameters, overflowing register capacity, are passed through the stack
185 define x86_regcallcc <32 x float> @testf32_stack(<32 x float> %a, <32 x float> %b, <32 x float> %c) nounwind {
186 %x1 = fadd <32 x float> %a, %b
187 %x2 = fadd <32 x float> %x1, %c