Mercurial > projects > dstress
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*, ...); |