| Index: src/arm/assembler-arm.cc
|
| diff --git a/src/arm/assembler-arm.cc b/src/arm/assembler-arm.cc
|
| index fa97a3b3217ce506ccd8a070a831e82a47d606ae..3533dfd6df95ab017c1c794d02883d6185c4ce30 100644
|
| --- a/src/arm/assembler-arm.cc
|
| +++ b/src/arm/assembler-arm.cc
|
| @@ -51,24 +51,30 @@ unsigned CpuFeatures::supported_ = 0;
|
| unsigned CpuFeatures::found_by_runtime_probing_ = 0;
|
|
|
|
|
| -#ifdef __arm__
|
| +// Get the CPU features enabled by the build. For cross compilation the
|
| +// preprocessor symbols CAN_USE_ARMV7_INSTRUCTIONS and CAN_USE_VFP_INSTRUCTIONS
|
| +// can be defined to enable ARMv7 and VFPv3 instructions when building the
|
| +// snapshot.
|
| static uint64_t CpuFeaturesImpliedByCompiler() {
|
| uint64_t answer = 0;
|
| #ifdef CAN_USE_ARMV7_INSTRUCTIONS
|
| answer |= 1u << ARMv7;
|
| #endif // def CAN_USE_ARMV7_INSTRUCTIONS
|
| +#ifdef CAN_USE_VFP_INSTRUCTIONS
|
| + answer |= 1u << VFP3 | 1u << ARMv7;
|
| +#endif // def CAN_USE_VFP_INSTRUCTIONS
|
| +
|
| +#ifdef __arm__
|
| // If the compiler is allowed to use VFP then we can use VFP too in our code
|
| // generation even when generating snapshots. This won't work for cross
|
| // compilation. VFPv3 implies ARMv7, see ARM DDI 0406B, page A1-6.
|
| #if defined(__VFP_FP__) && !defined(__SOFTFP__)
|
| answer |= 1u << VFP3 | 1u << ARMv7;
|
| #endif // defined(__VFP_FP__) && !defined(__SOFTFP__)
|
| -#ifdef CAN_USE_VFP_INSTRUCTIONS
|
| - answer |= 1u << VFP3 | 1u << ARMv7;
|
| -#endif // def CAN_USE_VFP_INSTRUCTIONS
|
| +#endif // def __arm__
|
| +
|
| return answer;
|
| }
|
| -#endif // def __arm__
|
|
|
|
|
| void CpuFeatures::Probe() {
|
| @@ -76,6 +82,18 @@ void CpuFeatures::Probe() {
|
| #ifdef DEBUG
|
| initialized_ = true;
|
| #endif
|
| +
|
| + // Get the features implied by the OS and the compiler settings. This is the
|
| + // minimal set of features which is also alowed for generated code in the
|
| + // snapshot.
|
| + supported_ |= OS::CpuFeaturesImpliedByPlatform();
|
| + supported_ |= CpuFeaturesImpliedByCompiler();
|
| +
|
| + if (Serializer::enabled()) {
|
| + // No probing for features if we might serialize (generate snapshot).
|
| + return;
|
| + }
|
| +
|
| #ifndef __arm__
|
| // For the simulator=arm build, use VFP when FLAG_enable_vfp3 is
|
| // enabled. VFPv3 implies ARMv7, see ARM DDI 0406B, page A1-6.
|
| @@ -87,13 +105,8 @@ void CpuFeatures::Probe() {
|
| supported_ |= 1u << ARMv7;
|
| }
|
| #else // def __arm__
|
| - if (Serializer::enabled()) {
|
| - supported_ |= OS::CpuFeaturesImpliedByPlatform();
|
| - supported_ |= CpuFeaturesImpliedByCompiler();
|
| - return; // No features if we might serialize.
|
| - }
|
| -
|
| - if (OS::ArmCpuHasFeature(VFP3)) {
|
| + // Probe for additional features not already known to be available.
|
| + if (!IsSupported(VFP3) && OS::ArmCpuHasFeature(VFP3)) {
|
| // This implementation also sets the VFP flags if runtime
|
| // detection of VFP returns true. VFPv3 implies ARMv7, see ARM DDI
|
| // 0406B, page A1-6.
|
| @@ -101,7 +114,7 @@ void CpuFeatures::Probe() {
|
| found_by_runtime_probing_ |= 1u << VFP3 | 1u << ARMv7;
|
| }
|
|
|
| - if (OS::ArmCpuHasFeature(ARMv7)) {
|
| + if (!IsSupported(ARMv7) && OS::ArmCpuHasFeature(ARMv7)) {
|
| supported_ |= 1u << ARMv7;
|
| found_by_runtime_probing_ |= 1u << ARMv7;
|
| }
|
|
|