OLD | NEW |
---|---|
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/globals.h" | 5 #include "vm/globals.h" |
6 #if defined(TARGET_ARCH_ARM64) | 6 #if defined(TARGET_ARCH_ARM64) |
7 | 7 |
8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
9 #include "vm/cpu.h" | 9 #include "vm/cpu.h" |
10 #include "vm/os.h" | 10 #include "vm/os.h" |
11 #include "vm/unit_test.h" | 11 #include "vm/unit_test.h" |
12 #include "vm/virtual_memory.h" | 12 #include "vm/virtual_memory.h" |
13 | 13 |
14 namespace dart { | 14 namespace dart { |
15 | 15 |
16 #define __ assembler-> | 16 #define __ assembler-> |
17 | 17 |
18 ASSEMBLER_TEST_GENERATE(Simple, assembler) { | 18 ASSEMBLER_TEST_GENERATE(Simple, assembler) { |
19 __ add(R0, ZR, Operand(ZR)); | 19 __ add(R0, ZR, Operand(ZR)); |
20 __ add(R0, R0, Operand(42)); | 20 __ add(R0, R0, Operand(42)); |
21 __ ret(); | 21 __ ret(); |
22 } | 22 } |
23 | 23 |
24 | 24 |
25 ASSEMBLER_TEST_RUN(Simple, test) { | 25 ASSEMBLER_TEST_RUN(Simple, test) { |
26 typedef int (*SimpleCode)(); | 26 typedef int (*SimpleCode)(); |
27 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT32(SimpleCode, test->entry())); | 27 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); |
28 } | |
29 | |
30 | |
31 // Move wide immediate tests. | |
32 // movz | |
33 ASSEMBLER_TEST_GENERATE(Movz0, assembler) { | |
34 __ movz(R0, 42, 0); | |
35 __ ret(); | |
36 } | |
37 | |
38 | |
39 ASSEMBLER_TEST_RUN(Movz0, test) { | |
40 typedef int (*SimpleCode)(); | |
41 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); | |
42 } | |
43 | |
44 | |
45 ASSEMBLER_TEST_GENERATE(Movz1, assembler) { | |
46 __ movz(R0, 42, 1); | |
regis
2014/04/03 16:57:38
You verify below that movk leaves some bits unchan
zra
2014/04/03 17:14:02
Done.
| |
47 __ ret(); | |
48 } | |
49 | |
50 | |
51 ASSEMBLER_TEST_RUN(Movz1, test) { | |
52 typedef int (*SimpleCode)(); | |
53 EXPECT_EQ(42LL << 16, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); | |
54 } | |
55 | |
56 | |
57 ASSEMBLER_TEST_GENERATE(Movz2, assembler) { | |
58 __ movz(R0, 42, 2); | |
59 __ ret(); | |
60 } | |
61 | |
62 | |
63 ASSEMBLER_TEST_RUN(Movz2, test) { | |
64 typedef int (*SimpleCode)(); | |
65 EXPECT_EQ(42LL << 32, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); | |
66 } | |
67 | |
68 | |
69 ASSEMBLER_TEST_GENERATE(Movz3, assembler) { | |
70 __ movz(R0, 42, 3); | |
71 __ ret(); | |
72 } | |
73 | |
74 | |
75 ASSEMBLER_TEST_RUN(Movz3, test) { | |
76 typedef int (*SimpleCode)(); | |
77 EXPECT_EQ(42LL << 48, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); | |
78 } | |
79 | |
80 | |
81 // movn | |
82 ASSEMBLER_TEST_GENERATE(Movn0, assembler) { | |
83 __ movn(R0, 42, 0); | |
84 __ ret(); | |
85 } | |
86 | |
87 | |
88 ASSEMBLER_TEST_RUN(Movn0, test) { | |
89 typedef int (*SimpleCode)(); | |
90 EXPECT_EQ(~42LL, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); | |
91 } | |
92 | |
93 | |
94 ASSEMBLER_TEST_GENERATE(Movn1, assembler) { | |
95 __ movn(R0, 42, 1); | |
96 __ ret(); | |
97 } | |
98 | |
99 | |
100 ASSEMBLER_TEST_RUN(Movn1, test) { | |
101 typedef int (*SimpleCode)(); | |
102 EXPECT_EQ(~(42LL << 16), EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); | |
103 } | |
104 | |
105 | |
106 ASSEMBLER_TEST_GENERATE(Movn2, assembler) { | |
107 __ movn(R0, 42, 2); | |
108 __ ret(); | |
109 } | |
110 | |
111 | |
112 ASSEMBLER_TEST_RUN(Movn2, test) { | |
113 typedef int (*SimpleCode)(); | |
114 EXPECT_EQ(~(42LL << 32), EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); | |
115 } | |
116 | |
117 | |
118 ASSEMBLER_TEST_GENERATE(Movn3, assembler) { | |
119 __ movn(R0, 42, 3); | |
120 __ ret(); | |
121 } | |
122 | |
123 | |
124 ASSEMBLER_TEST_RUN(Movn3, test) { | |
125 typedef int (*SimpleCode)(); | |
126 EXPECT_EQ(~(42LL << 48), EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); | |
127 } | |
128 | |
129 // movk | |
130 ASSEMBLER_TEST_GENERATE(Movk0, assembler) { | |
131 __ movz(R0, 1, 3); | |
132 __ movk(R0, 42, 0); | |
133 __ ret(); | |
134 } | |
135 | |
136 | |
137 ASSEMBLER_TEST_RUN(Movk0, test) { | |
138 typedef int (*SimpleCode)(); | |
139 EXPECT_EQ( | |
140 42LL | (1LL << 48), EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); | |
141 } | |
142 | |
143 | |
144 ASSEMBLER_TEST_GENERATE(Movk1, assembler) { | |
145 __ movz(R0, 1, 0); | |
146 __ movk(R0, 42, 1); | |
147 __ ret(); | |
148 } | |
149 | |
150 | |
151 ASSEMBLER_TEST_RUN(Movk1, test) { | |
152 typedef int (*SimpleCode)(); | |
153 EXPECT_EQ( | |
154 (42LL << 16) | 1, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); | |
155 } | |
156 | |
157 | |
158 ASSEMBLER_TEST_GENERATE(Movk2, assembler) { | |
159 __ movz(R0, 1, 0); | |
160 __ movk(R0, 42, 2); | |
161 __ ret(); | |
162 } | |
163 | |
164 | |
165 ASSEMBLER_TEST_RUN(Movk2, test) { | |
166 typedef int (*SimpleCode)(); | |
167 EXPECT_EQ( | |
168 (42LL << 32) | 1, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); | |
169 } | |
170 | |
171 | |
172 ASSEMBLER_TEST_GENERATE(Movk3, assembler) { | |
173 __ movz(R0, 1, 0); | |
174 __ movk(R0, 42, 3); | |
175 __ ret(); | |
176 } | |
177 | |
178 | |
179 ASSEMBLER_TEST_RUN(Movk3, test) { | |
180 typedef int (*SimpleCode)(); | |
181 EXPECT_EQ( | |
182 (42LL << 48) | 1, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); | |
183 } | |
184 | |
185 | |
186 // add tests. | |
187 ASSEMBLER_TEST_GENERATE(AddReg, assembler) { | |
188 __ movz(R0, 20, 0); | |
189 __ movz(R1, 22, 0); | |
190 __ add(R0, R0, Operand(R1)); | |
191 __ ret(); | |
192 } | |
193 | |
194 | |
195 ASSEMBLER_TEST_RUN(AddReg, test) { | |
196 typedef int (*SimpleCode)(); | |
197 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); | |
198 } | |
199 | |
200 | |
201 ASSEMBLER_TEST_GENERATE(AddLSLReg, assembler) { | |
202 __ movz(R0, 20, 0); | |
203 __ movz(R1, 11, 0); | |
204 __ add(R0, R0, Operand(R1, LSL, 1)); | |
205 __ ret(); | |
206 } | |
207 | |
208 | |
209 ASSEMBLER_TEST_RUN(AddLSLReg, test) { | |
210 typedef int (*SimpleCode)(); | |
211 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); | |
212 } | |
213 | |
214 | |
215 ASSEMBLER_TEST_GENERATE(AddLSRReg, assembler) { | |
216 __ movz(R0, 20, 0); | |
217 __ movz(R1, 44, 0); | |
218 __ add(R0, R0, Operand(R1, LSR, 1)); | |
219 __ ret(); | |
220 } | |
221 | |
222 | |
223 ASSEMBLER_TEST_RUN(AddLSRReg, test) { | |
224 typedef int (*SimpleCode)(); | |
225 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); | |
226 } | |
227 | |
228 | |
229 ASSEMBLER_TEST_GENERATE(AddASRReg, assembler) { | |
230 __ movz(R0, 20, 0); | |
231 __ movz(R1, 44, 0); | |
232 __ add(R0, R0, Operand(R1, ASR, 1)); | |
233 __ ret(); | |
234 } | |
235 | |
236 | |
237 ASSEMBLER_TEST_RUN(AddASRReg, test) { | |
238 typedef int (*SimpleCode)(); | |
239 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); | |
240 } | |
241 | |
242 | |
243 ASSEMBLER_TEST_GENERATE(AddASRNegReg, assembler) { | |
244 __ movz(R0, 43, 0); | |
245 __ movn(R1, 0, 0); // R1 <- -1 | |
246 __ add(R1, ZR, Operand(R1, LSL, 3)); // R1 <- -8 | |
247 __ add(R0, R0, Operand(R1, ASR, 3)); // R0 <- 43 + (-8 >> 3) | |
248 __ ret(); | |
249 } | |
250 | |
251 | |
252 ASSEMBLER_TEST_RUN(AddASRNegReg, test) { | |
253 typedef int (*SimpleCode)(); | |
254 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); | |
255 } | |
256 | |
257 | |
258 // TODO(zra): test other sign extension modes. | |
259 ASSEMBLER_TEST_GENERATE(AddExtReg, assembler) { | |
260 __ movz(R0, 43, 0); | |
261 __ movz(R1, 0xffff, 0); | |
262 __ movk(R1, 0xffff, 1); // R1 <- -1 (32-bit) | |
263 __ add(R0, R0, Operand(R1, SXTW, 0)); // R0 <- R0 + (sign extended R1) | |
264 __ ret(); | |
265 } | |
266 | |
267 | |
268 ASSEMBLER_TEST_RUN(AddExtReg, test) { | |
269 typedef int (*SimpleCode)(); | |
270 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry())); | |
28 } | 271 } |
29 | 272 |
30 } // namespace dart | 273 } // namespace dart |
31 | 274 |
32 #endif // defined(TARGET_ARCH_ARM64) | 275 #endif // defined(TARGET_ARCH_ARM64) |
OLD | NEW |