LowerMove.cpp revision 0c2dc522d0e120f346cf0a40c8cf0c93346131c2
1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17
18/*! \file LowerMove.cpp
19    \brief This file lowers the following bytecodes: MOVE_XXX
20*/
21#include "libdex/DexOpcodes.h"
22#include "libdex/DexFile.h"
23#include "Lower.h"
24#include "enc_wrapper.h"
25
26#define P_GPR_1 PhysicalReg_EBX
27//! lower bytecode MOVE
28
29//!
30int op_move() {
31    u2 vA, vB;
32    vA = INST_A(inst);
33    vB = INST_B(inst);
34    get_virtual_reg(vB, OpndSize_32, 1, false/*isPhysical*/);
35    set_virtual_reg(vA, OpndSize_32, 1, false);
36    rPC += 1;
37    return 2;
38}
39//! lower bytecode MOVE_FROM16
40
41//!
42int op_move_from16() {
43    u2 vA, vB;
44    vA = INST_AA(inst);
45    vB = FETCH(1);
46    get_virtual_reg(vB, OpndSize_32, 1, false);
47    set_virtual_reg(vA, OpndSize_32, 1, false);
48    rPC += 2;
49    return 2;
50}
51//! lower bytecode MOVE_16
52
53//!
54int op_move_16() {
55    u2 vA, vB;
56    vA = FETCH(1);
57    vB = FETCH(2);
58    get_virtual_reg(vB, OpndSize_32, 1, false);
59    set_virtual_reg(vA, OpndSize_32, 1, false);
60    rPC += 3;
61    return 2;
62}
63#undef P_GPR_1
64//! lower bytecode MOVE_WIDE
65
66//!
67int op_move_wide() {
68    u2 vA = INST_A(inst);
69    u2 vB = INST_B(inst);
70    get_virtual_reg(vB, OpndSize_64, 1, false);
71    set_virtual_reg(vA, OpndSize_64, 1, false);
72    rPC += 1;
73    return 2;
74}
75//! lower bytecode MOVE_WIDE_FROM16
76
77//!
78int op_move_wide_from16() {
79    u2 vA = INST_AA(inst);
80    u2 vB = FETCH(1);
81    get_virtual_reg(vB, OpndSize_64, 1, false);
82    set_virtual_reg(vA, OpndSize_64, 1, false);
83    rPC += 2;
84    return 2;
85}
86//! lower bytecode MOVE_WIDE_16
87
88//!
89int op_move_wide_16() {
90    u2 vA = FETCH(1);
91    u2 vB = FETCH(2);
92    get_virtual_reg(vB, OpndSize_64, 1, false);
93    set_virtual_reg(vA, OpndSize_64, 1, false);
94    rPC += 3;
95    return 2;
96}
97//! lower bytecode MOVE_RESULT.
98
99//! the return value from bytecode INVOKE is stored in the glue structure
100int op_move_result() {
101#ifdef WITH_JIT_INLINING
102    /* An inlined move result is effectively no-op */
103    if (traceCurrentMIR->OptimizationFlags & MIR_INLINED)
104        return 0;
105#endif
106    u2 vA = INST_AA(inst);
107    scratchRegs[0] = PhysicalReg_SCRATCH_1;
108    get_return_value(OpndSize_32, 1, false);
109    set_virtual_reg(vA, OpndSize_32, 1, false);
110    rPC += 1;
111    return 0;
112}
113//! lower bytecode MOVE_RESULT_WIDE.
114
115//! the return value from bytecode INVOKE is stored in the glue structure
116int op_move_result_wide() {
117#ifdef WITH_JIT_INLINING
118    /* An inlined move result is effectively no-op */
119    if (traceCurrentMIR->OptimizationFlags & MIR_INLINED)
120        return 0;
121#endif
122    u2 vA = INST_AA(inst);
123    scratchRegs[0] = PhysicalReg_SCRATCH_1;
124    get_return_value(OpndSize_64, 1, false);
125    set_virtual_reg(vA, OpndSize_64, 1, false);
126    rPC += 1;
127    return 0;
128}
129
130#define P_GPR_1 PhysicalReg_EBX
131#define P_GPR_2 PhysicalReg_ECX
132//!lower bytecode MOVE_RESULT_EXCEPTION
133
134//!update a virtual register with exception from glue structure;
135//!clear the exception from glue structure
136int op_move_exception() {
137    u2 vA = INST_AA(inst);
138    scratchRegs[2] = PhysicalReg_Null; scratchRegs[3] = PhysicalReg_Null;
139    scratchRegs[0] = PhysicalReg_SCRATCH_1; scratchRegs[1] = PhysicalReg_Null;
140    get_self_pointer(2, false);
141    move_mem_to_reg(OpndSize_32, offThread_exception, 2, false, 3, false);
142    move_imm_to_mem(OpndSize_32, 0, offThread_exception, 2, false);
143    set_virtual_reg(vA, OpndSize_32, 3, false);
144    rPC += 1;
145    return 0;
146}
147#undef P_GPR_1
148#undef P_GPR_2
149
150