Support passing arguments to invoke-static* instructions.
- Stop using the frame pointer for accessing locals.
- Stop emulating a stack when doing code generation. Instead,
rely on dex register model, where instructions only reference
registers.
Change-Id: Id51bd7d33ac430cb87a53c9f4b0c864eeb1006f9
diff --git a/compiler/optimizing/code_generator_arm.h b/compiler/optimizing/code_generator_arm.h
index 7a2835d..52d6b2e 100644
--- a/compiler/optimizing/code_generator_arm.h
+++ b/compiler/optimizing/code_generator_arm.h
@@ -43,12 +43,11 @@
DISALLOW_COPY_AND_ASSIGN(LocationsBuilderARM);
};
+class CodeGeneratorARM;
+
class InstructionCodeGeneratorARM : public HGraphVisitor {
public:
- explicit InstructionCodeGeneratorARM(HGraph* graph, CodeGenerator* codegen)
- : HGraphVisitor(graph),
- assembler_(codegen->GetAssembler()),
- codegen_(codegen) { }
+ InstructionCodeGeneratorARM(HGraph* graph, CodeGeneratorARM* codegen);
#define DECLARE_VISIT_INSTRUCTION(name) \
virtual void Visit##name(H##name* instr);
@@ -57,12 +56,12 @@
#undef DECLARE_VISIT_INSTRUCTION
- Assembler* GetAssembler() const { return assembler_; }
+ ArmAssembler* GetAssembler() const { return assembler_; }
void LoadCurrentMethod(Register reg);
private:
- Assembler* const assembler_;
- CodeGenerator* const codegen_;
+ ArmAssembler* const assembler_;
+ CodeGeneratorARM* const codegen_;
DISALLOW_COPY_AND_ASSIGN(InstructionCodeGeneratorARM);
};
@@ -75,12 +74,10 @@
instruction_visitor_(graph, this) { }
virtual ~CodeGeneratorARM() { }
- protected:
virtual void GenerateFrameEntry() OVERRIDE;
virtual void GenerateFrameExit() OVERRIDE;
virtual void Bind(Label* label) OVERRIDE;
- virtual void Move(HInstruction* instruction, Location location) OVERRIDE;
- virtual void Push(HInstruction* instruction, Location location) OVERRIDE;
+ virtual void Move(HInstruction* instruction, Location location, HInstruction* move_for) OVERRIDE;
virtual HGraphVisitor* GetLocationBuilder() OVERRIDE {
return &location_builder_;
@@ -90,16 +87,17 @@
return &instruction_visitor_;
}
- virtual Assembler* GetAssembler() OVERRIDE {
+ virtual ArmAssembler* GetAssembler() OVERRIDE {
return &assembler_;
}
+ int32_t GetStackSlot(HLocal* local) const;
+
private:
LocationsBuilderARM location_builder_;
InstructionCodeGeneratorARM instruction_visitor_;
ArmAssembler assembler_;
-
DISALLOW_COPY_AND_ASSIGN(CodeGeneratorARM);
};