Mercurial > projects > ldc
comparison tests/mini/asm8.d @ 949:b2d27ddf8f45
changes to get the naked asm stuff working for x64
author | wilsonk@ubuntu |
---|---|
date | Tue, 10 Feb 2009 08:02:25 -0700 |
parents | 03d7c4aac654 |
children | 7e669954db7d |
comparison
equal
deleted
inserted
replaced
948:780530d1cad3 | 949:b2d27ddf8f45 |
---|---|
1 int foo() | 1 int foo() |
2 { | 2 { |
3 version(X86) | 3 version(X86) |
4 asm { mov EAX, 42; } | 4 { |
5 asm { mov EAX, 42; } | |
6 } | |
7 else version (X86_64) | |
8 { | |
9 asm { mov EAX, 42; } | |
10 } | |
5 else static assert(0, "todo"); | 11 else static assert(0, "todo"); |
6 } | 12 } |
7 | 13 |
8 ulong bar() | 14 ulong bar() |
9 { | 15 { |
10 version(X86) | 16 version(X86) |
11 asm { mov EDX, 0xAA; mov EAX, 0xFF; } | 17 { |
18 asm { mov EDX, 0xAA; mov EAX, 0xFF; } | |
19 } | |
20 else version (X86_64) | |
21 { | |
22 asm { movq RAX, 0xFF; } | |
23 } | |
12 else static assert(0, "todo"); | 24 else static assert(0, "todo"); |
13 } | 25 } |
14 | 26 |
15 float onef() | 27 float onef() |
16 { | 28 { |
17 version(X86) | 29 version(X86) |
18 asm { fld1; } | 30 { |
31 asm { fld1; } | |
32 } | |
33 else version (X86_64) | |
34 { | |
35 asm { fld1; } | |
36 } | |
19 else static assert(0, "todo"); | 37 else static assert(0, "todo"); |
20 } | 38 } |
21 | 39 |
22 double oned() | 40 double oned() |
23 { | 41 { |
24 version(X86) | 42 version(X86) |
25 asm { fld1; } | 43 { |
44 asm { fld1; } | |
45 } | |
46 else version (X86_64) | |
47 { | |
48 asm { fld1; } | |
49 } | |
26 else static assert(0, "todo"); | 50 else static assert(0, "todo"); |
27 } | 51 } |
28 | 52 |
29 real oner() | 53 real oner() |
30 { | 54 { |
31 version(X86) | 55 version(X86) |
32 asm { fld1; } | 56 { |
33 else static assert(0, "todo"); | 57 asm { fld1; } |
34 } | 58 } |
59 else version (X86_64) | |
60 { | |
61 asm { fld1; } | |
62 } | |
63 else static assert(0, "todo"); | |
64 } | |
65 | |
35 | 66 |
36 real two = 2.0; | 67 real two = 2.0; |
37 | 68 |
38 creal cr() | 69 creal cr() |
39 { | 70 { |
40 version(X86) | 71 version(X86) |
41 asm { fld1; fld two; } | 72 { |
73 asm { fld1; fld two; } | |
74 } | |
75 else version (X86_64) | |
76 { | |
77 asm { fld1; fld two; } | |
78 } | |
42 else static assert(0, "todo"); | 79 else static assert(0, "todo"); |
43 } | 80 } |
44 | 81 |
45 creal cr2() | 82 creal cr2() |
46 { | 83 { |
47 version(X86) | 84 version(X86) |
85 { | |
86 asm | |
87 { | |
88 naked; | |
89 fld1; | |
90 fld two; | |
91 ret; | |
92 } | |
93 } | |
94 else version (X86_64) | |
95 { | |
48 asm | 96 asm |
49 { | 97 { |
50 naked; | 98 naked; |
51 fld1; | 99 fld1; |
52 fld two; | 100 fld two; |
53 ret; | 101 ret; |
102 } | |
54 } | 103 } |
55 else static assert(0, "todo"); | 104 else static assert(0, "todo"); |
56 } | 105 } |
57 | 106 |
58 void* vp() | 107 void* vp() |
59 { | 108 { |
60 version(X86) | 109 version(X86) |
61 asm { mov EAX, 0x80; } | 110 { |
111 asm { mov EAX, 0x80; } | |
112 } | |
113 else version (X86_64) | |
114 { | |
115 asm { movq RAX, 0x80; } | |
116 } | |
62 else static assert(0, "todo"); | 117 else static assert(0, "todo"); |
63 } | 118 } |
64 | 119 |
65 int[int] gaa; | 120 int[int] gaa; |
66 | 121 |
67 int[int] aa() | 122 int[int] aa() |
68 { | 123 { |
69 version(X86) | 124 version(X86) |
70 asm { mov EAX, gaa; } | 125 { |
126 asm { mov EAX, gaa; } | |
127 } | |
128 else version (X86_64) | |
129 { | |
130 asm { movq RAX, gaa; } | |
131 } | |
71 else static assert(0, "todo"); | 132 else static assert(0, "todo"); |
72 } | 133 } |
73 | 134 |
74 Object gobj; | 135 Object gobj; |
75 | 136 |
76 Object ob() | 137 Object ob() |
77 { | 138 { |
78 version(X86) | 139 version(X86) |
79 asm { mov EAX, gobj; } | 140 { |
141 asm { mov EAX, gobj; } | |
142 } | |
143 else version (X86_64) | |
144 { | |
145 asm { movq RAX, gobj; } | |
146 } | |
80 else static assert(0, "todo"); | 147 else static assert(0, "todo"); |
81 } | 148 } |
82 | 149 |
83 char[] ghello = "hello world"; | 150 char[] ghello = "hello world"; |
84 | 151 |
85 char[] str() | 152 char[] str() |
86 { | 153 { |
87 version(X86) | 154 version(X86) |
88 asm { lea ECX, ghello; mov EAX, [ECX]; mov EDX, [ECX+4]; } | 155 { |
156 asm { lea ECX, ghello; mov EAX, [ECX]; mov EDX, [ECX+4]; } | |
157 } | |
158 else version (X86_64) | |
159 { | |
160 asm { movq RAX, [ghello]; movq RDX, [ghello]+8; } | |
161 } | |
89 else static assert(0, "todo"); | 162 else static assert(0, "todo"); |
90 } | 163 } |
91 | 164 |
92 char[] delegate() dg() | 165 char[] delegate() dg() |
93 { | 166 { |
94 version(X86) | 167 version(X86) |
95 asm { mov EAX, gobj; lea EDX, Object.toString; } | 168 { |
169 asm { mov EAX, gobj; lea EDX, Object.toString; } | |
170 } | |
171 else version (X86_64) | |
172 { | |
173 asm { movq RAX, [gobj]; leaq RDX, Object.toString; } | |
174 } | |
96 else static assert(0, "todo"); | 175 else static assert(0, "todo"); |
97 } | 176 } |
98 | 177 |
99 void main() | 178 void main() |
100 { | 179 { |
101 gaa[4] = 5; | 180 gaa[4] = 5; |
102 gobj = new Object; | 181 gobj = new Object; |
103 auto adg = &gobj.toString; | 182 auto adg = &gobj.toString; |
104 | 183 |
105 assert(foo() == 42); | 184 assert(foo() == 42); |
106 assert(bar() == 0x000000AA000000FF); | 185 version(X86) |
186 { | |
187 assert(bar() == 0x000000AA000000FF); | |
188 } | |
189 else version (X86_64) | |
190 { | |
191 assert(bar() == 0x00000000000000FF); | |
192 } | |
107 assert(onef() == 1); | 193 assert(onef() == 1); |
108 assert(oned() == 1); | 194 assert(oned() == 1); |
109 assert(oner() == 1); | 195 assert(oner() == 1); |
110 assert(cr() == 1+2i); | 196 assert(cr() == 1+2i); |
111 assert(cr2() == 1+2i); | 197 assert(cr2() == 1+2i); |