Chromium Code Reviews| 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)); |
| 294 __ ret(); | 296 __ ret(); |
|
regis
2014/06/03 20:50:54
You need to copy SP to CSP before returning, no?
zra
2014/06/03 21:25:51
In general yes. I think it didn't matter here beca
| |
| 295 } | 297 } |
| 296 | 298 |
| 297 | 299 |
| 298 ASSEMBLER_TEST_RUN(SimpleLoadStore, test) { | 300 ASSEMBLER_TEST_RUN(SimpleLoadStore, test) { |
| 299 typedef int64_t (*Int64Return)(); | 301 typedef int64_t (*Int64Return)(); |
| 300 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 302 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 301 } | 303 } |
| 302 | 304 |
| 303 | 305 |
| 304 ASSEMBLER_TEST_GENERATE(SimpleLoadStoreHeapTag, assembler) { | 306 ASSEMBLER_TEST_GENERATE(SimpleLoadStoreHeapTag, assembler) { |
| 305 __ mov(SP, CSP); | 307 __ SetupDartSP(kTestStackSpace); |
| 306 __ movz(R0, 43, 0); | 308 __ movz(R0, 43, 0); |
| 307 __ movz(R1, 42, 0); | 309 __ movz(R1, 42, 0); |
| 308 __ add(R2, SP, Operand(1)); | 310 __ add(R2, SP, Operand(1)); |
| 309 __ str(R1, Address(R2, -1)); | 311 __ str(R1, Address(R2, -1)); |
| 310 __ ldr(R0, Address(R2, -1)); | 312 __ ldr(R0, Address(R2, -1)); |
| 311 __ ret(); | 313 __ ret(); |
| 312 } | 314 } |
| 313 | 315 |
| 314 | 316 |
| 315 ASSEMBLER_TEST_RUN(SimpleLoadStoreHeapTag, test) { | 317 ASSEMBLER_TEST_RUN(SimpleLoadStoreHeapTag, test) { |
| 316 typedef int64_t (*Int64Return)(); | 318 typedef int64_t (*Int64Return)(); |
| 317 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 319 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 318 } | 320 } |
| 319 | 321 |
| 320 | 322 |
| 321 ASSEMBLER_TEST_GENERATE(LoadStoreLargeIndex, assembler) { | 323 ASSEMBLER_TEST_GENERATE(LoadStoreLargeIndex, assembler) { |
| 322 __ mov(SP, CSP); | 324 __ SetupDartSP(kTestStackSpace); |
| 323 __ movz(R0, 43, 0); | 325 __ movz(R0, 43, 0); |
| 324 __ movz(R1, 42, 0); | 326 __ movz(R1, 42, 0); |
| 325 // Largest negative offset that can fit in the signed 9-bit immediate field. | 327 // Largest negative offset that can fit in the signed 9-bit immediate field. |
| 326 __ str(R1, Address(SP, -32*kWordSize, Address::PreIndex)); | 328 __ str(R1, Address(SP, -32*kWordSize, Address::PreIndex)); |
| 327 // Largest positive kWordSize aligned offset that we can fit. | 329 // Largest positive kWordSize aligned offset that we can fit. |
| 328 __ ldr(R0, Address(SP, 31*kWordSize, Address::PostIndex)); | 330 __ ldr(R0, Address(SP, 31*kWordSize, Address::PostIndex)); |
| 329 // Correction. | 331 // Correction. |
| 330 __ add(SP, SP, Operand(kWordSize)); // Restore SP. | 332 __ add(SP, SP, Operand(kWordSize)); // Restore SP. |
| 331 __ ret(); | 333 __ ret(); |
| 332 } | 334 } |
| 333 | 335 |
| 334 | 336 |
| 335 ASSEMBLER_TEST_RUN(LoadStoreLargeIndex, test) { | 337 ASSEMBLER_TEST_RUN(LoadStoreLargeIndex, test) { |
| 336 typedef int64_t (*Int64Return)(); | 338 typedef int64_t (*Int64Return)(); |
| 337 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 339 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 338 } | 340 } |
| 339 | 341 |
| 340 | 342 |
| 341 ASSEMBLER_TEST_GENERATE(LoadStoreLargeOffset, assembler) { | 343 ASSEMBLER_TEST_GENERATE(LoadStoreLargeOffset, assembler) { |
| 342 __ mov(SP, CSP); | 344 __ SetupDartSP(kTestStackSpace); |
| 343 __ movz(R0, 43, 0); | 345 __ movz(R0, 43, 0); |
| 344 __ movz(R1, 42, 0); | 346 __ movz(R1, 42, 0); |
| 345 __ sub(SP, SP, Operand(512*kWordSize)); | 347 __ sub(SP, SP, Operand(512*kWordSize)); |
| 346 __ str(R1, Address(SP, 512*kWordSize, Address::Offset)); | 348 __ str(R1, Address(SP, 512*kWordSize, Address::Offset)); |
| 347 __ add(SP, SP, Operand(512*kWordSize)); | 349 __ add(SP, SP, Operand(512*kWordSize)); |
| 348 __ ldr(R0, Address(SP)); | 350 __ ldr(R0, Address(SP)); |
| 349 __ ret(); | 351 __ ret(); |
| 350 } | 352 } |
| 351 | 353 |
| 352 | 354 |
| 353 ASSEMBLER_TEST_RUN(LoadStoreLargeOffset, test) { | 355 ASSEMBLER_TEST_RUN(LoadStoreLargeOffset, test) { |
| 354 typedef int64_t (*Int64Return)(); | 356 typedef int64_t (*Int64Return)(); |
| 355 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 357 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 356 } | 358 } |
| 357 | 359 |
| 358 | 360 |
| 359 ASSEMBLER_TEST_GENERATE(LoadStoreExtReg, assembler) { | 361 ASSEMBLER_TEST_GENERATE(LoadStoreExtReg, assembler) { |
| 360 __ mov(SP, CSP); | 362 __ SetupDartSP(kTestStackSpace); |
| 361 __ movz(R0, 43, 0); | 363 __ movz(R0, 43, 0); |
| 362 __ movz(R1, 42, 0); | 364 __ movz(R1, 42, 0); |
| 363 __ movz(R2, 0xfff8, 0); | 365 __ movz(R2, 0xfff8, 0); |
| 364 __ movk(R2, 0xffff, 1); // R2 <- -8 (int32_t). | 366 __ movk(R2, 0xffff, 1); // R2 <- -8 (int32_t). |
| 365 // This should sign extend R2, and add to SP to get address, | 367 // This should sign extend R2, and add to SP to get address, |
| 366 // i.e. SP - kWordSize. | 368 // i.e. SP - kWordSize. |
| 367 __ str(R1, Address(SP, R2, SXTW)); | 369 __ str(R1, Address(SP, R2, SXTW)); |
| 368 __ sub(SP, SP, Operand(kWordSize)); | 370 __ sub(SP, SP, Operand(kWordSize)); |
| 369 __ ldr(R0, Address(SP)); | 371 __ ldr(R0, Address(SP)); |
| 370 __ add(SP, SP, Operand(kWordSize)); | 372 __ add(SP, SP, Operand(kWordSize)); |
| 371 __ ret(); | 373 __ ret(); |
| 372 } | 374 } |
| 373 | 375 |
| 374 | 376 |
| 375 ASSEMBLER_TEST_RUN(LoadStoreExtReg, test) { | 377 ASSEMBLER_TEST_RUN(LoadStoreExtReg, test) { |
| 376 typedef int64_t (*Int64Return)(); | 378 typedef int64_t (*Int64Return)(); |
| 377 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 379 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 378 } | 380 } |
| 379 | 381 |
| 380 | 382 |
| 381 ASSEMBLER_TEST_GENERATE(LoadStoreScaledReg, assembler) { | 383 ASSEMBLER_TEST_GENERATE(LoadStoreScaledReg, assembler) { |
| 382 __ mov(SP, CSP); | 384 __ SetupDartSP(kTestStackSpace); |
| 383 __ movz(R0, 43, 0); | 385 __ movz(R0, 43, 0); |
| 384 __ movz(R1, 42, 0); | 386 __ movz(R1, 42, 0); |
| 385 __ movz(R2, 10, 0); | 387 __ movz(R2, 10, 0); |
| 386 __ sub(SP, SP, Operand(10*kWordSize)); | 388 __ sub(SP, SP, Operand(10*kWordSize)); |
| 387 // Store R1 into SP + R2 * kWordSize. | 389 // Store R1 into SP + R2 * kWordSize. |
| 388 __ str(R1, Address(SP, R2, UXTX, Address::Scaled)); | 390 __ str(R1, Address(SP, R2, UXTX, Address::Scaled)); |
| 389 __ ldr(R0, Address(SP, R2, UXTX, Address::Scaled)); | 391 __ ldr(R0, Address(SP, R2, UXTX, Address::Scaled)); |
| 390 __ add(SP, SP, Operand(10*kWordSize)); | 392 __ add(SP, SP, Operand(10*kWordSize)); |
| 391 __ ret(); | 393 __ ret(); |
| 392 } | 394 } |
| 393 | 395 |
| 394 | 396 |
| 395 ASSEMBLER_TEST_RUN(LoadStoreScaledReg, test) { | 397 ASSEMBLER_TEST_RUN(LoadStoreScaledReg, test) { |
| 396 typedef int64_t (*Int64Return)(); | 398 typedef int64_t (*Int64Return)(); |
| 397 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 399 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 398 } | 400 } |
| 399 | 401 |
| 400 | 402 |
| 401 ASSEMBLER_TEST_GENERATE(LoadSigned32Bit, assembler) { | 403 ASSEMBLER_TEST_GENERATE(LoadSigned32Bit, assembler) { |
| 402 __ mov(SP, CSP); | 404 __ SetupDartSP(kTestStackSpace); |
| 403 __ LoadImmediate(R1, 0xffffffff, kNoPP); | 405 __ LoadImmediate(R1, 0xffffffff, kNoPP); |
| 404 __ str(R1, Address(SP, -4, Address::PreIndex, kWord), kWord); | 406 __ str(R1, Address(SP, -4, Address::PreIndex, kWord), kWord); |
| 405 __ ldr(R0, Address(SP), kWord); | 407 __ ldr(R0, Address(SP), kWord); |
| 406 __ ldr(R1, Address(SP, 4, Address::PostIndex, kWord), kWord); | 408 __ ldr(R1, Address(SP, 4, Address::PostIndex, kWord), kWord); |
| 407 __ ret(); | 409 __ ret(); |
| 408 } | 410 } |
| 409 | 411 |
| 410 | 412 |
| 411 ASSEMBLER_TEST_RUN(LoadSigned32Bit, test) { | 413 ASSEMBLER_TEST_RUN(LoadSigned32Bit, test) { |
| 412 typedef int64_t (*Int64Return)(); | 414 typedef int64_t (*Int64Return)(); |
| (...skipping 915 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1328 | 1330 |
| 1329 | 1331 |
| 1330 ASSEMBLER_TEST_RUN(LoadImmediateMedNeg4, test) { | 1332 ASSEMBLER_TEST_RUN(LoadImmediateMedNeg4, test) { |
| 1331 typedef int64_t (*Int64Return)(); | 1333 typedef int64_t (*Int64Return)(); |
| 1332 EXPECT_EQ(-0x12341234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1334 EXPECT_EQ(-0x12341234, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1333 } | 1335 } |
| 1334 | 1336 |
| 1335 | 1337 |
| 1336 // Loading immediate values with the object pool. | 1338 // Loading immediate values with the object pool. |
| 1337 ASSEMBLER_TEST_GENERATE(LoadImmediatePPSmall, assembler) { | 1339 ASSEMBLER_TEST_GENERATE(LoadImmediatePPSmall, assembler) { |
| 1338 __ mov(SP, CSP); | 1340 __ SetupDartSP(kTestStackSpace); |
| 1339 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here. | 1341 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here. |
| 1340 __ LoadPoolPointer(PP); | 1342 __ LoadPoolPointer(PP); |
| 1341 __ LoadImmediate(R0, 42, PP); | 1343 __ LoadImmediate(R0, 42, PP); |
| 1342 __ PopAndUntagPP(); | 1344 __ PopAndUntagPP(); |
| 1343 __ ret(); | 1345 __ ret(); |
| 1344 } | 1346 } |
| 1345 | 1347 |
| 1346 | 1348 |
| 1347 ASSEMBLER_TEST_RUN(LoadImmediatePPSmall, test) { | 1349 ASSEMBLER_TEST_RUN(LoadImmediatePPSmall, test) { |
| 1348 typedef int64_t (*Int64Return)(); | 1350 typedef int64_t (*Int64Return)(); |
| 1349 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1351 EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1350 } | 1352 } |
| 1351 | 1353 |
| 1352 | 1354 |
| 1353 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed, assembler) { | 1355 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed, assembler) { |
| 1354 __ mov(SP, CSP); | 1356 __ SetupDartSP(kTestStackSpace); |
| 1355 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here. | 1357 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here. |
| 1356 __ LoadPoolPointer(PP); | 1358 __ LoadPoolPointer(PP); |
| 1357 __ LoadImmediate(R0, 0xf1234123, PP); | 1359 __ LoadImmediate(R0, 0xf1234123, PP); |
| 1358 __ PopAndUntagPP(); | 1360 __ PopAndUntagPP(); |
| 1359 __ ret(); | 1361 __ ret(); |
| 1360 } | 1362 } |
| 1361 | 1363 |
| 1362 | 1364 |
| 1363 ASSEMBLER_TEST_RUN(LoadImmediatePPMed, test) { | 1365 ASSEMBLER_TEST_RUN(LoadImmediatePPMed, test) { |
| 1364 typedef int64_t (*Int64Return)(); | 1366 typedef int64_t (*Int64Return)(); |
| 1365 EXPECT_EQ(0xf1234123, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1367 EXPECT_EQ(0xf1234123, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1366 } | 1368 } |
| 1367 | 1369 |
| 1368 | 1370 |
| 1369 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed2, assembler) { | 1371 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed2, assembler) { |
| 1370 __ mov(SP, CSP); | 1372 __ SetupDartSP(kTestStackSpace); |
| 1371 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here. | 1373 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here. |
| 1372 __ LoadPoolPointer(PP); | 1374 __ LoadPoolPointer(PP); |
| 1373 __ LoadImmediate(R0, 0x4321f1234124, PP); | 1375 __ LoadImmediate(R0, 0x4321f1234124, PP); |
| 1374 __ PopAndUntagPP(); | 1376 __ PopAndUntagPP(); |
| 1375 __ ret(); | 1377 __ ret(); |
| 1376 } | 1378 } |
| 1377 | 1379 |
| 1378 | 1380 |
| 1379 ASSEMBLER_TEST_RUN(LoadImmediatePPMed2, test) { | 1381 ASSEMBLER_TEST_RUN(LoadImmediatePPMed2, test) { |
| 1380 typedef int64_t (*Int64Return)(); | 1382 typedef int64_t (*Int64Return)(); |
| 1381 EXPECT_EQ( | 1383 EXPECT_EQ( |
| 1382 0x4321f1234124, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1384 0x4321f1234124, EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1383 } | 1385 } |
| 1384 | 1386 |
| 1385 | 1387 |
| 1386 ASSEMBLER_TEST_GENERATE(LoadImmediatePPLarge, assembler) { | 1388 ASSEMBLER_TEST_GENERATE(LoadImmediatePPLarge, assembler) { |
| 1387 __ mov(SP, CSP); | 1389 __ SetupDartSP(kTestStackSpace); |
| 1388 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here. | 1390 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here. |
| 1389 __ LoadPoolPointer(PP); | 1391 __ LoadPoolPointer(PP); |
| 1390 __ LoadImmediate(R0, 0x9287436598237465, PP); | 1392 __ LoadImmediate(R0, 0x9287436598237465, PP); |
| 1391 __ PopAndUntagPP(); | 1393 __ PopAndUntagPP(); |
| 1392 __ ret(); | 1394 __ ret(); |
| 1393 } | 1395 } |
| 1394 | 1396 |
| 1395 | 1397 |
| 1396 ASSEMBLER_TEST_RUN(LoadImmediatePPLarge, test) { | 1398 ASSEMBLER_TEST_RUN(LoadImmediatePPLarge, test) { |
| 1397 typedef int64_t (*Int64Return)(); | 1399 typedef int64_t (*Int64Return)(); |
| 1398 EXPECT_EQ(static_cast<int64_t>(0x9287436598237465), | 1400 EXPECT_EQ(static_cast<int64_t>(0x9287436598237465), |
| 1399 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1401 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1400 } | 1402 } |
| 1401 | 1403 |
| 1402 | 1404 |
| 1403 // LoadObject null. | 1405 // LoadObject null. |
| 1404 ASSEMBLER_TEST_GENERATE(LoadObjectNull, assembler) { | 1406 ASSEMBLER_TEST_GENERATE(LoadObjectNull, assembler) { |
| 1405 __ mov(SP, CSP); | 1407 __ SetupDartSP(kTestStackSpace); |
| 1406 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here. | 1408 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here. |
| 1407 __ LoadPoolPointer(PP); | 1409 __ LoadPoolPointer(PP); |
| 1408 __ LoadObject(R0, Object::null_object(), PP); | 1410 __ LoadObject(R0, Object::null_object(), PP); |
| 1409 __ PopAndUntagPP(); | 1411 __ PopAndUntagPP(); |
| 1410 __ ret(); | 1412 __ ret(); |
| 1411 } | 1413 } |
| 1412 | 1414 |
| 1413 | 1415 |
| 1414 ASSEMBLER_TEST_RUN(LoadObjectNull, test) { | 1416 ASSEMBLER_TEST_RUN(LoadObjectNull, test) { |
| 1415 typedef int64_t (*Int64Return)(); | 1417 typedef int64_t (*Int64Return)(); |
| 1416 EXPECT_EQ(reinterpret_cast<int64_t>(Object::null()), | 1418 EXPECT_EQ(reinterpret_cast<int64_t>(Object::null()), |
| 1417 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1419 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1418 } | 1420 } |
| 1419 | 1421 |
| 1420 | 1422 |
| 1421 ASSEMBLER_TEST_GENERATE(LoadObjectTrue, assembler) { | 1423 ASSEMBLER_TEST_GENERATE(LoadObjectTrue, assembler) { |
| 1422 __ mov(SP, CSP); | 1424 __ SetupDartSP(kTestStackSpace); |
| 1423 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here. | 1425 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here. |
| 1424 __ LoadPoolPointer(PP); | 1426 __ LoadPoolPointer(PP); |
| 1425 __ LoadObject(R0, Bool::True(), PP); | 1427 __ LoadObject(R0, Bool::True(), PP); |
| 1426 __ PopAndUntagPP(); | 1428 __ PopAndUntagPP(); |
| 1427 __ ret(); | 1429 __ ret(); |
| 1428 } | 1430 } |
| 1429 | 1431 |
| 1430 | 1432 |
| 1431 ASSEMBLER_TEST_RUN(LoadObjectTrue, test) { | 1433 ASSEMBLER_TEST_RUN(LoadObjectTrue, test) { |
| 1432 typedef int64_t (*Int64Return)(); | 1434 typedef int64_t (*Int64Return)(); |
| 1433 EXPECT_EQ(reinterpret_cast<int64_t>(Bool::True().raw()), | 1435 EXPECT_EQ(reinterpret_cast<int64_t>(Bool::True().raw()), |
| 1434 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); | 1436 EXECUTE_TEST_CODE_INT64(Int64Return, test->entry())); |
| 1435 } | 1437 } |
| 1436 | 1438 |
| 1437 | 1439 |
| 1438 ASSEMBLER_TEST_GENERATE(LoadObjectFalse, assembler) { | 1440 ASSEMBLER_TEST_GENERATE(LoadObjectFalse, assembler) { |
| 1439 __ mov(SP, CSP); | 1441 __ SetupDartSP(kTestStackSpace); |
| 1440 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here. | 1442 __ TagAndPushPP(); // Save caller's pool pointer and load a new one here. |
| 1441 __ LoadPoolPointer(PP); | 1443 __ LoadPoolPointer(PP); |
| 1442 __ LoadObject(R0, Bool::False(), PP); | 1444 __ LoadObject(R0, Bool::False(), PP); |
| 1443 __ PopAndUntagPP(); | 1445 __ PopAndUntagPP(); |
| 1444 __ ret(); | 1446 __ ret(); |
| 1445 } | 1447 } |
| 1446 | 1448 |
| 1447 | 1449 |
| 1448 ASSEMBLER_TEST_RUN(LoadObjectFalse, test) { | 1450 ASSEMBLER_TEST_RUN(LoadObjectFalse, test) { |
| 1449 typedef int64_t (*Int64Return)(); | 1451 typedef int64_t (*Int64Return)(); |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1590 } | 1592 } |
| 1591 | 1593 |
| 1592 | 1594 |
| 1593 ASSEMBLER_TEST_RUN(Fmovdr, test) { | 1595 ASSEMBLER_TEST_RUN(Fmovdr, test) { |
| 1594 typedef double (*DoubleReturn)(); | 1596 typedef double (*DoubleReturn)(); |
| 1595 EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1597 EXPECT_EQ(1.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 1596 } | 1598 } |
| 1597 | 1599 |
| 1598 | 1600 |
| 1599 ASSEMBLER_TEST_GENERATE(FldrdFstrdPrePostIndex, assembler) { | 1601 ASSEMBLER_TEST_GENERATE(FldrdFstrdPrePostIndex, assembler) { |
| 1600 __ mov(SP, CSP); | 1602 __ SetupDartSP(kTestStackSpace); |
| 1601 __ LoadDImmediate(V1, 42.0, kNoPP); | 1603 __ LoadDImmediate(V1, 42.0, kNoPP); |
| 1602 __ fstrd(V1, Address(SP, -1*kWordSize, Address::PreIndex)); | 1604 __ fstrd(V1, Address(SP, -1*kWordSize, Address::PreIndex)); |
| 1603 __ fldrd(V0, Address(SP, 1*kWordSize, Address::PostIndex)); | 1605 __ fldrd(V0, Address(SP, 1*kWordSize, Address::PostIndex)); |
| 1604 __ ret(); | 1606 __ ret(); |
| 1605 } | 1607 } |
| 1606 | 1608 |
| 1607 | 1609 |
| 1608 ASSEMBLER_TEST_RUN(FldrdFstrdPrePostIndex, test) { | 1610 ASSEMBLER_TEST_RUN(FldrdFstrdPrePostIndex, test) { |
| 1609 typedef double (*DoubleReturn)(); | 1611 typedef double (*DoubleReturn)(); |
| 1610 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1612 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 1611 } | 1613 } |
| 1612 | 1614 |
| 1613 | 1615 |
| 1614 ASSEMBLER_TEST_GENERATE(FldrsFstrsPrePostIndex, assembler) { | 1616 ASSEMBLER_TEST_GENERATE(FldrsFstrsPrePostIndex, assembler) { |
| 1615 __ mov(SP, CSP); | 1617 __ SetupDartSP(kTestStackSpace); |
| 1616 __ LoadDImmediate(V1, 42.0, kNoPP); | 1618 __ LoadDImmediate(V1, 42.0, kNoPP); |
| 1617 __ fcvtsd(V2, V1); | 1619 __ fcvtsd(V2, V1); |
| 1618 __ fstrs(V2, Address(SP, -1*kWordSize, Address::PreIndex)); | 1620 __ fstrs(V2, Address(SP, -1*kWordSize, Address::PreIndex)); |
| 1619 __ fldrs(V3, Address(SP, 1*kWordSize, Address::PostIndex)); | 1621 __ fldrs(V3, Address(SP, 1*kWordSize, Address::PostIndex)); |
| 1620 __ fcvtds(V0, V3); | 1622 __ fcvtds(V0, V3); |
| 1621 __ ret(); | 1623 __ ret(); |
| 1622 } | 1624 } |
| 1623 | 1625 |
| 1624 | 1626 |
| 1625 ASSEMBLER_TEST_RUN(FldrsFstrsPrePostIndex, test) { | 1627 ASSEMBLER_TEST_RUN(FldrsFstrsPrePostIndex, test) { |
| 1626 typedef double (*DoubleReturn)(); | 1628 typedef double (*DoubleReturn)(); |
| 1627 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1629 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 1628 } | 1630 } |
| 1629 | 1631 |
| 1630 | 1632 |
| 1631 ASSEMBLER_TEST_GENERATE(FldrqFstrqPrePostIndex, assembler) { | 1633 ASSEMBLER_TEST_GENERATE(FldrqFstrqPrePostIndex, assembler) { |
| 1632 __ mov(SP, CSP); | 1634 __ SetupDartSP(kTestStackSpace); |
| 1633 __ LoadDImmediate(V1, 21.0, kNoPP); | 1635 __ LoadDImmediate(V1, 21.0, kNoPP); |
| 1634 __ LoadDImmediate(V2, 21.0, kNoPP); | 1636 __ LoadDImmediate(V2, 21.0, kNoPP); |
| 1635 __ LoadImmediate(R1, 42, kNoPP); | 1637 __ LoadImmediate(R1, 42, kNoPP); |
| 1636 __ Push(R1); | 1638 __ Push(R1); |
| 1637 __ PushDouble(V1); | 1639 __ PushDouble(V1); |
| 1638 __ PushDouble(V2); | 1640 __ PushDouble(V2); |
| 1639 __ fldrq(V3, Address(SP, 2 * kWordSize, Address::PostIndex)); | 1641 __ fldrq(V3, Address(SP, 2 * kWordSize, Address::PostIndex)); |
| 1640 __ Pop(R0); | 1642 __ Pop(R0); |
| 1641 __ fstrq(V3, Address(SP, -2 * kWordSize, Address::PreIndex)); | 1643 __ fstrq(V3, Address(SP, -2 * kWordSize, Address::PreIndex)); |
| 1642 __ PopDouble(V0); | 1644 __ PopDouble(V0); |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1793 } | 1795 } |
| 1794 | 1796 |
| 1795 | 1797 |
| 1796 ASSEMBLER_TEST_RUN(Fsubd, test) { | 1798 ASSEMBLER_TEST_RUN(Fsubd, test) { |
| 1797 typedef double (*DoubleReturn)(); | 1799 typedef double (*DoubleReturn)(); |
| 1798 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1800 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 1799 } | 1801 } |
| 1800 | 1802 |
| 1801 | 1803 |
| 1802 ASSEMBLER_TEST_GENERATE(FldrdFstrdHeapTag, assembler) { | 1804 ASSEMBLER_TEST_GENERATE(FldrdFstrdHeapTag, assembler) { |
| 1803 __ mov(SP, CSP); | 1805 __ SetupDartSP(kTestStackSpace); |
| 1804 __ LoadDImmediate(V0, 43.0, kNoPP); | 1806 __ LoadDImmediate(V0, 43.0, kNoPP); |
| 1805 __ LoadDImmediate(V1, 42.0, kNoPP); | 1807 __ LoadDImmediate(V1, 42.0, kNoPP); |
| 1806 __ AddImmediate(SP, SP, -1 * kWordSize, kNoPP); | 1808 __ AddImmediate(SP, SP, -1 * kWordSize, kNoPP); |
| 1807 __ add(R2, SP, Operand(1)); | 1809 __ add(R2, SP, Operand(1)); |
| 1808 __ fstrd(V1, Address(R2, -1)); | 1810 __ fstrd(V1, Address(R2, -1)); |
| 1809 __ fldrd(V0, Address(R2, -1)); | 1811 __ fldrd(V0, Address(R2, -1)); |
| 1810 __ AddImmediate(SP, SP, 1 * kWordSize, kNoPP); | 1812 __ AddImmediate(SP, SP, 1 * kWordSize, kNoPP); |
| 1811 __ ret(); | 1813 __ ret(); |
| 1812 } | 1814 } |
| 1813 | 1815 |
| 1814 | 1816 |
| 1815 ASSEMBLER_TEST_RUN(FldrdFstrdHeapTag, test) { | 1817 ASSEMBLER_TEST_RUN(FldrdFstrdHeapTag, test) { |
| 1816 typedef double (*DoubleReturn)(); | 1818 typedef double (*DoubleReturn)(); |
| 1817 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1819 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 1818 } | 1820 } |
| 1819 | 1821 |
| 1820 | 1822 |
| 1821 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeIndex, assembler) { | 1823 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeIndex, assembler) { |
| 1822 __ mov(SP, CSP); | 1824 __ SetupDartSP(kTestStackSpace); |
| 1823 __ LoadDImmediate(V0, 43.0, kNoPP); | 1825 __ LoadDImmediate(V0, 43.0, kNoPP); |
| 1824 __ LoadDImmediate(V1, 42.0, kNoPP); | 1826 __ LoadDImmediate(V1, 42.0, kNoPP); |
| 1825 // Largest negative offset that can fit in the signed 9-bit immediate field. | 1827 // Largest negative offset that can fit in the signed 9-bit immediate field. |
| 1826 __ fstrd(V1, Address(SP, -32*kWordSize, Address::PreIndex)); | 1828 __ fstrd(V1, Address(SP, -32*kWordSize, Address::PreIndex)); |
| 1827 // Largest positive kWordSize aligned offset that we can fit. | 1829 // Largest positive kWordSize aligned offset that we can fit. |
| 1828 __ fldrd(V0, Address(SP, 31*kWordSize, Address::PostIndex)); | 1830 __ fldrd(V0, Address(SP, 31*kWordSize, Address::PostIndex)); |
| 1829 // Correction. | 1831 // Correction. |
| 1830 __ add(SP, SP, Operand(kWordSize)); // Restore SP. | 1832 __ add(SP, SP, Operand(kWordSize)); // Restore SP. |
| 1831 __ ret(); | 1833 __ ret(); |
| 1832 } | 1834 } |
| 1833 | 1835 |
| 1834 | 1836 |
| 1835 ASSEMBLER_TEST_RUN(FldrdFstrdLargeIndex, test) { | 1837 ASSEMBLER_TEST_RUN(FldrdFstrdLargeIndex, test) { |
| 1836 typedef double (*DoubleReturn)(); | 1838 typedef double (*DoubleReturn)(); |
| 1837 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1839 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 1838 } | 1840 } |
| 1839 | 1841 |
| 1840 | 1842 |
| 1841 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeOffset, assembler) { | 1843 ASSEMBLER_TEST_GENERATE(FldrdFstrdLargeOffset, assembler) { |
| 1842 __ mov(SP, CSP); | 1844 __ SetupDartSP(kTestStackSpace); |
| 1843 __ LoadDImmediate(V0, 43.0, kNoPP); | 1845 __ LoadDImmediate(V0, 43.0, kNoPP); |
| 1844 __ LoadDImmediate(V1, 42.0, kNoPP); | 1846 __ LoadDImmediate(V1, 42.0, kNoPP); |
| 1845 __ sub(SP, SP, Operand(512*kWordSize)); | 1847 __ sub(SP, SP, Operand(512*kWordSize)); |
| 1846 __ fstrd(V1, Address(SP, 512*kWordSize, Address::Offset)); | 1848 __ fstrd(V1, Address(SP, 512*kWordSize, Address::Offset)); |
| 1847 __ add(SP, SP, Operand(512*kWordSize)); | 1849 __ add(SP, SP, Operand(512*kWordSize)); |
| 1848 __ fldrd(V0, Address(SP)); | 1850 __ fldrd(V0, Address(SP)); |
| 1849 __ ret(); | 1851 __ ret(); |
| 1850 } | 1852 } |
| 1851 | 1853 |
| 1852 | 1854 |
| 1853 ASSEMBLER_TEST_RUN(FldrdFstrdLargeOffset, test) { | 1855 ASSEMBLER_TEST_RUN(FldrdFstrdLargeOffset, test) { |
| 1854 typedef double (*DoubleReturn)(); | 1856 typedef double (*DoubleReturn)(); |
| 1855 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 1857 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 1856 } | 1858 } |
| 1857 | 1859 |
| 1858 | 1860 |
| 1859 ASSEMBLER_TEST_GENERATE(FldrdFstrdExtReg, assembler) { | 1861 ASSEMBLER_TEST_GENERATE(FldrdFstrdExtReg, assembler) { |
| 1860 __ mov(SP, CSP); | 1862 __ SetupDartSP(kTestStackSpace); |
| 1861 __ LoadDImmediate(V0, 43.0, kNoPP); | 1863 __ LoadDImmediate(V0, 43.0, kNoPP); |
| 1862 __ LoadDImmediate(V1, 42.0, kNoPP); | 1864 __ LoadDImmediate(V1, 42.0, kNoPP); |
| 1863 __ movz(R2, 0xfff8, 0); | 1865 __ movz(R2, 0xfff8, 0); |
| 1864 __ movk(R2, 0xffff, 1); // R2 <- -8 (int32_t). | 1866 __ movk(R2, 0xffff, 1); // R2 <- -8 (int32_t). |
| 1865 // This should sign extend R2, and add to SP to get address, | 1867 // This should sign extend R2, and add to SP to get address, |
| 1866 // i.e. SP - kWordSize. | 1868 // i.e. SP - kWordSize. |
| 1867 __ fstrd(V1, Address(SP, R2, SXTW)); | 1869 __ fstrd(V1, Address(SP, R2, SXTW)); |
| 1868 __ sub(SP, SP, Operand(kWordSize)); | 1870 __ sub(SP, SP, Operand(kWordSize)); |
| 1869 __ fldrd(V0, Address(SP)); | 1871 __ fldrd(V0, Address(SP)); |
| 1870 __ add(SP, SP, Operand(kWordSize)); | 1872 __ add(SP, SP, Operand(kWordSize)); |
| 1871 __ ret(); | 1873 __ ret(); |
| 1872 } | 1874 } |
| 1873 | 1875 |
| 1874 | 1876 |
| 1875 ASSEMBLER_TEST_RUN(FldrdFstrdExtReg, test) { | 1877 ASSEMBLER_TEST_RUN(FldrdFstrdExtReg, test) { |
| 1876 typedef double (*DoubleReturn)(); | 1878 typedef double (*DoubleReturn)(); |
| 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(FldrdFstrdScaledReg, assembler) { | 1883 ASSEMBLER_TEST_GENERATE(FldrdFstrdScaledReg, assembler) { |
| 1882 __ mov(SP, CSP); | 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, 10, 0); | 1887 __ movz(R2, 10, 0); |
| 1886 __ sub(SP, SP, Operand(10*kWordSize)); | 1888 __ sub(SP, SP, Operand(10*kWordSize)); |
| 1887 // Store V1 into SP + R2 * kWordSize. | 1889 // Store V1 into SP + R2 * kWordSize. |
| 1888 __ fstrd(V1, Address(SP, R2, UXTX, Address::Scaled)); | 1890 __ fstrd(V1, Address(SP, R2, UXTX, Address::Scaled)); |
| 1889 __ fldrd(V0, Address(SP, R2, UXTX, Address::Scaled)); | 1891 __ fldrd(V0, Address(SP, R2, UXTX, Address::Scaled)); |
| 1890 __ add(SP, SP, Operand(10*kWordSize)); | 1892 __ add(SP, SP, Operand(10*kWordSize)); |
| 1891 __ ret(); | 1893 __ ret(); |
| 1892 } | 1894 } |
| (...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2335 } | 2337 } |
| 2336 | 2338 |
| 2337 | 2339 |
| 2338 ASSEMBLER_TEST_RUN(Vdivd, test) { | 2340 ASSEMBLER_TEST_RUN(Vdivd, test) { |
| 2339 typedef double (*DoubleReturn)(); | 2341 typedef double (*DoubleReturn)(); |
| 2340 EXPECT_EQ(2.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2342 EXPECT_EQ(2.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2341 } | 2343 } |
| 2342 | 2344 |
| 2343 | 2345 |
| 2344 ASSEMBLER_TEST_GENERATE(Vdupd, assembler) { | 2346 ASSEMBLER_TEST_GENERATE(Vdupd, assembler) { |
| 2345 __ mov(SP, CSP); | 2347 __ SetupDartSP(kTestStackSpace); |
| 2346 __ LoadDImmediate(V0, 21.0, kNoPP); | 2348 __ LoadDImmediate(V0, 21.0, kNoPP); |
| 2347 __ vdupd(V1, V0, 0); | 2349 __ vdupd(V1, V0, 0); |
| 2348 | 2350 |
| 2349 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord); | 2351 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord); |
| 2350 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); | 2352 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); |
| 2351 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); | 2353 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); |
| 2352 | 2354 |
| 2353 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex)); | 2355 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex)); |
| 2354 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex)); | 2356 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex)); |
| 2355 | 2357 |
| 2356 __ faddd(V0, V2, V3); | 2358 __ faddd(V0, V2, V3); |
| 2357 __ ret(); | 2359 __ ret(); |
| 2358 } | 2360 } |
| 2359 | 2361 |
| 2360 | 2362 |
| 2361 ASSEMBLER_TEST_RUN(Vdupd, test) { | 2363 ASSEMBLER_TEST_RUN(Vdupd, test) { |
| 2362 typedef double (*DoubleReturn)(); | 2364 typedef double (*DoubleReturn)(); |
| 2363 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2365 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2364 } | 2366 } |
| 2365 | 2367 |
| 2366 | 2368 |
| 2367 ASSEMBLER_TEST_GENERATE(Vdups, assembler) { | 2369 ASSEMBLER_TEST_GENERATE(Vdups, assembler) { |
| 2368 __ mov(SP, CSP); | 2370 __ SetupDartSP(kTestStackSpace); |
| 2369 __ LoadDImmediate(V0, 21.0, kNoPP); | 2371 __ LoadDImmediate(V0, 21.0, kNoPP); |
| 2370 __ fcvtsd(V0, V0); | 2372 __ fcvtsd(V0, V0); |
| 2371 __ vdups(V1, V0, 0); | 2373 __ vdups(V1, V0, 0); |
| 2372 | 2374 |
| 2373 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord); | 2375 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord); |
| 2374 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); | 2376 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); |
| 2375 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); | 2377 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); |
| 2376 | 2378 |
| 2377 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2379 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| 2378 __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2380 __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 2391 } | 2393 } |
| 2392 | 2394 |
| 2393 | 2395 |
| 2394 ASSEMBLER_TEST_RUN(Vdups, test) { | 2396 ASSEMBLER_TEST_RUN(Vdups, test) { |
| 2395 typedef double (*DoubleReturn)(); | 2397 typedef double (*DoubleReturn)(); |
| 2396 EXPECT_EQ(84.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2398 EXPECT_EQ(84.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2397 } | 2399 } |
| 2398 | 2400 |
| 2399 | 2401 |
| 2400 ASSEMBLER_TEST_GENERATE(Vinsd, assembler) { | 2402 ASSEMBLER_TEST_GENERATE(Vinsd, assembler) { |
| 2401 __ mov(SP, CSP); | 2403 __ SetupDartSP(kTestStackSpace); |
| 2402 __ LoadDImmediate(V5, 42.0, kNoPP); | 2404 __ LoadDImmediate(V5, 42.0, kNoPP); |
| 2403 __ vinsd(V1, 1, V5, 0); // V1[1] <- V0[0]. | 2405 __ vinsd(V1, 1, V5, 0); // V1[1] <- V0[0]. |
| 2404 | 2406 |
| 2405 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord); | 2407 const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord); |
| 2406 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); | 2408 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); |
| 2407 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); | 2409 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); |
| 2408 | 2410 |
| 2409 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex)); | 2411 __ fldrd(V2, Address(SP, 1 * dword_bytes, Address::PostIndex)); |
| 2410 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex)); | 2412 __ fldrd(V3, Address(SP, 1 * dword_bytes, Address::PostIndex)); |
| 2411 | 2413 |
| 2412 __ fmovdd(V0, V3); | 2414 __ fmovdd(V0, V3); |
| 2413 __ ret(); | 2415 __ ret(); |
| 2414 } | 2416 } |
| 2415 | 2417 |
| 2416 | 2418 |
| 2417 ASSEMBLER_TEST_RUN(Vinsd, test) { | 2419 ASSEMBLER_TEST_RUN(Vinsd, test) { |
| 2418 typedef double (*DoubleReturn)(); | 2420 typedef double (*DoubleReturn)(); |
| 2419 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); | 2421 EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(DoubleReturn, test->entry())); |
| 2420 } | 2422 } |
| 2421 | 2423 |
| 2422 | 2424 |
| 2423 ASSEMBLER_TEST_GENERATE(Vinss, assembler) { | 2425 ASSEMBLER_TEST_GENERATE(Vinss, assembler) { |
| 2424 __ mov(SP, CSP); | 2426 __ SetupDartSP(kTestStackSpace); |
| 2425 __ LoadDImmediate(V0, 21.0, kNoPP); | 2427 __ LoadDImmediate(V0, 21.0, kNoPP); |
| 2426 __ fcvtsd(V0, V0); | 2428 __ fcvtsd(V0, V0); |
| 2427 __ vinss(V1, 3, V0, 0); | 2429 __ vinss(V1, 3, V0, 0); |
| 2428 __ vinss(V1, 1, V0, 0); | 2430 __ vinss(V1, 1, V0, 0); |
| 2429 | 2431 |
| 2430 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord); | 2432 const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord); |
| 2431 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); | 2433 const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord); |
| 2432 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); | 2434 __ fstrq(V1, Address(SP, -1 * qword_bytes, Address::PreIndex)); |
| 2433 | 2435 |
| 2434 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex)); | 2436 __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex)); |
| (...skipping 790 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3225 EXPECT_FLOAT_EQ(1.0/sqrt(147000.0), res, 0.0001); | 3227 EXPECT_FLOAT_EQ(1.0/sqrt(147000.0), res, 0.0001); |
| 3226 } | 3228 } |
| 3227 | 3229 |
| 3228 | 3230 |
| 3229 // Called from assembler_test.cc. | 3231 // Called from assembler_test.cc. |
| 3230 // LR: return address. | 3232 // LR: return address. |
| 3231 // R0: context. | 3233 // R0: context. |
| 3232 // R1: value. | 3234 // R1: value. |
| 3233 // R2: growable array. | 3235 // R2: growable array. |
| 3234 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { | 3236 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) { |
| 3235 __ mov(SP, CSP); | 3237 __ SetupDartSP(kTestStackSpace); |
| 3236 __ TagAndPushPP(); | 3238 __ TagAndPushPP(); |
| 3237 __ LoadPoolPointer(PP); | 3239 __ LoadPoolPointer(PP); |
| 3238 __ Push(CTX); | 3240 __ Push(CTX); |
| 3239 __ Push(LR); | 3241 __ Push(LR); |
| 3240 __ mov(CTX, R0); | 3242 __ mov(CTX, R0); |
| 3241 __ StoreIntoObject(R2, | 3243 __ StoreIntoObject(R2, |
| 3242 FieldAddress(R2, GrowableObjectArray::data_offset()), | 3244 FieldAddress(R2, GrowableObjectArray::data_offset()), |
| 3243 R1); | 3245 R1); |
| 3244 __ Pop(LR); | 3246 __ Pop(LR); |
| 3245 __ Pop(CTX); | 3247 __ Pop(CTX); |
| 3246 __ PopAndUntagPP(); | 3248 __ PopAndUntagPP(); |
| 3247 __ ret(); | 3249 __ ret(); |
| 3248 } | 3250 } |
| 3249 | 3251 |
| 3250 } // namespace dart | 3252 } // namespace dart |
| 3251 | 3253 |
| 3252 #endif // defined(TARGET_ARCH_ARM64) | 3254 #endif // defined(TARGET_ARCH_ARM64) |
| OLD | NEW |