diff options
author | Nicolas Geoffray <ngeoffray@google.com> | 2014-03-11 17:53:17 +0000 |
---|---|---|
committer | Nicolas Geoffray <ngeoffray@google.com> | 2014-03-13 09:23:12 +0000 |
commit | bab4ed7057799a4fadc6283108ab56f389d117d4 (patch) | |
tree | ea1bf495458fd9f7a3ffbed0ea4e1dda5a0b8184 /compiler/optimizing/codegen_test.cc | |
parent | 37d4c1db4d705f5a28001f65afdd68d0527948d8 (diff) | |
download | art-bab4ed7057799a4fadc6283108ab56f389d117d4.zip art-bab4ed7057799a4fadc6283108ab56f389d117d4.tar.gz art-bab4ed7057799a4fadc6283108ab56f389d117d4.tar.bz2 |
More code generation for the optimizing compiler.
- Add HReturn instruction
- Generate code for locals/if/return
- Setup infrastructure for register allocation. Currently
emulate a stack.
Change-Id: Ib28c2dba80f6c526177ed9a7b09c0689ac8122fb
Diffstat (limited to 'compiler/optimizing/codegen_test.cc')
-rw-r--r-- | compiler/optimizing/codegen_test.cc | 85 |
1 files changed, 77 insertions, 8 deletions
diff --git a/compiler/optimizing/codegen_test.cc b/compiler/optimizing/codegen_test.cc index 6d4588d..a6ecdfb 100644 --- a/compiler/optimizing/codegen_test.cc +++ b/compiler/optimizing/codegen_test.cc @@ -45,7 +45,7 @@ class ExecutableMemoryAllocator : public CodeAllocator { DISALLOW_COPY_AND_ASSIGN(ExecutableMemoryAllocator); }; -static void TestCode(const uint16_t* data) { +static void TestCode(const uint16_t* data, bool has_result = false, int32_t expected = 0) { ArenaPool pool; ArenaAllocator arena(&pool); HGraphBuilder builder(&arena); @@ -54,14 +54,17 @@ static void TestCode(const uint16_t* data) { ASSERT_NE(graph, nullptr); ExecutableMemoryAllocator allocator; CHECK(CodeGenerator::CompileGraph(graph, kX86, &allocator)); - typedef void (*fptr)(); + typedef int32_t (*fptr)(); #if defined(__i386__) - reinterpret_cast<fptr>(allocator.memory())(); + int32_t result = reinterpret_cast<fptr>(allocator.memory())(); #endif CHECK(CodeGenerator::CompileGraph(graph, kArm, &allocator)); #if defined(__arm__) - reinterpret_cast<fptr>(allocator.memory())(); + int32_t result = reinterpret_cast<fptr>(allocator.memory())(); #endif + if (has_result) { + CHECK_EQ(result, expected); + } } TEST(CodegenTest, ReturnVoid) { @@ -69,7 +72,7 @@ TEST(CodegenTest, ReturnVoid) { TestCode(data); } -TEST(PrettyPrinterTest, CFG1) { +TEST(CodegenTest, CFG1) { const uint16_t data[] = ZERO_REGISTER_CODE_ITEM( Instruction::GOTO | 0x100, Instruction::RETURN_VOID); @@ -77,7 +80,7 @@ TEST(PrettyPrinterTest, CFG1) { TestCode(data); } -TEST(PrettyPrinterTest, CFG2) { +TEST(CodegenTest, CFG2) { const uint16_t data[] = ZERO_REGISTER_CODE_ITEM( Instruction::GOTO | 0x100, Instruction::GOTO | 0x100, @@ -86,7 +89,7 @@ TEST(PrettyPrinterTest, CFG2) { TestCode(data); } -TEST(PrettyPrinterTest, CFG3) { +TEST(CodegenTest, CFG3) { const uint16_t data1[] = ZERO_REGISTER_CODE_ITEM( Instruction::GOTO | 0x200, Instruction::RETURN_VOID, @@ -109,7 +112,7 @@ TEST(PrettyPrinterTest, CFG3) { TestCode(data3); } -TEST(PrettyPrinterTest, CFG4) { +TEST(CodegenTest, CFG4) { const uint16_t data[] = ZERO_REGISTER_CODE_ITEM( Instruction::RETURN_VOID, Instruction::GOTO | 0x100, @@ -118,4 +121,70 @@ TEST(PrettyPrinterTest, CFG4) { TestCode(data); } +TEST(CodegenTest, CFG5) { + const uint16_t data[] = ONE_REGISTER_CODE_ITEM( + Instruction::CONST_4 | 0 | 0, + Instruction::IF_EQ, 3, + Instruction::GOTO | 0x100, + Instruction::RETURN_VOID); + + TestCode(data); +} + +TEST(CodegenTest, IntConstant) { + const uint16_t data[] = ONE_REGISTER_CODE_ITEM( + Instruction::CONST_4 | 0 | 0, + Instruction::RETURN_VOID); + + TestCode(data); +} + +TEST(CodegenTest, Return1) { + const uint16_t data[] = ONE_REGISTER_CODE_ITEM( + Instruction::CONST_4 | 0 | 0, + Instruction::RETURN | 0); + + TestCode(data, true, 0); +} + +TEST(CodegenTest, Return2) { + const uint16_t data[] = TWO_REGISTERS_CODE_ITEM( + Instruction::CONST_4 | 0 | 0, + Instruction::CONST_4 | 0 | 1 << 8, + Instruction::RETURN | 1 << 8); + + TestCode(data, true, 0); +} + +TEST(CodegenTest, Return3) { + const uint16_t data[] = TWO_REGISTERS_CODE_ITEM( + Instruction::CONST_4 | 0 | 0, + Instruction::CONST_4 | 1 << 8 | 1 << 12, + Instruction::RETURN | 1 << 8); + + TestCode(data, true, 1); +} + +TEST(CodegenTest, ReturnIf1) { + const uint16_t data[] = TWO_REGISTERS_CODE_ITEM( + Instruction::CONST_4 | 0 | 0, + Instruction::CONST_4 | 1 << 8 | 1 << 12, + Instruction::IF_EQ, 3, + Instruction::RETURN | 0 << 8, + Instruction::RETURN | 1 << 8); + + TestCode(data, true, 1); +} + +TEST(CodegenTest, ReturnIf2) { + const uint16_t data[] = TWO_REGISTERS_CODE_ITEM( + Instruction::CONST_4 | 0 | 0, + Instruction::CONST_4 | 1 << 8 | 1 << 12, + Instruction::IF_EQ | 0 << 4 | 1 << 8, 3, + Instruction::RETURN | 0 << 8, + Instruction::RETURN | 1 << 8); + + TestCode(data, true, 0); +} + } // namespace art |