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

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

Issue 593363003: Expands the use of Immediate and Operand wrappers. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 2 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
« no previous file with comments | « runtime/vm/assembler_arm64.cc ('k') | runtime/vm/assembler_arm_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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"
(...skipping 15 matching lines...) Expand all
26 26
27 ASSEMBLER_TEST_RUN(Simple, test) { 27 ASSEMBLER_TEST_RUN(Simple, test) {
28 typedef int64_t (*Int64Return)() DART_UNUSED; 28 typedef int64_t (*Int64Return)() DART_UNUSED;
29 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 29 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
30 } 30 }
31 31
32 32
33 // Move wide immediate tests. 33 // Move wide immediate tests.
34 // movz 34 // movz
35 ASSEMBLER_TEST_GENERATE(Movz0, assembler) { 35 ASSEMBLER_TEST_GENERATE(Movz0, assembler) {
36 __ movz(R0, 42, 0); 36 __ movz(R0, Immediate(42), 0);
37 __ ret(); 37 __ ret();
38 } 38 }
39 39
40 40
41 ASSEMBLER_TEST_RUN(Movz0, test) { 41 ASSEMBLER_TEST_RUN(Movz0, test) {
42 typedef int64_t (*Int64Return)() DART_UNUSED; 42 typedef int64_t (*Int64Return)() DART_UNUSED;
43 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 43 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
44 } 44 }
45 45
46 46
47 ASSEMBLER_TEST_GENERATE(Movz1, assembler) { 47 ASSEMBLER_TEST_GENERATE(Movz1, assembler) {
48 __ movz(R0, 42, 0); // Overwritten by next instruction. 48 __ movz(R0, Immediate(42), 0); // Overwritten by next instruction.
49 __ movz(R0, 42, 1); 49 __ movz(R0, Immediate(42), 1);
50 __ ret(); 50 __ ret();
51 } 51 }
52 52
53 53
54 ASSEMBLER_TEST_RUN(Movz1, test) { 54 ASSEMBLER_TEST_RUN(Movz1, test) {
55 typedef int64_t (*Int64Return)() DART_UNUSED; 55 typedef int64_t (*Int64Return)() DART_UNUSED;
56 EXPECT_EQ(42LL << 16, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 56 EXPECT_EQ(42LL << 16, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
57 } 57 }
58 58
59 59
60 ASSEMBLER_TEST_GENERATE(Movz2, assembler) { 60 ASSEMBLER_TEST_GENERATE(Movz2, assembler) {
61 __ movz(R0, 42, 2); 61 __ movz(R0, Immediate(42), 2);
62 __ ret(); 62 __ ret();
63 } 63 }
64 64
65 65
66 ASSEMBLER_TEST_RUN(Movz2, test) { 66 ASSEMBLER_TEST_RUN(Movz2, test) {
67 typedef int64_t (*Int64Return)() DART_UNUSED; 67 typedef int64_t (*Int64Return)() DART_UNUSED;
68 EXPECT_EQ(42LL << 32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 68 EXPECT_EQ(42LL << 32, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
69 } 69 }
70 70
71 71
72 ASSEMBLER_TEST_GENERATE(Movz3, assembler) { 72 ASSEMBLER_TEST_GENERATE(Movz3, assembler) {
73 __ movz(R0, 42, 3); 73 __ movz(R0, Immediate(42), 3);
74 __ ret(); 74 __ ret();
75 } 75 }
76 76
77 77
78 ASSEMBLER_TEST_RUN(Movz3, test) { 78 ASSEMBLER_TEST_RUN(Movz3, test) {
79 typedef int64_t (*Int64Return)() DART_UNUSED; 79 typedef int64_t (*Int64Return)() DART_UNUSED;
80 EXPECT_EQ(42LL << 48, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 80 EXPECT_EQ(42LL << 48, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
81 } 81 }
82 82
83 83
84 // movn 84 // movn
85 ASSEMBLER_TEST_GENERATE(Movn0, assembler) { 85 ASSEMBLER_TEST_GENERATE(Movn0, assembler) {
86 __ movn(R0, 42, 0); 86 __ movn(R0, Immediate(42), 0);
87 __ ret(); 87 __ ret();
88 } 88 }
89 89
90 90
91 ASSEMBLER_TEST_RUN(Movn0, test) { 91 ASSEMBLER_TEST_RUN(Movn0, test) {
92 typedef int64_t (*Int64Return)() DART_UNUSED; 92 typedef int64_t (*Int64Return)() DART_UNUSED;
93 EXPECT_EQ(~42LL, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 93 EXPECT_EQ(~42LL, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
94 } 94 }
95 95
96 96
97 ASSEMBLER_TEST_GENERATE(Movn1, assembler) { 97 ASSEMBLER_TEST_GENERATE(Movn1, assembler) {
98 __ movn(R0, 42, 1); 98 __ movn(R0, Immediate(42), 1);
99 __ ret(); 99 __ ret();
100 } 100 }
101 101
102 102
103 ASSEMBLER_TEST_RUN(Movn1, test) { 103 ASSEMBLER_TEST_RUN(Movn1, test) {
104 typedef int64_t (*Int64Return)() DART_UNUSED; 104 typedef int64_t (*Int64Return)() DART_UNUSED;
105 EXPECT_EQ(~(42LL << 16), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 105 EXPECT_EQ(~(42LL << 16), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
106 } 106 }
107 107
108 108
109 ASSEMBLER_TEST_GENERATE(Movn2, assembler) { 109 ASSEMBLER_TEST_GENERATE(Movn2, assembler) {
110 __ movn(R0, 42, 2); 110 __ movn(R0, Immediate(42), 2);
111 __ ret(); 111 __ ret();
112 } 112 }
113 113
114 114
115 ASSEMBLER_TEST_RUN(Movn2, test) { 115 ASSEMBLER_TEST_RUN(Movn2, test) {
116 typedef int64_t (*Int64Return)() DART_UNUSED; 116 typedef int64_t (*Int64Return)() DART_UNUSED;
117 EXPECT_EQ(~(42LL << 32), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 117 EXPECT_EQ(~(42LL << 32), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
118 } 118 }
119 119
120 120
121 ASSEMBLER_TEST_GENERATE(Movn3, assembler) { 121 ASSEMBLER_TEST_GENERATE(Movn3, assembler) {
122 __ movn(R0, 42, 3); 122 __ movn(R0, Immediate(42), 3);
123 __ ret(); 123 __ ret();
124 } 124 }
125 125
126 126
127 ASSEMBLER_TEST_RUN(Movn3, test) { 127 ASSEMBLER_TEST_RUN(Movn3, test) {
128 typedef int64_t (*Int64Return)() DART_UNUSED; 128 typedef int64_t (*Int64Return)() DART_UNUSED;
129 EXPECT_EQ(~(42LL << 48), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 129 EXPECT_EQ(~(42LL << 48), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
130 } 130 }
131 131
132 // movk 132 // movk
133 ASSEMBLER_TEST_GENERATE(Movk0, assembler) { 133 ASSEMBLER_TEST_GENERATE(Movk0, assembler) {
134 __ movz(R0, 1, 3); 134 __ movz(R0, Immediate(1), 3);
135 __ movk(R0, 42, 0); 135 __ movk(R0, Immediate(42), 0);
136 __ ret(); 136 __ ret();
137 } 137 }
138 138
139 139
140 ASSEMBLER_TEST_RUN(Movk0, test) { 140 ASSEMBLER_TEST_RUN(Movk0, test) {
141 typedef int64_t (*Int64Return)() DART_UNUSED; 141 typedef int64_t (*Int64Return)() DART_UNUSED;
142 EXPECT_EQ( 142 EXPECT_EQ(
143 42LL | (1LL << 48), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 143 42LL | (1LL << 48), EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
144 } 144 }
145 145
146 146
147 ASSEMBLER_TEST_GENERATE(Movk1, assembler) { 147 ASSEMBLER_TEST_GENERATE(Movk1, assembler) {
148 __ movz(R0, 1, 0); 148 __ movz(R0, Immediate(1), 0);
149 __ movk(R0, 42, 1); 149 __ movk(R0, Immediate(42), 1);
150 __ ret(); 150 __ ret();
151 } 151 }
152 152
153 153
154 ASSEMBLER_TEST_RUN(Movk1, test) { 154 ASSEMBLER_TEST_RUN(Movk1, test) {
155 typedef int64_t (*Int64Return)() DART_UNUSED; 155 typedef int64_t (*Int64Return)() DART_UNUSED;
156 EXPECT_EQ( 156 EXPECT_EQ(
157 (42LL << 16) | 1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 157 (42LL << 16) | 1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
158 } 158 }
159 159
160 160
161 ASSEMBLER_TEST_GENERATE(Movk2, assembler) { 161 ASSEMBLER_TEST_GENERATE(Movk2, assembler) {
162 __ movz(R0, 1, 0); 162 __ movz(R0, Immediate(1), 0);
163 __ movk(R0, 42, 2); 163 __ movk(R0, Immediate(42), 2);
164 __ ret(); 164 __ ret();
165 } 165 }
166 166
167 167
168 ASSEMBLER_TEST_RUN(Movk2, test) { 168 ASSEMBLER_TEST_RUN(Movk2, test) {
169 typedef int64_t (*Int64Return)() DART_UNUSED; 169 typedef int64_t (*Int64Return)() DART_UNUSED;
170 EXPECT_EQ( 170 EXPECT_EQ(
171 (42LL << 32) | 1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 171 (42LL << 32) | 1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
172 } 172 }
173 173
174 174
175 ASSEMBLER_TEST_GENERATE(Movk3, assembler) { 175 ASSEMBLER_TEST_GENERATE(Movk3, assembler) {
176 __ movz(R0, 1, 0); 176 __ movz(R0, Immediate(1), 0);
177 __ movk(R0, 42, 3); 177 __ movk(R0, Immediate(42), 3);
178 __ ret(); 178 __ ret();
179 } 179 }
180 180
181 181
182 ASSEMBLER_TEST_RUN(Movk3, test) { 182 ASSEMBLER_TEST_RUN(Movk3, test) {
183 typedef int64_t (*Int64Return)() DART_UNUSED; 183 typedef int64_t (*Int64Return)() DART_UNUSED;
184 EXPECT_EQ( 184 EXPECT_EQ(
185 (42LL << 48) | 1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 185 (42LL << 48) | 1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
186 } 186 }
187 187
188 188
189 ASSEMBLER_TEST_GENERATE(MovzBig, assembler) { 189 ASSEMBLER_TEST_GENERATE(MovzBig, assembler) {
190 __ movz(R0, 0x8000, 0); 190 __ movz(R0, Immediate(0x8000), 0);
191 __ ret(); 191 __ ret();
192 } 192 }
193 193
194 194
195 ASSEMBLER_TEST_RUN(MovzBig, test) { 195 ASSEMBLER_TEST_RUN(MovzBig, test) {
196 typedef int64_t (*Int64Return)() DART_UNUSED; 196 typedef int64_t (*Int64Return)() DART_UNUSED;
197 EXPECT_EQ(0x8000, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 197 EXPECT_EQ(0x8000, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
198 } 198 }
199 199
200 200
201 // add tests. 201 // add tests.
202 ASSEMBLER_TEST_GENERATE(AddReg, assembler) { 202 ASSEMBLER_TEST_GENERATE(AddReg, assembler) {
203 __ movz(R0, 20, 0); 203 __ movz(R0, Immediate(20), 0);
204 __ movz(R1, 22, 0); 204 __ movz(R1, Immediate(22), 0);
205 __ add(R0, R0, Operand(R1)); 205 __ add(R0, R0, Operand(R1));
206 __ ret(); 206 __ ret();
207 } 207 }
208 208
209 209
210 ASSEMBLER_TEST_RUN(AddReg, test) { 210 ASSEMBLER_TEST_RUN(AddReg, test) {
211 typedef int64_t (*Int64Return)() DART_UNUSED; 211 typedef int64_t (*Int64Return)() DART_UNUSED;
212 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 212 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
213 } 213 }
214 214
215 215
216 ASSEMBLER_TEST_GENERATE(AddLSLReg, assembler) { 216 ASSEMBLER_TEST_GENERATE(AddLSLReg, assembler) {
217 __ movz(R0, 20, 0); 217 __ movz(R0, Immediate(20), 0);
218 __ movz(R1, 11, 0); 218 __ movz(R1, Immediate(11), 0);
219 __ add(R0, R0, Operand(R1, LSL, 1)); 219 __ add(R0, R0, Operand(R1, LSL, 1));
220 __ ret(); 220 __ ret();
221 } 221 }
222 222
223 223
224 ASSEMBLER_TEST_RUN(AddLSLReg, test) { 224 ASSEMBLER_TEST_RUN(AddLSLReg, test) {
225 typedef int64_t (*Int64Return)() DART_UNUSED; 225 typedef int64_t (*Int64Return)() DART_UNUSED;
226 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 226 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
227 } 227 }
228 228
229 229
230 ASSEMBLER_TEST_GENERATE(AddLSRReg, assembler) { 230 ASSEMBLER_TEST_GENERATE(AddLSRReg, assembler) {
231 __ movz(R0, 20, 0); 231 __ movz(R0, Immediate(20), 0);
232 __ movz(R1, 44, 0); 232 __ movz(R1, Immediate(44), 0);
233 __ add(R0, R0, Operand(R1, LSR, 1)); 233 __ add(R0, R0, Operand(R1, LSR, 1));
234 __ ret(); 234 __ ret();
235 } 235 }
236 236
237 237
238 ASSEMBLER_TEST_RUN(AddLSRReg, test) { 238 ASSEMBLER_TEST_RUN(AddLSRReg, test) {
239 typedef int64_t (*Int64Return)() DART_UNUSED; 239 typedef int64_t (*Int64Return)() DART_UNUSED;
240 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 240 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
241 } 241 }
242 242
243 243
244 ASSEMBLER_TEST_GENERATE(AddASRReg, assembler) { 244 ASSEMBLER_TEST_GENERATE(AddASRReg, assembler) {
245 __ movz(R0, 20, 0); 245 __ movz(R0, Immediate(20), 0);
246 __ movz(R1, 44, 0); 246 __ movz(R1, Immediate(44), 0);
247 __ add(R0, R0, Operand(R1, ASR, 1)); 247 __ add(R0, R0, Operand(R1, ASR, 1));
248 __ ret(); 248 __ ret();
249 } 249 }
250 250
251 251
252 ASSEMBLER_TEST_RUN(AddASRReg, test) { 252 ASSEMBLER_TEST_RUN(AddASRReg, test) {
253 typedef int64_t (*Int64Return)() DART_UNUSED; 253 typedef int64_t (*Int64Return)() DART_UNUSED;
254 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 254 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
255 } 255 }
256 256
257 257
258 ASSEMBLER_TEST_GENERATE(AddASRNegReg, assembler) { 258 ASSEMBLER_TEST_GENERATE(AddASRNegReg, assembler) {
259 __ movz(R0, 43, 0); 259 __ movz(R0, Immediate(43), 0);
260 __ movn(R1, 0, 0); // R1 <- -1 260 __ movn(R1, Immediate(0), 0); // R1 <- -1
261 __ add(R1, ZR, Operand(R1, LSL, 3)); // R1 <- -8 261 __ add(R1, ZR, Operand(R1, LSL, 3)); // R1 <- -8
262 __ add(R0, R0, Operand(R1, ASR, 3)); // R0 <- 43 + (-8 >> 3) 262 __ add(R0, R0, Operand(R1, ASR, 3)); // R0 <- 43 + (-8 >> 3)
263 __ ret(); 263 __ ret();
264 } 264 }
265 265
266 266
267 ASSEMBLER_TEST_RUN(AddASRNegReg, test) { 267 ASSEMBLER_TEST_RUN(AddASRNegReg, test) {
268 typedef int64_t (*Int64Return)() DART_UNUSED; 268 typedef int64_t (*Int64Return)() DART_UNUSED;
269 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 269 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
270 } 270 }
271 271
272 272
273 // TODO(zra): test other sign extension modes. 273 // TODO(zra): test other sign extension modes.
274 ASSEMBLER_TEST_GENERATE(AddExtReg, assembler) { 274 ASSEMBLER_TEST_GENERATE(AddExtReg, assembler) {
275 __ movz(R0, 43, 0); 275 __ movz(R0, Immediate(43), 0);
276 __ movz(R1, 0xffff, 0); 276 __ movz(R1, Immediate(0xffff), 0);
277 __ movk(R1, 0xffff, 1); // R1 <- -1 (32-bit) 277 __ movk(R1, Immediate(0xffff), 1); // R1 <- -1 (32-bit)
278 __ add(R0, R0, Operand(R1, SXTW, 0)); // R0 <- R0 + (sign extended R1) 278 __ add(R0, R0, Operand(R1, SXTW, 0)); // R0 <- R0 + (sign extended R1)
279 __ ret(); 279 __ ret();
280 } 280 }
281 281
282 282
283 ASSEMBLER_TEST_RUN(AddExtReg, test) { 283 ASSEMBLER_TEST_RUN(AddExtReg, test) {
284 typedef int64_t (*Int64Return)() DART_UNUSED; 284 typedef int64_t (*Int64Return)() DART_UNUSED;
285 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 285 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
286 } 286 }
287 287
288 288
289 // Loads and Stores. 289 // Loads and Stores.
290 ASSEMBLER_TEST_GENERATE(SimpleLoadStore, assembler) { 290 ASSEMBLER_TEST_GENERATE(SimpleLoadStore, assembler) {
291 __ SetupDartSP(kTestStackSpace); 291 __ SetupDartSP(kTestStackSpace);
292 __ movz(R0, 43, 0); 292 __ movz(R0, Immediate(43), 0);
293 __ movz(R1, 42, 0); 293 __ movz(R1, Immediate(42), 0);
294 __ str(R1, Address(SP, -1*kWordSize, Address::PreIndex)); 294 __ str(R1, Address(SP, -1*kWordSize, Address::PreIndex));
295 __ ldr(R0, Address(SP, 1*kWordSize, Address::PostIndex)); 295 __ ldr(R0, Address(SP, 1*kWordSize, Address::PostIndex));
296 __ mov(CSP, SP); 296 __ mov(CSP, SP);
297 __ ret(); 297 __ ret();
298 } 298 }
299 299
300 300
301 ASSEMBLER_TEST_RUN(SimpleLoadStore, test) { 301 ASSEMBLER_TEST_RUN(SimpleLoadStore, test) {
302 typedef int64_t (*Int64Return)() DART_UNUSED; 302 typedef int64_t (*Int64Return)() DART_UNUSED;
303 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 303 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
304 } 304 }
305 305
306 306
307 ASSEMBLER_TEST_GENERATE(SimpleLoadStoreHeapTag, assembler) { 307 ASSEMBLER_TEST_GENERATE(SimpleLoadStoreHeapTag, assembler) {
308 __ SetupDartSP(kTestStackSpace); 308 __ SetupDartSP(kTestStackSpace);
309 __ movz(R0, 43, 0); 309 __ movz(R0, Immediate(43), 0);
310 __ movz(R1, 42, 0); 310 __ movz(R1, Immediate(42), 0);
311 __ add(R2, SP, Operand(1)); 311 __ add(R2, SP, Operand(1));
312 __ str(R1, Address(R2, -1)); 312 __ str(R1, Address(R2, -1));
313 __ ldr(R0, Address(R2, -1)); 313 __ ldr(R0, Address(R2, -1));
314 __ mov(CSP, SP); 314 __ mov(CSP, SP);
315 __ ret(); 315 __ ret();
316 } 316 }
317 317
318 318
319 ASSEMBLER_TEST_RUN(SimpleLoadStoreHeapTag, test) { 319 ASSEMBLER_TEST_RUN(SimpleLoadStoreHeapTag, test) {
320 typedef int64_t (*Int64Return)() DART_UNUSED; 320 typedef int64_t (*Int64Return)() DART_UNUSED;
321 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 321 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
322 } 322 }
323 323
324 324
325 ASSEMBLER_TEST_GENERATE(LoadStoreLargeIndex, assembler) { 325 ASSEMBLER_TEST_GENERATE(LoadStoreLargeIndex, assembler) {
326 __ SetupDartSP(kTestStackSpace); 326 __ SetupDartSP(kTestStackSpace);
327 __ movz(R0, 43, 0); 327 __ movz(R0, Immediate(43), 0);
328 __ movz(R1, 42, 0); 328 __ movz(R1, Immediate(42), 0);
329 // Largest negative offset that can fit in the signed 9-bit immediate field. 329 // Largest negative offset that can fit in the signed 9-bit immediate field.
330 __ str(R1, Address(SP, -32*kWordSize, Address::PreIndex)); 330 __ str(R1, Address(SP, -32*kWordSize, Address::PreIndex));
331 // Largest positive kWordSize aligned offset that we can fit. 331 // Largest positive kWordSize aligned offset that we can fit.
332 __ ldr(R0, Address(SP, 31*kWordSize, Address::PostIndex)); 332 __ ldr(R0, Address(SP, 31*kWordSize, Address::PostIndex));
333 // Correction. 333 // Correction.
334 __ add(SP, SP, Operand(kWordSize)); // Restore SP. 334 __ add(SP, SP, Operand(kWordSize)); // Restore SP.
335 __ mov(CSP, SP); 335 __ mov(CSP, SP);
336 __ ret(); 336 __ ret();
337 } 337 }
338 338
339 339
340 ASSEMBLER_TEST_RUN(LoadStoreLargeIndex, test) { 340 ASSEMBLER_TEST_RUN(LoadStoreLargeIndex, test) {
341 typedef int64_t (*Int64Return)() DART_UNUSED; 341 typedef int64_t (*Int64Return)() DART_UNUSED;
342 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 342 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
343 } 343 }
344 344
345 345
346 ASSEMBLER_TEST_GENERATE(LoadStoreLargeOffset, assembler) { 346 ASSEMBLER_TEST_GENERATE(LoadStoreLargeOffset, assembler) {
347 __ SetupDartSP(kTestStackSpace); 347 __ SetupDartSP(kTestStackSpace);
348 __ movz(R0, 43, 0); 348 __ movz(R0, Immediate(43), 0);
349 __ movz(R1, 42, 0); 349 __ movz(R1, Immediate(42), 0);
350 __ sub(SP, SP, Operand(512*kWordSize)); 350 __ sub(SP, SP, Operand(512*kWordSize));
351 __ str(R1, Address(SP, 512*kWordSize, Address::Offset)); 351 __ str(R1, Address(SP, 512*kWordSize, Address::Offset));
352 __ add(SP, SP, Operand(512*kWordSize)); 352 __ add(SP, SP, Operand(512*kWordSize));
353 __ ldr(R0, Address(SP)); 353 __ ldr(R0, Address(SP));
354 __ mov(CSP, SP); 354 __ mov(CSP, SP);
355 __ ret(); 355 __ ret();
356 } 356 }
357 357
358 358
359 ASSEMBLER_TEST_RUN(LoadStoreLargeOffset, test) { 359 ASSEMBLER_TEST_RUN(LoadStoreLargeOffset, test) {
360 typedef int64_t (*Int64Return)() DART_UNUSED; 360 typedef int64_t (*Int64Return)() DART_UNUSED;
361 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 361 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
362 } 362 }
363 363
364 364
365 ASSEMBLER_TEST_GENERATE(LoadStoreExtReg, assembler) { 365 ASSEMBLER_TEST_GENERATE(LoadStoreExtReg, assembler) {
366 __ SetupDartSP(kTestStackSpace); 366 __ SetupDartSP(kTestStackSpace);
367 __ movz(R0, 43, 0); 367 __ movz(R0, Immediate(43), 0);
368 __ movz(R1, 42, 0); 368 __ movz(R1, Immediate(42), 0);
369 __ movz(R2, 0xfff8, 0); 369 __ movz(R2, Immediate(0xfff8), 0);
370 __ movk(R2, 0xffff, 1); // R2 <- -8 (int32_t). 370 __ movk(R2, Immediate(0xffff), 1); // R2 <- -8 (int32_t).
371 // This should sign extend R2, and add to SP to get address, 371 // This should sign extend R2, and add to SP to get address,
372 // i.e. SP - kWordSize. 372 // i.e. SP - kWordSize.
373 __ str(R1, Address(SP, R2, SXTW)); 373 __ str(R1, Address(SP, R2, SXTW));
374 __ sub(SP, SP, Operand(kWordSize)); 374 __ sub(SP, SP, Operand(kWordSize));
375 __ ldr(R0, Address(SP)); 375 __ ldr(R0, Address(SP));
376 __ add(SP, SP, Operand(kWordSize)); 376 __ add(SP, SP, Operand(kWordSize));
377 __ mov(CSP, SP); 377 __ mov(CSP, SP);
378 __ ret(); 378 __ ret();
379 } 379 }
380 380
381 381
382 ASSEMBLER_TEST_RUN(LoadStoreExtReg, test) { 382 ASSEMBLER_TEST_RUN(LoadStoreExtReg, test) {
383 typedef int64_t (*Int64Return)() DART_UNUSED; 383 typedef int64_t (*Int64Return)() DART_UNUSED;
384 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 384 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
385 } 385 }
386 386
387 387
388 ASSEMBLER_TEST_GENERATE(LoadStoreScaledReg, assembler) { 388 ASSEMBLER_TEST_GENERATE(LoadStoreScaledReg, assembler) {
389 __ SetupDartSP(kTestStackSpace); 389 __ SetupDartSP(kTestStackSpace);
390 __ movz(R0, 43, 0); 390 __ movz(R0, Immediate(43), 0);
391 __ movz(R1, 42, 0); 391 __ movz(R1, Immediate(42), 0);
392 __ movz(R2, 10, 0); 392 __ movz(R2, Immediate(10), 0);
393 __ sub(SP, SP, Operand(10*kWordSize)); 393 __ sub(SP, SP, Operand(10*kWordSize));
394 // Store R1 into SP + R2 * kWordSize. 394 // Store R1 into SP + R2 * kWordSize.
395 __ str(R1, Address(SP, R2, UXTX, Address::Scaled)); 395 __ str(R1, Address(SP, R2, UXTX, Address::Scaled));
396 __ ldr(R0, Address(SP, R2, UXTX, Address::Scaled)); 396 __ ldr(R0, Address(SP, R2, UXTX, Address::Scaled));
397 __ add(SP, SP, Operand(10*kWordSize)); 397 __ add(SP, SP, Operand(10*kWordSize));
398 __ mov(CSP, SP); 398 __ mov(CSP, SP);
399 __ ret(); 399 __ ret();
400 } 400 }
401 401
402 402
(...skipping 15 matching lines...) Expand all
418 418
419 419
420 ASSEMBLER_TEST_RUN(LoadSigned32Bit, test) { 420 ASSEMBLER_TEST_RUN(LoadSigned32Bit, test) {
421 typedef int64_t (*Int64Return)() DART_UNUSED; 421 typedef int64_t (*Int64Return)() DART_UNUSED;
422 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 422 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
423 } 423 }
424 424
425 425
426 // Logical register operations. 426 // Logical register operations.
427 ASSEMBLER_TEST_GENERATE(AndRegs, assembler) { 427 ASSEMBLER_TEST_GENERATE(AndRegs, assembler) {
428 __ movz(R1, 43, 0); 428 __ movz(R1, Immediate(43), 0);
429 __ movz(R2, 42, 0); 429 __ movz(R2, Immediate(42), 0);
430 __ and_(R0, R1, Operand(R2)); 430 __ and_(R0, R1, Operand(R2));
431 __ ret(); 431 __ ret();
432 } 432 }
433 433
434 434
435 ASSEMBLER_TEST_RUN(AndRegs, test) { 435 ASSEMBLER_TEST_RUN(AndRegs, test) {
436 typedef int64_t (*Int64Return)() DART_UNUSED; 436 typedef int64_t (*Int64Return)() DART_UNUSED;
437 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 437 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
438 } 438 }
439 439
440 440
441 ASSEMBLER_TEST_GENERATE(AndShiftRegs, assembler) { 441 ASSEMBLER_TEST_GENERATE(AndShiftRegs, assembler) {
442 __ movz(R1, 42, 0); 442 __ movz(R1, Immediate(42), 0);
443 __ movz(R2, 21, 0); 443 __ movz(R2, Immediate(21), 0);
444 __ and_(R0, R1, Operand(R2, LSL, 1)); 444 __ and_(R0, R1, Operand(R2, LSL, 1));
445 __ ret(); 445 __ ret();
446 } 446 }
447 447
448 448
449 ASSEMBLER_TEST_RUN(AndShiftRegs, test) { 449 ASSEMBLER_TEST_RUN(AndShiftRegs, test) {
450 typedef int64_t (*Int64Return)() DART_UNUSED; 450 typedef int64_t (*Int64Return)() DART_UNUSED;
451 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 451 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
452 } 452 }
453 453
454 454
455 ASSEMBLER_TEST_GENERATE(BicRegs, assembler) { 455 ASSEMBLER_TEST_GENERATE(BicRegs, assembler) {
456 __ movz(R1, 42, 0); 456 __ movz(R1, Immediate(42), 0);
457 __ movz(R2, 5, 0); 457 __ movz(R2, Immediate(5), 0);
458 __ bic(R0, R1, Operand(R2)); 458 __ bic(R0, R1, Operand(R2));
459 __ ret(); 459 __ ret();
460 } 460 }
461 461
462 462
463 ASSEMBLER_TEST_RUN(BicRegs, test) { 463 ASSEMBLER_TEST_RUN(BicRegs, test) {
464 typedef int64_t (*Int64Return)() DART_UNUSED; 464 typedef int64_t (*Int64Return)() DART_UNUSED;
465 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 465 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
466 } 466 }
467 467
468 468
469 ASSEMBLER_TEST_GENERATE(OrrRegs, assembler) { 469 ASSEMBLER_TEST_GENERATE(OrrRegs, assembler) {
470 __ movz(R1, 32, 0); 470 __ movz(R1, Immediate(32), 0);
471 __ movz(R2, 10, 0); 471 __ movz(R2, Immediate(10), 0);
472 __ orr(R0, R1, Operand(R2)); 472 __ orr(R0, R1, Operand(R2));
473 __ ret(); 473 __ ret();
474 } 474 }
475 475
476 476
477 ASSEMBLER_TEST_RUN(OrrRegs, test) { 477 ASSEMBLER_TEST_RUN(OrrRegs, test) {
478 typedef int64_t (*Int64Return)() DART_UNUSED; 478 typedef int64_t (*Int64Return)() DART_UNUSED;
479 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 479 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
480 } 480 }
481 481
482 482
483 ASSEMBLER_TEST_GENERATE(OrnRegs, assembler) { 483 ASSEMBLER_TEST_GENERATE(OrnRegs, assembler) {
484 __ movz(R1, 32, 0); 484 __ movz(R1, Immediate(32), 0);
485 __ movn(R2, 0, 0); // R2 <- 0xffffffffffffffff. 485 __ movn(R2, Immediate(0), 0); // R2 <- 0xffffffffffffffff.
486 __ movk(R2, 0xffd5, 0); // R2 <- 0xffffffffffffffe5. 486 __ movk(R2, Immediate(0xffd5), 0); // R2 <- 0xffffffffffffffe5.
487 __ orn(R0, R1, Operand(R2)); 487 __ orn(R0, R1, Operand(R2));
488 __ ret(); 488 __ ret();
489 } 489 }
490 490
491 491
492 ASSEMBLER_TEST_RUN(OrnRegs, test) { 492 ASSEMBLER_TEST_RUN(OrnRegs, test) {
493 typedef int64_t (*Int64Return)() DART_UNUSED; 493 typedef int64_t (*Int64Return)() DART_UNUSED;
494 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 494 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
495 } 495 }
496 496
497 497
498 ASSEMBLER_TEST_GENERATE(EorRegs, assembler) { 498 ASSEMBLER_TEST_GENERATE(EorRegs, assembler) {
499 __ movz(R1, 0xffd5, 0); 499 __ movz(R1, Immediate(0xffd5), 0);
500 __ movz(R2, 0xffff, 0); 500 __ movz(R2, Immediate(0xffff), 0);
501 __ eor(R0, R1, Operand(R2)); 501 __ eor(R0, R1, Operand(R2));
502 __ ret(); 502 __ ret();
503 } 503 }
504 504
505 505
506 ASSEMBLER_TEST_RUN(EorRegs, test) { 506 ASSEMBLER_TEST_RUN(EorRegs, test) {
507 typedef int64_t (*Int64Return)() DART_UNUSED; 507 typedef int64_t (*Int64Return)() DART_UNUSED;
508 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 508 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
509 } 509 }
510 510
511 511
512 ASSEMBLER_TEST_GENERATE(EonRegs, assembler) { 512 ASSEMBLER_TEST_GENERATE(EonRegs, assembler) {
513 __ movz(R1, 0xffd5, 0); 513 __ movz(R1, Immediate(0xffd5), 0);
514 __ movn(R2, 0xffff, 0); 514 __ movn(R2, Immediate(0xffff), 0);
515 __ eon(R0, R1, Operand(R2)); 515 __ eon(R0, R1, Operand(R2));
516 __ ret(); 516 __ ret();
517 } 517 }
518 518
519 519
520 ASSEMBLER_TEST_RUN(EonRegs, test) { 520 ASSEMBLER_TEST_RUN(EonRegs, test) {
521 typedef int64_t (*Int64Return)() DART_UNUSED; 521 typedef int64_t (*Int64Return)() DART_UNUSED;
522 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 522 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
523 } 523 }
524 524
525 525
526 // Logical immediate operations. 526 // Logical immediate operations.
527 ASSEMBLER_TEST_GENERATE(AndImm, assembler) { 527 ASSEMBLER_TEST_GENERATE(AndImm, assembler) {
528 __ movz(R1, 42, 0); 528 __ movz(R1, Immediate(42), 0);
529 __ andi(R0, R1, 0xaaaaaaaaaaaaaaaaULL); 529 __ andi(R0, R1, Immediate(0xaaaaaaaaaaaaaaaaULL));
530 __ ret(); 530 __ ret();
531 } 531 }
532 532
533 533
534 ASSEMBLER_TEST_RUN(AndImm, test) { 534 ASSEMBLER_TEST_RUN(AndImm, test) {
535 typedef int64_t (*Int64Return)() DART_UNUSED; 535 typedef int64_t (*Int64Return)() DART_UNUSED;
536 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 536 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
537 } 537 }
538 538
539 539
540 ASSEMBLER_TEST_GENERATE(AndOneImm, assembler) { 540 ASSEMBLER_TEST_GENERATE(AndOneImm, assembler) {
541 __ movz(R1, 43, 0); 541 __ movz(R1, Immediate(43), 0);
542 __ andi(R0, R1, 1); 542 __ andi(R0, R1, Immediate(1));
543 __ ret(); 543 __ ret();
544 } 544 }
545 545
546 546
547 ASSEMBLER_TEST_RUN(AndOneImm, test) { 547 ASSEMBLER_TEST_RUN(AndOneImm, test) {
548 typedef int64_t (*Int64Return)() DART_UNUSED; 548 typedef int64_t (*Int64Return)() DART_UNUSED;
549 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 549 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
550 } 550 }
551 551
552 552
553 ASSEMBLER_TEST_GENERATE(OrrImm, assembler) { 553 ASSEMBLER_TEST_GENERATE(OrrImm, assembler) {
554 __ movz(R1, 0, 0); 554 __ movz(R1, Immediate(0), 0);
555 __ movz(R2, 0x3f, 0); 555 __ movz(R2, Immediate(0x3f), 0);
556 __ movz(R3, 0xa, 0); 556 __ movz(R3, Immediate(0xa), 0);
557 __ orri(R1, R1, 0x0020002000200020ULL); 557 __ orri(R1, R1, Immediate(0x0020002000200020ULL));
558 __ orr(R1, R1, Operand(R3)); 558 __ orr(R1, R1, Operand(R3));
559 __ and_(R0, R1, Operand(R2)); 559 __ and_(R0, R1, Operand(R2));
560 __ ret(); 560 __ ret();
561 } 561 }
562 562
563 563
564 ASSEMBLER_TEST_RUN(OrrImm, test) { 564 ASSEMBLER_TEST_RUN(OrrImm, test) {
565 typedef int64_t (*Int64Return)() DART_UNUSED; 565 typedef int64_t (*Int64Return)() DART_UNUSED;
566 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 566 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
567 } 567 }
568 568
569 569
570 ASSEMBLER_TEST_GENERATE(EorImm, assembler) { 570 ASSEMBLER_TEST_GENERATE(EorImm, assembler) {
571 __ movn(R0, 0, 0); 571 __ movn(R0, Immediate(0), 0);
572 __ movk(R0, 0xffd5, 0); // R0 < 0xffffffffffffffd5. 572 __ movk(R0, Immediate(0xffd5), 0); // R0 < 0xffffffffffffffd5.
573 __ movz(R1, 0x3f, 0); 573 __ movz(R1, Immediate(0x3f), 0);
574 __ eori(R0, R0, 0x3f3f3f3f3f3f3f3fULL); 574 __ eori(R0, R0, Immediate(0x3f3f3f3f3f3f3f3fULL));
575 __ and_(R0, R0, Operand(R1)); 575 __ and_(R0, R0, Operand(R1));
576 __ ret(); 576 __ ret();
577 } 577 }
578 578
579 579
580 ASSEMBLER_TEST_RUN(EorImm, test) { 580 ASSEMBLER_TEST_RUN(EorImm, test) {
581 typedef int64_t (*Int64Return)() DART_UNUSED; 581 typedef int64_t (*Int64Return)() DART_UNUSED;
582 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 582 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
583 } 583 }
584 584
585 585
586 // Comparisons, branching. 586 // Comparisons, branching.
587 ASSEMBLER_TEST_GENERATE(BranchALForward, assembler) { 587 ASSEMBLER_TEST_GENERATE(BranchALForward, assembler) {
588 Label l; 588 Label l;
589 __ movz(R0, 42, 0); 589 __ movz(R0, Immediate(42), 0);
590 __ b(&l, AL); 590 __ b(&l, AL);
591 __ movz(R0, 0, 0); 591 __ movz(R0, Immediate(0), 0);
592 __ Bind(&l); 592 __ Bind(&l);
593 __ ret(); 593 __ ret();
594 } 594 }
595 595
596 596
597 ASSEMBLER_TEST_RUN(BranchALForward, test) { 597 ASSEMBLER_TEST_RUN(BranchALForward, test) {
598 typedef int64_t (*Int64Return)() DART_UNUSED; 598 typedef int64_t (*Int64Return)() DART_UNUSED;
599 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 599 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
600 } 600 }
601 601
602 602
603 ASSEMBLER_TEST_GENERATE(BranchALBackwards, assembler) { 603 ASSEMBLER_TEST_GENERATE(BranchALBackwards, assembler) {
604 Label l, leave; 604 Label l, leave;
605 __ movz(R0, 42, 0); 605 __ movz(R0, Immediate(42), 0);
606 __ b(&l, AL); 606 __ b(&l, AL);
607 607
608 __ movz(R0, 0, 0); 608 __ movz(R0, Immediate(0), 0);
609 __ Bind(&leave); 609 __ Bind(&leave);
610 __ ret(); 610 __ ret();
611 __ movz(R0, 0, 0); 611 __ movz(R0, Immediate(0), 0);
612 612
613 __ Bind(&l); 613 __ Bind(&l);
614 __ b(&leave, AL); 614 __ b(&leave, AL);
615 __ movz(R0, 0, 0); 615 __ movz(R0, Immediate(0), 0);
616 __ ret(); 616 __ ret();
617 } 617 }
618 618
619 619
620 ASSEMBLER_TEST_RUN(BranchALBackwards, test) { 620 ASSEMBLER_TEST_RUN(BranchALBackwards, test) {
621 typedef int64_t (*Int64Return)() DART_UNUSED; 621 typedef int64_t (*Int64Return)() DART_UNUSED;
622 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 622 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
623 } 623 }
624 624
625 625
626 ASSEMBLER_TEST_GENERATE(CmpEqBranch, assembler) { 626 ASSEMBLER_TEST_GENERATE(CmpEqBranch, assembler) {
627 Label l; 627 Label l;
628 628
629 __ movz(R0, 42, 0); 629 __ movz(R0, Immediate(42), 0);
630 __ movz(R1, 234, 0); 630 __ movz(R1, Immediate(234), 0);
631 __ movz(R2, 234, 0); 631 __ movz(R2, Immediate(234), 0);
632 632
633 __ cmp(R1, Operand(R2)); 633 __ cmp(R1, Operand(R2));
634 __ b(&l, EQ); 634 __ b(&l, EQ);
635 __ movz(R0, 0, 0); 635 __ movz(R0, Immediate(0), 0);
636 __ Bind(&l); 636 __ Bind(&l);
637 __ ret(); 637 __ ret();
638 } 638 }
639 639
640 640
641 ASSEMBLER_TEST_RUN(CmpEqBranch, test) { 641 ASSEMBLER_TEST_RUN(CmpEqBranch, test) {
642 typedef int64_t (*Int64Return)() DART_UNUSED; 642 typedef int64_t (*Int64Return)() DART_UNUSED;
643 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 643 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
644 } 644 }
645 645
646 646
647 ASSEMBLER_TEST_GENERATE(CmpEqBranchNotTaken, assembler) { 647 ASSEMBLER_TEST_GENERATE(CmpEqBranchNotTaken, assembler) {
648 Label l; 648 Label l;
649 649
650 __ movz(R0, 0, 0); 650 __ movz(R0, Immediate(0), 0);
651 __ movz(R1, 233, 0); 651 __ movz(R1, Immediate(233), 0);
652 __ movz(R2, 234, 0); 652 __ movz(R2, Immediate(234), 0);
653 653
654 __ cmp(R1, Operand(R2)); 654 __ cmp(R1, Operand(R2));
655 __ b(&l, EQ); 655 __ b(&l, EQ);
656 __ movz(R0, 42, 0); 656 __ movz(R0, Immediate(42), 0);
657 __ Bind(&l); 657 __ Bind(&l);
658 __ ret(); 658 __ ret();
659 } 659 }
660 660
661 661
662 ASSEMBLER_TEST_RUN(CmpEqBranchNotTaken, test) { 662 ASSEMBLER_TEST_RUN(CmpEqBranchNotTaken, test) {
663 typedef int64_t (*Int64Return)() DART_UNUSED; 663 typedef int64_t (*Int64Return)() DART_UNUSED;
664 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 664 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
665 } 665 }
666 666
667 667
668 ASSEMBLER_TEST_GENERATE(CmpEq1Branch, assembler) { 668 ASSEMBLER_TEST_GENERATE(CmpEq1Branch, assembler) {
669 Label l; 669 Label l;
670 670
671 __ movz(R0, 42, 0); 671 __ movz(R0, Immediate(42), 0);
672 __ movz(R1, 1, 0); 672 __ movz(R1, Immediate(1), 0);
673 673
674 __ cmp(R1, Operand(1)); 674 __ cmp(R1, Operand(1));
675 __ b(&l, EQ); 675 __ b(&l, EQ);
676 __ movz(R0, 0, 0); 676 __ movz(R0, Immediate(0), 0);
677 __ Bind(&l); 677 __ Bind(&l);
678 __ ret(); 678 __ ret();
679 } 679 }
680 680
681 681
682 ASSEMBLER_TEST_RUN(CmpEq1Branch, test) { 682 ASSEMBLER_TEST_RUN(CmpEq1Branch, test) {
683 typedef int64_t (*Int64Return)() DART_UNUSED; 683 typedef int64_t (*Int64Return)() DART_UNUSED;
684 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 684 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
685 } 685 }
686 686
687 687
688 ASSEMBLER_TEST_GENERATE(CmnEq1Branch, assembler) { 688 ASSEMBLER_TEST_GENERATE(CmnEq1Branch, assembler) {
689 Label l; 689 Label l;
690 690
691 __ movz(R0, 42, 0); 691 __ movz(R0, Immediate(42), 0);
692 __ movn(R1, 0, 0); // R1 <- -1 692 __ movn(R1, Immediate(0), 0); // R1 <- -1
693 693
694 __ cmn(R1, Operand(1)); 694 __ cmn(R1, Operand(1));
695 __ b(&l, EQ); 695 __ b(&l, EQ);
696 __ movz(R0, 0, 0); 696 __ movz(R0, Immediate(0), 0);
697 __ Bind(&l); 697 __ Bind(&l);
698 __ ret(); 698 __ ret();
699 } 699 }
700 700
701 701
702 ASSEMBLER_TEST_RUN(CmnEq1Branch, test) { 702 ASSEMBLER_TEST_RUN(CmnEq1Branch, test) {
703 typedef int64_t (*Int64Return)() DART_UNUSED; 703 typedef int64_t (*Int64Return)() DART_UNUSED;
704 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 704 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
705 } 705 }
706 706
707 707
708 ASSEMBLER_TEST_GENERATE(CmpLtBranch, assembler) { 708 ASSEMBLER_TEST_GENERATE(CmpLtBranch, assembler) {
709 Label l; 709 Label l;
710 710
711 __ movz(R0, 42, 0); 711 __ movz(R0, Immediate(42), 0);
712 __ movz(R1, 233, 0); 712 __ movz(R1, Immediate(233), 0);
713 __ movz(R2, 234, 0); 713 __ movz(R2, Immediate(234), 0);
714 714
715 __ cmp(R1, Operand(R2)); 715 __ cmp(R1, Operand(R2));
716 __ b(&l, LT); 716 __ b(&l, LT);
717 __ movz(R0, 0, 0); 717 __ movz(R0, Immediate(0), 0);
718 __ Bind(&l); 718 __ Bind(&l);
719 __ ret(); 719 __ ret();
720 } 720 }
721 721
722 722
723 ASSEMBLER_TEST_RUN(CmpLtBranch, test) { 723 ASSEMBLER_TEST_RUN(CmpLtBranch, test) {
724 typedef int64_t (*Int64Return)() DART_UNUSED; 724 typedef int64_t (*Int64Return)() DART_UNUSED;
725 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 725 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
726 } 726 }
727 727
728 728
729 ASSEMBLER_TEST_GENERATE(CmpLtBranchNotTaken, assembler) { 729 ASSEMBLER_TEST_GENERATE(CmpLtBranchNotTaken, assembler) {
730 Label l; 730 Label l;
731 731
732 __ movz(R0, 0, 0); 732 __ movz(R0, Immediate(0), 0);
733 __ movz(R1, 235, 0); 733 __ movz(R1, Immediate(235), 0);
734 __ movz(R2, 234, 0); 734 __ movz(R2, Immediate(234), 0);
735 735
736 __ cmp(R1, Operand(R2)); 736 __ cmp(R1, Operand(R2));
737 __ b(&l, LT); 737 __ b(&l, LT);
738 __ movz(R0, 42, 0); 738 __ movz(R0, Immediate(42), 0);
739 __ Bind(&l); 739 __ Bind(&l);
740 __ ret(); 740 __ ret();
741 } 741 }
742 742
743 743
744 ASSEMBLER_TEST_RUN(CmpLtBranchNotTaken, test) { 744 ASSEMBLER_TEST_RUN(CmpLtBranchNotTaken, test) {
745 typedef int64_t (*Int64Return)() DART_UNUSED; 745 typedef int64_t (*Int64Return)() DART_UNUSED;
746 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 746 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
747 } 747 }
748 748
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
849 849
850 ASSEMBLER_TEST_RUN(FcmpzGtBranch, test) { 850 ASSEMBLER_TEST_RUN(FcmpzGtBranch, test) {
851 typedef double (*DoubleReturn)() DART_UNUSED; 851 typedef double (*DoubleReturn)() DART_UNUSED;
852 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); 852 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
853 } 853 }
854 854
855 855
856 ASSEMBLER_TEST_GENERATE(AndsBranch, assembler) { 856 ASSEMBLER_TEST_GENERATE(AndsBranch, assembler) {
857 Label l; 857 Label l;
858 858
859 __ movz(R0, 42, 0); 859 __ movz(R0, Immediate(42), 0);
860 __ movz(R1, 2, 0); 860 __ movz(R1, Immediate(2), 0);
861 __ movz(R2, 1, 0); 861 __ movz(R2, Immediate(1), 0);
862 862
863 __ ands(R3, R1, Operand(R2)); 863 __ ands(R3, R1, Operand(R2));
864 __ b(&l, EQ); 864 __ b(&l, EQ);
865 __ movz(R0, 0, 0); 865 __ movz(R0, Immediate(0), 0);
866 __ Bind(&l); 866 __ Bind(&l);
867 __ ret(); 867 __ ret();
868 } 868 }
869 869
870 870
871 ASSEMBLER_TEST_RUN(AndsBranch, test) { 871 ASSEMBLER_TEST_RUN(AndsBranch, test) {
872 typedef int64_t (*Int64Return)() DART_UNUSED; 872 typedef int64_t (*Int64Return)() DART_UNUSED;
873 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 873 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
874 } 874 }
875 875
876 876
877 ASSEMBLER_TEST_GENERATE(AndsBranchNotTaken, assembler) { 877 ASSEMBLER_TEST_GENERATE(AndsBranchNotTaken, assembler) {
878 Label l; 878 Label l;
879 879
880 __ movz(R0, 0, 0); 880 __ movz(R0, Immediate(0), 0);
881 __ movz(R1, 2, 0); 881 __ movz(R1, Immediate(2), 0);
882 __ movz(R2, 2, 0); 882 __ movz(R2, Immediate(2), 0);
883 883
884 __ ands(R3, R1, Operand(R2)); 884 __ ands(R3, R1, Operand(R2));
885 __ b(&l, EQ); 885 __ b(&l, EQ);
886 __ movz(R0, 42, 0); 886 __ movz(R0, Immediate(42), 0);
887 __ Bind(&l); 887 __ Bind(&l);
888 __ ret(); 888 __ ret();
889 } 889 }
890 890
891 891
892 ASSEMBLER_TEST_RUN(AndsBranchNotTaken, test) { 892 ASSEMBLER_TEST_RUN(AndsBranchNotTaken, test) {
893 typedef int64_t (*Int64Return)() DART_UNUSED; 893 typedef int64_t (*Int64Return)() DART_UNUSED;
894 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 894 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
895 } 895 }
896 896
897 897
898 ASSEMBLER_TEST_GENERATE(BicsBranch, assembler) { 898 ASSEMBLER_TEST_GENERATE(BicsBranch, assembler) {
899 Label l; 899 Label l;
900 900
901 __ movz(R0, 42, 0); 901 __ movz(R0, Immediate(42), 0);
902 __ movz(R1, 2, 0); 902 __ movz(R1, Immediate(2), 0);
903 __ movz(R2, 2, 0); 903 __ movz(R2, Immediate(2), 0);
904 904
905 __ bics(R3, R1, Operand(R2)); 905 __ bics(R3, R1, Operand(R2));
906 __ b(&l, EQ); 906 __ b(&l, EQ);
907 __ movz(R0, 0, 0); 907 __ movz(R0, Immediate(0), 0);
908 __ Bind(&l); 908 __ Bind(&l);
909 __ ret(); 909 __ ret();
910 } 910 }
911 911
912 912
913 ASSEMBLER_TEST_RUN(BicsBranch, test) { 913 ASSEMBLER_TEST_RUN(BicsBranch, test) {
914 typedef int64_t (*Int64Return)() DART_UNUSED; 914 typedef int64_t (*Int64Return)() DART_UNUSED;
915 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 915 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
916 } 916 }
917 917
918 918
919 ASSEMBLER_TEST_GENERATE(BicsBranchNotTaken, assembler) { 919 ASSEMBLER_TEST_GENERATE(BicsBranchNotTaken, assembler) {
920 Label l; 920 Label l;
921 921
922 __ movz(R0, 0, 0); 922 __ movz(R0, Immediate(0), 0);
923 __ movz(R1, 2, 0); 923 __ movz(R1, Immediate(2), 0);
924 __ movz(R2, 1, 0); 924 __ movz(R2, Immediate(1), 0);
925 925
926 __ bics(R3, R1, Operand(R2)); 926 __ bics(R3, R1, Operand(R2));
927 __ b(&l, EQ); 927 __ b(&l, EQ);
928 __ movz(R0, 42, 0); 928 __ movz(R0, Immediate(42), 0);
929 __ Bind(&l); 929 __ Bind(&l);
930 __ ret(); 930 __ ret();
931 } 931 }
932 932
933 933
934 ASSEMBLER_TEST_RUN(BicsBranchNotTaken, test) { 934 ASSEMBLER_TEST_RUN(BicsBranchNotTaken, test) {
935 typedef int64_t (*Int64Return)() DART_UNUSED; 935 typedef int64_t (*Int64Return)() DART_UNUSED;
936 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 936 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
937 } 937 }
938 938
939 939
940 ASSEMBLER_TEST_GENERATE(AndisBranch, assembler) { 940 ASSEMBLER_TEST_GENERATE(AndisBranch, assembler) {
941 Label l; 941 Label l;
942 942
943 __ movz(R0, 42, 0); 943 __ movz(R0, Immediate(42), 0);
944 __ movz(R1, 2, 0); 944 __ movz(R1, Immediate(2), 0);
945 945
946 __ andis(R3, R1, 1); 946 __ andis(R3, R1, Immediate(1));
947 __ b(&l, EQ); 947 __ b(&l, EQ);
948 __ movz(R0, 0, 0); 948 __ movz(R0, Immediate(0), 0);
949 __ Bind(&l); 949 __ Bind(&l);
950 __ ret(); 950 __ ret();
951 } 951 }
952 952
953 953
954 ASSEMBLER_TEST_RUN(AndisBranch, test) { 954 ASSEMBLER_TEST_RUN(AndisBranch, test) {
955 typedef int64_t (*Int64Return)() DART_UNUSED; 955 typedef int64_t (*Int64Return)() DART_UNUSED;
956 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 956 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
957 } 957 }
958 958
959 959
960 ASSEMBLER_TEST_GENERATE(AndisBranchNotTaken, assembler) { 960 ASSEMBLER_TEST_GENERATE(AndisBranchNotTaken, assembler) {
961 Label l; 961 Label l;
962 962
963 __ movz(R0, 0, 0); 963 __ movz(R0, Immediate(0), 0);
964 __ movz(R1, 2, 0); 964 __ movz(R1, Immediate(2), 0);
965 965
966 __ andis(R3, R1, 2); 966 __ andis(R3, R1, Immediate(2));
967 __ b(&l, EQ); 967 __ b(&l, EQ);
968 __ movz(R0, 42, 0); 968 __ movz(R0, Immediate(42), 0);
969 __ Bind(&l); 969 __ Bind(&l);
970 __ ret(); 970 __ ret();
971 } 971 }
972 972
973 973
974 ASSEMBLER_TEST_RUN(AndisBranchNotTaken, test) { 974 ASSEMBLER_TEST_RUN(AndisBranchNotTaken, test) {
975 typedef int64_t (*Int64Return)() DART_UNUSED; 975 typedef int64_t (*Int64Return)() DART_UNUSED;
976 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 976 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
977 } 977 }
978 978
979 979
980 // Address of PC-rel offset, br, blr. 980 // Address of PC-rel offset, br, blr.
981 ASSEMBLER_TEST_GENERATE(AdrBr, assembler) { 981 ASSEMBLER_TEST_GENERATE(AdrBr, assembler) {
982 __ movz(R0, 123, 0); 982 __ movz(R0, Immediate(123), 0);
983 __ adr(R1, 3 * Instr::kInstrSize); // R1 <- PC + 3*Instr::kInstrSize 983 // R1 <- PC + 3*Instr::kInstrSize
984 __ adr(R1, Immediate(3 * Instr::kInstrSize));
984 __ br(R1); 985 __ br(R1);
985 __ ret(); 986 __ ret();
986 987
987 // br goes here. 988 // br goes here.
988 __ movz(R0, 42, 0); 989 __ movz(R0, Immediate(42), 0);
989 __ ret(); 990 __ ret();
990 } 991 }
991 992
992 993
993 ASSEMBLER_TEST_RUN(AdrBr, test) { 994 ASSEMBLER_TEST_RUN(AdrBr, test) {
994 typedef int64_t (*Int64Return)() DART_UNUSED; 995 typedef int64_t (*Int64Return)() DART_UNUSED;
995 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 996 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
996 } 997 }
997 998
998 999
999 ASSEMBLER_TEST_GENERATE(AdrBlr, assembler) { 1000 ASSEMBLER_TEST_GENERATE(AdrBlr, assembler) {
1000 __ movz(R0, 123, 0); 1001 __ movz(R0, Immediate(123), 0);
1001 __ add(R3, ZR, Operand(LR)); // Save LR. 1002 __ add(R3, ZR, Operand(LR)); // Save LR.
1002 __ adr(R1, 4 * Instr::kInstrSize); // R1 <- PC + 4*Instr::kInstrSize 1003 // R1 <- PC + 4*Instr::kInstrSize
1004 __ adr(R1, Immediate(4 * Instr::kInstrSize));
1003 __ blr(R1); 1005 __ blr(R1);
1004 __ add(LR, ZR, Operand(R3)); 1006 __ add(LR, ZR, Operand(R3));
1005 __ ret(); 1007 __ ret();
1006 1008
1007 // blr goes here. 1009 // blr goes here.
1008 __ movz(R0, 42, 0); 1010 __ movz(R0, Immediate(42), 0);
1009 __ ret(); 1011 __ ret();
1010 } 1012 }
1011 1013
1012 1014
1013 ASSEMBLER_TEST_RUN(AdrBlr, test) { 1015 ASSEMBLER_TEST_RUN(AdrBlr, test) {
1014 typedef int64_t (*Int64Return)() DART_UNUSED; 1016 typedef int64_t (*Int64Return)() DART_UNUSED;
1015 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1017 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1016 } 1018 }
1017 1019
1018 1020
1019 // Misc. arithmetic. 1021 // Misc. arithmetic.
1020 ASSEMBLER_TEST_GENERATE(Udiv, assembler) { 1022 ASSEMBLER_TEST_GENERATE(Udiv, assembler) {
1021 __ movz(R0, 27, 0); 1023 __ movz(R0, Immediate(27), 0);
1022 __ movz(R1, 9, 0); 1024 __ movz(R1, Immediate(9), 0);
1023 __ udiv(R2, R0, R1); 1025 __ udiv(R2, R0, R1);
1024 __ mov(R0, R2); 1026 __ mov(R0, R2);
1025 __ ret(); 1027 __ ret();
1026 } 1028 }
1027 1029
1028 1030
1029 ASSEMBLER_TEST_RUN(Udiv, test) { 1031 ASSEMBLER_TEST_RUN(Udiv, test) {
1030 EXPECT(test != NULL); 1032 EXPECT(test != NULL);
1031 typedef int64_t (*Int64Return)() DART_UNUSED; 1033 typedef int64_t (*Int64Return)() DART_UNUSED;
1032 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1034 EXPECT_EQ(3, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1033 } 1035 }
1034 1036
1035 1037
1036 ASSEMBLER_TEST_GENERATE(Sdiv, assembler) { 1038 ASSEMBLER_TEST_GENERATE(Sdiv, assembler) {
1037 __ movz(R0, 27, 0); 1039 __ movz(R0, Immediate(27), 0);
1038 __ movz(R1, 9, 0); 1040 __ movz(R1, Immediate(9), 0);
1039 __ neg(R1, R1); 1041 __ neg(R1, R1);
1040 __ sdiv(R2, R0, R1); 1042 __ sdiv(R2, R0, R1);
1041 __ mov(R0, R2); 1043 __ mov(R0, R2);
1042 __ ret(); 1044 __ ret();
1043 } 1045 }
1044 1046
1045 1047
1046 ASSEMBLER_TEST_RUN(Sdiv, test) { 1048 ASSEMBLER_TEST_RUN(Sdiv, test) {
1047 EXPECT(test != NULL); 1049 EXPECT(test != NULL);
1048 typedef int64_t (*Int64Return)() DART_UNUSED; 1050 typedef int64_t (*Int64Return)() DART_UNUSED;
1049 EXPECT_EQ(-3, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1051 EXPECT_EQ(-3, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1050 } 1052 }
1051 1053
1052 1054
1053 ASSEMBLER_TEST_GENERATE(Udiv_zero, assembler) { 1055 ASSEMBLER_TEST_GENERATE(Udiv_zero, assembler) {
1054 __ movz(R0, 27, 0); 1056 __ movz(R0, Immediate(27), 0);
1055 __ movz(R1, 0, 0); 1057 __ movz(R1, Immediate(0), 0);
1056 __ udiv(R2, R0, R1); 1058 __ udiv(R2, R0, R1);
1057 __ mov(R0, R2); 1059 __ mov(R0, R2);
1058 __ ret(); 1060 __ ret();
1059 } 1061 }
1060 1062
1061 1063
1062 ASSEMBLER_TEST_RUN(Udiv_zero, test) { 1064 ASSEMBLER_TEST_RUN(Udiv_zero, test) {
1063 EXPECT(test != NULL); 1065 EXPECT(test != NULL);
1064 typedef int64_t (*Int64Return)() DART_UNUSED; 1066 typedef int64_t (*Int64Return)() DART_UNUSED;
1065 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1067 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1066 } 1068 }
1067 1069
1068 1070
1069 ASSEMBLER_TEST_GENERATE(Sdiv_zero, assembler) { 1071 ASSEMBLER_TEST_GENERATE(Sdiv_zero, assembler) {
1070 __ movz(R0, 27, 0); 1072 __ movz(R0, Immediate(27), 0);
1071 __ movz(R1, 0, 0); 1073 __ movz(R1, Immediate(0), 0);
1072 __ sdiv(R2, R0, R1); 1074 __ sdiv(R2, R0, R1);
1073 __ mov(R0, R2); 1075 __ mov(R0, R2);
1074 __ ret(); 1076 __ ret();
1075 } 1077 }
1076 1078
1077 1079
1078 ASSEMBLER_TEST_RUN(Sdiv_zero, test) { 1080 ASSEMBLER_TEST_RUN(Sdiv_zero, test) {
1079 EXPECT(test != NULL); 1081 EXPECT(test != NULL);
1080 typedef int64_t (*Int64Return)() DART_UNUSED; 1082 typedef int64_t (*Int64Return)() DART_UNUSED;
1081 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1083 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1082 } 1084 }
1083 1085
1084 1086
1085 ASSEMBLER_TEST_GENERATE(Udiv_corner, assembler) { 1087 ASSEMBLER_TEST_GENERATE(Udiv_corner, assembler) {
1086 __ movz(R0, 0x8000, 3); // R0 <- 0x8000000000000000 1088 __ movz(R0, Immediate(0x8000), 3); // R0 <- 0x8000000000000000
1087 __ movn(R1, 0, 0); // R1 <- 0xffffffffffffffff 1089 __ movn(R1, Immediate(0), 0); // R1 <- 0xffffffffffffffff
1088 __ udiv(R2, R0, R1); 1090 __ udiv(R2, R0, R1);
1089 __ mov(R0, R2); 1091 __ mov(R0, R2);
1090 __ ret(); 1092 __ ret();
1091 } 1093 }
1092 1094
1093 1095
1094 ASSEMBLER_TEST_RUN(Udiv_corner, test) { 1096 ASSEMBLER_TEST_RUN(Udiv_corner, test) {
1095 EXPECT(test != NULL); 1097 EXPECT(test != NULL);
1096 typedef int64_t (*Int64Return)() DART_UNUSED; 1098 typedef int64_t (*Int64Return)() DART_UNUSED;
1097 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1099 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1098 } 1100 }
1099 1101
1100 1102
1101 ASSEMBLER_TEST_GENERATE(Sdiv_corner, assembler) { 1103 ASSEMBLER_TEST_GENERATE(Sdiv_corner, assembler) {
1102 __ movz(R3, 0x8000, 3); // R0 <- 0x8000000000000000 1104 __ movz(R3, Immediate(0x8000), 3); // R0 <- 0x8000000000000000
1103 __ movn(R1, 0, 0); // R1 <- 0xffffffffffffffff 1105 __ movn(R1, Immediate(0), 0); // R1 <- 0xffffffffffffffff
1104 __ sdiv(R2, R3, R1); 1106 __ sdiv(R2, R3, R1);
1105 __ mov(R0, R2); 1107 __ mov(R0, R2);
1106 __ ret(); 1108 __ ret();
1107 } 1109 }
1108 1110
1109 1111
1110 ASSEMBLER_TEST_RUN(Sdiv_corner, test) { 1112 ASSEMBLER_TEST_RUN(Sdiv_corner, test) {
1111 EXPECT(test != NULL); 1113 EXPECT(test != NULL);
1112 typedef int64_t (*Int64Return)() DART_UNUSED; 1114 typedef int64_t (*Int64Return)() DART_UNUSED;
1113 EXPECT_EQ(static_cast<int64_t>(0x8000000000000000), 1115 EXPECT_EQ(static_cast<int64_t>(0x8000000000000000),
1114 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1116 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1115 } 1117 }
1116 1118
1117 1119
1118 ASSEMBLER_TEST_GENERATE(Lslv, assembler) { 1120 ASSEMBLER_TEST_GENERATE(Lslv, assembler) {
1119 __ movz(R1, 21, 0); 1121 __ movz(R1, Immediate(21), 0);
1120 __ movz(R2, 1, 0); 1122 __ movz(R2, Immediate(1), 0);
1121 __ lslv(R0, R1, R2); 1123 __ lslv(R0, R1, R2);
1122 __ ret(); 1124 __ ret();
1123 } 1125 }
1124 1126
1125 1127
1126 ASSEMBLER_TEST_RUN(Lslv, test) { 1128 ASSEMBLER_TEST_RUN(Lslv, test) {
1127 typedef int64_t (*Int64Return)() DART_UNUSED; 1129 typedef int64_t (*Int64Return)() DART_UNUSED;
1128 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1130 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1129 } 1131 }
1130 1132
1131 1133
1132 ASSEMBLER_TEST_GENERATE(Lsrv, assembler) { 1134 ASSEMBLER_TEST_GENERATE(Lsrv, assembler) {
1133 __ movz(R1, 84, 0); 1135 __ movz(R1, Immediate(84), 0);
1134 __ movz(R2, 1, 0); 1136 __ movz(R2, Immediate(1), 0);
1135 __ lsrv(R0, R1, R2); 1137 __ lsrv(R0, R1, R2);
1136 __ ret(); 1138 __ ret();
1137 } 1139 }
1138 1140
1139 1141
1140 ASSEMBLER_TEST_RUN(Lsrv, test) { 1142 ASSEMBLER_TEST_RUN(Lsrv, test) {
1141 typedef int64_t (*Int64Return)() DART_UNUSED; 1143 typedef int64_t (*Int64Return)() DART_UNUSED;
1142 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1144 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1143 } 1145 }
1144 1146
1145 1147
1146 ASSEMBLER_TEST_GENERATE(LShiftingV, assembler) { 1148 ASSEMBLER_TEST_GENERATE(LShiftingV, assembler) {
1147 __ movz(R1, 1, 0); 1149 __ movz(R1, Immediate(1), 0);
1148 __ movz(R2, 63, 0); 1150 __ movz(R2, Immediate(63), 0);
1149 __ lslv(R1, R1, R2); 1151 __ lslv(R1, R1, R2);
1150 __ lsrv(R0, R1, R2); 1152 __ lsrv(R0, R1, R2);
1151 __ ret(); 1153 __ ret();
1152 } 1154 }
1153 1155
1154 1156
1155 ASSEMBLER_TEST_RUN(LShiftingV, test) { 1157 ASSEMBLER_TEST_RUN(LShiftingV, test) {
1156 typedef int64_t (*Int64Return)() DART_UNUSED; 1158 typedef int64_t (*Int64Return)() DART_UNUSED;
1157 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1159 EXPECT_EQ(1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1158 } 1160 }
1159 1161
1160 1162
1161 ASSEMBLER_TEST_GENERATE(RShiftingV, assembler) { 1163 ASSEMBLER_TEST_GENERATE(RShiftingV, assembler) {
1162 __ movz(R1, 1, 0); 1164 __ movz(R1, Immediate(1), 0);
1163 __ movz(R2, 63, 0); 1165 __ movz(R2, Immediate(63), 0);
1164 __ lslv(R1, R1, R2); 1166 __ lslv(R1, R1, R2);
1165 __ asrv(R0, R1, R2); 1167 __ asrv(R0, R1, R2);
1166 __ ret(); 1168 __ ret();
1167 } 1169 }
1168 1170
1169 1171
1170 ASSEMBLER_TEST_RUN(RShiftingV, test) { 1172 ASSEMBLER_TEST_RUN(RShiftingV, test) {
1171 typedef int64_t (*Int64Return)() DART_UNUSED; 1173 typedef int64_t (*Int64Return)() DART_UNUSED;
1172 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1174 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1173 } 1175 }
1174 1176
1175 1177
1176 ASSEMBLER_TEST_GENERATE(Mult_pos, assembler) { 1178 ASSEMBLER_TEST_GENERATE(Mult_pos, assembler) {
1177 __ movz(R1, 6, 0); 1179 __ movz(R1, Immediate(6), 0);
1178 __ movz(R2, 7, 0); 1180 __ movz(R2, Immediate(7), 0);
1179 __ mul(R0, R1, R2); 1181 __ mul(R0, R1, R2);
1180 __ ret(); 1182 __ ret();
1181 } 1183 }
1182 1184
1183 1185
1184 ASSEMBLER_TEST_RUN(Mult_pos, test) { 1186 ASSEMBLER_TEST_RUN(Mult_pos, test) {
1185 typedef int64_t (*Int64Return)() DART_UNUSED; 1187 typedef int64_t (*Int64Return)() DART_UNUSED;
1186 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1188 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1187 } 1189 }
1188 1190
1189 1191
1190 ASSEMBLER_TEST_GENERATE(Mult_neg, assembler) { 1192 ASSEMBLER_TEST_GENERATE(Mult_neg, assembler) {
1191 __ movz(R1, 6, 0); 1193 __ movz(R1, Immediate(6), 0);
1192 __ movz(R2, 7, 0); 1194 __ movz(R2, Immediate(7), 0);
1193 __ neg(R2, R2); 1195 __ neg(R2, R2);
1194 __ mul(R0, R1, R2); 1196 __ mul(R0, R1, R2);
1195 __ ret(); 1197 __ ret();
1196 } 1198 }
1197 1199
1198 1200
1199 ASSEMBLER_TEST_RUN(Mult_neg, test) { 1201 ASSEMBLER_TEST_RUN(Mult_neg, test) {
1200 typedef int64_t (*Int64Return)() DART_UNUSED; 1202 typedef int64_t (*Int64Return)() DART_UNUSED;
1201 EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1203 EXPECT_EQ(-42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1202 } 1204 }
1203 1205
1204 1206
1205 ASSEMBLER_TEST_GENERATE(Smulh_pos, assembler) { 1207 ASSEMBLER_TEST_GENERATE(Smulh_pos, assembler) {
1206 __ movz(R1, 6, 0); 1208 __ movz(R1, Immediate(6), 0);
1207 __ movz(R2, 7, 0); 1209 __ movz(R2, Immediate(7), 0);
1208 __ smulh(R0, R1, R2); 1210 __ smulh(R0, R1, R2);
1209 __ ret(); 1211 __ ret();
1210 } 1212 }
1211 1213
1212 1214
1213 ASSEMBLER_TEST_RUN(Smulh_pos, test) { 1215 ASSEMBLER_TEST_RUN(Smulh_pos, test) {
1214 typedef int64_t (*Int64Return)() DART_UNUSED; 1216 typedef int64_t (*Int64Return)() DART_UNUSED;
1215 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1217 EXPECT_EQ(0, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1216 } 1218 }
1217 1219
1218 1220
1219 ASSEMBLER_TEST_GENERATE(Smulh_neg, assembler) { 1221 ASSEMBLER_TEST_GENERATE(Smulh_neg, assembler) {
1220 __ movz(R1, 6, 0); 1222 __ movz(R1, Immediate(6), 0);
1221 __ movz(R2, 7, 0); 1223 __ movz(R2, Immediate(7), 0);
1222 __ neg(R2, R2); 1224 __ neg(R2, R2);
1223 __ smulh(R0, R1, R2); 1225 __ smulh(R0, R1, R2);
1224 __ ret(); 1226 __ ret();
1225 } 1227 }
1226 1228
1227 1229
1228 ASSEMBLER_TEST_RUN(Smulh_neg, test) { 1230 ASSEMBLER_TEST_RUN(Smulh_neg, test) {
1229 typedef int64_t (*Int64Return)() DART_UNUSED; 1231 typedef int64_t (*Int64Return)() DART_UNUSED;
1230 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1232 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1231 } 1233 }
(...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after
1875 ASSEMBLER_TEST_RUN(FldrdFstrdLargeOffset, test) { 1877 ASSEMBLER_TEST_RUN(FldrdFstrdLargeOffset, test) {
1876 typedef double (*DoubleReturn)() DART_UNUSED; 1878 typedef double (*DoubleReturn)() DART_UNUSED;
1877 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); 1879 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
1878 } 1880 }
1879 1881
1880 1882
1881 ASSEMBLER_TEST_GENERATE(FldrdFstrdExtReg, assembler) { 1883 ASSEMBLER_TEST_GENERATE(FldrdFstrdExtReg, assembler) {
1882 __ SetupDartSP(kTestStackSpace); 1884 __ SetupDartSP(kTestStackSpace);
1883 __ LoadDImmediate(V0, 43.0, kNoPP); 1885 __ LoadDImmediate(V0, 43.0, kNoPP);
1884 __ LoadDImmediate(V1, 42.0, kNoPP); 1886 __ LoadDImmediate(V1, 42.0, kNoPP);
1885 __ movz(R2, 0xfff8, 0); 1887 __ movz(R2, Immediate(0xfff8), 0);
1886 __ movk(R2, 0xffff, 1); // R2 <- -8 (int32_t). 1888 __ movk(R2, Immediate(0xffff), 1); // R2 <- -8 (int32_t).
1887 // This should sign extend R2, and add to SP to get address, 1889 // This should sign extend R2, and add to SP to get address,
1888 // i.e. SP - kWordSize. 1890 // i.e. SP - kWordSize.
1889 __ fstrd(V1, Address(SP, R2, SXTW)); 1891 __ fstrd(V1, Address(SP, R2, SXTW));
1890 __ sub(SP, SP, Operand(kWordSize)); 1892 __ sub(SP, SP, Operand(kWordSize));
1891 __ fldrd(V0, Address(SP)); 1893 __ fldrd(V0, Address(SP));
1892 __ add(SP, SP, Operand(kWordSize)); 1894 __ add(SP, SP, Operand(kWordSize));
1893 __ mov(CSP, SP); 1895 __ mov(CSP, SP);
1894 __ ret(); 1896 __ ret();
1895 } 1897 }
1896 1898
1897 1899
1898 ASSEMBLER_TEST_RUN(FldrdFstrdExtReg, test) { 1900 ASSEMBLER_TEST_RUN(FldrdFstrdExtReg, test) {
1899 typedef double (*DoubleReturn)() DART_UNUSED; 1901 typedef double (*DoubleReturn)() DART_UNUSED;
1900 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); 1902 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
1901 } 1903 }
1902 1904
1903 1905
1904 ASSEMBLER_TEST_GENERATE(FldrdFstrdScaledReg, assembler) { 1906 ASSEMBLER_TEST_GENERATE(FldrdFstrdScaledReg, assembler) {
1905 __ SetupDartSP(kTestStackSpace); 1907 __ SetupDartSP(kTestStackSpace);
1906 __ LoadDImmediate(V0, 43.0, kNoPP); 1908 __ LoadDImmediate(V0, 43.0, kNoPP);
1907 __ LoadDImmediate(V1, 42.0, kNoPP); 1909 __ LoadDImmediate(V1, 42.0, kNoPP);
1908 __ movz(R2, 10, 0); 1910 __ movz(R2, Immediate(10), 0);
1909 __ sub(SP, SP, Operand(10*kWordSize)); 1911 __ sub(SP, SP, Operand(10*kWordSize));
1910 // Store V1 into SP + R2 * kWordSize. 1912 // Store V1 into SP + R2 * kWordSize.
1911 __ fstrd(V1, Address(SP, R2, UXTX, Address::Scaled)); 1913 __ fstrd(V1, Address(SP, R2, UXTX, Address::Scaled));
1912 __ fldrd(V0, Address(SP, R2, UXTX, Address::Scaled)); 1914 __ fldrd(V0, Address(SP, R2, UXTX, Address::Scaled));
1913 __ add(SP, SP, Operand(10*kWordSize)); 1915 __ add(SP, SP, Operand(10*kWordSize));
1914 __ mov(CSP, SP); 1916 __ mov(CSP, SP);
1915 __ ret(); 1917 __ ret();
1916 } 1918 }
1917 1919
1918 1920
(...skipping 1353 matching lines...) Expand 10 before | Expand all | Expand 10 after
3272 __ Pop(LR); 3274 __ Pop(LR);
3273 __ Pop(CTX); 3275 __ Pop(CTX);
3274 __ PopAndUntagPP(); 3276 __ PopAndUntagPP();
3275 __ mov(CSP, SP); 3277 __ mov(CSP, SP);
3276 __ ret(); 3278 __ ret();
3277 } 3279 }
3278 3280
3279 } // namespace dart 3281 } // namespace dart
3280 3282
3281 #endif // defined(TARGET_ARCH_ARM64) 3283 #endif // defined(TARGET_ARCH_ARM64)
OLDNEW
« no previous file with comments | « runtime/vm/assembler_arm64.cc ('k') | runtime/vm/assembler_arm_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698