Mercurial > projects > ldc
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"); |