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

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

Issue 317443004: Uses assembler macro for dart SP setup on arm64. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 6 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.h ('k') | runtime/vm/stub_code_arm64.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"
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 static const intptr_t kTestStackSpace = 512 * kWordSize;
17
16 #define __ assembler-> 18 #define __ assembler->
17 19
18 ASSEMBLER_TEST_GENERATE(Simple, assembler) { 20 ASSEMBLER_TEST_GENERATE(Simple, assembler) {
19 __ add(R0, ZR, Operand(ZR)); 21 __ add(R0, ZR, Operand(ZR));
20 __ add(R0, R0, Operand(42)); 22 __ add(R0, R0, Operand(42));
21 __ ret(); 23 __ ret();
22 } 24 }
23 25
24 26
25 ASSEMBLER_TEST_RUN(Simple, test) { 27 ASSEMBLER_TEST_RUN(Simple, test) {
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 281
280 282
281 ASSEMBLER_TEST_RUN(AddExtReg, test) { 283 ASSEMBLER_TEST_RUN(AddExtReg, test) {
282 typedef int64_t (*Int64Return)(); 284 typedef int64_t (*Int64Return)();
283 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 285 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
284 } 286 }
285 287
286 288
287 // Loads and Stores. 289 // Loads and Stores.
288 ASSEMBLER_TEST_GENERATE(SimpleLoadStore, assembler) { 290 ASSEMBLER_TEST_GENERATE(SimpleLoadStore, assembler) {
289 __ mov(SP, CSP); 291 __ SetupDartSP(kTestStackSpace);
290 __ movz(R0, 43, 0); 292 __ movz(R0, 43, 0);
291 __ movz(R1, 42, 0); 293 __ movz(R1, 42, 0);
292 __ str(R1, Address(SP, -1*kWordSize, Address::PreIndex)); 294 __ str(R1, Address(SP, -1*kWordSize, Address::PreIndex));
293 __ ldr(R0, Address(SP, 1*kWordSize, Address::PostIndex)); 295 __ ldr(R0, Address(SP, 1*kWordSize, Address::PostIndex));
296 __ mov(CSP, SP);
294 __ ret(); 297 __ ret();
295 } 298 }
296 299
297 300
298 ASSEMBLER_TEST_RUN(SimpleLoadStore, test) { 301 ASSEMBLER_TEST_RUN(SimpleLoadStore, test) {
299 typedef int64_t (*Int64Return)(); 302 typedef int64_t (*Int64Return)();
300 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 303 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
301 } 304 }
302 305
303 306
304 ASSEMBLER_TEST_GENERATE(SimpleLoadStoreHeapTag, assembler) { 307 ASSEMBLER_TEST_GENERATE(SimpleLoadStoreHeapTag, assembler) {
305 __ mov(SP, CSP); 308 __ SetupDartSP(kTestStackSpace);
306 __ movz(R0, 43, 0); 309 __ movz(R0, 43, 0);
307 __ movz(R1, 42, 0); 310 __ movz(R1, 42, 0);
308 __ add(R2, SP, Operand(1)); 311 __ add(R2, SP, Operand(1));
309 __ str(R1, Address(R2, -1)); 312 __ str(R1, Address(R2, -1));
310 __ ldr(R0, Address(R2, -1)); 313 __ ldr(R0, Address(R2, -1));
314 __ mov(CSP, SP);
311 __ ret(); 315 __ ret();
312 } 316 }
313 317
314 318
315 ASSEMBLER_TEST_RUN(SimpleLoadStoreHeapTag, test) { 319 ASSEMBLER_TEST_RUN(SimpleLoadStoreHeapTag, test) {
316 typedef int64_t (*Int64Return)(); 320 typedef int64_t (*Int64Return)();
317 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 321 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
318 } 322 }
319 323
320 324
321 ASSEMBLER_TEST_GENERATE(LoadStoreLargeIndex, assembler) { 325 ASSEMBLER_TEST_GENERATE(LoadStoreLargeIndex, assembler) {
322 __ mov(SP, CSP); 326 __ SetupDartSP(kTestStackSpace);
323 __ movz(R0, 43, 0); 327 __ movz(R0, 43, 0);
324 __ movz(R1, 42, 0); 328 __ movz(R1, 42, 0);
325 // 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.
326 __ str(R1, Address(SP, -32*kWordSize, Address::PreIndex)); 330 __ str(R1, Address(SP, -32*kWordSize, Address::PreIndex));
327 // Largest positive kWordSize aligned offset that we can fit. 331 // Largest positive kWordSize aligned offset that we can fit.
328 __ ldr(R0, Address(SP, 31*kWordSize, Address::PostIndex)); 332 __ ldr(R0, Address(SP, 31*kWordSize, Address::PostIndex));
329 // Correction. 333 // Correction.
330 __ add(SP, SP, Operand(kWordSize)); // Restore SP. 334 __ add(SP, SP, Operand(kWordSize)); // Restore SP.
335 __ mov(CSP, SP);
331 __ ret(); 336 __ ret();
332 } 337 }
333 338
334 339
335 ASSEMBLER_TEST_RUN(LoadStoreLargeIndex, test) { 340 ASSEMBLER_TEST_RUN(LoadStoreLargeIndex, test) {
336 typedef int64_t (*Int64Return)(); 341 typedef int64_t (*Int64Return)();
337 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 342 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
338 } 343 }
339 344
340 345
341 ASSEMBLER_TEST_GENERATE(LoadStoreLargeOffset, assembler) { 346 ASSEMBLER_TEST_GENERATE(LoadStoreLargeOffset, assembler) {
342 __ mov(SP, CSP); 347 __ SetupDartSP(kTestStackSpace);
343 __ movz(R0, 43, 0); 348 __ movz(R0, 43, 0);
344 __ movz(R1, 42, 0); 349 __ movz(R1, 42, 0);
345 __ sub(SP, SP, Operand(512*kWordSize)); 350 __ sub(SP, SP, Operand(512*kWordSize));
346 __ str(R1, Address(SP, 512*kWordSize, Address::Offset)); 351 __ str(R1, Address(SP, 512*kWordSize, Address::Offset));
347 __ add(SP, SP, Operand(512*kWordSize)); 352 __ add(SP, SP, Operand(512*kWordSize));
348 __ ldr(R0, Address(SP)); 353 __ ldr(R0, Address(SP));
354 __ mov(CSP, SP);
349 __ ret(); 355 __ ret();
350 } 356 }
351 357
352 358
353 ASSEMBLER_TEST_RUN(LoadStoreLargeOffset, test) { 359 ASSEMBLER_TEST_RUN(LoadStoreLargeOffset, test) {
354 typedef int64_t (*Int64Return)(); 360 typedef int64_t (*Int64Return)();
355 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 361 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
356 } 362 }
357 363
358 364
359 ASSEMBLER_TEST_GENERATE(LoadStoreExtReg, assembler) { 365 ASSEMBLER_TEST_GENERATE(LoadStoreExtReg, assembler) {
360 __ mov(SP, CSP); 366 __ SetupDartSP(kTestStackSpace);
361 __ movz(R0, 43, 0); 367 __ movz(R0, 43, 0);
362 __ movz(R1, 42, 0); 368 __ movz(R1, 42, 0);
363 __ movz(R2, 0xfff8, 0); 369 __ movz(R2, 0xfff8, 0);
364 __ movk(R2, 0xffff, 1); // R2 <- -8 (int32_t). 370 __ movk(R2, 0xffff, 1); // R2 <- -8 (int32_t).
365 // 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,
366 // i.e. SP - kWordSize. 372 // i.e. SP - kWordSize.
367 __ str(R1, Address(SP, R2, SXTW)); 373 __ str(R1, Address(SP, R2, SXTW));
368 __ sub(SP, SP, Operand(kWordSize)); 374 __ sub(SP, SP, Operand(kWordSize));
369 __ ldr(R0, Address(SP)); 375 __ ldr(R0, Address(SP));
370 __ add(SP, SP, Operand(kWordSize)); 376 __ add(SP, SP, Operand(kWordSize));
377 __ mov(CSP, SP);
371 __ ret(); 378 __ ret();
372 } 379 }
373 380
374 381
375 ASSEMBLER_TEST_RUN(LoadStoreExtReg, test) { 382 ASSEMBLER_TEST_RUN(LoadStoreExtReg, test) {
376 typedef int64_t (*Int64Return)(); 383 typedef int64_t (*Int64Return)();
377 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 384 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
378 } 385 }
379 386
380 387
381 ASSEMBLER_TEST_GENERATE(LoadStoreScaledReg, assembler) { 388 ASSEMBLER_TEST_GENERATE(LoadStoreScaledReg, assembler) {
382 __ mov(SP, CSP); 389 __ SetupDartSP(kTestStackSpace);
383 __ movz(R0, 43, 0); 390 __ movz(R0, 43, 0);
384 __ movz(R1, 42, 0); 391 __ movz(R1, 42, 0);
385 __ movz(R2, 10, 0); 392 __ movz(R2, 10, 0);
386 __ sub(SP, SP, Operand(10*kWordSize)); 393 __ sub(SP, SP, Operand(10*kWordSize));
387 // Store R1 into SP + R2 * kWordSize. 394 // Store R1 into SP + R2 * kWordSize.
388 __ str(R1, Address(SP, R2, UXTX, Address::Scaled)); 395 __ str(R1, Address(SP, R2, UXTX, Address::Scaled));
389 __ ldr(R0, Address(SP, R2, UXTX, Address::Scaled)); 396 __ ldr(R0, Address(SP, R2, UXTX, Address::Scaled));
390 __ add(SP, SP, Operand(10*kWordSize)); 397 __ add(SP, SP, Operand(10*kWordSize));
398 __ mov(CSP, SP);
391 __ ret(); 399 __ ret();
392 } 400 }
393 401
394 402
395 ASSEMBLER_TEST_RUN(LoadStoreScaledReg, test) { 403 ASSEMBLER_TEST_RUN(LoadStoreScaledReg, test) {
396 typedef int64_t (*Int64Return)(); 404 typedef int64_t (*Int64Return)();
397 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 405 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
398 } 406 }
399 407
400 408
401 ASSEMBLER_TEST_GENERATE(LoadSigned32Bit, assembler) { 409 ASSEMBLER_TEST_GENERATE(LoadSigned32Bit, assembler) {
402 __ mov(SP, CSP); 410 __ SetupDartSP(kTestStackSpace);
403 __ LoadImmediate(R1, 0xffffffff, kNoPP); 411 __ LoadImmediate(R1, 0xffffffff, kNoPP);
404 __ str(R1, Address(SP, -4, Address::PreIndex, kWord), kWord); 412 __ str(R1, Address(SP, -4, Address::PreIndex, kWord), kWord);
405 __ ldr(R0, Address(SP), kWord); 413 __ ldr(R0, Address(SP), kWord);
406 __ ldr(R1, Address(SP, 4, Address::PostIndex, kWord), kWord); 414 __ ldr(R1, Address(SP, 4, Address::PostIndex, kWord), kWord);
415 __ mov(CSP, SP);
407 __ ret(); 416 __ ret();
408 } 417 }
409 418
410 419
411 ASSEMBLER_TEST_RUN(LoadSigned32Bit, test) { 420 ASSEMBLER_TEST_RUN(LoadSigned32Bit, test) {
412 typedef int64_t (*Int64Return)(); 421 typedef int64_t (*Int64Return)();
413 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 422 EXPECT_EQ(-1, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
414 } 423 }
415 424
416 425
(...skipping 911 matching lines...) Expand 10 before | Expand all | Expand 10 after
1328 1337
1329 1338
1330 ASSEMBLER_TEST_RUN(LoadImmediateMedNeg4, test) { 1339 ASSEMBLER_TEST_RUN(LoadImmediateMedNeg4, test) {
1331 typedef int64_t (*Int64Return)(); 1340 typedef int64_t (*Int64Return)();
1332 EXPECT_EQ(-0x12341234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1341 EXPECT_EQ(-0x12341234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1333 } 1342 }
1334 1343
1335 1344
1336 // Loading immediate values with the object pool. 1345 // Loading immediate values with the object pool.
1337 ASSEMBLER_TEST_GENERATE(LoadImmediatePPSmall, assembler) { 1346 ASSEMBLER_TEST_GENERATE(LoadImmediatePPSmall, assembler) {
1338 __ mov(SP, CSP); 1347 __ SetupDartSP(kTestStackSpace);
1339 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here. 1348 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here.
1340 __ LoadPoolPointer(PP); 1349 __ LoadPoolPointer(PP);
1341 __ LoadImmediate(R0, 42, PP); 1350 __ LoadImmediate(R0, 42, PP);
1342 __ PopAndUntagPP(); 1351 __ PopAndUntagPP();
1352 __ mov(CSP, SP);
1343 __ ret(); 1353 __ ret();
1344 } 1354 }
1345 1355
1346 1356
1347 ASSEMBLER_TEST_RUN(LoadImmediatePPSmall, test) { 1357 ASSEMBLER_TEST_RUN(LoadImmediatePPSmall, test) {
1348 typedef int64_t (*Int64Return)(); 1358 typedef int64_t (*Int64Return)();
1349 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1359 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1350 } 1360 }
1351 1361
1352 1362
1353 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed, assembler) { 1363 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed, assembler) {
1354 __ mov(SP, CSP); 1364 __ SetupDartSP(kTestStackSpace);
1355 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here. 1365 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here.
1356 __ LoadPoolPointer(PP); 1366 __ LoadPoolPointer(PP);
1357 __ LoadImmediate(R0, 0xf1234123, PP); 1367 __ LoadImmediate(R0, 0xf1234123, PP);
1358 __ PopAndUntagPP(); 1368 __ PopAndUntagPP();
1369 __ mov(CSP, SP);
1359 __ ret(); 1370 __ ret();
1360 } 1371 }
1361 1372
1362 1373
1363 ASSEMBLER_TEST_RUN(LoadImmediatePPMed, test) { 1374 ASSEMBLER_TEST_RUN(LoadImmediatePPMed, test) {
1364 typedef int64_t (*Int64Return)(); 1375 typedef int64_t (*Int64Return)();
1365 EXPECT_EQ(0xf1234123, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1376 EXPECT_EQ(0xf1234123, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1366 } 1377 }
1367 1378
1368 1379
1369 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed2, assembler) { 1380 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed2, assembler) {
1370 __ mov(SP, CSP); 1381 __ SetupDartSP(kTestStackSpace);
1371 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here. 1382 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here.
1372 __ LoadPoolPointer(PP); 1383 __ LoadPoolPointer(PP);
1373 __ LoadImmediate(R0, 0x4321f1234124, PP); 1384 __ LoadImmediate(R0, 0x4321f1234124, PP);
1374 __ PopAndUntagPP(); 1385 __ PopAndUntagPP();
1386 __ mov(CSP, SP);
1375 __ ret(); 1387 __ ret();
1376 } 1388 }
1377 1389
1378 1390
1379 ASSEMBLER_TEST_RUN(LoadImmediatePPMed2, test) { 1391 ASSEMBLER_TEST_RUN(LoadImmediatePPMed2, test) {
1380 typedef int64_t (*Int64Return)(); 1392 typedef int64_t (*Int64Return)();
1381 EXPECT_EQ( 1393 EXPECT_EQ(
1382 0x4321f1234124, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1394 0x4321f1234124, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1383 } 1395 }
1384 1396
1385 1397
1386 ASSEMBLER_TEST_GENERATE(LoadImmediatePPLarge, assembler) { 1398 ASSEMBLER_TEST_GENERATE(LoadImmediatePPLarge, assembler) {
1387 __ mov(SP, CSP); 1399 __ SetupDartSP(kTestStackSpace);
1388 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here. 1400 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here.
1389 __ LoadPoolPointer(PP); 1401 __ LoadPoolPointer(PP);
1390 __ LoadImmediate(R0, 0x9287436598237465, PP); 1402 __ LoadImmediate(R0, 0x9287436598237465, PP);
1391 __ PopAndUntagPP(); 1403 __ PopAndUntagPP();
1404 __ mov(CSP, SP);
1392 __ ret(); 1405 __ ret();
1393 } 1406 }
1394 1407
1395 1408
1396 ASSEMBLER_TEST_RUN(LoadImmediatePPLarge, test) { 1409 ASSEMBLER_TEST_RUN(LoadImmediatePPLarge, test) {
1397 typedef int64_t (*Int64Return)(); 1410 typedef int64_t (*Int64Return)();
1398 EXPECT_EQ(static_cast<int64_t>(0x9287436598237465), 1411 EXPECT_EQ(static_cast<int64_t>(0x9287436598237465),
1399 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1412 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1400 } 1413 }
1401 1414
1402 1415
1403 // LoadObject null. 1416 // LoadObject null.
1404 ASSEMBLER_TEST_GENERATE(LoadObjectNull, assembler) { 1417 ASSEMBLER_TEST_GENERATE(LoadObjectNull, assembler) {
1405 __ mov(SP, CSP); 1418 __ SetupDartSP(kTestStackSpace);
1406 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here. 1419 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here.
1407 __ LoadPoolPointer(PP); 1420 __ LoadPoolPointer(PP);
1408 __ LoadObject(R0, Object::null_object(), PP); 1421 __ LoadObject(R0, Object::null_object(), PP);
1409 __ PopAndUntagPP(); 1422 __ PopAndUntagPP();
1423 __ mov(CSP, SP);
1410 __ ret(); 1424 __ ret();
1411 } 1425 }
1412 1426
1413 1427
1414 ASSEMBLER_TEST_RUN(LoadObjectNull, test) { 1428 ASSEMBLER_TEST_RUN(LoadObjectNull, test) {
1415 typedef int64_t (*Int64Return)(); 1429 typedef int64_t (*Int64Return)();
1416 EXPECT_EQ(reinterpret_cast<int64_t>(Object::null()), 1430 EXPECT_EQ(reinterpret_cast<int64_t>(Object::null()),
1417 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1431 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1418 } 1432 }
1419 1433
1420 1434
1421 ASSEMBLER_TEST_GENERATE(LoadObjectTrue, assembler) { 1435 ASSEMBLER_TEST_GENERATE(LoadObjectTrue, assembler) {
1422 __ mov(SP, CSP); 1436 __ SetupDartSP(kTestStackSpace);
1423 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here. 1437 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here.
1424 __ LoadPoolPointer(PP); 1438 __ LoadPoolPointer(PP);
1425 __ LoadObject(R0, Bool::True(), PP); 1439 __ LoadObject(R0, Bool::True(), PP);
1426 __ PopAndUntagPP(); 1440 __ PopAndUntagPP();
1441 __ mov(CSP, SP);
1427 __ ret(); 1442 __ ret();
1428 } 1443 }
1429 1444
1430 1445
1431 ASSEMBLER_TEST_RUN(LoadObjectTrue, test) { 1446 ASSEMBLER_TEST_RUN(LoadObjectTrue, test) {
1432 typedef int64_t (*Int64Return)(); 1447 typedef int64_t (*Int64Return)();
1433 EXPECT_EQ(reinterpret_cast<int64_t>(Bool::True().raw()), 1448 EXPECT_EQ(reinterpret_cast<int64_t>(Bool::True().raw()),
1434 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1449 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1435 } 1450 }
1436 1451
1437 1452
1438 ASSEMBLER_TEST_GENERATE(LoadObjectFalse, assembler) { 1453 ASSEMBLER_TEST_GENERATE(LoadObjectFalse, assembler) {
1439 __ mov(SP, CSP); 1454 __ SetupDartSP(kTestStackSpace);
1440 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here. 1455 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here.
1441 __ LoadPoolPointer(PP); 1456 __ LoadPoolPointer(PP);
1442 __ LoadObject(R0, Bool::False(), PP); 1457 __ LoadObject(R0, Bool::False(), PP);
1443 __ PopAndUntagPP(); 1458 __ PopAndUntagPP();
1459 __ mov(CSP, SP);
1444 __ ret(); 1460 __ ret();
1445 } 1461 }
1446 1462
1447 1463
1448 ASSEMBLER_TEST_RUN(LoadObjectFalse, test) { 1464 ASSEMBLER_TEST_RUN(LoadObjectFalse, test) {
1449 typedef int64_t (*Int64Return)(); 1465 typedef int64_t (*Int64Return)();
1450 EXPECT_EQ(reinterpret_cast<int64_t>(Bool::False().raw()), 1466 EXPECT_EQ(reinterpret_cast<int64_t>(Bool::False().raw()),
1451 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); 1467 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry()));
1452 } 1468 }
1453 1469
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
1590 } 1606 }
1591 1607
1592 1608
1593 ASSEMBLER_TEST_RUN(Fmovdr, test) { 1609 ASSEMBLER_TEST_RUN(Fmovdr, test) {
1594 typedef double (*DoubleReturn)(); 1610 typedef double (*DoubleReturn)();
1595 EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); 1611 EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
1596 } 1612 }
1597 1613
1598 1614
1599 ASSEMBLER_TEST_GENERATE(FldrdFstrdPrePostIndex, assembler) { 1615 ASSEMBLER_TEST_GENERATE(FldrdFstrdPrePostIndex, assembler) {
1600 __ mov(SP, CSP); 1616 __ SetupDartSP(kTestStackSpace);
1601 __ LoadDImmediate(V1, 42.0, kNoPP); 1617 __ LoadDImmediate(V1, 42.0, kNoPP);
1602 __ fstrd(V1, Address(SP, -1*kWordSize, Address::PreIndex)); 1618 __ fstrd(V1, Address(SP, -1*kWordSize, Address::PreIndex));
1603 __ fldrd(V0, Address(SP, 1*kWordSize, Address::PostIndex)); 1619 __ fldrd(V0, Address(SP, 1*kWordSize, Address::PostIndex));
1620 __ mov(CSP, SP);
1604 __ ret(); 1621 __ ret();
1605 } 1622 }
1606 1623
1607 1624
1608 ASSEMBLER_TEST_RUN(FldrdFstrdPrePostIndex, test) { 1625 ASSEMBLER_TEST_RUN(FldrdFstrdPrePostIndex, test) {
1609 typedef double (*DoubleReturn)(); 1626 typedef double (*DoubleReturn)();
1610 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); 1627 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
1611 } 1628 }
1612 1629
1613 1630
1614 ASSEMBLER_TEST_GENERATE(FldrsFstrsPrePostIndex, assembler) { 1631 ASSEMBLER_TEST_GENERATE(FldrsFstrsPrePostIndex, assembler) {
1615 __ mov(SP, CSP); 1632 __ SetupDartSP(kTestStackSpace);
1616 __ LoadDImmediate(V1, 42.0, kNoPP); 1633 __ LoadDImmediate(V1, 42.0, kNoPP);
1617 __ fcvtsd(V2, V1); 1634 __ fcvtsd(V2, V1);
1618 __ fstrs(V2, Address(SP, -1*kWordSize, Address::PreIndex)); 1635 __ fstrs(V2, Address(SP, -1*kWordSize, Address::PreIndex));
1619 __ fldrs(V3, Address(SP, 1*kWordSize, Address::PostIndex)); 1636 __ fldrs(V3, Address(SP, 1*kWordSize, Address::PostIndex));
1620 __ fcvtds(V0, V3); 1637 __ fcvtds(V0, V3);
1638 __ mov(CSP, SP);
1621 __ ret(); 1639 __ ret();
1622 } 1640 }
1623 1641
1624 1642
1625 ASSEMBLER_TEST_RUN(FldrsFstrsPrePostIndex, test) { 1643 ASSEMBLER_TEST_RUN(FldrsFstrsPrePostIndex, test) {
1626 typedef double (*DoubleReturn)(); 1644 typedef double (*DoubleReturn)();
1627 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); 1645 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
1628 } 1646 }
1629 1647
1630 1648
1631 ASSEMBLER_TEST_GENERATE(FldrqFstrqPrePostIndex, assembler) { 1649 ASSEMBLER_TEST_GENERATE(FldrqFstrqPrePostIndex, assembler) {
1632 __ mov(SP, CSP); 1650 __ SetupDartSP(kTestStackSpace);
1633 __ LoadDImmediate(V1, 21.0, kNoPP); 1651 __ LoadDImmediate(V1, 21.0, kNoPP);
1634 __ LoadDImmediate(V2, 21.0, kNoPP); 1652 __ LoadDImmediate(V2, 21.0, kNoPP);
1635 __ LoadImmediate(R1, 42, kNoPP); 1653 __ LoadImmediate(R1, 42, kNoPP);
1636 __ Push(R1); 1654 __ Push(R1);
1637 __ PushDouble(V1); 1655 __ PushDouble(V1);
1638 __ PushDouble(V2); 1656 __ PushDouble(V2);
1639 __ fldrq(V3, Address(SP, 2 * kWordSize, Address::PostIndex)); 1657 __ fldrq(V3, Address(SP, 2 * kWordSize, Address::PostIndex));
1640 __ Pop(R0); 1658 __ Pop(R0);
1641 __ fstrq(V3, Address(SP, -2 * kWordSize, Address::PreIndex)); 1659 __ fstrq(V3, Address(SP, -2 * kWordSize, Address::PreIndex));
1642 __ PopDouble(V0); 1660 __ PopDouble(V0);
1643 __ PopDouble(V1); 1661 __ PopDouble(V1);
1644 __ faddd(V0, V0, V1); 1662 __ faddd(V0, V0, V1);
1663 __ mov(CSP, SP);
1645 __ ret(); 1664 __ ret();
1646 } 1665 }
1647 1666
1648 1667
1649 ASSEMBLER_TEST_RUN(FldrqFstrqPrePostIndex, test) { 1668 ASSEMBLER_TEST_RUN(FldrqFstrqPrePostIndex, test) {
1650 typedef double (*DoubleReturn)(); 1669 typedef double (*DoubleReturn)();
1651 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); 1670 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
1652 } 1671 }
1653 1672
1654 1673
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
1793 } 1812 }
1794 1813
1795 1814
1796 ASSEMBLER_TEST_RUN(Fsubd, test) { 1815 ASSEMBLER_TEST_RUN(Fsubd, test) {
1797 typedef double (*DoubleReturn)(); 1816 typedef double (*DoubleReturn)();
1798 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); 1817 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
1799 } 1818 }
1800 1819
1801 1820
1802 ASSEMBLER_TEST_GENERATE(FldrdFstrdHeapTag, assembler) { 1821 ASSEMBLER_TEST_GENERATE(FldrdFstrdHeapTag, assembler) {
1803 __ mov(SP, CSP); 1822 __ SetupDartSP(kTestStackSpace);
1804 __ LoadDImmediate(V0, 43.0, kNoPP); 1823 __ LoadDImmediate(V0, 43.0, kNoPP);
1805 __ LoadDImmediate(V1, 42.0, kNoPP); 1824 __ LoadDImmediate(V1, 42.0, kNoPP);
1806 __ AddImmediate(SP, SP, -1 * kWordSize, kNoPP); 1825 __ AddImmediate(SP, SP, -1 * kWordSize, kNoPP);
1807 __ add(R2, SP, Operand(1)); 1826 __ add(R2, SP, Operand(1));
1808 __ fstrd(V1, Address(R2, -1)); 1827 __ fstrd(V1, Address(R2, -1));
1809 __ fldrd(V0, Address(R2, -1)); 1828 __ fldrd(V0, Address(R2, -1));
1810 __ AddImmediate(SP, SP, 1 * kWordSize, kNoPP); 1829 __ AddImmediate(SP, SP, 1 * kWordSize, kNoPP);
1830 __ mov(CSP, SP);
1811 __ ret(); 1831 __ ret();
1812 } 1832 }
1813 1833
1814 1834
1815 ASSEMBLER_TEST_RUN(FldrdFstrdHeapTag, test) { 1835 ASSEMBLER_TEST_RUN(FldrdFstrdHeapTag, test) {
1816 typedef double (*DoubleReturn)(); 1836 typedef double (*DoubleReturn)();
1817 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); 1837 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
1818 } 1838 }
1819 1839
1820 1840
1821 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeIndex, assembler) { 1841 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeIndex, assembler) {
1822 __ mov(SP, CSP); 1842 __ SetupDartSP(kTestStackSpace);
1823 __ LoadDImmediate(V0, 43.0, kNoPP); 1843 __ LoadDImmediate(V0, 43.0, kNoPP);
1824 __ LoadDImmediate(V1, 42.0, kNoPP); 1844 __ LoadDImmediate(V1, 42.0, kNoPP);
1825 // Largest negative offset that can fit in the signed 9-bit immediate field. 1845 // Largest negative offset that can fit in the signed 9-bit immediate field.
1826 __ fstrd(V1, Address(SP, -32*kWordSize, Address::PreIndex)); 1846 __ fstrd(V1, Address(SP, -32*kWordSize, Address::PreIndex));
1827 // Largest positive kWordSize aligned offset that we can fit. 1847 // Largest positive kWordSize aligned offset that we can fit.
1828 __ fldrd(V0, Address(SP, 31*kWordSize, Address::PostIndex)); 1848 __ fldrd(V0, Address(SP, 31*kWordSize, Address::PostIndex));
1829 // Correction. 1849 // Correction.
1830 __ add(SP, SP, Operand(kWordSize)); // Restore SP. 1850 __ add(SP, SP, Operand(kWordSize)); // Restore SP.
1851 __ mov(CSP, SP);
1831 __ ret(); 1852 __ ret();
1832 } 1853 }
1833 1854
1834 1855
1835 ASSEMBLER_TEST_RUN(FldrdFstrdLargeIndex, test) { 1856 ASSEMBLER_TEST_RUN(FldrdFstrdLargeIndex, test) {
1836 typedef double (*DoubleReturn)(); 1857 typedef double (*DoubleReturn)();
1837 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); 1858 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
1838 } 1859 }
1839 1860
1840 1861
1841 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeOffset, assembler) { 1862 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeOffset, assembler) {
1842 __ mov(SP, CSP); 1863 __ SetupDartSP(kTestStackSpace);
1843 __ LoadDImmediate(V0, 43.0, kNoPP); 1864 __ LoadDImmediate(V0, 43.0, kNoPP);
1844 __ LoadDImmediate(V1, 42.0, kNoPP); 1865 __ LoadDImmediate(V1, 42.0, kNoPP);
1845 __ sub(SP, SP, Operand(512*kWordSize)); 1866 __ sub(SP, SP, Operand(512*kWordSize));
1846 __ fstrd(V1, Address(SP, 512*kWordSize, Address::Offset)); 1867 __ fstrd(V1, Address(SP, 512*kWordSize, Address::Offset));
1847 __ add(SP, SP, Operand(512*kWordSize)); 1868 __ add(SP, SP, Operand(512*kWordSize));
1848 __ fldrd(V0, Address(SP)); 1869 __ fldrd(V0, Address(SP));
1870 __ mov(CSP, SP);
1849 __ ret(); 1871 __ ret();
1850 } 1872 }
1851 1873
1852 1874
1853 ASSEMBLER_TEST_RUN(FldrdFstrdLargeOffset, test) { 1875 ASSEMBLER_TEST_RUN(FldrdFstrdLargeOffset, test) {
1854 typedef double (*DoubleReturn)(); 1876 typedef double (*DoubleReturn)();
1855 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); 1877 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
1856 } 1878 }
1857 1879
1858 1880
1859 ASSEMBLER_TEST_GENERATE(FldrdFstrdExtReg, assembler) { 1881 ASSEMBLER_TEST_GENERATE(FldrdFstrdExtReg, assembler) {
1860 __ mov(SP, CSP); 1882 __ SetupDartSP(kTestStackSpace);
1861 __ LoadDImmediate(V0, 43.0, kNoPP); 1883 __ LoadDImmediate(V0, 43.0, kNoPP);
1862 __ LoadDImmediate(V1, 42.0, kNoPP); 1884 __ LoadDImmediate(V1, 42.0, kNoPP);
1863 __ movz(R2, 0xfff8, 0); 1885 __ movz(R2, 0xfff8, 0);
1864 __ movk(R2, 0xffff, 1); // R2 <- -8 (int32_t). 1886 __ movk(R2, 0xffff, 1); // R2 <- -8 (int32_t).
1865 // This should sign extend R2, and add to SP to get address, 1887 // This should sign extend R2, and add to SP to get address,
1866 // i.e. SP - kWordSize. 1888 // i.e. SP - kWordSize.
1867 __ fstrd(V1, Address(SP, R2, SXTW)); 1889 __ fstrd(V1, Address(SP, R2, SXTW));
1868 __ sub(SP, SP, Operand(kWordSize)); 1890 __ sub(SP, SP, Operand(kWordSize));
1869 __ fldrd(V0, Address(SP)); 1891 __ fldrd(V0, Address(SP));
1870 __ add(SP, SP, Operand(kWordSize)); 1892 __ add(SP, SP, Operand(kWordSize));
1893 __ mov(CSP, SP);
1871 __ ret(); 1894 __ ret();
1872 } 1895 }
1873 1896
1874 1897
1875 ASSEMBLER_TEST_RUN(FldrdFstrdExtReg, test) { 1898 ASSEMBLER_TEST_RUN(FldrdFstrdExtReg, test) {
1876 typedef double (*DoubleReturn)(); 1899 typedef double (*DoubleReturn)();
1877 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); 1900 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
1878 } 1901 }
1879 1902
1880 1903
1881 ASSEMBLER_TEST_GENERATE(FldrdFstrdScaledReg, assembler) { 1904 ASSEMBLER_TEST_GENERATE(FldrdFstrdScaledReg, assembler) {
1882 __ mov(SP, CSP); 1905 __ SetupDartSP(kTestStackSpace);
1883 __ LoadDImmediate(V0, 43.0, kNoPP); 1906 __ LoadDImmediate(V0, 43.0, kNoPP);
1884 __ LoadDImmediate(V1, 42.0, kNoPP); 1907 __ LoadDImmediate(V1, 42.0, kNoPP);
1885 __ movz(R2, 10, 0); 1908 __ movz(R2, 10, 0);
1886 __ sub(SP, SP, Operand(10*kWordSize)); 1909 __ sub(SP, SP, Operand(10*kWordSize));
1887 // Store V1 into SP + R2 * kWordSize. 1910 // Store V1 into SP + R2 * kWordSize.
1888 __ fstrd(V1, Address(SP, R2, UXTX, Address::Scaled)); 1911 __ fstrd(V1, Address(SP, R2, UXTX, Address::Scaled));
1889 __ fldrd(V0, Address(SP, R2, UXTX, Address::Scaled)); 1912 __ fldrd(V0, Address(SP, R2, UXTX, Address::Scaled));
1890 __ add(SP, SP, Operand(10*kWordSize)); 1913 __ add(SP, SP, Operand(10*kWordSize));
1914 __ mov(CSP, SP);
1891 __ ret(); 1915 __ ret();
1892 } 1916 }
1893 1917
1894 1918
1895 ASSEMBLER_TEST_RUN(FldrdFstrdScaledReg, test) { 1919 ASSEMBLER_TEST_RUN(FldrdFstrdScaledReg, test) {
1896 typedef double (*DoubleReturn)(); 1920 typedef double (*DoubleReturn)();
1897 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); 1921 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
1898 } 1922 }
1899 1923
1900 1924
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
2335 } 2359 }
2336 2360
2337 2361
2338 ASSEMBLER_TEST_RUN(Vdivd, test) { 2362 ASSEMBLER_TEST_RUN(Vdivd, test) {
2339 typedef double (*DoubleReturn)(); 2363 typedef double (*DoubleReturn)();
2340 EXPECT_EQ(2.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); 2364 EXPECT_EQ(2.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
2341 } 2365 }
2342 2366
2343 2367
2344 ASSEMBLER_TEST_GENERATE(Vdupd, assembler) { 2368 ASSEMBLER_TEST_GENERATE(Vdupd, assembler) {
2345 __ mov(SP, CSP); 2369 __ SetupDartSP(kTestStackSpace);
2346 __ LoadDImmediate(V0, 21.0, kNoPP); 2370 __ LoadDImmediate(V0, 21.0, kNoPP);
2347 __ vdupd(V1, V0, 0); 2371 __ vdupd(V1, V0, 0);
2348 2372
2349 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord); 2373 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord);
2350 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); 2374 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord);
2351 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); 2375 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex));
2352 2376
2353 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex)); 2377 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex));
2354 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex)); 2378 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex));
2355 2379
2356 __ faddd(V0, V2, V3); 2380 __ faddd(V0, V2, V3);
2381 __ mov(CSP, SP);
2357 __ ret(); 2382 __ ret();
2358 } 2383 }
2359 2384
2360 2385
2361 ASSEMBLER_TEST_RUN(Vdupd, test) { 2386 ASSEMBLER_TEST_RUN(Vdupd, test) {
2362 typedef double (*DoubleReturn)(); 2387 typedef double (*DoubleReturn)();
2363 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); 2388 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
2364 } 2389 }
2365 2390
2366 2391
2367 ASSEMBLER_TEST_GENERATE(Vdups, assembler) { 2392 ASSEMBLER_TEST_GENERATE(Vdups, assembler) {
2368 __ mov(SP, CSP); 2393 __ SetupDartSP(kTestStackSpace);
2369 __ LoadDImmediate(V0, 21.0, kNoPP); 2394 __ LoadDImmediate(V0, 21.0, kNoPP);
2370 __ fcvtsd(V0, V0); 2395 __ fcvtsd(V0, V0);
2371 __ vdups(V1, V0, 0); 2396 __ vdups(V1, V0, 0);
2372 2397
2373 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord); 2398 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord);
2374 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); 2399 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord);
2375 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); 2400 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex));
2376 2401
2377 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex)); 2402 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex));
2378 __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex)); 2403 __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex));
2379 __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex)); 2404 __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex));
2380 __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex)); 2405 __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex));
2381 2406
2382 __ fcvtds(V0, V0); 2407 __ fcvtds(V0, V0);
2383 __ fcvtds(V1, V1); 2408 __ fcvtds(V1, V1);
2384 __ fcvtds(V2, V2); 2409 __ fcvtds(V2, V2);
2385 __ fcvtds(V3, V3); 2410 __ fcvtds(V3, V3);
2386 2411
2387 __ faddd(V0, V1, V1); 2412 __ faddd(V0, V1, V1);
2388 __ faddd(V0, V0, V2); 2413 __ faddd(V0, V0, V2);
2389 __ faddd(V0, V0, V3); 2414 __ faddd(V0, V0, V3);
2415 __ mov(CSP, SP);
2390 __ ret(); 2416 __ ret();
2391 } 2417 }
2392 2418
2393 2419
2394 ASSEMBLER_TEST_RUN(Vdups, test) { 2420 ASSEMBLER_TEST_RUN(Vdups, test) {
2395 typedef double (*DoubleReturn)(); 2421 typedef double (*DoubleReturn)();
2396 EXPECT_EQ(84.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); 2422 EXPECT_EQ(84.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
2397 } 2423 }
2398 2424
2399 2425
2400 ASSEMBLER_TEST_GENERATE(Vinsd, assembler) { 2426 ASSEMBLER_TEST_GENERATE(Vinsd, assembler) {
2401 __ mov(SP, CSP); 2427 __ SetupDartSP(kTestStackSpace);
2402 __ LoadDImmediate(V5, 42.0, kNoPP); 2428 __ LoadDImmediate(V5, 42.0, kNoPP);
2403 __ vinsd(V1, 1, V5, 0); // V1[1] <- V0[0]. 2429 __ vinsd(V1, 1, V5, 0); // V1[1] <- V0[0].
2404 2430
2405 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord); 2431 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord);
2406 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); 2432 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord);
2407 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); 2433 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex));
2408 2434
2409 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex)); 2435 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex));
2410 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex)); 2436 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex));
2411 2437
2412 __ fmovdd(V0, V3); 2438 __ fmovdd(V0, V3);
2439 __ mov(CSP, SP);
2413 __ ret(); 2440 __ ret();
2414 } 2441 }
2415 2442
2416 2443
2417 ASSEMBLER_TEST_RUN(Vinsd, test) { 2444 ASSEMBLER_TEST_RUN(Vinsd, test) {
2418 typedef double (*DoubleReturn)(); 2445 typedef double (*DoubleReturn)();
2419 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); 2446 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
2420 } 2447 }
2421 2448
2422 2449
2423 ASSEMBLER_TEST_GENERATE(Vinss, assembler) { 2450 ASSEMBLER_TEST_GENERATE(Vinss, assembler) {
2424 __ mov(SP, CSP); 2451 __ SetupDartSP(kTestStackSpace);
2425 __ LoadDImmediate(V0, 21.0, kNoPP); 2452 __ LoadDImmediate(V0, 21.0, kNoPP);
2426 __ fcvtsd(V0, V0); 2453 __ fcvtsd(V0, V0);
2427 __ vinss(V1, 3, V0, 0); 2454 __ vinss(V1, 3, V0, 0);
2428 __ vinss(V1, 1, V0, 0); 2455 __ vinss(V1, 1, V0, 0);
2429 2456
2430 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord); 2457 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord);
2431 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); 2458 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord);
2432 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); 2459 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex));
2433 2460
2434 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex)); 2461 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex));
2435 __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex)); 2462 __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex));
2436 __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex)); 2463 __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex));
2437 __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex)); 2464 __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex));
2438 2465
2439 __ fcvtds(V0, V0); 2466 __ fcvtds(V0, V0);
2440 __ fcvtds(V1, V1); 2467 __ fcvtds(V1, V1);
2441 __ fcvtds(V2, V2); 2468 __ fcvtds(V2, V2);
2442 __ fcvtds(V3, V3); 2469 __ fcvtds(V3, V3);
2443 2470
2444 __ faddd(V0, V0, V1); 2471 __ faddd(V0, V0, V1);
2445 __ faddd(V0, V0, V2); 2472 __ faddd(V0, V0, V2);
2446 __ faddd(V0, V0, V3); 2473 __ faddd(V0, V0, V3);
2474 __ mov(CSP, SP);
2447 __ ret(); 2475 __ ret();
2448 } 2476 }
2449 2477
2450 2478
2451 ASSEMBLER_TEST_RUN(Vinss, test) { 2479 ASSEMBLER_TEST_RUN(Vinss, test) {
2452 typedef double (*DoubleReturn)(); 2480 typedef double (*DoubleReturn)();
2453 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); 2481 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry()));
2454 } 2482 }
2455 2483
2456 2484
(...skipping 768 matching lines...) Expand 10 before | Expand all | Expand 10 after
3225 EXPECT_FLOAT_EQ(1.0/sqrt(147000.0), res, 0.0001); 3253 EXPECT_FLOAT_EQ(1.0/sqrt(147000.0), res, 0.0001);
3226 } 3254 }
3227 3255
3228 3256
3229 // Called from assembler_test.cc. 3257 // Called from assembler_test.cc.
3230 // LR: return address. 3258 // LR: return address.
3231 // R0: context. 3259 // R0: context.
3232 // R1: value. 3260 // R1: value.
3233 // R2: growable array. 3261 // R2: growable array.
3234 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { 3262 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) {
3235 __ mov(SP, CSP); 3263 __ SetupDartSP(kTestStackSpace);
3236 __ TagAndPushPP(); 3264 __ TagAndPushPP();
3237 __ LoadPoolPointer(PP); 3265 __ LoadPoolPointer(PP);
3238 __ Push(CTX); 3266 __ Push(CTX);
3239 __ Push(LR); 3267 __ Push(LR);
3240 __ mov(CTX, R0); 3268 __ mov(CTX, R0);
3241 __ StoreIntoObject(R2, 3269 __ StoreIntoObject(R2,
3242 FieldAddress(R2, GrowableObjectArray::data_offset()), 3270 FieldAddress(R2, GrowableObjectArray::data_offset()),
3243 R1); 3271 R1);
3244 __ Pop(LR); 3272 __ Pop(LR);
3245 __ Pop(CTX); 3273 __ Pop(CTX);
3246 __ PopAndUntagPP(); 3274 __ PopAndUntagPP();
3275 __ mov(CSP, SP);
3247 __ ret(); 3276 __ ret();
3248 } 3277 }
3249 3278
3250 } // namespace dart 3279 } // namespace dart
3251 3280
3252 #endif // defined(TARGET_ARCH_ARM64) 3281 #endif // defined(TARGET_ARCH_ARM64)
OLDNEW
« no previous file with comments | « runtime/vm/assembler_arm64.h ('k') | runtime/vm/stub_code_arm64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698