| Index: runtime/vm/instructions_arm64_test.cc
|
| ===================================================================
|
| --- runtime/vm/instructions_arm64_test.cc (revision 35070)
|
| +++ runtime/vm/instructions_arm64_test.cc (working copy)
|
| @@ -5,6 +5,64 @@
|
| #include "vm/globals.h"
|
| #if defined(TARGET_ARCH_ARM64)
|
|
|
| -// TODO(zra): Port these tests.
|
| +#include "vm/assembler.h"
|
| +#include "vm/cpu.h"
|
| +#include "vm/instructions.h"
|
| +#include "vm/stub_code.h"
|
| +#include "vm/unit_test.h"
|
|
|
| +namespace dart {
|
| +
|
| +#define __ assembler->
|
| +
|
| +ASSEMBLER_TEST_GENERATE(Call, assembler) {
|
| + __ BranchLinkPatchable(&StubCode::InvokeDartCodeLabel());
|
| + __ ret();
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(Call, test) {
|
| + // The return address, which must be the address of an instruction contained
|
| + // in the code, points to the Ret instruction above, i.e. one instruction
|
| + // before the end of the code buffer.
|
| + CallPattern call(test->entry() + test->code().Size() - Instr::kInstrSize,
|
| + test->code());
|
| + EXPECT_EQ(StubCode::InvokeDartCodeLabel().address(),
|
| + call.TargetAddress());
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_GENERATE(Jump, assembler) {
|
| + __ BranchPatchable(&StubCode::InvokeDartCodeLabel());
|
| + __ BranchPatchable(&StubCode::AllocateArrayLabel());
|
| +}
|
| +
|
| +
|
| +ASSEMBLER_TEST_RUN(Jump, test) {
|
| + 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::InvokeDartCodeLabel().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::InvokeDartCodeLabel().address(),
|
| + jump2.TargetAddress());
|
| +}
|
| +
|
| +} // namespace dart
|
| +
|
| #endif // defined TARGET_ARCH_ARM64
|
|
|