OLD | NEW |
1 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
2 // All Rights Reserved. | 2 // All Rights Reserved. |
3 // | 3 // |
4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
5 // modification, are permitted provided that the following conditions | 5 // modification, are permitted provided that the following conditions |
6 // are met: | 6 // are met: |
7 // | 7 // |
8 // - Redistributions of source code must retain the above copyright notice, | 8 // - Redistributions of source code must retain the above copyright notice, |
9 // this list of conditions and the following disclaimer. | 9 // this list of conditions and the following disclaimer. |
10 // | 10 // |
(...skipping 27 matching lines...) Expand all Loading... |
38 | 38 |
39 #include "arm/assembler-arm-inl.h" | 39 #include "arm/assembler-arm-inl.h" |
40 #include "serialize.h" | 40 #include "serialize.h" |
41 | 41 |
42 namespace v8 { | 42 namespace v8 { |
43 namespace internal { | 43 namespace internal { |
44 | 44 |
45 // Safe default is no features. | 45 // Safe default is no features. |
46 unsigned CpuFeatures::supported_ = 0; | 46 unsigned CpuFeatures::supported_ = 0; |
47 unsigned CpuFeatures::enabled_ = 0; | 47 unsigned CpuFeatures::enabled_ = 0; |
| 48 unsigned CpuFeatures::found_by_runtime_probing_ = 0; |
48 | 49 |
49 void CpuFeatures::Probe() { | 50 void CpuFeatures::Probe() { |
50 // If the compiler is allowed to use vfp then we can use vfp too in our | 51 // If the compiler is allowed to use vfp then we can use vfp too in our |
51 // code generation. | 52 // code generation. |
52 #if !defined(__arm__) || (defined(__VFP_FP__) && !defined(__SOFTFP__)) | 53 #if !defined(__arm__) |
53 // The supported flags for VFP are set to true for the following | 54 // For the simulator=arm build, always use VFP since the arm simulator has |
54 // conditions, even without runtime detection of VFP: | 55 // VFP support. |
55 // (1) For the simulator=arm build, always use VFP since | |
56 // the arm simulator has VFP support. | |
57 // (2) If V8 is being compiled with GCC with the vfp option turned on, | |
58 // always use VFP since the build system assumes that V8 will run on | |
59 // a platform that has VFP hardware. | |
60 supported_ |= 1u << VFP3; | 56 supported_ |= 1u << VFP3; |
61 #else | 57 #else |
62 if (Serializer::enabled()) return; // No features if we might serialize. | 58 if (Serializer::enabled()) { |
| 59 supported_ |= OS::CpuFeaturesImpliedByPlatform(); |
| 60 return; // No features if we might serialize. |
| 61 } |
63 | 62 |
64 if (OS::ArmCpuHasFeature(OS::VFP)) { | 63 if (OS::ArmCpuHasFeature(VFP3)) { |
65 // This implementation also sets the VFP flags if | 64 // This implementation also sets the VFP flags if |
66 // runtime detection of VFP returns true. | 65 // runtime detection of VFP returns true. |
67 supported_ |= 1u << VFP3; | 66 supported_ |= 1u << VFP3; |
| 67 found_by_runtime_probing_ |= 1u << VFP3; |
68 } | 68 } |
69 #endif | 69 #endif |
70 } | 70 } |
71 | 71 |
| 72 |
72 // ----------------------------------------------------------------------------- | 73 // ----------------------------------------------------------------------------- |
73 // Implementation of Register and CRegister | 74 // Implementation of Register and CRegister |
74 | 75 |
75 Register no_reg = { -1 }; | 76 Register no_reg = { -1 }; |
76 | 77 |
77 Register r0 = { 0 }; | 78 Register r0 = { 0 }; |
78 Register r1 = { 1 }; | 79 Register r1 = { 1 }; |
79 Register r2 = { 2 }; | 80 Register r2 = { 2 }; |
80 Register r3 = { 3 }; | 81 Register r3 = { 3 }; |
81 Register r4 = { 4 }; | 82 Register r4 = { 4 }; |
(...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
598 return false; | 599 return false; |
599 } | 600 } |
600 | 601 |
601 | 602 |
602 // We have to use the temporary register for things that can be relocated even | 603 // We have to use the temporary register for things that can be relocated even |
603 // if they can be encoded in the ARM's 12 bits of immediate-offset instruction | 604 // if they can be encoded in the ARM's 12 bits of immediate-offset instruction |
604 // space. There is no guarantee that the relocated location can be similarly | 605 // space. There is no guarantee that the relocated location can be similarly |
605 // encoded. | 606 // encoded. |
606 static bool MustUseIp(RelocInfo::Mode rmode) { | 607 static bool MustUseIp(RelocInfo::Mode rmode) { |
607 if (rmode == RelocInfo::EXTERNAL_REFERENCE) { | 608 if (rmode == RelocInfo::EXTERNAL_REFERENCE) { |
| 609 #ifdef DEBUG |
| 610 if (!Serializer::enabled()) { |
| 611 Serializer::TooLateToEnableNow(); |
| 612 } |
| 613 #endif |
608 return Serializer::enabled(); | 614 return Serializer::enabled(); |
609 } else if (rmode == RelocInfo::NONE) { | 615 } else if (rmode == RelocInfo::NONE) { |
610 return false; | 616 return false; |
611 } | 617 } |
612 return true; | 618 return true; |
613 } | 619 } |
614 | 620 |
615 | 621 |
616 void Assembler::addrmod1(Instr instr, | 622 void Assembler::addrmod1(Instr instr, |
617 Register rn, | 623 Register rn, |
(...skipping 738 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1356 | 1362 |
1357 | 1363 |
1358 void Assembler::stc2(Coprocessor coproc, | 1364 void Assembler::stc2(Coprocessor coproc, |
1359 CRegister crd, | 1365 CRegister crd, |
1360 Register rn, | 1366 Register rn, |
1361 int option, | 1367 int option, |
1362 LFlag l) { // v5 and above | 1368 LFlag l) { // v5 and above |
1363 stc(coproc, crd, rn, option, l, static_cast<Condition>(nv)); | 1369 stc(coproc, crd, rn, option, l, static_cast<Condition>(nv)); |
1364 } | 1370 } |
1365 | 1371 |
| 1372 |
1366 // Support for VFP. | 1373 // Support for VFP. |
1367 void Assembler::fmdrr(const Register dst, | 1374 void Assembler::fmdrr(const Register dst, |
1368 const Register src1, | 1375 const Register src1, |
1369 const Register src2, | 1376 const Register src2, |
1370 const SBit s, | 1377 const SBit s, |
1371 const Condition cond) { | 1378 const Condition cond) { |
1372 // Dm = <Rt,Rt2>. | 1379 // Dm = <Rt,Rt2>. |
1373 // Instruction details available in ARM DDI 0406A, A8-646. | 1380 // Instruction details available in ARM DDI 0406A, A8-646. |
1374 // cond(31-28) | 1100(27-24)| 010(23-21) | op=0(20) | Rt2(19-16) | | 1381 // cond(31-28) | 1100(27-24)| 010(23-21) | op=0(20) | Rt2(19-16) | |
1375 // Rt(15-12) | 1011(11-8) | 00(7-6) | M(5) | 1(4) | Vm | 1382 // Rt(15-12) | 1011(11-8) | 00(7-6) | M(5) | 1(4) | Vm |
1376 | 1383 ASSERT(CpuFeatures::IsEnabled(VFP3)); |
1377 ASSERT(!src1.is(pc) && !src2.is(pc)); | 1384 ASSERT(!src1.is(pc) && !src2.is(pc)); |
1378 emit(cond | 0xC*B24 | B22 | src2.code()*B16 | | 1385 emit(cond | 0xC*B24 | B22 | src2.code()*B16 | |
1379 src1.code()*B12 | 0xB*B8 | B4 | dst.code()); | 1386 src1.code()*B12 | 0xB*B8 | B4 | dst.code()); |
1380 } | 1387 } |
1381 | 1388 |
1382 | 1389 |
1383 void Assembler::fmrrd(const Register dst1, | 1390 void Assembler::fmrrd(const Register dst1, |
1384 const Register dst2, | 1391 const Register dst2, |
1385 const Register src, | 1392 const Register src, |
1386 const SBit s, | 1393 const SBit s, |
1387 const Condition cond) { | 1394 const Condition cond) { |
1388 // <Rt,Rt2> = Dm. | 1395 // <Rt,Rt2> = Dm. |
1389 // Instruction details available in ARM DDI 0406A, A8-646. | 1396 // Instruction details available in ARM DDI 0406A, A8-646. |
1390 // cond(31-28) | 1100(27-24)| 010(23-21) | op=1(20) | Rt2(19-16) | | 1397 // cond(31-28) | 1100(27-24)| 010(23-21) | op=1(20) | Rt2(19-16) | |
1391 // Rt(15-12) | 1011(11-8) | 00(7-6) | M(5) | 1(4) | Vm | 1398 // Rt(15-12) | 1011(11-8) | 00(7-6) | M(5) | 1(4) | Vm |
1392 | 1399 ASSERT(CpuFeatures::IsEnabled(VFP3)); |
1393 ASSERT(!dst1.is(pc) && !dst2.is(pc)); | 1400 ASSERT(!dst1.is(pc) && !dst2.is(pc)); |
1394 emit(cond | 0xC*B24 | B22 | B20 | dst2.code()*B16 | | 1401 emit(cond | 0xC*B24 | B22 | B20 | dst2.code()*B16 | |
1395 dst1.code()*B12 | 0xB*B8 | B4 | src.code()); | 1402 dst1.code()*B12 | 0xB*B8 | B4 | src.code()); |
1396 } | 1403 } |
1397 | 1404 |
1398 | 1405 |
1399 void Assembler::fmsr(const Register dst, | 1406 void Assembler::fmsr(const Register dst, |
1400 const Register src, | 1407 const Register src, |
1401 const SBit s, | 1408 const SBit s, |
1402 const Condition cond) { | 1409 const Condition cond) { |
1403 // Sn = Rt. | 1410 // Sn = Rt. |
1404 // Instruction details available in ARM DDI 0406A, A8-642. | 1411 // Instruction details available in ARM DDI 0406A, A8-642. |
1405 // cond(31-28) | 1110(27-24)| 000(23-21) | op=0(20) | Vn(19-16) | | 1412 // cond(31-28) | 1110(27-24)| 000(23-21) | op=0(20) | Vn(19-16) | |
1406 // Rt(15-12) | 1010(11-8) | N(7)=0 | 00(6-5) | 1(4) | 0000(3-0) | 1413 // Rt(15-12) | 1010(11-8) | N(7)=0 | 00(6-5) | 1(4) | 0000(3-0) |
1407 | 1414 ASSERT(CpuFeatures::IsEnabled(VFP3)); |
1408 ASSERT(!src.is(pc)); | 1415 ASSERT(!src.is(pc)); |
1409 emit(cond | 0xE*B24 | (dst.code() >> 1)*B16 | | 1416 emit(cond | 0xE*B24 | (dst.code() >> 1)*B16 | |
1410 src.code()*B12 | 0xA*B8 | (0x1 & dst.code())*B7 | B4); | 1417 src.code()*B12 | 0xA*B8 | (0x1 & dst.code())*B7 | B4); |
1411 } | 1418 } |
1412 | 1419 |
1413 | 1420 |
1414 void Assembler::fmrs(const Register dst, | 1421 void Assembler::fmrs(const Register dst, |
1415 const Register src, | 1422 const Register src, |
1416 const SBit s, | 1423 const SBit s, |
1417 const Condition cond) { | 1424 const Condition cond) { |
1418 // Rt = Sn. | 1425 // Rt = Sn. |
1419 // Instruction details available in ARM DDI 0406A, A8-642. | 1426 // Instruction details available in ARM DDI 0406A, A8-642. |
1420 // cond(31-28) | 1110(27-24)| 000(23-21) | op=1(20) | Vn(19-16) | | 1427 // cond(31-28) | 1110(27-24)| 000(23-21) | op=1(20) | Vn(19-16) | |
1421 // Rt(15-12) | 1010(11-8) | N(7)=0 | 00(6-5) | 1(4) | 0000(3-0) | 1428 // Rt(15-12) | 1010(11-8) | N(7)=0 | 00(6-5) | 1(4) | 0000(3-0) |
1422 | 1429 ASSERT(CpuFeatures::IsEnabled(VFP3)); |
1423 ASSERT(!dst.is(pc)); | 1430 ASSERT(!dst.is(pc)); |
1424 emit(cond | 0xE*B24 | B20 | (src.code() >> 1)*B16 | | 1431 emit(cond | 0xE*B24 | B20 | (src.code() >> 1)*B16 | |
1425 dst.code()*B12 | 0xA*B8 | (0x1 & src.code())*B7 | B4); | 1432 dst.code()*B12 | 0xA*B8 | (0x1 & src.code())*B7 | B4); |
1426 } | 1433 } |
1427 | 1434 |
1428 | 1435 |
1429 void Assembler::fsitod(const Register dst, | 1436 void Assembler::fsitod(const Register dst, |
1430 const Register src, | 1437 const Register src, |
1431 const SBit s, | 1438 const SBit s, |
1432 const Condition cond) { | 1439 const Condition cond) { |
1433 // Dd = Sm (integer in Sm converted to IEEE 64-bit doubles in Dd). | 1440 // Dd = Sm (integer in Sm converted to IEEE 64-bit doubles in Dd). |
1434 // Instruction details available in ARM DDI 0406A, A8-576. | 1441 // Instruction details available in ARM DDI 0406A, A8-576. |
1435 // cond(31-28) | 11101(27-23)| D=?(22) | 11(21-20) | 1(19) |opc2=000(18-16) | | 1442 // cond(31-28) | 11101(27-23)| D=?(22) | 11(21-20) | 1(19) |opc2=000(18-16) | |
1436 // Vd(15-12) | 101(11-9) | sz(8)=1 | op(7)=1 | 1(6) | M=?(5) | 0(4) | Vm(3-0) | 1443 // Vd(15-12) | 101(11-9) | sz(8)=1 | op(7)=1 | 1(6) | M=?(5) | 0(4) | Vm(3-0) |
1437 | 1444 ASSERT(CpuFeatures::IsEnabled(VFP3)); |
1438 emit(cond | 0xE*B24 | B23 | 0x3*B20 | B19 | | 1445 emit(cond | 0xE*B24 | B23 | 0x3*B20 | B19 | |
1439 dst.code()*B12 | 0x5*B9 | B8 | B7 | B6 | | 1446 dst.code()*B12 | 0x5*B9 | B8 | B7 | B6 | |
1440 (0x1 & src.code())*B5 | (src.code() >> 1)); | 1447 (0x1 & src.code())*B5 | (src.code() >> 1)); |
1441 } | 1448 } |
1442 | 1449 |
1443 | 1450 |
1444 void Assembler::ftosid(const Register dst, | 1451 void Assembler::ftosid(const Register dst, |
1445 const Register src, | 1452 const Register src, |
1446 const SBit s, | 1453 const SBit s, |
1447 const Condition cond) { | 1454 const Condition cond) { |
1448 // Sd = Dm (IEEE 64-bit doubles in Dm converted to 32 bit integer in Sd). | 1455 // Sd = Dm (IEEE 64-bit doubles in Dm converted to 32 bit integer in Sd). |
1449 // Instruction details available in ARM DDI 0406A, A8-576. | 1456 // Instruction details available in ARM DDI 0406A, A8-576. |
1450 // cond(31-28) | 11101(27-23)| D=?(22) | 11(21-20) | 1(19) | opc2=101(18-16)| | 1457 // cond(31-28) | 11101(27-23)| D=?(22) | 11(21-20) | 1(19) | opc2=101(18-16)| |
1451 // Vd(15-12) | 101(11-9) | sz(8)=1 | op(7)=? | 1(6) | M=?(5) | 0(4) | Vm(3-0) | 1458 // Vd(15-12) | 101(11-9) | sz(8)=1 | op(7)=? | 1(6) | M=?(5) | 0(4) | Vm(3-0) |
1452 | 1459 ASSERT(CpuFeatures::IsEnabled(VFP3)); |
1453 emit(cond | 0xE*B24 | B23 |(0x1 & dst.code())*B22 | | 1460 emit(cond | 0xE*B24 | B23 |(0x1 & dst.code())*B22 | |
1454 0x3*B20 | B19 | 0x5*B16 | (dst.code() >> 1)*B12 | | 1461 0x3*B20 | B19 | 0x5*B16 | (dst.code() >> 1)*B12 | |
1455 0x5*B9 | B8 | B7 | B6 | src.code()); | 1462 0x5*B9 | B8 | B7 | B6 | src.code()); |
1456 } | 1463 } |
1457 | 1464 |
1458 | 1465 |
1459 void Assembler::faddd(const Register dst, | 1466 void Assembler::faddd(const Register dst, |
1460 const Register src1, | 1467 const Register src1, |
1461 const Register src2, | 1468 const Register src2, |
1462 const SBit s, | 1469 const SBit s, |
1463 const Condition cond) { | 1470 const Condition cond) { |
1464 // Dd = faddd(Dn, Dm) double precision floating point addition. | 1471 // Dd = faddd(Dn, Dm) double precision floating point addition. |
1465 // Dd = D:Vd; Dm=M:Vm; Dn=N:Vm. | 1472 // Dd = D:Vd; Dm=M:Vm; Dn=N:Vm. |
1466 // Instruction details available in ARM DDI 0406A, A8-536. | 1473 // Instruction details available in ARM DDI 0406A, A8-536. |
1467 // cond(31-28) | 11100(27-23)| D=?(22) | 11(21-20) | Vn(19-16) | | 1474 // cond(31-28) | 11100(27-23)| D=?(22) | 11(21-20) | Vn(19-16) | |
1468 // Vd(15-12) | 101(11-9) | sz(8)=1 | N(7)=0 | 0(6) | M=?(5) | 0(4) | Vm(3-0) | 1475 // Vd(15-12) | 101(11-9) | sz(8)=1 | N(7)=0 | 0(6) | M=?(5) | 0(4) | Vm(3-0) |
1469 | 1476 ASSERT(CpuFeatures::IsEnabled(VFP3)); |
1470 emit(cond | 0xE*B24 | 0x3*B20 | src1.code()*B16 | | 1477 emit(cond | 0xE*B24 | 0x3*B20 | src1.code()*B16 | |
1471 dst.code()*B12 | 0x5*B9 | B8 | src2.code()); | 1478 dst.code()*B12 | 0x5*B9 | B8 | src2.code()); |
1472 } | 1479 } |
1473 | 1480 |
1474 | 1481 |
1475 void Assembler::fsubd(const Register dst, | 1482 void Assembler::fsubd(const Register dst, |
1476 const Register src1, | 1483 const Register src1, |
1477 const Register src2, | 1484 const Register src2, |
1478 const SBit s, | 1485 const SBit s, |
1479 const Condition cond) { | 1486 const Condition cond) { |
1480 // Dd = fsubd(Dn, Dm) double precision floating point subtraction. | 1487 // Dd = fsubd(Dn, Dm) double precision floating point subtraction. |
1481 // Dd = D:Vd; Dm=M:Vm; Dn=N:Vm. | 1488 // Dd = D:Vd; Dm=M:Vm; Dn=N:Vm. |
1482 // Instruction details available in ARM DDI 0406A, A8-784. | 1489 // Instruction details available in ARM DDI 0406A, A8-784. |
1483 // cond(31-28) | 11100(27-23)| D=?(22) | 11(21-20) | Vn(19-16) | | 1490 // cond(31-28) | 11100(27-23)| D=?(22) | 11(21-20) | Vn(19-16) | |
1484 // Vd(15-12) | 101(11-9) | sz(8)=1 | N(7)=0 | 1(6) | M=?(5) | 0(4) | Vm(3-0) | 1491 // Vd(15-12) | 101(11-9) | sz(8)=1 | N(7)=0 | 1(6) | M=?(5) | 0(4) | Vm(3-0) |
1485 | 1492 ASSERT(CpuFeatures::IsEnabled(VFP3)); |
1486 emit(cond | 0xE*B24 | 0x3*B20 | src1.code()*B16 | | 1493 emit(cond | 0xE*B24 | 0x3*B20 | src1.code()*B16 | |
1487 dst.code()*B12 | 0x5*B9 | B8 | B6 | src2.code()); | 1494 dst.code()*B12 | 0x5*B9 | B8 | B6 | src2.code()); |
1488 } | 1495 } |
1489 | 1496 |
1490 | 1497 |
1491 void Assembler::fmuld(const Register dst, | 1498 void Assembler::fmuld(const Register dst, |
1492 const Register src1, | 1499 const Register src1, |
1493 const Register src2, | 1500 const Register src2, |
1494 const SBit s, | 1501 const SBit s, |
1495 const Condition cond) { | 1502 const Condition cond) { |
1496 // Dd = fmuld(Dn, Dm) double precision floating point multiplication. | 1503 // Dd = fmuld(Dn, Dm) double precision floating point multiplication. |
1497 // Dd = D:Vd; Dm=M:Vm; Dn=N:Vm. | 1504 // Dd = D:Vd; Dm=M:Vm; Dn=N:Vm. |
1498 // Instruction details available in ARM DDI 0406A, A8-784. | 1505 // Instruction details available in ARM DDI 0406A, A8-784. |
1499 // cond(31-28) | 11100(27-23)| D=?(22) | 10(21-20) | Vn(19-16) | | 1506 // cond(31-28) | 11100(27-23)| D=?(22) | 10(21-20) | Vn(19-16) | |
1500 // Vd(15-12) | 101(11-9) | sz(8)=1 | N(7)=0 | 0(6) | M=?(5) | 0(4) | Vm(3-0) | 1507 // Vd(15-12) | 101(11-9) | sz(8)=1 | N(7)=0 | 0(6) | M=?(5) | 0(4) | Vm(3-0) |
1501 | 1508 ASSERT(CpuFeatures::IsEnabled(VFP3)); |
1502 emit(cond | 0xE*B24 | 0x2*B20 | src1.code()*B16 | | 1509 emit(cond | 0xE*B24 | 0x2*B20 | src1.code()*B16 | |
1503 dst.code()*B12 | 0x5*B9 | B8 | src2.code()); | 1510 dst.code()*B12 | 0x5*B9 | B8 | src2.code()); |
1504 } | 1511 } |
1505 | 1512 |
1506 | 1513 |
1507 void Assembler::fdivd(const Register dst, | 1514 void Assembler::fdivd(const Register dst, |
1508 const Register src1, | 1515 const Register src1, |
1509 const Register src2, | 1516 const Register src2, |
1510 const SBit s, | 1517 const SBit s, |
1511 const Condition cond) { | 1518 const Condition cond) { |
1512 // Dd = fdivd(Dn, Dm) double precision floating point division. | 1519 // Dd = fdivd(Dn, Dm) double precision floating point division. |
1513 // Dd = D:Vd; Dm=M:Vm; Dn=N:Vm. | 1520 // Dd = D:Vd; Dm=M:Vm; Dn=N:Vm. |
1514 // Instruction details available in ARM DDI 0406A, A8-584. | 1521 // Instruction details available in ARM DDI 0406A, A8-584. |
1515 // cond(31-28) | 11101(27-23)| D=?(22) | 00(21-20) | Vn(19-16) | | 1522 // cond(31-28) | 11101(27-23)| D=?(22) | 00(21-20) | Vn(19-16) | |
1516 // Vd(15-12) | 101(11-9) | sz(8)=1 | N(7)=? | 0(6) | M=?(5) | 0(4) | Vm(3-0) | 1523 // Vd(15-12) | 101(11-9) | sz(8)=1 | N(7)=? | 0(6) | M=?(5) | 0(4) | Vm(3-0) |
1517 | 1524 ASSERT(CpuFeatures::IsEnabled(VFP3)); |
1518 emit(cond | 0xE*B24 | B23 | src1.code()*B16 | | 1525 emit(cond | 0xE*B24 | B23 | src1.code()*B16 | |
1519 dst.code()*B12 | 0x5*B9 | B8 | src2.code()); | 1526 dst.code()*B12 | 0x5*B9 | B8 | src2.code()); |
1520 } | 1527 } |
1521 | 1528 |
1522 | 1529 |
1523 void Assembler::fcmp(const Register src1, | 1530 void Assembler::fcmp(const Register src1, |
1524 const Register src2, | 1531 const Register src2, |
1525 const SBit s, | 1532 const SBit s, |
1526 const Condition cond) { | 1533 const Condition cond) { |
1527 // vcmp(Dd, Dm) double precision floating point comparison. | 1534 // vcmp(Dd, Dm) double precision floating point comparison. |
1528 // Instruction details available in ARM DDI 0406A, A8-570. | 1535 // Instruction details available in ARM DDI 0406A, A8-570. |
1529 // cond(31-28) | 11101 (27-23)| D=?(22) | 11 (21-20) | 0100 (19-16) | | 1536 // cond(31-28) | 11101 (27-23)| D=?(22) | 11 (21-20) | 0100 (19-16) | |
1530 // Vd(15-12) | 101(11-9) | sz(8)=1 | E(7)=? | 1(6) | M(5)=? | 0(4) | Vm(3-0) | 1537 // Vd(15-12) | 101(11-9) | sz(8)=1 | E(7)=? | 1(6) | M(5)=? | 0(4) | Vm(3-0) |
1531 | 1538 ASSERT(CpuFeatures::IsEnabled(VFP3)); |
1532 emit(cond | 0xE*B24 |B23 | 0x3*B20 | B18 | | 1539 emit(cond | 0xE*B24 |B23 | 0x3*B20 | B18 | |
1533 src1.code()*B12 | 0x5*B9 | B8 | B6 | src2.code()); | 1540 src1.code()*B12 | 0x5*B9 | B8 | B6 | src2.code()); |
1534 } | 1541 } |
1535 | 1542 |
1536 | 1543 |
1537 void Assembler::vmrs(Register dst, Condition cond) { | 1544 void Assembler::vmrs(Register dst, Condition cond) { |
1538 // Instruction details available in ARM DDI 0406A, A8-652. | 1545 // Instruction details available in ARM DDI 0406A, A8-652. |
1539 // cond(31-28) | 1110 (27-24) | 1111(23-20)| 0001 (19-16) | | 1546 // cond(31-28) | 1110 (27-24) | 1111(23-20)| 0001 (19-16) | |
1540 // Rt(15-12) | 1010 (11-8) | 0(7) | 00 (6-5) | 1(4) | 0000(3-0) | 1547 // Rt(15-12) | 1010 (11-8) | 0(7) | 00 (6-5) | 1(4) | 0000(3-0) |
1541 | 1548 ASSERT(CpuFeatures::IsEnabled(VFP3)); |
1542 emit(cond | 0xE*B24 | 0xF*B20 | B16 | | 1549 emit(cond | 0xE*B24 | 0xF*B20 | B16 | |
1543 dst.code()*B12 | 0xA*B8 | B4); | 1550 dst.code()*B12 | 0xA*B8 | B4); |
1544 } | 1551 } |
1545 | 1552 |
1546 | 1553 |
1547 // Pseudo instructions | 1554 // Pseudo instructions |
1548 void Assembler::lea(Register dst, | 1555 void Assembler::lea(Register dst, |
1549 const MemOperand& x, | 1556 const MemOperand& x, |
1550 SBit s, | 1557 SBit s, |
1551 Condition cond) { | 1558 Condition cond) { |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1696 // these modes do not need an entry in the constant pool | 1703 // these modes do not need an entry in the constant pool |
1697 } else { | 1704 } else { |
1698 ASSERT(num_prinfo_ < kMaxNumPRInfo); | 1705 ASSERT(num_prinfo_ < kMaxNumPRInfo); |
1699 prinfo_[num_prinfo_++] = rinfo; | 1706 prinfo_[num_prinfo_++] = rinfo; |
1700 // Make sure the constant pool is not emitted in place of the next | 1707 // Make sure the constant pool is not emitted in place of the next |
1701 // instruction for which we just recorded relocation info | 1708 // instruction for which we just recorded relocation info |
1702 BlockConstPoolBefore(pc_offset() + kInstrSize); | 1709 BlockConstPoolBefore(pc_offset() + kInstrSize); |
1703 } | 1710 } |
1704 if (rinfo.rmode() != RelocInfo::NONE) { | 1711 if (rinfo.rmode() != RelocInfo::NONE) { |
1705 // Don't record external references unless the heap will be serialized. | 1712 // Don't record external references unless the heap will be serialized. |
1706 if (rmode == RelocInfo::EXTERNAL_REFERENCE && | 1713 if (rmode == RelocInfo::EXTERNAL_REFERENCE) { |
1707 !Serializer::enabled() && | 1714 #ifdef DEBUG |
1708 !FLAG_debug_code) { | 1715 if (!Serializer::enabled()) { |
1709 return; | 1716 Serializer::TooLateToEnableNow(); |
| 1717 } |
| 1718 #endif |
| 1719 if (!Serializer::enabled() && !FLAG_debug_code) { |
| 1720 return; |
| 1721 } |
1710 } | 1722 } |
1711 ASSERT(buffer_space() >= kMaxRelocSize); // too late to grow buffer here | 1723 ASSERT(buffer_space() >= kMaxRelocSize); // too late to grow buffer here |
1712 reloc_info_writer.Write(&rinfo); | 1724 reloc_info_writer.Write(&rinfo); |
1713 } | 1725 } |
1714 } | 1726 } |
1715 | 1727 |
1716 | 1728 |
1717 void Assembler::CheckConstPool(bool force_emit, bool require_jump) { | 1729 void Assembler::CheckConstPool(bool force_emit, bool require_jump) { |
1718 // Calculate the offset of the next check. It will be overwritten | 1730 // Calculate the offset of the next check. It will be overwritten |
1719 // when a const pool is generated or when const pools are being | 1731 // when a const pool is generated or when const pools are being |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1810 bind(&after_pool); | 1822 bind(&after_pool); |
1811 } | 1823 } |
1812 | 1824 |
1813 // Since a constant pool was just emitted, move the check offset forward by | 1825 // Since a constant pool was just emitted, move the check offset forward by |
1814 // the standard interval. | 1826 // the standard interval. |
1815 next_buffer_check_ = pc_offset() + kCheckConstInterval; | 1827 next_buffer_check_ = pc_offset() + kCheckConstInterval; |
1816 } | 1828 } |
1817 | 1829 |
1818 | 1830 |
1819 } } // namespace v8::internal | 1831 } } // namespace v8::internal |
OLD | NEW |