Index: src/arm/assembler-arm.cc |
diff --git a/src/arm/assembler-arm.cc b/src/arm/assembler-arm.cc |
index b0dbe061e2024cc69c24f164478b021ceb720868..8c5eb036a20cde01548d35b306d333b9a9f2346a 100644 |
--- a/src/arm/assembler-arm.cc |
+++ b/src/arm/assembler-arm.cc |
@@ -63,26 +63,21 @@ ExternalReference ExternalReference::cpu_features() { |
static unsigned CpuFeaturesImpliedByCompiler() { |
unsigned answer = 0; |
#ifdef CAN_USE_ARMV7_INSTRUCTIONS |
- answer |= 1u << ARMv7; |
+ if (FLAG_enable_armv7) { |
+ answer |= 1u << ARMv7; |
+ } |
#endif // CAN_USE_ARMV7_INSTRUCTIONS |
#ifdef CAN_USE_VFP3_INSTRUCTIONS |
- answer |= 1u << VFP3 | 1u << ARMv7; |
+ if (FLAG_enable_vfp3) { |
+ answer |= 1u << VFP3 | 1u << ARMv7; |
+ } |
#endif // CAN_USE_VFP3_INSTRUCTIONS |
#ifdef CAN_USE_VFP32DREGS |
- answer |= 1u << VFP32DREGS; |
+ if (FLAG_enable_32dregs) { |
+ answer |= 1u << VFP32DREGS; |
+ } |
#endif // CAN_USE_VFP32DREGS |
- |
-#ifdef __arm__ |
- // If the compiler is allowed to use VFP then we can use VFP too in our code |
- // generation even when generating snapshots. ARMv7 and hardware floating |
- // point support implies VFPv3, see ARM DDI 0406B, page A1-6. |
-#if defined(CAN_USE_ARMV7_INSTRUCTIONS) && defined(__VFP_FP__) \ |
- && !defined(__SOFTFP__) |
- answer |= 1u << VFP3 | 1u << ARMv7; |
-#endif // defined(CAN_USE_ARMV7_INSTRUCTIONS) && defined(__VFP_FP__) |
- // && !defined(__SOFTFP__) |
-#endif // _arm__ |
- if (answer & (1u << ARMv7)) { |
+ if ((answer & (1u << ARMv7)) && FLAG_enable_unaligned_accesses) { |
answer |= 1u << UNALIGNED_ACCESSES; |
} |
@@ -116,6 +111,8 @@ void CpuFeatures::Probe() { |
if (Serializer::enabled()) { |
// No probing for features if we might serialize (generate snapshot). |
+ printf(" "); |
+ PrintFeatures(); |
return; |
} |
@@ -144,9 +141,13 @@ void CpuFeatures::Probe() { |
supported_ |= static_cast<uint64_t>(1) << VFP32DREGS; |
} |
+ if (FLAG_enable_unaligned_accesses) { |
+ supported_ |= static_cast<uint64_t>(1) << UNALIGNED_ACCESSES; |
+ } |
+ |
#else // __arm__ |
// Probe for additional features not already known to be available. |
- if (!IsSupported(VFP3) && OS::ArmCpuHasFeature(VFP3)) { |
+ if (!IsSupported(VFP3) && FLAG_enable_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. |
@@ -155,26 +156,28 @@ void CpuFeatures::Probe() { |
static_cast<uint64_t>(1) << ARMv7; |
} |
- if (!IsSupported(ARMv7) && OS::ArmCpuHasFeature(ARMv7)) { |
+ if (!IsSupported(ARMv7) && FLAG_enable_armv7 && OS::ArmCpuHasFeature(ARMv7)) { |
found_by_runtime_probing_only_ |= static_cast<uint64_t>(1) << ARMv7; |
} |
- if (!IsSupported(SUDIV) && OS::ArmCpuHasFeature(SUDIV)) { |
+ if (!IsSupported(SUDIV) && FLAG_enable_sudiv && OS::ArmCpuHasFeature(SUDIV)) { |
found_by_runtime_probing_only_ |= static_cast<uint64_t>(1) << SUDIV; |
} |
- if (!IsSupported(UNALIGNED_ACCESSES) && OS::ArmCpuHasFeature(ARMv7)) { |
+ if (!IsSupported(UNALIGNED_ACCESSES) && FLAG_enable_unaligned_accesses |
+ && OS::ArmCpuHasFeature(ARMv7)) { |
found_by_runtime_probing_only_ |= |
static_cast<uint64_t>(1) << UNALIGNED_ACCESSES; |
} |
if (OS::GetCpuImplementer() == QUALCOMM_IMPLEMENTER && |
- OS::ArmCpuHasFeature(ARMv7)) { |
+ FLAG_enable_movw_movt && OS::ArmCpuHasFeature(ARMv7)) { |
found_by_runtime_probing_only_ |= |
static_cast<uint64_t>(1) << MOVW_MOVT_IMMEDIATE_LOADS; |
} |
- if (!IsSupported(VFP32DREGS) && OS::ArmCpuHasFeature(VFP32DREGS)) { |
+ if (!IsSupported(VFP32DREGS) && FLAG_enable_32dregs |
+ && OS::ArmCpuHasFeature(VFP32DREGS)) { |
found_by_runtime_probing_only_ |= static_cast<uint64_t>(1) << VFP32DREGS; |
} |
@@ -186,6 +189,79 @@ void CpuFeatures::Probe() { |
} |
+void CpuFeatures::PrintTarget() { |
+ const char* arm_arch = NULL; |
+ const char* arm_test = ""; |
+ const char* arm_fpu = ""; |
+ const char* arm_thumb = ""; |
+ const char* arm_float_abi = NULL; |
+ |
+#if defined CAN_USE_ARMV7_INSTRUCTIONS |
+ arm_arch = "arm v7"; |
+#else |
+ arm_arch = "arm v6"; |
+#endif |
+ |
+#ifdef __arm__ |
+ |
+# ifdef ARM_TEST |
+ arm_test = " test"; |
+# endif |
+# if defined __ARM_NEON__ |
+ arm_fpu = " neon"; |
+# elif defined CAN_USE_VFP3_INSTRUCTIONS |
+ arm_fpu = " vfp3"; |
+# else |
+ arm_fpu = " vfp2"; |
+# endif |
+# if (defined __thumb__) || (defined __thumb2__) |
+ arm_thumb = " thumb"; |
+# endif |
+ arm_float_abi = OS::ArmUsingHardFloat() ? "hard" : "softfp"; |
+ |
+#else // __arm__ |
+ |
+ arm_test = " simulator"; |
+# if defined CAN_USE_VFP3_INSTRUCTIONS |
+# if defined CAN_USE_VFP32DREGS |
+ arm_fpu = " vfp3"; |
+# else |
+ arm_fpu = " vfp3-d16"; |
+# endif |
+# else |
+ arm_fpu = " vfp2"; |
+# endif |
+# if USE_EABI_HARDFLOAT == 1 |
+ arm_float_abi = "hard"; |
+# else |
+ arm_float_abi = "softfp"; |
+# endif |
+ |
+#endif // __arm__ |
+ |
+ printf("target%s %s%s%s %s\n", |
+ arm_test, arm_arch, arm_fpu, arm_thumb, arm_float_abi); |
+} |
+ |
+ |
+void CpuFeatures::PrintFeatures() { |
+ printf( |
+ "ARMv7=%d VFP3=%d VFP32DREGS=%d SUDIV=%d UNALIGNED_ACCESSES=%d " |
+ "MOVW_MOVT_IMMEDIATE_LOADS=%d", |
+ CpuFeatures::IsSupported(ARMv7), |
+ CpuFeatures::IsSupported(VFP3), |
+ CpuFeatures::IsSupported(VFP32DREGS), |
+ CpuFeatures::IsSupported(SUDIV), |
+ CpuFeatures::IsSupported(UNALIGNED_ACCESSES), |
+ CpuFeatures::IsSupported(MOVW_MOVT_IMMEDIATE_LOADS)); |
+#ifdef __arm__ |
+ printf(" USE_EABI_HARDFLOAT=%d\n", OS::ArmUsingHardFloat()); |
+#else |
+ printf(" USE_EABI_HARDFLOAT=%d\n", USE_EABI_HARDFLOAT); |
+#endif |
+} |
+ |
+ |
// ----------------------------------------------------------------------------- |
// Implementation of RelocInfo |