summaryrefslogtreecommitdiffstats
path: root/compiler/optimizing/code_generator.cc
diff options
context:
space:
mode:
authorNicolas Geoffray <ngeoffray@google.com>2014-02-28 10:23:58 +0000
committerNicolas Geoffray <ngeoffray@google.com>2014-03-04 16:19:11 +0000
commitd4dd255db1d110ceb5551f6d95ff31fb57420994 (patch)
tree93c9dfff8d16f2b9675c35477cc4bcd8ea3f630c /compiler/optimizing/code_generator.cc
parentb565506a63e75dac4a8bb9dd54dabf5259e5b95f (diff)
downloadart-d4dd255db1d110ceb5551f6d95ff31fb57420994.zip
art-d4dd255db1d110ceb5551f6d95ff31fb57420994.tar.gz
art-d4dd255db1d110ceb5551f6d95ff31fb57420994.tar.bz2
Add codegen support to the optimizing compiler.
Change-Id: I9aae76908ff1d6e64fb71a6718fc1426b67a5c28
Diffstat (limited to 'compiler/optimizing/code_generator.cc')
-rw-r--r--compiler/optimizing/code_generator.cc79
1 files changed, 79 insertions, 0 deletions
diff --git a/compiler/optimizing/code_generator.cc b/compiler/optimizing/code_generator.cc
new file mode 100644
index 0000000..01fc23b
--- /dev/null
+++ b/compiler/optimizing/code_generator.cc
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "code_generator.h"
+
+#include "code_generator_arm.h"
+#include "code_generator_x86.h"
+#include "utils/assembler.h"
+#include "utils/arm/assembler_arm.h"
+#include "utils/mips/assembler_mips.h"
+#include "utils/x86/assembler_x86.h"
+
+namespace art {
+
+void CodeGenerator::Compile(CodeAllocator* allocator) {
+ GenerateFrameEntry();
+ const GrowableArray<HBasicBlock*>* blocks = graph()->blocks();
+ for (size_t i = 0; i < blocks->Size(); i++) {
+ CompileBlock(blocks->Get(i));
+ }
+ size_t code_size = assembler_->CodeSize();
+ uint8_t* buffer = allocator->Allocate(code_size);
+ MemoryRegion code(buffer, code_size);
+ assembler_->FinalizeInstructions(code);
+}
+
+void CodeGenerator::CompileBlock(HBasicBlock* block) {
+ Bind(GetLabelOf(block));
+ for (HInstructionIterator it(block); !it.Done(); it.Advance()) {
+ it.Current()->Accept(this);
+ }
+}
+
+bool CodeGenerator::GoesToNextBlock(HGoto* goto_instruction) const {
+ HBasicBlock* successor = goto_instruction->GetSuccessor();
+ // We currently iterate over the block in insertion order.
+ return goto_instruction->block()->block_id() + 1 == successor->block_id();
+}
+
+Label* CodeGenerator::GetLabelOf(HBasicBlock* block) const {
+ return block_labels_.GetRawStorage() + block->block_id();
+}
+
+bool CodeGenerator::CompileGraph(HGraph* graph,
+ InstructionSet instruction_set,
+ CodeAllocator* allocator) {
+ switch (instruction_set) {
+ case kArm:
+ case kThumb2: {
+ arm::ArmAssembler assembler;
+ arm::CodeGeneratorARM(&assembler, graph).Compile(allocator);
+ return true;
+ }
+ case kMips:
+ return false;
+ case kX86: {
+ x86::X86Assembler assembler;
+ x86::CodeGeneratorX86(&assembler, graph).Compile(allocator);
+ return true;
+ }
+ default:
+ return false;
+ }
+}
+
+} // namespace art