From 0616ae081e648f4b9b64b33e2624a943c5fce977 Mon Sep 17 00:00:00 2001 From: Mark Mendell Date: Fri, 17 Apr 2015 12:49:27 -0400 Subject: [optimizing] Add support for x86 constant area Use the Quick trick of finding the address of the method by calling the next instruction and popping the return address into a register. This trick is used because of the lack of PC-relative addressing in 32 bit mode on the X86. Add a HX86ComputeBaseMethodAddress instruction to trigger generation of the method address, which is referenced by instructions needing access to the constant area. Add a HX86LoadFromConstantTable instruction that takes a HX86ComputeBaseMethodAddress and a HConstant that will be used to load the value when needed. Change Add/Sub/Mul/Div to detect a HX86LoadFromConstantTable right hand side, and generate code that directly references the constant area. Other uses will be added later. Change the inputs to HReturn and HInvoke(s), replacing the FP constants with HX86LoadFromConstantTable instead. This allows values to be loaded from the constant area into the right location. Port the X86_64 assembler constant area handling to the X86. Use the new per-backend optimization framework to do this conversion. Change-Id: I6d235a72238262e4f9ec0f3c88319a187f865932 Signed-off-by: Mark Mendell --- compiler/optimizing/optimizing_compiler.cc | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'compiler/optimizing/optimizing_compiler.cc') diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc index 91b03d4bd1..f549ba8391 100644 --- a/compiler/optimizing/optimizing_compiler.cc +++ b/compiler/optimizing/optimizing_compiler.cc @@ -23,6 +23,10 @@ #include "instruction_simplifier_arm64.h" #endif +#ifdef ART_ENABLE_CODEGEN_x86 +#include "constant_area_fixups_x86.h" +#endif + #include "art_method-inl.h" #include "base/arena_allocator.h" #include "base/arena_containers.h" @@ -423,6 +427,17 @@ static void RunArchOptimizations(InstructionSet instruction_set, RunOptimizations(arm64_optimizations, arraysize(arm64_optimizations), pass_observer); break; } +#endif +#ifdef ART_ENABLE_CODEGEN_x86 + case kX86: { + x86::ConstantAreaFixups* constant_area_fixups = + new (arena) x86::ConstantAreaFixups(graph, stats); + HOptimization* x86_optimizations[] = { + constant_area_fixups + }; + RunOptimizations(x86_optimizations, arraysize(x86_optimizations), pass_observer); + break; + } #endif default: break; -- cgit v1.2.3-59-g8ed1b