Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(531)

Side by Side Diff: runtime/vm/assembler_arm64_test.cc

Issue 214233006: Adds subract, move wide immediate instructions to ARM64. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698