Mercurial > projects > ldc
comparison tests/mini/asm8.d @ 1002:c749648ed2b8
Fix cfloat return on x86_64: only perform ABI transformation for non-extern(D)
functions.
There's no need to waste cycles with extern(D), which we get to define
ourselves. Fixes tests/mini/asm8.d. (Since the asm abiret code already assumed
{xmm0, xmm1} returns)
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Thu, 26 Feb 2009 23:35:39 +0100 |
parents | 855889b7b268 |
children | e8c6dbcd33d1 |
comparison
equal
deleted
inserted
replaced
1001:7a0238db1962 | 1002:c749648ed2b8 |
---|---|
116 { | 116 { |
117 asm { fld1; fld two_f; } | 117 asm { fld1; fld two_f; } |
118 } | 118 } |
119 else version (X86_64) | 119 else version (X86_64) |
120 { | 120 { |
121 version(all) { | 121 asm |
122 asm | 122 { |
123 { | 123 movss XMM0, [one_f]; |
124 movss XMM0, [one_f]; | 124 movss XMM1, [two_f]; |
125 movss XMM1, [two_f]; | 125 } |
126 } | 126 } |
127 } else { | 127 else static assert(0, "todo"); |
128 // Code for when LDC becomes ABI-compatible with GCC | 128 } |
129 // regarding cfloat returns. | 129 |
130 asm { | 130 extern(C) cfloat cf_C() |
131 movd EAX, [one_f]; | 131 { |
132 movd ECX, [two_f]; | 132 version(X86) |
133 | 133 { |
134 // invalid operand size :( | 134 asm { fld1; fld two_f; } |
135 //shl RCX, 32; | 135 } |
136 //or RAX, RCX; | 136 else version (X86_64) |
137 | 137 { |
138 pushq RAX; | 138 asm { |
139 mov [RSP + 4], EAX; | 139 mov EAX, [one_f]; |
140 popq RAX; | 140 mov ECX, [two_f]; |
141 | 141 |
142 movd XMM0, RAX; | 142 shl RCX, 32; |
143 } | 143 or RAX, RCX; |
144 | |
145 movd XMM0, RAX; | |
144 } | 146 } |
145 } | 147 } |
146 else static assert(0, "todo"); | 148 else static assert(0, "todo"); |
147 } | 149 } |
148 | 150 |
158 ret; | 160 ret; |
159 } | 161 } |
160 } | 162 } |
161 else version (X86_64) | 163 else version (X86_64) |
162 { | 164 { |
163 version(all) { | 165 asm |
164 asm | 166 { |
165 { | 167 naked; |
166 naked; | 168 movss XMM0, [one_f]; |
167 movss XMM0, [one_f]; | 169 movss XMM1, [two_f]; |
168 movss XMM1, [two_f]; | 170 ret; |
169 ret; | 171 } |
170 } | 172 } |
171 } else { | 173 else static assert(0, "todo"); |
172 // Code for when LDC becomes ABI-compatible with GCC | 174 } |
173 // regarding cfloat returns. | 175 |
174 asm { | 176 extern(C) cfloat cf2_C() |
175 naked; | 177 { |
176 mov EAX, [one_f]; | 178 version(X86) |
177 mov ECX, [two_f]; | 179 { |
178 | 180 asm |
179 // invalid operand size :( | 181 { |
180 //shl RCX, 32; | 182 naked; |
181 //or RAX, RCX; | 183 fld1; |
182 | 184 fld two_f; |
183 pushq RAX; | 185 ret; |
184 mov [RSP + 4], EAX; | 186 } |
185 popq RAX; | 187 } |
186 | 188 else version (X86_64) |
187 movd RAX, XMM0; | 189 { |
188 ret; | 190 asm { |
189 } | 191 naked; |
192 mov EAX, [one_f]; | |
193 mov ECX, [two_f]; | |
194 | |
195 shl RCX, 32; | |
196 or RAX, RCX; | |
197 | |
198 movd XMM0, RAX; | |
199 ret; | |
190 } | 200 } |
191 } | 201 } |
192 else static assert(0, "todo"); | 202 else static assert(0, "todo"); |
193 } | 203 } |
194 | 204 |
367 assert(oneir() == 1i); | 377 assert(oneir() == 1i); |
368 | 378 |
369 assert(cf() == 1+2i); | 379 assert(cf() == 1+2i); |
370 assert(cf2() == 1+2i); | 380 assert(cf2() == 1+2i); |
371 | 381 |
382 assert(cf_C() == 1+2i); | |
383 assert(cf2_C() == 1+2i); | |
384 | |
372 assert(cd() == 1+2i); | 385 assert(cd() == 1+2i); |
373 assert(cd2() == 1+2i); | 386 assert(cd2() == 1+2i); |
374 | 387 |
375 assert(cr() == 1+2i); | 388 assert(cr() == 1+2i); |
376 assert(cr2() == 1+2i); | 389 assert(cr2() == 1+2i); |