diff options
author | Dong-Yuan Chen <dong-yuan.chen@intel.com> | 2012-07-03 13:13:07 -0700 |
---|---|---|
committer | Elliott Hughes <enh@google.com> | 2012-07-20 12:27:18 -0700 |
commit | 0c2dc522d0e120f346cf0a40c8cf0c93346131c2 (patch) | |
tree | f7ca4c8e3ca1150b7e8c5f4b68c60972641dc77f /vm/compiler/codegen/x86/LowerMove.cpp | |
parent | abede656a1f2330e3d31281fb208be7c04e8eb56 (diff) | |
download | android_dalvik-0c2dc522d0e120f346cf0a40c8cf0c93346131c2.tar.gz android_dalvik-0c2dc522d0e120f346cf0a40c8cf0c93346131c2.tar.bz2 android_dalvik-0c2dc522d0e120f346cf0a40c8cf0c93346131c2.zip |
[X86] X86 trace JIT compiler support
This patch provides a fully functional x86 trace JIT compiler for Dalvik
VM. It is built on top of the existing x86 fast interpreter
with bug fixes and needed extension to support trace JIT interface. The
x86 trace JIT code generator was developed independent of the existing
template-based code generator and thus does not share exactly the same
infrastructure. Included in this patch are:
* Deprecated and removed the x86-atom fast interpreter that is no
longer functional since ICS.
* Augmented x86 fast interpreter to provide interfaces for x86 trace JIT
compiler.
* Added x86 trace JIT code generator with full JDWP debugging support.
* Method JIT and self-verification mode are not supported.
The x86 code generator uses the x86 instruction encoder/decoder library
from the Apache Harmony project. Additional wrapper extension and bug
fixes were added to support the x86 trace JIT code generator. The x86
instruction encoder/decoder is embedded inside the x86 code generator
under the libenc subdirectory.
Change-Id: I241113681963a16c13a3562390813cbaaa6eedf0
Signed-off-by: Dong-Yuan Chen <dong-yuan.chen@intel.com>
Signed-off-by: Yixin Shou <yixin.shou@intel.com>
Signed-off-by: Johnnie Birch <johnnie.l.birch.jr@intel.com>
Signed-off-by: Udayan <udayan.banerji@intel.com>
Signed-off-by: Sushma Kyasaralli Thimmappa <sushma.kyasaralli.thimmappa@intel.com>
Signed-off-by: Bijoy Jose <bijoy.a.jose@intel.com>
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
Signed-off-by: Tim Hartley <timothy.d.hartley@intel.com>
Diffstat (limited to 'vm/compiler/codegen/x86/LowerMove.cpp')
-rw-r--r-- | vm/compiler/codegen/x86/LowerMove.cpp | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/vm/compiler/codegen/x86/LowerMove.cpp b/vm/compiler/codegen/x86/LowerMove.cpp new file mode 100644 index 000000000..2f0b5bce0 --- /dev/null +++ b/vm/compiler/codegen/x86/LowerMove.cpp @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2012 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. + */ + + +/*! \file LowerMove.cpp + \brief This file lowers the following bytecodes: MOVE_XXX +*/ +#include "libdex/DexOpcodes.h" +#include "libdex/DexFile.h" +#include "Lower.h" +#include "enc_wrapper.h" + +#define P_GPR_1 PhysicalReg_EBX +//! lower bytecode MOVE + +//! +int op_move() { + u2 vA, vB; + vA = INST_A(inst); + vB = INST_B(inst); + get_virtual_reg(vB, OpndSize_32, 1, false/*isPhysical*/); + set_virtual_reg(vA, OpndSize_32, 1, false); + rPC += 1; + return 2; +} +//! lower bytecode MOVE_FROM16 + +//! +int op_move_from16() { + u2 vA, vB; + vA = INST_AA(inst); + vB = FETCH(1); + get_virtual_reg(vB, OpndSize_32, 1, false); + set_virtual_reg(vA, OpndSize_32, 1, false); + rPC += 2; + return 2; +} +//! lower bytecode MOVE_16 + +//! +int op_move_16() { + u2 vA, vB; + vA = FETCH(1); + vB = FETCH(2); + get_virtual_reg(vB, OpndSize_32, 1, false); + set_virtual_reg(vA, OpndSize_32, 1, false); + rPC += 3; + return 2; +} +#undef P_GPR_1 +//! lower bytecode MOVE_WIDE + +//! +int op_move_wide() { + u2 vA = INST_A(inst); + u2 vB = INST_B(inst); + get_virtual_reg(vB, OpndSize_64, 1, false); + set_virtual_reg(vA, OpndSize_64, 1, false); + rPC += 1; + return 2; +} +//! lower bytecode MOVE_WIDE_FROM16 + +//! +int op_move_wide_from16() { + u2 vA = INST_AA(inst); + u2 vB = FETCH(1); + get_virtual_reg(vB, OpndSize_64, 1, false); + set_virtual_reg(vA, OpndSize_64, 1, false); + rPC += 2; + return 2; +} +//! lower bytecode MOVE_WIDE_16 + +//! +int op_move_wide_16() { + u2 vA = FETCH(1); + u2 vB = FETCH(2); + get_virtual_reg(vB, OpndSize_64, 1, false); + set_virtual_reg(vA, OpndSize_64, 1, false); + rPC += 3; + return 2; +} +//! lower bytecode MOVE_RESULT. + +//! the return value from bytecode INVOKE is stored in the glue structure +int op_move_result() { +#ifdef WITH_JIT_INLINING + /* An inlined move result is effectively no-op */ + if (traceCurrentMIR->OptimizationFlags & MIR_INLINED) + return 0; +#endif + u2 vA = INST_AA(inst); + scratchRegs[0] = PhysicalReg_SCRATCH_1; + get_return_value(OpndSize_32, 1, false); + set_virtual_reg(vA, OpndSize_32, 1, false); + rPC += 1; + return 0; +} +//! lower bytecode MOVE_RESULT_WIDE. + +//! the return value from bytecode INVOKE is stored in the glue structure +int op_move_result_wide() { +#ifdef WITH_JIT_INLINING + /* An inlined move result is effectively no-op */ + if (traceCurrentMIR->OptimizationFlags & MIR_INLINED) + return 0; +#endif + u2 vA = INST_AA(inst); + scratchRegs[0] = PhysicalReg_SCRATCH_1; + get_return_value(OpndSize_64, 1, false); + set_virtual_reg(vA, OpndSize_64, 1, false); + rPC += 1; + return 0; +} + +#define P_GPR_1 PhysicalReg_EBX +#define P_GPR_2 PhysicalReg_ECX +//!lower bytecode MOVE_RESULT_EXCEPTION + +//!update a virtual register with exception from glue structure; +//!clear the exception from glue structure +int op_move_exception() { + u2 vA = INST_AA(inst); + scratchRegs[2] = PhysicalReg_Null; scratchRegs[3] = PhysicalReg_Null; + scratchRegs[0] = PhysicalReg_SCRATCH_1; scratchRegs[1] = PhysicalReg_Null; + get_self_pointer(2, false); + move_mem_to_reg(OpndSize_32, offThread_exception, 2, false, 3, false); + move_imm_to_mem(OpndSize_32, 0, offThread_exception, 2, false); + set_virtual_reg(vA, OpndSize_32, 3, false); + rPC += 1; + return 0; +} +#undef P_GPR_1 +#undef P_GPR_2 + |