OLD | NEW |
---|---|
1 ; This file checks that Subzero generates code in accordance with the | 1 ; This file checks that Subzero generates code in accordance with the |
2 ; calling convention for vectors. | 2 ; calling convention for vectors. |
3 | 3 |
4 ; RUN: %p2i -i %s --filetype=obj --disassemble --args -O2 \ | 4 ; RUN: %p2i -i %s --filetype=obj --disassemble --args -O2 \ |
5 ; RUN: -allow-externally-defined-symbols | FileCheck %s | 5 ; RUN: -allow-externally-defined-symbols | FileCheck %s |
6 ; RUN: %p2i -i %s --filetype=obj --disassemble --args -Om1 \ | 6 ; RUN: %p2i -i %s --filetype=obj --disassemble --args -Om1 \ |
7 ; RUN: -allow-externally-defined-symbols | FileCheck --check-prefix=OPTM1 %s | 7 ; RUN: -allow-externally-defined-symbols | FileCheck --check-prefix=OPTM1 %s |
8 | 8 |
9 ; RUN: %if --need=target_MIPS32 --need=allow_dump \ | |
10 ; RUN: --command %p2i --filetype=asm --assemble --disassemble --target \ | |
11 ; RUN: mips32 -i %s --args -O2 -allow-externally-defined-symbols \ | |
12 ; RUN: | %if --need=target_MIPS32 --need=allow_dump \ | |
13 ; RUN: --command FileCheck --check-prefix MIPS32 %s | |
14 | |
9 ; The first five functions test that vectors are moved from their | 15 ; The first five functions test that vectors are moved from their |
10 ; correct argument location to xmm0. | 16 ; correct argument location to xmm0. |
11 | 17 |
12 define internal <4 x float> @test_returning_arg0( | 18 define internal <4 x float> @test_returning_arg0( |
13 <4 x float> %arg0, <4 x float> %arg1, <4 x float> %arg2, <4 x float> %arg3, | 19 <4 x float> %arg0, <4 x float> %arg1, <4 x float> %arg2, <4 x float> %arg3, |
14 <4 x float> %arg4, <4 x float> %arg5) { | 20 <4 x float> %arg4, <4 x float> %arg5) { |
15 entry: | 21 entry: |
16 ret <4 x float> %arg0 | 22 ret <4 x float> %arg0 |
17 ; CHECK-LABEL: test_returning_arg0 | 23 ; CHECK-LABEL: test_returning_arg0 |
18 ; CHECK-NOT: mov | 24 ; CHECK-NOT: mov |
19 ; CHECK: ret | 25 ; CHECK: ret |
20 | 26 |
21 ; OPTM1-LABEL: test_returning_arg0 | 27 ; OPTM1-LABEL: test_returning_arg0 |
22 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm0 | 28 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm0 |
23 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] | 29 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] |
24 ; OPTM1: ret | 30 ; OPTM1: ret |
31 ; MIPS32-LABEL: test_returning_arg0 | |
32 ; MIPS32: lw v0,16(sp) | |
Jim Stichnoth
2016/10/28 17:42:07
Here are a lot more instances of "dangerously" har
Stefan Maksimovic
2016/10/31 10:33:08
Done.
| |
33 ; MIPS32: lw v1,20(sp) | |
34 ; MIPS32: move a1,a0 | |
35 ; MIPS32: sw a2,0(a1) | |
36 ; MIPS32: sw a3,4(a1) | |
37 ; MIPS32: sw v0,8(a1) | |
38 ; MIPS32: sw v1,12(a1) | |
39 ; MIPS32: move v0,a0 | |
25 } | 40 } |
26 | 41 |
27 define internal <4 x float> @test_returning_arg1( | 42 define internal <4 x float> @test_returning_arg1( |
28 <4 x float> %arg0, <4 x float> %arg1, <4 x float> %arg2, <4 x float> %arg3, | 43 <4 x float> %arg0, <4 x float> %arg1, <4 x float> %arg2, <4 x float> %arg3, |
29 <4 x float> %arg4, <4 x float> %arg5) { | 44 <4 x float> %arg4, <4 x float> %arg5) { |
30 entry: | 45 entry: |
31 ret <4 x float> %arg1 | 46 ret <4 x float> %arg1 |
32 ; CHECK-LABEL: test_returning_arg1 | 47 ; CHECK-LABEL: test_returning_arg1 |
33 ; CHECK: movups xmm0,xmm1 | 48 ; CHECK: movups xmm0,xmm1 |
34 ; CHECK: ret | 49 ; CHECK: ret |
35 | 50 |
36 ; OPTM1-LABEL: test_returning_arg1 | 51 ; OPTM1-LABEL: test_returning_arg1 |
37 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm1 | 52 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm1 |
38 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] | 53 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] |
39 ; OPTM1: ret | 54 ; OPTM1: ret |
55 ; MIPS32-LABEL: test_returning_arg1 | |
56 ; MIPS32: lw v0,24(sp) | |
57 ; MIPS32: lw v1,28(sp) | |
58 ; MIPS32: lw a1,32(sp) | |
59 ; MIPS32: lw a2,36(sp) | |
60 ; MIPS32: move a3,a0 | |
61 ; MIPS32: sw v0,0(a3) | |
62 ; MIPS32: sw v1,4(a3) | |
63 ; MIPS32: sw a1,8(a3) | |
64 ; MIPS32: sw a2,12(a3) | |
65 ; MIPS32: move v0,a0 | |
40 } | 66 } |
41 | 67 |
42 define internal <4 x float> @test_returning_arg2( | 68 define internal <4 x float> @test_returning_arg2( |
43 <4 x float> %arg0, <4 x float> %arg1, <4 x float> %arg2, <4 x float> %arg3, | 69 <4 x float> %arg0, <4 x float> %arg1, <4 x float> %arg2, <4 x float> %arg3, |
44 <4 x float> %arg4, <4 x float> %arg5) { | 70 <4 x float> %arg4, <4 x float> %arg5) { |
45 entry: | 71 entry: |
46 ret <4 x float> %arg2 | 72 ret <4 x float> %arg2 |
47 ; CHECK-LABEL: test_returning_arg2 | 73 ; CHECK-LABEL: test_returning_arg2 |
48 ; CHECK: movups xmm0,xmm2 | 74 ; CHECK: movups xmm0,xmm2 |
49 ; CHECK: ret | 75 ; CHECK: ret |
50 | 76 |
51 ; OPTM1-LABEL: test_returning_arg2 | 77 ; OPTM1-LABEL: test_returning_arg2 |
52 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm2 | 78 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm2 |
53 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] | 79 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] |
54 ; OPTM1: ret | 80 ; OPTM1: ret |
81 ; MIPS32-LABEL: test_returning_arg2 | |
82 ; MIPS32: lw v0,40(sp) | |
83 ; MIPS32: lw v1,44(sp) | |
84 ; MIPS32: lw a1,48(sp) | |
85 ; MIPS32: lw a2,52(sp) | |
86 ; MIPS32: move a3,a0 | |
87 ; MIPS32: sw v0,0(a3) | |
88 ; MIPS32: sw v1,4(a3) | |
89 ; MIPS32: sw a1,8(a3) | |
90 ; MIPS32: sw a2,12(a3) | |
91 ; MIPS32: move v0,a0 | |
55 } | 92 } |
56 | 93 |
57 define internal <4 x float> @test_returning_arg3( | 94 define internal <4 x float> @test_returning_arg3( |
58 <4 x float> %arg0, <4 x float> %arg1, <4 x float> %arg2, <4 x float> %arg3, | 95 <4 x float> %arg0, <4 x float> %arg1, <4 x float> %arg2, <4 x float> %arg3, |
59 <4 x float> %arg4, <4 x float> %arg5) { | 96 <4 x float> %arg4, <4 x float> %arg5) { |
60 entry: | 97 entry: |
61 ret <4 x float> %arg3 | 98 ret <4 x float> %arg3 |
62 ; CHECK-LABEL: test_returning_arg3 | 99 ; CHECK-LABEL: test_returning_arg3 |
63 ; CHECK: movups xmm0,xmm3 | 100 ; CHECK: movups xmm0,xmm3 |
64 ; CHECK: ret | 101 ; CHECK: ret |
65 | 102 |
66 ; OPTM1-LABEL: test_returning_arg3 | 103 ; OPTM1-LABEL: test_returning_arg3 |
67 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm3 | 104 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm3 |
68 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] | 105 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] |
69 ; OPTM1: ret | 106 ; OPTM1: ret |
107 ; MIPS32-LABEL: test_returning_arg3 | |
108 ; MIPS32: lw v0,56(sp) | |
109 ; MIPS32: lw v1,60(sp) | |
110 ; MIPS32: lw a1,64(sp) | |
111 ; MIPS32: lw a2,68(sp) | |
112 ; MIPS32: move a3,a0 | |
113 ; MIPS32: sw v0,0(a3) | |
114 ; MIPS32: sw v1,4(a3) | |
115 ; MIPS32: sw a1,8(a3) | |
116 ; MIPS32: sw a2,12(a3) | |
117 ; MIPS32: move v0,a0 | |
70 } | 118 } |
71 | 119 |
72 define internal <4 x float> @test_returning_arg4( | 120 define internal <4 x float> @test_returning_arg4( |
73 <4 x float> %arg0, <4 x float> %arg1, <4 x float> %arg2, <4 x float> %arg3, | 121 <4 x float> %arg0, <4 x float> %arg1, <4 x float> %arg2, <4 x float> %arg3, |
74 <4 x float> %arg4, <4 x float> %arg5) { | 122 <4 x float> %arg4, <4 x float> %arg5) { |
75 entry: | 123 entry: |
76 ret <4 x float> %arg4 | 124 ret <4 x float> %arg4 |
77 ; CHECK-LABEL: test_returning_arg4 | 125 ; CHECK-LABEL: test_returning_arg4 |
78 ; CHECK: movups xmm0,XMMWORD PTR [esp+0x4] | 126 ; CHECK: movups xmm0,XMMWORD PTR [esp+0x4] |
79 ; CHECK: ret | 127 ; CHECK: ret |
80 | 128 |
81 ; OPTM1-LABEL: test_returning_arg4 | 129 ; OPTM1-LABEL: test_returning_arg4 |
82 ; OPTM1: movups xmm0,XMMWORD PTR {{.*}} | 130 ; OPTM1: movups xmm0,XMMWORD PTR {{.*}} |
83 ; OPTM1: ret | 131 ; OPTM1: ret |
132 ; MIPS32-LABEL: test_returning_arg4 | |
133 ; MIPS32: lw v0,72(sp) | |
134 ; MIPS32: lw v1,76(sp) | |
135 ; MIPS32: lw a1,80(sp) | |
136 ; MIPS32: lw a2,84(sp) | |
137 ; MIPS32: move a3,a0 | |
138 ; MIPS32: sw v0,0(a3) | |
139 ; MIPS32: sw v1,4(a3) | |
140 ; MIPS32: sw a1,8(a3) | |
141 ; MIPS32: sw a2,12(a3) | |
142 ; MIPS32: move v0,a0 | |
84 } | 143 } |
85 | 144 |
86 ; The next five functions check that xmm arguments are handled | 145 ; The next five functions check that xmm arguments are handled |
87 ; correctly when interspersed with stack arguments in the argument | 146 ; correctly when interspersed with stack arguments in the argument |
88 ; list. | 147 ; list. |
89 | 148 |
90 define internal <4 x float> @test_returning_interspersed_arg0( | 149 define internal <4 x float> @test_returning_interspersed_arg0( |
91 i32 %i32arg0, double %doublearg0, <4 x float> %arg0, <4 x float> %arg1, | 150 i32 %i32arg0, double %doublearg0, <4 x float> %arg0, <4 x float> %arg1, |
92 i32 %i32arg1, <4 x float> %arg2, double %doublearg1, <4 x float> %arg3, | 151 i32 %i32arg1, <4 x float> %arg2, double %doublearg1, <4 x float> %arg3, |
93 i32 %i32arg2, double %doublearg2, float %floatarg0, <4 x float> %arg4, | 152 i32 %i32arg2, double %doublearg2, float %floatarg0, <4 x float> %arg4, |
94 <4 x float> %arg5, float %floatarg1) { | 153 <4 x float> %arg5, float %floatarg1) { |
95 entry: | 154 entry: |
96 ret <4 x float> %arg0 | 155 ret <4 x float> %arg0 |
97 ; CHECK-LABEL: test_returning_interspersed_arg0 | 156 ; CHECK-LABEL: test_returning_interspersed_arg0 |
98 ; CHECK-NOT: mov | 157 ; CHECK-NOT: mov |
99 ; CHECK: ret | 158 ; CHECK: ret |
100 | 159 |
101 ; OPTM1-LABEL: test_returning_interspersed_arg0 | 160 ; OPTM1-LABEL: test_returning_interspersed_arg0 |
102 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm0 | 161 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm0 |
103 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] | 162 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] |
104 ; OPTM1: ret | 163 ; OPTM1: ret |
164 ; MIPS32-LABEL: test_returning_interspersed_arg0 | |
165 ; MIPS32: lw v0,16(sp) | |
166 ; MIPS32: lw v1,20(sp) | |
167 ; MIPS32: lw a1,24(sp) | |
168 ; MIPS32: lw a2,28(sp) | |
169 ; MIPS32: move a3,a0 | |
170 ; MIPS32: sw v0,0(a3) | |
171 ; MIPS32: sw v1,4(a3) | |
172 ; MIPS32: sw a1,8(a3) | |
173 ; MIPS32: sw a2,12(a3) | |
174 ; MIPS32: move v0,a0 | |
105 } | 175 } |
106 | 176 |
107 define internal <4 x float> @test_returning_interspersed_arg1( | 177 define internal <4 x float> @test_returning_interspersed_arg1( |
108 i32 %i32arg0, double %doublearg0, <4 x float> %arg0, <4 x float> %arg1, | 178 i32 %i32arg0, double %doublearg0, <4 x float> %arg0, <4 x float> %arg1, |
109 i32 %i32arg1, <4 x float> %arg2, double %doublearg1, <4 x float> %arg3, | 179 i32 %i32arg1, <4 x float> %arg2, double %doublearg1, <4 x float> %arg3, |
110 i32 %i32arg2, double %doublearg2, float %floatarg0, <4 x float> %arg4, | 180 i32 %i32arg2, double %doublearg2, float %floatarg0, <4 x float> %arg4, |
111 <4 x float> %arg5, float %floatarg1) { | 181 <4 x float> %arg5, float %floatarg1) { |
112 entry: | 182 entry: |
113 ret <4 x float> %arg1 | 183 ret <4 x float> %arg1 |
114 ; CHECK-LABEL: test_returning_interspersed_arg1 | 184 ; CHECK-LABEL: test_returning_interspersed_arg1 |
115 ; CHECK: movups xmm0,xmm1 | 185 ; CHECK: movups xmm0,xmm1 |
116 ; CHECK: ret | 186 ; CHECK: ret |
117 | 187 |
118 ; OPTM1-LABEL: test_returning_interspersed_arg1 | 188 ; OPTM1-LABEL: test_returning_interspersed_arg1 |
119 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm1 | 189 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm1 |
120 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] | 190 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] |
121 ; OPTM1: ret | 191 ; OPTM1: ret |
192 ; MIPS32-LABEL: test_returning_interspersed_arg1 | |
193 ; MIPS32: lw v0,32(sp) | |
194 ; MIPS32: lw v1,36(sp) | |
195 ; MIPS32: lw a1,40(sp) | |
196 ; MIPS32: lw a2,44(sp) | |
197 ; MIPS32: move a3,a0 | |
198 ; MIPS32: sw v0,0(a3) | |
199 ; MIPS32: sw v1,4(a3) | |
200 ; MIPS32: sw a1,8(a3) | |
201 ; MIPS32: sw a2,12(a3) | |
202 ; MIPS32: move v0,a0 | |
122 } | 203 } |
123 | 204 |
124 define internal <4 x float> @test_returning_interspersed_arg2( | 205 define internal <4 x float> @test_returning_interspersed_arg2( |
125 i32 %i32arg0, double %doublearg0, <4 x float> %arg0, <4 x float> %arg1, | 206 i32 %i32arg0, double %doublearg0, <4 x float> %arg0, <4 x float> %arg1, |
126 i32 %i32arg1, <4 x float> %arg2, double %doublearg1, <4 x float> %arg3, | 207 i32 %i32arg1, <4 x float> %arg2, double %doublearg1, <4 x float> %arg3, |
127 i32 %i32arg2, double %doublearg2, float %floatarg0, <4 x float> %arg4, | 208 i32 %i32arg2, double %doublearg2, float %floatarg0, <4 x float> %arg4, |
128 <4 x float> %arg5, float %floatarg1) { | 209 <4 x float> %arg5, float %floatarg1) { |
129 entry: | 210 entry: |
130 ret <4 x float> %arg2 | 211 ret <4 x float> %arg2 |
131 ; CHECK-LABEL: test_returning_interspersed_arg2 | 212 ; CHECK-LABEL: test_returning_interspersed_arg2 |
132 ; CHECK: movups xmm0,xmm2 | 213 ; CHECK: movups xmm0,xmm2 |
133 ; CHECK: ret | 214 ; CHECK: ret |
134 | 215 |
135 ; OPTM1-LABEL: test_returning_interspersed_arg2 | 216 ; OPTM1-LABEL: test_returning_interspersed_arg2 |
136 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm2 | 217 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm2 |
137 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] | 218 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] |
138 ; OPTM1: ret | 219 ; OPTM1: ret |
220 ; MIPS32-LABEL: test_returning_interspersed_arg2 | |
221 ; MIPS32: lw v0,52(sp) | |
222 ; MIPS32: lw v1,56(sp) | |
223 ; MIPS32: lw a1,60(sp) | |
224 ; MIPS32: lw a2,64(sp) | |
225 ; MIPS32: move a3,a0 | |
226 ; MIPS32: sw v0,0(a3) | |
227 ; MIPS32: sw v1,4(a3) | |
228 ; MIPS32: sw a1,8(a3) | |
229 ; MIPS32: sw a2,12(a3) | |
230 ; MIPS32: move v0,a0 | |
139 } | 231 } |
140 | 232 |
141 define internal <4 x float> @test_returning_interspersed_arg3( | 233 define internal <4 x float> @test_returning_interspersed_arg3( |
142 i32 %i32arg0, double %doublearg0, <4 x float> %arg0, <4 x float> %arg1, | 234 i32 %i32arg0, double %doublearg0, <4 x float> %arg0, <4 x float> %arg1, |
143 i32 %i32arg1, <4 x float> %arg2, double %doublearg1, <4 x float> %arg3, | 235 i32 %i32arg1, <4 x float> %arg2, double %doublearg1, <4 x float> %arg3, |
144 i32 %i32arg2, double %doublearg2, float %floatarg0, <4 x float> %arg4, | 236 i32 %i32arg2, double %doublearg2, float %floatarg0, <4 x float> %arg4, |
145 <4 x float> %arg5, float %floatarg1) { | 237 <4 x float> %arg5, float %floatarg1) { |
146 entry: | 238 entry: |
147 ret <4 x float> %arg3 | 239 ret <4 x float> %arg3 |
148 ; CHECK-LABEL: test_returning_interspersed_arg3 | 240 ; CHECK-LABEL: test_returning_interspersed_arg3 |
149 ; CHECK: movups xmm0,xmm3 | 241 ; CHECK: movups xmm0,xmm3 |
150 ; CHECK: ret | 242 ; CHECK: ret |
151 | 243 |
152 ; OPTM1-LABEL: test_returning_interspersed_arg3 | 244 ; OPTM1-LABEL: test_returning_interspersed_arg3 |
153 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm3 | 245 ; OPTM1: movups XMMWORD PTR [[LOC:.*]],xmm3 |
154 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] | 246 ; OPTM1: movups xmm0,XMMWORD PTR [[LOC]] |
155 ; OPTM1: ret | 247 ; OPTM1: ret |
248 ; MIPS32-LABEL: test_returning_interspersed_arg3 | |
249 ; MIPS32: lw v0,80(sp) | |
250 ; MIPS32: lw v1,84(sp) | |
251 ; MIPS32: lw a1,88(sp) | |
252 ; MIPS32: lw a2,92(sp) | |
253 ; MIPS32: move a3,a0 | |
254 ; MIPS32: sw v0,0(a3) | |
255 ; MIPS32: sw v1,4(a3) | |
256 ; MIPS32: sw a1,8(a3) | |
257 ; MIPS32: sw a2,12(a3) | |
258 ; MIPS32: move v0,a0 | |
259 | |
156 } | 260 } |
157 | 261 |
158 define internal <4 x float> @test_returning_interspersed_arg4( | 262 define internal <4 x float> @test_returning_interspersed_arg4( |
159 i32 %i32arg0, double %doublearg0, <4 x float> %arg0, <4 x float> %arg1, | 263 i32 %i32arg0, double %doublearg0, <4 x float> %arg0, <4 x float> %arg1, |
160 i32 %i32arg1, <4 x float> %arg2, double %doublearg1, <4 x float> %arg3, | 264 i32 %i32arg1, <4 x float> %arg2, double %doublearg1, <4 x float> %arg3, |
161 i32 %i32arg2, double %doublearg2, float %floatarg0, <4 x float> %arg4, | 265 i32 %i32arg2, double %doublearg2, float %floatarg0, <4 x float> %arg4, |
162 <4 x float> %arg5, float %floatarg1) { | 266 <4 x float> %arg5, float %floatarg1) { |
163 entry: | 267 entry: |
164 ret <4 x float> %arg4 | 268 ret <4 x float> %arg4 |
165 ; CHECK-LABEL: test_returning_interspersed_arg4 | 269 ; CHECK-LABEL: test_returning_interspersed_arg4 |
166 ; CHECK: movups xmm0,XMMWORD PTR [esp+0x34] | 270 ; CHECK: movups xmm0,XMMWORD PTR [esp+0x34] |
167 ; CHECK: ret | 271 ; CHECK: ret |
168 | 272 |
169 ; OPTM1-LABEL: test_returning_interspersed_arg4 | 273 ; OPTM1-LABEL: test_returning_interspersed_arg4 |
170 ; OPTM1: movups xmm0,XMMWORD PTR {{.*}} | 274 ; OPTM1: movups xmm0,XMMWORD PTR {{.*}} |
171 ; OPTM1: ret | 275 ; OPTM1: ret |
276 ; MIPS32-LABEL: test_returning_interspersed_arg4 | |
277 ; MIPS32: lw v0,116(sp) | |
278 ; MIPS32: lw v1,120(sp) | |
279 ; MIPS32: lw a1,124(sp) | |
280 ; MIPS32: lw a2,128(sp) | |
281 ; MIPS32: move a3,a0 | |
282 ; MIPS32: sw v0,0(a3) | |
283 ; MIPS32: sw v1,4(a3) | |
284 ; MIPS32: sw a1,8(a3) | |
285 ; MIPS32: sw a2,12(a3) | |
286 ; MIPS32: move v0,a0 | |
172 } | 287 } |
173 | 288 |
174 ; Test that vectors are passed correctly as arguments to a function. | 289 ; Test that vectors are passed correctly as arguments to a function. |
175 | 290 |
176 declare void @VectorArgs(<4 x float>, <4 x float>, <4 x float>, <4 x float>, | 291 declare void @VectorArgs(<4 x float>, <4 x float>, <4 x float>, <4 x float>, |
177 <4 x float>, <4 x float>) | 292 <4 x float>, <4 x float>) |
178 | 293 |
179 declare void @killXmmRegisters() | 294 declare void @killXmmRegisters() |
180 | 295 |
181 define internal void @test_passing_vectors( | 296 define internal void @test_passing_vectors( |
(...skipping 25 matching lines...) Expand all Loading... | |
207 ; OPTM1: movups [[ARG5:.*]],XMMWORD PTR {{.*}} | 322 ; OPTM1: movups [[ARG5:.*]],XMMWORD PTR {{.*}} |
208 ; OPTM1: movups XMMWORD PTR [esp],[[ARG5]] | 323 ; OPTM1: movups XMMWORD PTR [esp],[[ARG5]] |
209 ; OPTM1: movups [[ARG6:.*]],XMMWORD PTR {{.*}} | 324 ; OPTM1: movups [[ARG6:.*]],XMMWORD PTR {{.*}} |
210 ; OPTM1: movups XMMWORD PTR [esp+0x10],[[ARG6]] | 325 ; OPTM1: movups XMMWORD PTR [esp+0x10],[[ARG6]] |
211 ; OPTM1: movups xmm0,XMMWORD PTR {{.*}} | 326 ; OPTM1: movups xmm0,XMMWORD PTR {{.*}} |
212 ; OPTM1: movups xmm1,XMMWORD PTR {{.*}} | 327 ; OPTM1: movups xmm1,XMMWORD PTR {{.*}} |
213 ; OPTM1: movups xmm2,XMMWORD PTR {{.*}} | 328 ; OPTM1: movups xmm2,XMMWORD PTR {{.*}} |
214 ; OPTM1: movups xmm3,XMMWORD PTR {{.*}} | 329 ; OPTM1: movups xmm3,XMMWORD PTR {{.*}} |
215 ; OPTM1: call {{.*}} R_{{.*}} VectorArgs | 330 ; OPTM1: call {{.*}} R_{{.*}} VectorArgs |
216 ; OPTM1-NEXT: add esp,0x6c | 331 ; OPTM1-NEXT: add esp,0x6c |
332 ; MIPS32-LABEL: test_passing_vectors | |
333 ; MIPS32: sw s7,108(sp) | |
334 ; MIPS32: sw s6,104(sp) | |
335 ; MIPS32: sw s5,100(sp) | |
336 ; MIPS32: sw s4,96(sp) | |
337 ; MIPS32: sw s3,92(sp) | |
338 ; MIPS32: sw s2,88(sp) | |
339 ; MIPS32: sw s1,84(sp) | |
340 ; MIPS32: sw s0,80(sp) | |
341 ; MIPS32: lw s0,180(sp) | |
342 ; MIPS32: lw s1,184(sp) | |
343 ; MIPS32: lw s2,188(sp) | |
344 ; MIPS32: lw s3,192(sp) | |
345 ; MIPS32: lw s4,196(sp) | |
346 ; MIPS32: lw s5,200(sp) | |
347 ; MIPS32: lw s6,204(sp) | |
348 ; MIPS32: lw s7,208(sp) | |
349 ; MIPS32: jal 0 <test_returning_arg0> 228: R_MIPS_26 killXmmRegisters | |
350 ; MIPS32: nop | |
351 ; MIPS32: lw v0,244(sp) | |
352 ; MIPS32: sw v0,16(sp) | |
353 ; MIPS32: lw v0,248(sp) | |
354 ; MIPS32: sw v0,20(sp) | |
355 ; MIPS32: lw v0,252(sp) | |
356 ; MIPS32: sw v0,24(sp) | |
357 ; MIPS32: lw v0,256(sp) | |
358 ; MIPS32: sw v0,28(sp) | |
359 ; MIPS32: lw v0,228(sp) | |
360 ; MIPS32: sw v0,32(sp) | |
361 ; MIPS32: lw v0,232(sp) | |
362 ; MIPS32: sw v0,36(sp) | |
363 ; MIPS32: lw v0,236(sp) | |
364 ; MIPS32: sw v0,40(sp) | |
365 ; MIPS32: lw v0,240(sp) | |
366 ; MIPS32: sw v0,44(sp) | |
367 ; MIPS32: lw v0,212(sp) | |
368 ; MIPS32: sw v0,48(sp) | |
369 ; MIPS32: lw v0,216(sp) | |
370 ; MIPS32: sw v0,52(sp) | |
371 ; MIPS32: lw v0,220(sp) | |
372 ; MIPS32: sw v0,56(sp) | |
373 ; MIPS32: lw v0,224(sp) | |
374 ; MIPS32: sw v0,60(sp) | |
375 ; MIPS32: sw s4,64(sp) | |
376 ; MIPS32: sw s5,68(sp) | |
377 ; MIPS32: sw s6,72(sp) | |
378 ; MIPS32: sw s7,76(sp) | |
379 ; MIPS32: sw s0,80(sp) | |
380 ; MIPS32: sw s1,84(sp) | |
381 ; MIPS32: sw s2,88(sp) | |
382 ; MIPS32: sw s3,92(sp) | |
383 ; MIPS32: lw a0,260(sp) | |
384 ; MIPS32: lw a1,264(sp) | |
385 ; MIPS32: lw a2,268(sp) | |
386 ; MIPS32: lw a3,272(sp) | |
387 ; MIPS32: jal 0 <test_returning_arg0> 2c0: R_MIPS_26 VectorArgs | |
388 ; MIPS32: nop | |
389 ; MIPS32: lw s0,80(sp) | |
390 ; MIPS32: lw s1,84(sp) | |
391 ; MIPS32: lw s2,88(sp) | |
392 ; MIPS32: lw s3,92(sp) | |
393 ; MIPS32: lw s4,96(sp) | |
394 ; MIPS32: lw s5,100(sp) | |
395 ; MIPS32: lw s6,104(sp) | |
396 ; MIPS32: lw s7,108(sp) | |
397 ; MIPS32: lw ra,112(sp) | |
398 | |
217 } | 399 } |
218 | 400 |
219 declare void @InterspersedVectorArgs( | 401 declare void @InterspersedVectorArgs( |
220 <4 x float>, i64, <4 x float>, i64, <4 x float>, float, <4 x float>, | 402 <4 x float>, i64, <4 x float>, i64, <4 x float>, float, <4 x float>, |
221 double, <4 x float>, i32, <4 x float>) | 403 double, <4 x float>, i32, <4 x float>) |
222 | 404 |
223 define internal void @test_passing_vectors_interspersed( | 405 define internal void @test_passing_vectors_interspersed( |
224 <4 x float> %arg0, <4 x float> %arg1, <4 x float> %arg2, <4 x float> %arg3, | 406 <4 x float> %arg0, <4 x float> %arg1, <4 x float> %arg2, <4 x float> %arg3, |
225 <4 x float> %arg4, <4 x float> %arg5, <4 x float> %arg6, <4 x float> %arg7, | 407 <4 x float> %arg4, <4 x float> %arg5, <4 x float> %arg6, <4 x float> %arg7, |
226 <4 x float> %arg8, <4 x float> %arg9) { | 408 <4 x float> %arg8, <4 x float> %arg9) { |
(...skipping 26 matching lines...) Expand all Loading... | |
253 ; OPTM1: movups XMMWORD PTR [esp+0x20],[[ARG9]] | 435 ; OPTM1: movups XMMWORD PTR [esp+0x20],[[ARG9]] |
254 ; OPTM1: movups [[ARG11:.*]],XMMWORD PTR {{.*}} | 436 ; OPTM1: movups [[ARG11:.*]],XMMWORD PTR {{.*}} |
255 ; OPTM1: movups XMMWORD PTR [esp+0x40],[[ARG11]] | 437 ; OPTM1: movups XMMWORD PTR [esp+0x40],[[ARG11]] |
256 ; OPTM1: movups xmm0,XMMWORD PTR {{.*}} | 438 ; OPTM1: movups xmm0,XMMWORD PTR {{.*}} |
257 ; OPTM1: movups xmm1,XMMWORD PTR {{.*}} | 439 ; OPTM1: movups xmm1,XMMWORD PTR {{.*}} |
258 ; OPTM1: movups xmm2,XMMWORD PTR {{.*}} | 440 ; OPTM1: movups xmm2,XMMWORD PTR {{.*}} |
259 ; OPTM1: movups xmm3,XMMWORD PTR {{.*}} | 441 ; OPTM1: movups xmm3,XMMWORD PTR {{.*}} |
260 ; OPTM1: call {{.*}} R_{{.*}} InterspersedVectorArgs | 442 ; OPTM1: call {{.*}} R_{{.*}} InterspersedVectorArgs |
261 ; OPTM1-NEXT: add esp,0x9c | 443 ; OPTM1-NEXT: add esp,0x9c |
262 ; OPTM1: ret | 444 ; OPTM1: ret |
445 ; MIPS32-LABEL: test_passing_vectors_interspersed | |
446 ; MIPS32: sw s7,156(sp) | |
447 ; MIPS32: sw s6,152(sp) | |
448 ; MIPS32: sw s5,148(sp) | |
449 ; MIPS32: sw s4,144(sp) | |
450 ; MIPS32: sw s3,140(sp) | |
451 ; MIPS32: sw s2,136(sp) | |
452 ; MIPS32: sw s1,132(sp) | |
453 ; MIPS32: sw s0,128(sp) | |
454 ; MIPS32: lw s0,228(sp) | |
455 ; MIPS32: lw s1,232(sp) | |
456 ; MIPS32: lw s2,236(sp) | |
457 ; MIPS32: lw s3,240(sp) | |
458 ; MIPS32: lw s4,244(sp) | |
459 ; MIPS32: lw s5,248(sp) | |
460 ; MIPS32: lw s6,252(sp) | |
461 ; MIPS32: lw s7,256(sp) | |
462 ; MIPS32: jal 0 <test_returning_arg0> 348: R_MIPS_26 killXmmRegisters | |
463 ; MIPS32: nop | |
464 ; MIPS32: li v0,0 | |
465 ; MIPS32: li v1,0 | |
466 ; MIPS32: sw v0,20(sp) | |
467 ; MIPS32: sw v1,16(sp) | |
468 ; MIPS32: lw v0,292(sp) | |
469 ; MIPS32: sw v0,24(sp) | |
470 ; MIPS32: lw v0,296(sp) | |
471 ; MIPS32: sw v0,28(sp) | |
472 ; MIPS32: lw v0,300(sp) | |
473 ; MIPS32: sw v0,32(sp) | |
474 ; MIPS32: lw v0,304(sp) | |
475 ; MIPS32: sw v0,36(sp) | |
476 ; MIPS32: li v0,0 | |
477 ; MIPS32: li v1,1 | |
478 ; MIPS32: sw v0,44(sp) | |
479 ; MIPS32: sw v1,40(sp) | |
480 ; MIPS32: lw v0,276(sp) | |
481 ; MIPS32: sw v0,48(sp) | |
482 ; MIPS32: lw v0,280(sp) | |
483 ; MIPS32: sw v0,52(sp) | |
484 ; MIPS32: lw v0,284(sp) | |
485 ; MIPS32: sw v0,56(sp) | |
486 ; MIPS32: lw v0,288(sp) | |
487 ; MIPS32: sw v0,60(sp) | |
488 ; MIPS32: lui v0,0x0 3b0: R_MIPS_HI16 .L$float$40000000 | |
489 ; MIPS32: lwc1 $f0,0(v0) 3b4: R_MIPS_LO16 .L$float$4000000 0 | |
490 ; MIPS32: swc1 $f0,64(sp) | |
491 ; MIPS32: lw v0,260(sp) | |
492 ; MIPS32: sw v0,68(sp) | |
493 ; MIPS32: lw v0,264(sp) | |
494 ; MIPS32: sw v0,72(sp) | |
495 ; MIPS32: lw v0,268(sp) | |
496 ; MIPS32: sw v0,76(sp) | |
497 ; MIPS32: lw v0,272(sp) | |
498 ; MIPS32: sw v0,80(sp) | |
499 ; MIPS32: lui v0,0x0 3dc: R_MIPS_HI16 .L$double$40080000000000 00 | |
500 ; MIPS32: ldc1 $f0,0(v0) 3e0: R_MIPS_LO16 .L$double$400800 0000000000 | |
501 ; MIPS32: sdc1 $f0,88(sp) | |
502 ; MIPS32: sw s4,96(sp) | |
503 ; MIPS32: sw s5,100(sp) | |
504 ; MIPS32: sw s6,104(sp) | |
505 ; MIPS32: sw s7,108(sp) | |
506 ; MIPS32: li v0,4 | |
507 ; MIPS32: sw v0,112(sp) | |
508 ; MIPS32: sw s0,116(sp) | |
509 ; MIPS32: sw s1,120(sp) | |
510 ; MIPS32: sw s2,124(sp) | |
511 ; MIPS32: sw s3,128(sp) | |
512 ; MIPS32: lw a0,308(sp) | |
513 ; MIPS32: lw a1,312(sp) | |
514 ; MIPS32: lw a2,316(sp) | |
515 ; MIPS32: lw a3,320(sp) | |
516 ; MIPS32: jal 0 <test_returning_arg0> 420: R_MIPS_26 InterspersedVect orArgs | |
517 ; MIPS32: nop | |
518 ; MIPS32: lw s0,128(sp) | |
519 ; MIPS32: lw s1,132(sp) | |
520 ; MIPS32: lw s2,136(sp) | |
521 ; MIPS32: lw s3,140(sp) | |
522 ; MIPS32: lw s4,144(sp) | |
523 ; MIPS32: lw s5,148(sp) | |
524 ; MIPS32: lw s6,152(sp) | |
525 ; MIPS32: lw s7,156(sp) | |
526 ; MIPS32: lw ra,160(sp) | |
263 } | 527 } |
264 | 528 |
265 ; Test that a vector returned from a function is recognized to be in | 529 ; Test that a vector returned from a function is recognized to be in |
266 ; xmm0. | 530 ; xmm0. |
267 | 531 |
268 declare <4 x float> @VectorReturn(<4 x float> %arg0) | 532 declare <4 x float> @VectorReturn(<4 x float> %arg0) |
269 | 533 |
270 define internal void @test_receiving_vectors(<4 x float> %arg0) { | 534 define internal void @test_receiving_vectors(<4 x float> %arg0) { |
271 entry: | 535 entry: |
272 %result = call <4 x float> @VectorReturn(<4 x float> %arg0) | 536 %result = call <4 x float> @VectorReturn(<4 x float> %arg0) |
273 %result2 = call <4 x float> @VectorReturn(<4 x float> %result) | 537 %result2 = call <4 x float> @VectorReturn(<4 x float> %result) |
274 ret void | 538 ret void |
275 ; CHECK-LABEL: test_receiving_vectors | 539 ; CHECK-LABEL: test_receiving_vectors |
276 ; CHECK: call {{.*}} R_{{.*}} VectorReturn | 540 ; CHECK: call {{.*}} R_{{.*}} VectorReturn |
277 ; CHECK-NOT: movups xmm0 | 541 ; CHECK-NOT: movups xmm0 |
278 ; CHECK: call {{.*}} R_{{.*}} VectorReturn | 542 ; CHECK: call {{.*}} R_{{.*}} VectorReturn |
279 ; CHECK: ret | 543 ; CHECK: ret |
280 | 544 |
281 ; OPTM1-LABEL: test_receiving_vectors | 545 ; OPTM1-LABEL: test_receiving_vectors |
282 ; OPTM1: call {{.*}} R_{{.*}} VectorReturn | 546 ; OPTM1: call {{.*}} R_{{.*}} VectorReturn |
283 ; OPTM1: movups {{.*}},xmm0 | 547 ; OPTM1: movups {{.*}},xmm0 |
284 ; OPTM1: movups xmm0,{{.*}} | 548 ; OPTM1: movups xmm0,{{.*}} |
285 ; OPTM1: call {{.*}} R_{{.*}} VectorReturn | 549 ; OPTM1: call {{.*}} R_{{.*}} VectorReturn |
286 ; OPTM1: ret | 550 ; OPTM1: ret |
551 ; MIPS32-LABEL: test_receiving_vectors | |
552 ; MIPS32: sw s8,52(sp) | |
553 ; MIPS32: sw s0,48(sp) | |
554 ; MIPS32: move s8,sp | |
555 ; MIPS32: move v0,a0 | |
556 ; MIPS32: addiu v1,sp,16 | |
557 ; MIPS32: move s0,v1 | |
558 ; MIPS32: move a0,s0 | |
559 ; MIPS32: sw a2,16(sp) | |
560 ; MIPS32: sw a3,20(sp) | |
561 ; MIPS32: move a2,v0 | |
562 ; MIPS32: move a3,a1 | |
563 ; MIPS32: jal 0 <test_returning_arg0> 494: R_MIPS_26 VectorReturn | |
564 ; MIPS32: nop | |
565 ; MIPS32: lw v0,0(s0) | |
566 ; MIPS32: lw v1,4(s0) | |
567 ; MIPS32: lw a1,8(s0) | |
568 ; MIPS32: lw s0,12(s0) | |
569 ; MIPS32: addiu a0,sp,32 | |
570 ; MIPS32: sw a1,16(sp) | |
571 ; MIPS32: sw s0,20(sp) | |
572 ; MIPS32: move a2,v0 | |
573 ; MIPS32: move a3,v1 | |
574 ; MIPS32: jal 0 <test_returning_arg0> 4c0: R_MIPS_26 VectorReturn | |
575 ; MIPS32: nop | |
576 ; MIPS32: move sp,s8 | |
577 ; MIPS32: lw s0,48(sp) | |
578 ; MIPS32: lw s8,52(sp) | |
579 ; MIPS32: lw ra,56(sp) | |
287 } | 580 } |
OLD | NEW |