Index: runtime/vm/instructions_arm_test.cc |
=================================================================== |
--- runtime/vm/instructions_arm_test.cc (revision 33437) |
+++ runtime/vm/instructions_arm_test.cc (working copy) |
@@ -6,6 +6,7 @@ |
#if defined(TARGET_ARCH_ARM) |
#include "vm/assembler.h" |
+#include "vm/cpu.h" |
#include "vm/instructions.h" |
#include "vm/stub_code.h" |
#include "vm/unit_test.h" |
@@ -62,6 +63,45 @@ |
jump2.TargetAddress()); |
} |
+ |
+#if defined(USING_SIMULATOR) |
+ASSEMBLER_TEST_GENERATE(JumpARMv6, assembler) { |
+ // ARMv7 is the default. |
+ HostCPUFeatures::set_arm_version(ARMv6); |
+ __ BranchPatchable(&StubCode::InstanceFunctionLookupLabel()); |
+ __ BranchPatchable(&StubCode::AllocateArrayLabel()); |
+ HostCPUFeatures::set_arm_version(ARMv7); |
+} |
+ |
+ |
+ASSEMBLER_TEST_RUN(JumpARMv6, test) { |
+ HostCPUFeatures::set_arm_version(ARMv6); |
+ const Code& code = test->code(); |
+ const Instructions& instrs = Instructions::Handle(code.instructions()); |
+ bool status = |
+ VirtualMemory::Protect(reinterpret_cast<void*>(instrs.EntryPoint()), |
+ instrs.size(), |
+ VirtualMemory::kReadWrite); |
+ EXPECT(status); |
+ JumpPattern jump1(test->entry(), test->code()); |
+ EXPECT_EQ(StubCode::InstanceFunctionLookupLabel().address(), |
+ jump1.TargetAddress()); |
+ JumpPattern jump2(test->entry() + jump1.pattern_length_in_bytes(), |
+ test->code()); |
+ EXPECT_EQ(StubCode::AllocateArrayLabel().address(), |
+ jump2.TargetAddress()); |
+ uword target1 = jump1.TargetAddress(); |
+ uword target2 = jump2.TargetAddress(); |
+ jump1.SetTargetAddress(target2); |
+ jump2.SetTargetAddress(target1); |
+ EXPECT_EQ(StubCode::AllocateArrayLabel().address(), |
+ jump1.TargetAddress()); |
+ EXPECT_EQ(StubCode::InstanceFunctionLookupLabel().address(), |
+ jump2.TargetAddress()); |
+ HostCPUFeatures::set_arm_version(ARMv7); |
+} |
+#endif |
+ |
} // namespace dart |
#endif // defined TARGET_ARCH_ARM |