comparison tests/mini/asm8.d @ 959:7e669954db7d

Implement implicit return after inline asm on x86_64
author Frits van Bommel <fvbommel wxs.nl>
date Sun, 15 Feb 2009 18:04:22 +0100
parents b2d27ddf8f45
children aa2e3a6c3410
comparison
equal deleted inserted replaced
958:89729c76b8ff 959:7e669954db7d
1 const float one_f = 1;
2 const double one_d = 1;
3 const real one_r = 1;
4
1 int foo() 5 int foo()
2 { 6 {
3 version(X86) 7 version(X86)
4 { 8 {
5 asm { mov EAX, 42; } 9 asm { mov EAX, 42; }
22 asm { movq RAX, 0xFF; } 26 asm { movq RAX, 0xFF; }
23 } 27 }
24 else static assert(0, "todo"); 28 else static assert(0, "todo");
25 } 29 }
26 30
31
27 float onef() 32 float onef()
28 { 33 {
29 version(X86) 34 version(X86)
30 { 35 {
31 asm { fld1; } 36 asm { fld1; }
32 } 37 }
33 else version (X86_64) 38 else version (X86_64)
34 { 39 {
35 asm { fld1; } 40 asm { movss XMM0, [one_f]; }
36 } 41 }
37 else static assert(0, "todo"); 42 else static assert(0, "todo");
38 } 43 }
39 44
40 double oned() 45 double oned()
43 { 48 {
44 asm { fld1; } 49 asm { fld1; }
45 } 50 }
46 else version (X86_64) 51 else version (X86_64)
47 { 52 {
48 asm { fld1; } 53 asm { movsd XMM0, [one_d]; }
49 } 54 }
50 else static assert(0, "todo"); 55 else static assert(0, "todo");
51 } 56 }
52 57
53 real oner() 58 real oner()
61 asm { fld1; } 66 asm { fld1; }
62 } 67 }
63 else static assert(0, "todo"); 68 else static assert(0, "todo");
64 } 69 }
65 70
66 71 ifloat oneif()
67 real two = 2.0; 72 {
73 version(X86)
74 {
75 asm { fld1; }
76 }
77 else version (X86_64)
78 {
79 asm { movss XMM0, [one_f]; }
80 }
81 else static assert(0, "todo");
82 }
83
84 idouble oneid()
85 {
86 version(X86)
87 {
88 asm { fld1; }
89 }
90 else version (X86_64)
91 {
92 asm { movsd XMM0, [one_d]; }
93 }
94 else static assert(0, "todo");
95 }
96
97 ireal oneir()
98 {
99 version(X86)
100 {
101 asm { fld1; }
102 }
103 else version (X86_64)
104 {
105 asm { fld1; }
106 }
107 else static assert(0, "todo");
108 }
109
110
111 const float two_f = 2;
112
113 cfloat cf()
114 {
115 version(X86)
116 {
117 asm { fld1; flds two_f; }
118 }
119 else version (X86_64)
120 {
121 asm
122 {
123 movss XMM1, [two_f];
124 movss XMM0, [one_f];
125 movd ECX, XMM1;
126 movd EAX, XMM0;
127
128 // invalid operand size :(
129 //shl RCX, 32;
130 //or RAX, RCX;
131
132 pushq RAX;
133 mov [RSP + 4], EAX;
134 popq RAX;
135
136 movd XMM0, RAX;
137 }
138 }
139 else static assert(0, "todo");
140 }
141
142 cfloat cf2()
143 {
144 version(X86)
145 {
146 asm
147 {
148 naked;
149 fld1;
150 flds two_f;
151 ret;
152 }
153 }
154 else version (X86_64)
155 {
156 asm
157 {
158 naked;
159 movss XMM1, [two_f];
160 movss XMM0, [one_f];
161 movd ECX, XMM1;
162 movd EAX, XMM0;
163
164 // invalid operand size :(
165 //shl RCX, 32;
166 //or RAX, RCX;
167
168 pushq RAX;
169 mov [RSP + 4], EAX;
170 popq RAX;
171
172 movd RAX, XMM0;
173 ret;
174 }
175 }
176 else static assert(0, "todo");
177 }
178
179
180 const double two_d = 2;
181
182 cdouble cd()
183 {
184 version(X86)
185 {
186 asm { fld1; fld two_d }
187 }
188 else version (X86_64)
189 {
190 asm
191 {
192 leaq RAX, [one_d];
193 leaq RCX, [two_d];
194 movsd XMM0, [RAX];
195 movsd XMM1, [RCX];
196 }
197 }
198 else static assert(0, "todo");
199 }
200
201 cdouble cd2()
202 {
203 version(X86)
204 {
205 asm
206 {
207 naked;
208 fld1;
209 fld two_d;
210 ret;
211 }
212 }
213 else version (X86_64)
214 {
215 asm
216 {
217 naked;
218 movsd XMM0, [one_d];
219 movsd XMM1, [two_d];
220 }
221 }
222 else static assert(0, "todo");
223 }
224
225
226 const real two_r = 2.0;
68 227
69 creal cr() 228 creal cr()
70 { 229 {
71 version(X86) 230 version(X86)
72 { 231 {
73 asm { fld1; fld two; } 232 asm { fld1; fld two_r; }
74 } 233 }
75 else version (X86_64) 234 else version (X86_64)
76 { 235 {
77 asm { fld1; fld two; } 236 asm { fld two_r; fld1; }
78 } 237 }
79 else static assert(0, "todo"); 238 else static assert(0, "todo");
80 } 239 }
81 240
82 creal cr2() 241 creal cr2()
85 { 244 {
86 asm 245 asm
87 { 246 {
88 naked; 247 naked;
89 fld1; 248 fld1;
90 fld two; 249 fld two_r;
91 ret; 250 ret;
92 } 251 }
93 } 252 }
94 else version (X86_64) 253 else version (X86_64)
95 { 254 {
96 asm 255 asm
97 { 256 {
98 naked; 257 naked;
258 fld two_r;
99 fld1; 259 fld1;
100 fld two;
101 ret; 260 ret;
102 } 261 }
103 } 262 }
104 else static assert(0, "todo"); 263 else static assert(0, "todo");
105 } 264 }
191 assert(bar() == 0x00000000000000FF); 350 assert(bar() == 0x00000000000000FF);
192 } 351 }
193 assert(onef() == 1); 352 assert(onef() == 1);
194 assert(oned() == 1); 353 assert(oned() == 1);
195 assert(oner() == 1); 354 assert(oner() == 1);
355
356 assert(oneif() == 1i);
357 assert(oneid() == 1i);
358 assert(oneir() == 1i);
359
360 assert(cf() == 1+2i);
361 assert(cf2() == 1+2i);
362
363 assert(cd() == 1+2i);
364 assert(cd2() == 1+2i);
365
196 assert(cr() == 1+2i); 366 assert(cr() == 1+2i);
197 assert(cr2() == 1+2i); 367 assert(cr2() == 1+2i);
368
198 assert(vp() == cast(void*)0x80); 369 assert(vp() == cast(void*)0x80);
199 assert(aa() is gaa); 370 assert(aa() is gaa);
200 assert(ob() is gobj); 371 assert(ob() is gobj);
201 assert(str() == "hello world"); 372 assert(str() == "hello world");
202 assert(dg()() == "object.Object"); 373 assert(dg()() == "object.Object");