Index: src/arm/assembler-arm.cc |
=================================================================== |
--- src/arm/assembler-arm.cc (revision 3297) |
+++ src/arm/assembler-arm.cc (working copy) |
@@ -45,30 +45,31 @@ |
// Safe default is no features. |
unsigned CpuFeatures::supported_ = 0; |
unsigned CpuFeatures::enabled_ = 0; |
+unsigned CpuFeatures::found_by_runtime_probing_ = 0; |
void CpuFeatures::Probe() { |
// If the compiler is allowed to use vfp then we can use vfp too in our |
// code generation. |
-#if !defined(__arm__) || (defined(__VFP_FP__) && !defined(__SOFTFP__)) |
- // The supported flags for VFP are set to true for the following |
- // conditions, even without runtime detection of VFP: |
- // (1) For the simulator=arm build, always use VFP since |
- // the arm simulator has VFP support. |
- // (2) If V8 is being compiled with GCC with the vfp option turned on, |
- // always use VFP since the build system assumes that V8 will run on |
- // a platform that has VFP hardware. |
+#if !defined(__arm__) |
+ // For the simulator=arm build, always use VFP since the arm simulator has |
+ // VFP support. |
supported_ |= 1u << VFP3; |
#else |
- if (Serializer::enabled()) return; // No features if we might serialize. |
+ if (Serializer::enabled()) { |
+ supported_ |= OS::CpuFeaturesImpliedByPlatform(); |
+ return; // No features if we might serialize. |
+ } |
- if (OS::ArmCpuHasFeature(OS::VFP)) { |
+ if (OS::ArmCpuHasFeature(VFP3)) { |
// This implementation also sets the VFP flags if |
// runtime detection of VFP returns true. |
supported_ |= 1u << VFP3; |
+ found_by_runtime_probing_ |= 1u << VFP3; |
} |
#endif |
} |
+ |
// ----------------------------------------------------------------------------- |
// Implementation of Register and CRegister |
@@ -605,6 +606,11 @@ |
// encoded. |
static bool MustUseIp(RelocInfo::Mode rmode) { |
if (rmode == RelocInfo::EXTERNAL_REFERENCE) { |
+#ifdef DEBUG |
+ if (!Serializer::enabled()) { |
+ Serializer::TooLateToEnableNow(); |
+ } |
+#endif |
return Serializer::enabled(); |
} else if (rmode == RelocInfo::NONE) { |
return false; |
@@ -1363,6 +1369,7 @@ |
stc(coproc, crd, rn, option, l, static_cast<Condition>(nv)); |
} |
+ |
// Support for VFP. |
void Assembler::fmdrr(const Register dst, |
const Register src1, |
@@ -1373,7 +1380,7 @@ |
// Instruction details available in ARM DDI 0406A, A8-646. |
// cond(31-28) | 1100(27-24)| 010(23-21) | op=0(20) | Rt2(19-16) | |
// Rt(15-12) | 1011(11-8) | 00(7-6) | M(5) | 1(4) | Vm |
- |
+ ASSERT(CpuFeatures::IsEnabled(VFP3)); |
ASSERT(!src1.is(pc) && !src2.is(pc)); |
emit(cond | 0xC*B24 | B22 | src2.code()*B16 | |
src1.code()*B12 | 0xB*B8 | B4 | dst.code()); |
@@ -1389,7 +1396,7 @@ |
// Instruction details available in ARM DDI 0406A, A8-646. |
// cond(31-28) | 1100(27-24)| 010(23-21) | op=1(20) | Rt2(19-16) | |
// Rt(15-12) | 1011(11-8) | 00(7-6) | M(5) | 1(4) | Vm |
- |
+ ASSERT(CpuFeatures::IsEnabled(VFP3)); |
ASSERT(!dst1.is(pc) && !dst2.is(pc)); |
emit(cond | 0xC*B24 | B22 | B20 | dst2.code()*B16 | |
dst1.code()*B12 | 0xB*B8 | B4 | src.code()); |
@@ -1404,7 +1411,7 @@ |
// Instruction details available in ARM DDI 0406A, A8-642. |
// cond(31-28) | 1110(27-24)| 000(23-21) | op=0(20) | Vn(19-16) | |
// Rt(15-12) | 1010(11-8) | N(7)=0 | 00(6-5) | 1(4) | 0000(3-0) |
- |
+ ASSERT(CpuFeatures::IsEnabled(VFP3)); |
ASSERT(!src.is(pc)); |
emit(cond | 0xE*B24 | (dst.code() >> 1)*B16 | |
src.code()*B12 | 0xA*B8 | (0x1 & dst.code())*B7 | B4); |
@@ -1419,7 +1426,7 @@ |
// Instruction details available in ARM DDI 0406A, A8-642. |
// cond(31-28) | 1110(27-24)| 000(23-21) | op=1(20) | Vn(19-16) | |
// Rt(15-12) | 1010(11-8) | N(7)=0 | 00(6-5) | 1(4) | 0000(3-0) |
- |
+ ASSERT(CpuFeatures::IsEnabled(VFP3)); |
ASSERT(!dst.is(pc)); |
emit(cond | 0xE*B24 | B20 | (src.code() >> 1)*B16 | |
dst.code()*B12 | 0xA*B8 | (0x1 & src.code())*B7 | B4); |
@@ -1434,7 +1441,7 @@ |
// Instruction details available in ARM DDI 0406A, A8-576. |
// cond(31-28) | 11101(27-23)| D=?(22) | 11(21-20) | 1(19) |opc2=000(18-16) | |
// Vd(15-12) | 101(11-9) | sz(8)=1 | op(7)=1 | 1(6) | M=?(5) | 0(4) | Vm(3-0) |
- |
+ ASSERT(CpuFeatures::IsEnabled(VFP3)); |
emit(cond | 0xE*B24 | B23 | 0x3*B20 | B19 | |
dst.code()*B12 | 0x5*B9 | B8 | B7 | B6 | |
(0x1 & src.code())*B5 | (src.code() >> 1)); |
@@ -1449,7 +1456,7 @@ |
// Instruction details available in ARM DDI 0406A, A8-576. |
// cond(31-28) | 11101(27-23)| D=?(22) | 11(21-20) | 1(19) | opc2=101(18-16)| |
// Vd(15-12) | 101(11-9) | sz(8)=1 | op(7)=? | 1(6) | M=?(5) | 0(4) | Vm(3-0) |
- |
+ ASSERT(CpuFeatures::IsEnabled(VFP3)); |
emit(cond | 0xE*B24 | B23 |(0x1 & dst.code())*B22 | |
0x3*B20 | B19 | 0x5*B16 | (dst.code() >> 1)*B12 | |
0x5*B9 | B8 | B7 | B6 | src.code()); |
@@ -1466,7 +1473,7 @@ |
// Instruction details available in ARM DDI 0406A, A8-536. |
// cond(31-28) | 11100(27-23)| D=?(22) | 11(21-20) | Vn(19-16) | |
// Vd(15-12) | 101(11-9) | sz(8)=1 | N(7)=0 | 0(6) | M=?(5) | 0(4) | Vm(3-0) |
- |
+ ASSERT(CpuFeatures::IsEnabled(VFP3)); |
emit(cond | 0xE*B24 | 0x3*B20 | src1.code()*B16 | |
dst.code()*B12 | 0x5*B9 | B8 | src2.code()); |
} |
@@ -1482,7 +1489,7 @@ |
// Instruction details available in ARM DDI 0406A, A8-784. |
// cond(31-28) | 11100(27-23)| D=?(22) | 11(21-20) | Vn(19-16) | |
// Vd(15-12) | 101(11-9) | sz(8)=1 | N(7)=0 | 1(6) | M=?(5) | 0(4) | Vm(3-0) |
- |
+ ASSERT(CpuFeatures::IsEnabled(VFP3)); |
emit(cond | 0xE*B24 | 0x3*B20 | src1.code()*B16 | |
dst.code()*B12 | 0x5*B9 | B8 | B6 | src2.code()); |
} |
@@ -1498,7 +1505,7 @@ |
// Instruction details available in ARM DDI 0406A, A8-784. |
// cond(31-28) | 11100(27-23)| D=?(22) | 10(21-20) | Vn(19-16) | |
// Vd(15-12) | 101(11-9) | sz(8)=1 | N(7)=0 | 0(6) | M=?(5) | 0(4) | Vm(3-0) |
- |
+ ASSERT(CpuFeatures::IsEnabled(VFP3)); |
emit(cond | 0xE*B24 | 0x2*B20 | src1.code()*B16 | |
dst.code()*B12 | 0x5*B9 | B8 | src2.code()); |
} |
@@ -1514,7 +1521,7 @@ |
// Instruction details available in ARM DDI 0406A, A8-584. |
// cond(31-28) | 11101(27-23)| D=?(22) | 00(21-20) | Vn(19-16) | |
// Vd(15-12) | 101(11-9) | sz(8)=1 | N(7)=? | 0(6) | M=?(5) | 0(4) | Vm(3-0) |
- |
+ ASSERT(CpuFeatures::IsEnabled(VFP3)); |
emit(cond | 0xE*B24 | B23 | src1.code()*B16 | |
dst.code()*B12 | 0x5*B9 | B8 | src2.code()); |
} |
@@ -1528,7 +1535,7 @@ |
// Instruction details available in ARM DDI 0406A, A8-570. |
// cond(31-28) | 11101 (27-23)| D=?(22) | 11 (21-20) | 0100 (19-16) | |
// Vd(15-12) | 101(11-9) | sz(8)=1 | E(7)=? | 1(6) | M(5)=? | 0(4) | Vm(3-0) |
- |
+ ASSERT(CpuFeatures::IsEnabled(VFP3)); |
emit(cond | 0xE*B24 |B23 | 0x3*B20 | B18 | |
src1.code()*B12 | 0x5*B9 | B8 | B6 | src2.code()); |
} |
@@ -1538,7 +1545,7 @@ |
// Instruction details available in ARM DDI 0406A, A8-652. |
// cond(31-28) | 1110 (27-24) | 1111(23-20)| 0001 (19-16) | |
// Rt(15-12) | 1010 (11-8) | 0(7) | 00 (6-5) | 1(4) | 0000(3-0) |
- |
+ ASSERT(CpuFeatures::IsEnabled(VFP3)); |
emit(cond | 0xE*B24 | 0xF*B20 | B16 | |
dst.code()*B12 | 0xA*B8 | B4); |
} |
@@ -1703,10 +1710,15 @@ |
} |
if (rinfo.rmode() != RelocInfo::NONE) { |
// Don't record external references unless the heap will be serialized. |
- if (rmode == RelocInfo::EXTERNAL_REFERENCE && |
- !Serializer::enabled() && |
- !FLAG_debug_code) { |
- return; |
+ if (rmode == RelocInfo::EXTERNAL_REFERENCE) { |
+#ifdef DEBUG |
+ if (!Serializer::enabled()) { |
+ Serializer::TooLateToEnableNow(); |
+ } |
+#endif |
+ if (!Serializer::enabled() && !FLAG_debug_code) { |
+ return; |
+ } |
} |
ASSERT(buffer_space() >= kMaxRelocSize); // too late to grow buffer here |
reloc_info_writer.Write(&rinfo); |