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);