comparison run/mini/asm8.d @ 1628:c6ef09dfba4d

add mini test set from ldc project
author Moritz Warning <moritzwarning@web.de>
date Mon, 10 Jan 2011 19:47:18 +0100
parents
children
comparison
equal deleted inserted replaced
1627:e1b954780837 1628:c6ef09dfba4d
1 const float one_f = 1;
2 const double one_d = 1;
3 const real one_r = 1;
4
5 int foo()
6 {
7 version(X86)
8 {
9 asm { mov EAX, 42; }
10 }
11 else version (X86_64)
12 {
13 asm { mov EAX, 42; }
14 }
15 else static assert(0, "todo");
16 }
17
18 ulong bar()
19 {
20 version(X86)
21 {
22 asm { mov EDX, 0xAA; mov EAX, 0xFF; }
23 }
24 else version (X86_64)
25 {
26 asm { movq RAX, 0xAA000000FF; }
27 }
28 else static assert(0, "todo");
29 }
30
31
32 float onef()
33 {
34 version(X86)
35 {
36 asm { fld1; }
37 }
38 else version (X86_64)
39 {
40 asm { movss XMM0, [one_f]; }
41 }
42 else static assert(0, "todo");
43 }
44
45 double oned()
46 {
47 version(X86)
48 {
49 asm { fld1; }
50 }
51 else version (X86_64)
52 {
53 asm { movsd XMM0, [one_d]; }
54 }
55 else static assert(0, "todo");
56 }
57
58 real oner()
59 {
60 version(X86)
61 {
62 asm { fld1; }
63 }
64 else version (X86_64)
65 {
66 asm { fld1; }
67 }
68 else static assert(0, "todo");
69 }
70
71 ifloat oneif()
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; fld two_f; }
118 }
119 else version (X86_64)
120 {
121 asm
122 {
123 movss XMM0, [one_f];
124 movss XMM1, [two_f];
125 }
126 }
127 else static assert(0, "todo");
128 }
129
130 extern(C) cfloat cf_C()
131 {
132 version(X86)
133 {
134 asm {
135 mov EAX, [one_f];
136 mov EDX, [two_f];
137 }
138 }
139 else version (X86_64)
140 {
141 asm {
142 mov EAX, [one_f];
143 mov ECX, [two_f];
144
145 shl RCX, 32;
146 or RAX, RCX;
147
148 movd XMM0, RAX;
149 }
150 }
151 else static assert(0, "todo");
152 }
153
154 cfloat cf2()
155 {
156 version(X86)
157 {
158 asm
159 {
160 naked;
161 fld1;
162 fld two_f;
163 ret;
164 }
165 }
166 else version (X86_64)
167 {
168 asm
169 {
170 naked;
171 movss XMM0, [one_f];
172 movss XMM1, [two_f];
173 ret;
174 }
175 }
176 else static assert(0, "todo");
177 }
178
179 extern(C) cfloat cf2_C()
180 {
181 version(X86)
182 {
183 asm
184 {
185 naked;
186 mov EAX, [one_f];
187 mov EDX, [two_f];
188 ret;
189 }
190 }
191 else version (X86_64)
192 {
193 asm {
194 naked;
195 mov EAX, [one_f];
196 mov ECX, [two_f];
197
198 shl RCX, 32;
199 or RAX, RCX;
200
201 movd XMM0, RAX;
202 ret;
203 }
204 }
205 else static assert(0, "todo");
206 }
207
208
209 const double two_d = 2;
210
211 cdouble cd()
212 {
213 version(X86)
214 {
215 asm { fld1; fld two_d; }
216 }
217 else version (X86_64)
218 {
219 asm
220 {
221 leaq RAX, [one_d];
222 leaq RCX, [two_d];
223 movsd XMM0, [RAX];
224 movsd XMM1, [RCX];
225 }
226 }
227 else static assert(0, "todo");
228 }
229
230 cdouble cd2()
231 {
232 version(X86)
233 {
234 asm
235 {
236 naked;
237 fld1;
238 fld two_d;
239 ret;
240 }
241 }
242 else version (X86_64)
243 {
244 asm
245 {
246 naked;
247 movsd XMM0, [one_d];
248 movsd XMM1, [two_d];
249 }
250 }
251 else static assert(0, "todo");
252 }
253
254
255 const real two_r = 2.0;
256
257 creal cr()
258 {
259 version(X86)
260 {
261 asm { fld1; fld two_r; }
262 }
263 else version (X86_64)
264 {
265 asm { fld two_r; fld1; }
266 }
267 else static assert(0, "todo");
268 }
269
270 creal cr2()
271 {
272 version(X86)
273 {
274 asm
275 {
276 naked;
277 fld1;
278 fld two_r;
279 ret;
280 }
281 }
282 else version (X86_64)
283 {
284 asm
285 {
286 naked;
287 fld two_r;
288 fld1;
289 ret;
290 }
291 }
292 else static assert(0, "todo");
293 }
294
295 void* vp()
296 {
297 version(X86)
298 {
299 asm { mov EAX, 0x80; }
300 }
301 else version (X86_64)
302 {
303 asm { movq RAX, 0x80; }
304 }
305 else static assert(0, "todo");
306 }
307
308 int[int] gaa;
309
310 int[int] aa()
311 {
312 version(X86)
313 {
314 asm { mov EAX, gaa; }
315 }
316 else version (X86_64)
317 {
318 asm { movq RAX, gaa; }
319 }
320 else static assert(0, "todo");
321 }
322
323 Object gobj;
324
325 Object ob()
326 {
327 version(X86)
328 {
329 asm { mov EAX, gobj; }
330 }
331 else version (X86_64)
332 {
333 asm { movq RAX, gobj; }
334 }
335 else static assert(0, "todo");
336 }
337
338 char[] ghello = "hello world";
339
340 char[] str()
341 {
342 version(X86)
343 {
344 asm { lea ECX, ghello; mov EAX, [ECX]; mov EDX, [ECX+4]; }
345 }
346 else version (X86_64)
347 {
348 asm { movq RAX, [ghello]; movq RDX, [ghello]+8; }
349 }
350 else static assert(0, "todo");
351 }
352
353 char[] delegate() dg()
354 {
355 version(X86)
356 {
357 asm { mov EAX, gobj; lea EDX, Object.toString; }
358 }
359 else version (X86_64)
360 {
361 asm { movq RAX, [gobj]; leaq RDX, Object.toString; }
362 }
363 else static assert(0, "todo");
364 }
365
366 void main()
367 {
368 gaa[4] = 5;
369 gobj = new Object;
370 auto adg = &gobj.toString;
371
372 assert(foo() == 42);
373 assert(bar() == 0xAA000000FF);
374 assert(onef() == 1);
375 assert(oned() == 1);
376 assert(oner() == 1);
377
378 assert(oneif() == 1i);
379 assert(oneid() == 1i);
380 assert(oneir() == 1i);
381
382 assert(cf() == 1+2i);
383 assert(cf2() == 1+2i);
384
385 assert(cf_C() == 1+2i);
386 assert(cf2_C() == 1+2i);
387
388 assert(cd() == 1+2i);
389 assert(cd2() == 1+2i);
390
391 assert(cr() == 1+2i);
392 assert(cr2() == 1+2i);
393
394 assert(vp() == cast(void*)0x80);
395 assert(aa() is gaa);
396 assert(ob() is gobj);
397 assert(str() == "hello world");
398 assert(dg()() == "object.Object");
399 }
400
401 extern(C) int printf(char*, ...);