| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/globals.h" | 5 #include "vm/globals.h" |
| 6 #if defined(TARGET_ARCH_ARM64) | 6 #if defined(TARGET_ARCH_ARM64) |
| 7 | 7 |
| 8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
| 9 #include "vm/cpu.h" | 9 #include "vm/cpu.h" |
| 10 #include "vm/os.h" | 10 #include "vm/os.h" |
| 11 #include "vm/unit_test.h" | 11 #include "vm/unit_test.h" |
| 12 #include "vm/virtual_memory.h" | 12 #include "vm/virtual_memory.h" |
| 13 | 13 |
| 14 namespace dart { | 14 namespace dart { |
| 15 | 15 |
| 16 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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) |
| OLD | NEW |