mir_to_lir.cc revision 28c9a83398a6e48eefb9b79a390920629bbb8519
1e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/*
2e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Copyright (C) 2011 The Android Open Source Project
3e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
4e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Licensed under the Apache License, Version 2.0 (the "License");
5e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * you may not use this file except in compliance with the License.
6e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * You may obtain a copy of the License at
7e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
8e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *      http://www.apache.org/licenses/LICENSE-2.0
9e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee *
10e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Unless required by applicable law or agreed to in writing, software
11e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * distributed under the License is distributed on an "AS IS" BASIS,
12e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * See the License for the specific language governing permissions and
14e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * limitations under the License.
15e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee */
16e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
17e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee#include "object_utils.h"
18e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
191bc37c60da71c923ea9a2e99d31ba1b3d76d79a8buzbee#include "../compiler_internals.h"
20eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee#include "local_optimizations.h"
211bc37c60da71c923ea9a2e99d31ba1b3d76d79a8buzbee#include "codegen_util.h"
221bc37c60da71c923ea9a2e99d31ba1b3d76d79a8buzbee#include "ralloc_util.h"
23eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee
24e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeenamespace art {
25e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
26fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee// TODO: unify bad_loc
27fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeeconst RegLocation bad_loc = {kLocDalvikFrame, 0, 0, 0, 0, 0, 0, 0, 0,
282cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee                            INVALID_REG, INVALID_REG, INVALID_SREG,
292cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee                            INVALID_SREG};
30e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
31e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/* Mark register usage state and return long retloc */
32fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeeRegLocation GetReturnWide(CompilationUnit* cu, bool is_double)
33e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
3452a77fc135f0e0df57ee24641c3f5ae415ff7bd6buzbee  RegLocation gpr_res = LocCReturnWide();
3552a77fc135f0e0df57ee24641c3f5ae415ff7bd6buzbee  RegLocation fpr_res = LocCReturnDouble();
36fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  RegLocation res = is_double ? fpr_res : gpr_res;
37fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  Clobber(cu, res.low_reg);
38fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  Clobber(cu, res.high_reg);
39fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  LockTemp(cu, res.low_reg);
40fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  LockTemp(cu, res.high_reg);
41fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  MarkPair(cu, res.low_reg, res.high_reg);
42a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  return res;
43e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
44e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
45fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeeRegLocation GetReturn(CompilationUnit* cu, bool is_float)
46e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
4752a77fc135f0e0df57ee24641c3f5ae415ff7bd6buzbee  RegLocation gpr_res = LocCReturn();
4852a77fc135f0e0df57ee24641c3f5ae415ff7bd6buzbee  RegLocation fpr_res = LocCReturnFloat();
49fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  RegLocation res = is_float ? fpr_res : gpr_res;
50fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  Clobber(cu, res.low_reg);
51fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  if (cu->instruction_set == kMips) {
52fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    MarkInUse(cu, res.low_reg);
53a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  } else {
54fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    LockTemp(cu, res.low_reg);
55a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
56a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  return res;
57e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
58e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
59e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/*
60e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Target-independent code generation.  Use only high-level
61e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * load/store utilities here, or target-dependent genXX() handlers
62e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * when necessary.
63e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee */
64fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeestatic bool CompileDalvikInstruction(CompilationUnit* cu, MIR* mir, BasicBlock* bb,
65fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee                                     LIR* label_list)
66e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
67a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  bool res = false;   // Assume success
68fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  RegLocation rl_src[3];
69fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  RegLocation rl_dest = bad_loc;
70fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  RegLocation rl_result = bad_loc;
71a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  Instruction::Code opcode = mir->dalvikInsn.opcode;
72fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  int opt_flags = mir->optimization_flags;
73408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee  uint32_t vB = mir->dalvikInsn.vB;
74408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee  uint32_t vC = mir->dalvikInsn.vC;
75a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
76a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  /* Prep Src and Dest locations */
77fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  int next_sreg = 0;
78fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  int next_loc = 0;
79fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  int attrs = oat_data_flow_attributes[opcode];
80fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  rl_src[0] = rl_src[1] = rl_src[2] = bad_loc;
81a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  if (attrs & DF_UA) {
82bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    if (attrs & DF_A_WIDE) {
83fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_src[next_loc++] = GetSrcWide(cu, mir, next_sreg);
84fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      next_sreg+= 2;
85bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    } else {
86fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_src[next_loc++] = GetSrc(cu, mir, next_sreg);
87fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      next_sreg++;
88bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    }
89a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
90a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  if (attrs & DF_UB) {
91bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    if (attrs & DF_B_WIDE) {
92fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_src[next_loc++] = GetSrcWide(cu, mir, next_sreg);
93fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      next_sreg+= 2;
94bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    } else {
95fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_src[next_loc++] = GetSrc(cu, mir, next_sreg);
96fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      next_sreg++;
97bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    }
98a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
99a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  if (attrs & DF_UC) {
100bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    if (attrs & DF_C_WIDE) {
101fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_src[next_loc++] = GetSrcWide(cu, mir, next_sreg);
102bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    } else {
103fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_src[next_loc++] = GetSrc(cu, mir, next_sreg);
104bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    }
105a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
106a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  if (attrs & DF_DA) {
107bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    if (attrs & DF_A_WIDE) {
108fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_dest = GetDestWide(cu, mir);
109bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    } else {
110fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_dest = GetDest(cu, mir);
111bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    }
112a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
113a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  switch (opcode) {
114a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NOP:
115a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
116a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
117474b6da273c7ce6df50a4e51eb9929a77e1611c3Ian Rogers    case Instruction::MOVE_EXCEPTION:
118fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenMoveException(cu, rl_dest);
119a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
120a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::RETURN_VOID:
121fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      if (!(cu->attrs & METHOD_IS_LEAF)) {
122fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        GenSuspendTest(cu, opt_flags);
123a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
124a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
125a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
126a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::RETURN:
127a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::RETURN_OBJECT:
128fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      if (!(cu->attrs & METHOD_IS_LEAF)) {
129fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        GenSuspendTest(cu, opt_flags);
130a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
131fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      StoreValue(cu, GetReturn(cu, cu->shorty[0] == 'F'), rl_src[0]);
132a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
133a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
134a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::RETURN_WIDE:
135fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      if (!(cu->attrs & METHOD_IS_LEAF)) {
136fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        GenSuspendTest(cu, opt_flags);
137a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
138fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      StoreValueWide(cu, GetReturnWide(cu,
139fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee                       cu->shorty[0] == 'D'), rl_src[0]);
140a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
141a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
142a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_RESULT_WIDE:
143fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      if (opt_flags & MIR_INLINED)
144a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        break;  // Nop - combined w/ previous invoke
145fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      StoreValueWide(cu, rl_dest, GetReturnWide(cu, rl_dest.fp));
146a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
147a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
148a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_RESULT:
149a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_RESULT_OBJECT:
150fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      if (opt_flags & MIR_INLINED)
151a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee        break;  // Nop - combined w/ previous invoke
152fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      StoreValue(cu, rl_dest, GetReturn(cu, rl_dest.fp));
153a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
154a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
155a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE:
156a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_OBJECT:
157a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_16:
158a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_OBJECT_16:
159a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_FROM16:
160a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_OBJECT_FROM16:
161fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      StoreValue(cu, rl_dest, rl_src[0]);
162a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
163a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
164a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_WIDE:
165a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_WIDE_16:
166a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_WIDE_FROM16:
167fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      StoreValueWide(cu, rl_dest, rl_src[0]);
168a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
169a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
170a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST:
171a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_4:
172a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_16:
173fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_result = EvalLoc(cu, rl_dest, kAnyReg, true);
174fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      LoadConstantNoClobber(cu, rl_result.low_reg, vB);
175fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      StoreValue(cu, rl_dest, rl_result);
176a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
177a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
178a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_HIGH16:
179fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_result = EvalLoc(cu, rl_dest, kAnyReg, true);
180fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      LoadConstantNoClobber(cu, rl_result.low_reg, vB << 16);
181fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      StoreValue(cu, rl_dest, rl_result);
182a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
183a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
184a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_WIDE_16:
185a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_WIDE_32:
186fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_result = EvalLoc(cu, rl_dest, kAnyReg, true);
187fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      LoadConstantValueWide(cu, rl_result.low_reg, rl_result.high_reg, vB,
188408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee                            (vB & 0x80000000) ? -1 : 0);
189fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      StoreValueWide(cu, rl_dest, rl_result);
190a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
191a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
192a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_WIDE:
193fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_result = EvalLoc(cu, rl_dest, kAnyReg, true);
194fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      LoadConstantValueWide(cu, rl_result.low_reg, rl_result.high_reg,
195a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee                            mir->dalvikInsn.vB_wide & 0xffffffff,
196a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee                            (mir->dalvikInsn.vB_wide >> 32) & 0xffffffff);
197fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      StoreValueWide(cu, rl_dest, rl_result);
198a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
199a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
200a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_WIDE_HIGH16:
201fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_result = EvalLoc(cu, rl_dest, kAnyReg, true);
202fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      LoadConstantValueWide(cu, rl_result.low_reg, rl_result.high_reg,
203408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee                            0, vB << 16);
204fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      StoreValueWide(cu, rl_dest, rl_result);
205a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
206a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
207a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MONITOR_ENTER:
208fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenMonitorEnter(cu, opt_flags, rl_src[0]);
209a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
210a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
211a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MONITOR_EXIT:
212fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenMonitorExit(cu, opt_flags, rl_src[0]);
213a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
214a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
215a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CHECK_CAST:
216fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenCheckCast(cu, vB, rl_src[0]);
217a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
218a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
219a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INSTANCE_OF:
220fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenInstanceof(cu, vC, rl_dest, rl_src[0]);
221a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
222a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
223a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NEW_INSTANCE:
224fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenNewInstance(cu, vB, rl_dest);
225a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
226a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
227a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::THROW:
228fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenThrow(cu, rl_src[0]);
229a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
230a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
231a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ARRAY_LENGTH:
232fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      int len_offset;
233fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      len_offset = Array::LengthOffset().Int32Value();
234fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_src[0] = LoadValue(cu, rl_src[0], kCoreReg);
235fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenNullCheck(cu, rl_src[0].s_reg_low, rl_src[0].low_reg, opt_flags);
236fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_result = EvalLoc(cu, rl_dest, kCoreReg, true);
237fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      LoadWordDisp(cu, rl_src[0].low_reg, len_offset, rl_result.low_reg);
238fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      StoreValue(cu, rl_dest, rl_result);
239a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
240a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
241a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_STRING:
242a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_STRING_JUMBO:
243fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenConstString(cu, vB, rl_dest);
244a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
245a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
246a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_CLASS:
247fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenConstClass(cu, vB, rl_dest);
248a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
249a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
250a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FILL_ARRAY_DATA:
251fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenFillArrayData(cu, vB, rl_src[0]);
252a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
253a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
254a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FILLED_NEW_ARRAY:
255fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenFilledNewArray(cu, NewMemCallInfo(cu, bb, mir, kStatic,
2563b3dbddcbc7a7bee505a608061304f9b26a91750buzbee                        false /* not range */));
257a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
258a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
259a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FILLED_NEW_ARRAY_RANGE:
260fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenFilledNewArray(cu, NewMemCallInfo(cu, bb, mir, kStatic,
2613b3dbddcbc7a7bee505a608061304f9b26a91750buzbee                        true /* range */));
262a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
263a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
264a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NEW_ARRAY:
265fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenNewArray(cu, vC, rl_dest, rl_src[0]);
266a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
267a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
268a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::GOTO:
269a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::GOTO_16:
270a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::GOTO_32:
271fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      if (bb->taken->start_offset <= mir->offset) {
272fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        GenSuspendTestAndBranch(cu, opt_flags, &label_list[bb->taken->id]);
273a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      } else {
274fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        OpUnconditionalBranch(cu, &label_list[bb->taken->id]);
275a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
276a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
277a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
278a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::PACKED_SWITCH:
279fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenPackedSwitch(cu, vB, rl_src[0]);
280a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
281a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
282a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPARSE_SWITCH:
283fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenSparseSwitch(cu, vB, rl_src[0]);
284a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
285a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
286a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMPL_FLOAT:
287a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMPG_FLOAT:
288a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMPL_DOUBLE:
289a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMPG_DOUBLE:
290fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      res = GenCmpFP(cu, opcode, rl_dest, rl_src[0], rl_src[1]);
291a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
292a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
293a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMP_LONG:
294fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenCmpLong(cu, rl_dest, rl_src[0], rl_src[1]);
295a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
296a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
297a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_EQ:
298a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_NE:
299a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_LT:
300a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_GE:
301a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_GT:
302a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_LE: {
303fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      LIR* taken = &label_list[bb->taken->id];
304fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      LIR* fall_through = &label_list[bb->fall_through->id];
305fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      bool backward_branch;
306fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      backward_branch = (bb->taken->start_offset <= mir->offset);
307fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      if (backward_branch) {
308fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        GenSuspendTest(cu, opt_flags);
309a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
310fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenCompareAndBranch(cu, opcode, rl_src[0], rl_src[1], taken,
311fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee                          fall_through);
312a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
313a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
314a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
315a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_EQZ:
316a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_NEZ:
317a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_LTZ:
318a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_GEZ:
319a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_GTZ:
320a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_LEZ: {
321fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      LIR* taken = &label_list[bb->taken->id];
322fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      LIR* fall_through = &label_list[bb->fall_through->id];
323fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      bool backward_branch;
324fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      backward_branch = (bb->taken->start_offset <= mir->offset);
325fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      if (backward_branch) {
326fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        GenSuspendTest(cu, opt_flags);
327a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
328fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenCompareZeroAndBranch(cu, opcode, rl_src[0], taken, fall_through);
329a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
330a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
331a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
332a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AGET_WIDE:
333fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenArrayGet(cu, opt_flags, kLong, rl_src[0], rl_src[1], rl_dest, 3);
334a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
335a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AGET:
336a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AGET_OBJECT:
337fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenArrayGet(cu, opt_flags, kWord, rl_src[0], rl_src[1], rl_dest, 2);
338a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
339a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AGET_BOOLEAN:
340fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenArrayGet(cu, opt_flags, kUnsignedByte, rl_src[0], rl_src[1], rl_dest, 0);
341a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
342a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AGET_BYTE:
343fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenArrayGet(cu, opt_flags, kSignedByte, rl_src[0], rl_src[1], rl_dest, 0);
344a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
345a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AGET_CHAR:
346fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenArrayGet(cu, opt_flags, kUnsignedHalf, rl_src[0], rl_src[1], rl_dest, 1);
347a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
348a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AGET_SHORT:
349fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenArrayGet(cu, opt_flags, kSignedHalf, rl_src[0], rl_src[1], rl_dest, 1);
350a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
351a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::APUT_WIDE:
352fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenArrayPut(cu, opt_flags, kLong, rl_src[1], rl_src[2], rl_src[0], 3);
353a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
354a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::APUT:
355fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenArrayPut(cu, opt_flags, kWord, rl_src[1], rl_src[2], rl_src[0], 2);
356a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
357a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::APUT_OBJECT:
358fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenArrayObjPut(cu, opt_flags, rl_src[1], rl_src[2], rl_src[0], 2);
359a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
360a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::APUT_SHORT:
361a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::APUT_CHAR:
362fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenArrayPut(cu, opt_flags, kUnsignedHalf, rl_src[1], rl_src[2], rl_src[0], 1);
363a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
364a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::APUT_BYTE:
365a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::APUT_BOOLEAN:
366fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenArrayPut(cu, opt_flags, kUnsignedByte, rl_src[1], rl_src[2],
367fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee            rl_src[0], 0);
368a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
369a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
370a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IGET_OBJECT:
371a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    //case Instruction::IGET_OBJECT_VOLATILE:
372fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenIGet(cu, vC, opt_flags, kWord, rl_dest, rl_src[0], false, true);
373a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
374a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
375a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IGET_WIDE:
376a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    //case Instruction::IGET_WIDE_VOLATILE:
377fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenIGet(cu, vC, opt_flags, kLong, rl_dest, rl_src[0], true, false);
378a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
379a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
380a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IGET:
381a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    //case Instruction::IGET_VOLATILE:
382fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenIGet(cu, vC, opt_flags, kWord, rl_dest, rl_src[0], false, false);
383a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
384a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
385a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IGET_CHAR:
386fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenIGet(cu, vC, opt_flags, kUnsignedHalf, rl_dest, rl_src[0], false, false);
387a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
388a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
389a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IGET_SHORT:
390fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenIGet(cu, vC, opt_flags, kSignedHalf, rl_dest, rl_src[0], false, false);
391a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
392a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
393a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IGET_BOOLEAN:
394a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IGET_BYTE:
395fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenIGet(cu, vC, opt_flags, kUnsignedByte, rl_dest, rl_src[0], false, false);
396a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
397a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
398a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IPUT_WIDE:
399a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    //case Instruction::IPUT_WIDE_VOLATILE:
400fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenIPut(cu, vC, opt_flags, kLong, rl_src[0], rl_src[1], true, false);
401a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
402a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
403a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IPUT_OBJECT:
404a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    //case Instruction::IPUT_OBJECT_VOLATILE:
405fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenIPut(cu, vC, opt_flags, kWord, rl_src[0], rl_src[1], false, true);
406a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
407a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
408a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IPUT:
409a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    //case Instruction::IPUT_VOLATILE:
410fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenIPut(cu, vC, opt_flags, kWord, rl_src[0], rl_src[1], false, false);
411a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
412a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
413a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IPUT_BOOLEAN:
414a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IPUT_BYTE:
415fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenIPut(cu, vC, opt_flags, kUnsignedByte, rl_src[0], rl_src[1], false, false);
416a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
417a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
418a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IPUT_CHAR:
419fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenIPut(cu, vC, opt_flags, kUnsignedHalf, rl_src[0], rl_src[1], false, false);
420a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
421a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
422a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IPUT_SHORT:
423fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenIPut(cu, vC, opt_flags, kSignedHalf, rl_src[0], rl_src[1], false, false);
424a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
425a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
426a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SGET_OBJECT:
427fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenSget(cu, vB, rl_dest, false, true);
428a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
429a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SGET:
430a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SGET_BOOLEAN:
431a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SGET_BYTE:
432a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SGET_CHAR:
433a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SGET_SHORT:
434fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenSget(cu, vB, rl_dest, false, false);
435a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
436a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
437a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SGET_WIDE:
438fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenSget(cu, vB, rl_dest, true, false);
439a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
440a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
441a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPUT_OBJECT:
442fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenSput(cu, vB, rl_src[0], false, true);
443a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
444a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
445a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPUT:
446a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPUT_BOOLEAN:
447a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPUT_BYTE:
448a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPUT_CHAR:
449a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPUT_SHORT:
450fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenSput(cu, vB, rl_src[0], false, false);
451a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
452a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
453a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPUT_WIDE:
454fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenSput(cu, vB, rl_src[0], true, false);
455a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
456a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
457a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_STATIC_RANGE:
458fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenInvoke(cu, NewMemCallInfo(cu, bb, mir, kStatic, true));
459a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
460a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_STATIC:
461fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenInvoke(cu, NewMemCallInfo(cu, bb, mir, kStatic, false));
462a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
463a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
464a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_DIRECT:
465fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenInvoke(cu, NewMemCallInfo(cu, bb, mir, kDirect, false));
466a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
467a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_DIRECT_RANGE:
468fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenInvoke(cu, NewMemCallInfo(cu, bb, mir, kDirect, true));
469a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
470a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
471a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_VIRTUAL:
472fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenInvoke(cu, NewMemCallInfo(cu, bb, mir, kVirtual, false));
473a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
474a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_VIRTUAL_RANGE:
475fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenInvoke(cu, NewMemCallInfo(cu, bb, mir, kVirtual, true));
476a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
477a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
478a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_SUPER:
479fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenInvoke(cu, NewMemCallInfo(cu, bb, mir, kSuper, false));
480a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
481a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_SUPER_RANGE:
482fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenInvoke(cu, NewMemCallInfo(cu, bb, mir, kSuper, true));
483a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
484a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
485a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_INTERFACE:
486fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenInvoke(cu, NewMemCallInfo(cu, bb, mir, kInterface, false));
487a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
488a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_INTERFACE_RANGE:
489fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenInvoke(cu, NewMemCallInfo(cu, bb, mir, kInterface, true));
490a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
491a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
492a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NEG_INT:
493a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NOT_INT:
494fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      res = GenArithOpInt(cu, opcode, rl_dest, rl_src[0], rl_src[0]);
495a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
496a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
497a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NEG_LONG:
498a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NOT_LONG:
499fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      res = GenArithOpLong(cu, opcode, rl_dest, rl_src[0], rl_src[0]);
500a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
501a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
502a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NEG_FLOAT:
503fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      res = GenArithOpFloat(cu, opcode, rl_dest, rl_src[0], rl_src[0]);
504a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
505a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
506a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NEG_DOUBLE:
507fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      res = GenArithOpDouble(cu, opcode, rl_dest, rl_src[0], rl_src[0]);
508a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
509a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
510a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INT_TO_LONG:
511fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenIntToLong(cu, rl_dest, rl_src[0]);
512a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
513a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
514a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::LONG_TO_INT:
515fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_src[0] = UpdateLocWide(cu, rl_src[0]);
516fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_src[0] = WideToNarrow(cu, rl_src[0]);
517fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      StoreValue(cu, rl_dest, rl_src[0]);
518a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
519a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
520a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INT_TO_BYTE:
521a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INT_TO_SHORT:
522a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INT_TO_CHAR:
523fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenIntNarrowing(cu, opcode, rl_dest, rl_src[0]);
524a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
525a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
526a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INT_TO_FLOAT:
527a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INT_TO_DOUBLE:
528a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::LONG_TO_FLOAT:
529a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::LONG_TO_DOUBLE:
530a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FLOAT_TO_INT:
531a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FLOAT_TO_LONG:
532a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FLOAT_TO_DOUBLE:
533a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DOUBLE_TO_INT:
534a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DOUBLE_TO_LONG:
535a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DOUBLE_TO_FLOAT:
536fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenConversion(cu, opcode, rl_dest, rl_src[0]);
537a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
538a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
539a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_INT:
540a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_INT:
541a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_INT:
542a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_INT:
543a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_INT:
544a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AND_INT:
545a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::OR_INT:
546a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::XOR_INT:
547a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHL_INT:
548a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHR_INT:
549a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::USHR_INT:
550a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_INT_2ADDR:
551a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_INT_2ADDR:
552a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_INT_2ADDR:
553a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_INT_2ADDR:
554a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_INT_2ADDR:
555a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AND_INT_2ADDR:
556a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::OR_INT_2ADDR:
557a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::XOR_INT_2ADDR:
558a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHL_INT_2ADDR:
559a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHR_INT_2ADDR:
560a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::USHR_INT_2ADDR:
561fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenArithOpInt(cu, opcode, rl_dest, rl_src[0], rl_src[1]);
562a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
563a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
564a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_LONG:
565a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_LONG:
566a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_LONG:
567a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_LONG:
568a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_LONG:
569a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AND_LONG:
570a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::OR_LONG:
571a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::XOR_LONG:
572a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_LONG_2ADDR:
573a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_LONG_2ADDR:
574a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_LONG_2ADDR:
575a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_LONG_2ADDR:
576a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_LONG_2ADDR:
577a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AND_LONG_2ADDR:
578a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::OR_LONG_2ADDR:
579a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::XOR_LONG_2ADDR:
580fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenArithOpLong(cu, opcode, rl_dest, rl_src[0], rl_src[1]);
581a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
582a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
583a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHL_LONG:
584a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHR_LONG:
585a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::USHR_LONG:
586a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHL_LONG_2ADDR:
587a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHR_LONG_2ADDR:
588a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::USHR_LONG_2ADDR:
589fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenShiftOpLong(cu, opcode, rl_dest, rl_src[0], rl_src[1]);
590a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
591a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
592a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_FLOAT:
593a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_FLOAT:
594a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_FLOAT:
595a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_FLOAT:
596a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_FLOAT:
597a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_FLOAT_2ADDR:
598a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_FLOAT_2ADDR:
599a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_FLOAT_2ADDR:
600a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_FLOAT_2ADDR:
601a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_FLOAT_2ADDR:
602fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenArithOpFloat(cu, opcode, rl_dest, rl_src[0], rl_src[1]);
603a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
604a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
605a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_DOUBLE:
606a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_DOUBLE:
607a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_DOUBLE:
608a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_DOUBLE:
609a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_DOUBLE:
610a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_DOUBLE_2ADDR:
611a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_DOUBLE_2ADDR:
612a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_DOUBLE_2ADDR:
613a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_DOUBLE_2ADDR:
614a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_DOUBLE_2ADDR:
615fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenArithOpDouble(cu, opcode, rl_dest, rl_src[0], rl_src[1]);
616a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
617a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
618a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::RSUB_INT:
619a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_INT_LIT16:
620a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_INT_LIT16:
621a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_INT_LIT16:
622a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_INT_LIT16:
623a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AND_INT_LIT16:
624a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::OR_INT_LIT16:
625a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::XOR_INT_LIT16:
626a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_INT_LIT8:
627a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::RSUB_INT_LIT8:
628a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_INT_LIT8:
629a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_INT_LIT8:
630a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_INT_LIT8:
631a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AND_INT_LIT8:
632a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::OR_INT_LIT8:
633a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::XOR_INT_LIT8:
634a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHL_INT_LIT8:
635a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHR_INT_LIT8:
636a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::USHR_INT_LIT8:
637fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenArithOpIntLit(cu, opcode, rl_dest, rl_src[0], vC);
638a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
639a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
640a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    default:
641a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      res = true;
642a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
643a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  return res;
644e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
645e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
646e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/* Extended MIR instructions like PHI */
647fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeestatic void HandleExtendedMethodMIR(CompilationUnit* cu, BasicBlock* bb, MIR* mir)
648e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
649fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  int op_offset = mir->dalvikInsn.opcode - kMirOpFirst;
650a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  char* msg = NULL;
651fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  if (cu->verbose) {
652fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    msg = static_cast<char*>(NewMem(cu, strlen(extended_mir_op_names[op_offset]) + 1,
653cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee                                    false, kAllocDebugInfo));
654fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    strcpy(msg, extended_mir_op_names[op_offset]);
655a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
656fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  LIR* op = NewLIR1(cu, kPseudoExtended, reinterpret_cast<uintptr_t>(msg));
657a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
658cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee  switch (static_cast<ExtendedMIROpcode>(mir->dalvikInsn.opcode)) {
659a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case kMirOpPhi: {
660fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      char* ssa_string = NULL;
661fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      if (cu->verbose) {
662fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        ssa_string = GetSSAString(cu, mir->ssa_rep);
663a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
664fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      op->flags.is_nop = true;
665fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      NewLIR1(cu, kPseudoSSARep, reinterpret_cast<uintptr_t>(ssa_string));
666a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
667a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
668a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case kMirOpCopy: {
669fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      RegLocation rl_src = GetSrc(cu, mir, 0);
670fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      RegLocation rl_dest = GetDest(cu, mir);
671fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      StoreValue(cu, rl_dest, rl_src);
672a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
673e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
674a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case kMirOpFusedCmplFloat:
675fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenFusedFPCmpBranch(cu, bb, mir, false /*gt bias*/, false /*double*/);
676a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
677a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case kMirOpFusedCmpgFloat:
678fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenFusedFPCmpBranch(cu, bb, mir, true /*gt bias*/, false /*double*/);
679a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
680a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case kMirOpFusedCmplDouble:
681fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenFusedFPCmpBranch(cu, bb, mir, false /*gt bias*/, true /*double*/);
682a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
683a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case kMirOpFusedCmpgDouble:
684fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenFusedFPCmpBranch(cu, bb, mir, true /*gt bias*/, true /*double*/);
685a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
686a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case kMirOpFusedCmpLong:
687fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      GenFusedLongCmpBranch(cu, bb, mir);
688a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
689a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    default:
690a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
691a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
692e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
693e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
694e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/* Handle the content in each basic block */
695fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeestatic bool MethodBlockCodeGen(CompilationUnit* cu, BasicBlock* bb)
696e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
697fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  if (bb->block_type == kDead) return false;
698fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  cu->current_dalvik_offset = bb->start_offset;
699a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  MIR* mir;
700fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  LIR* label_list = cu->block_label_list;
701fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  int block_id = bb->id;
702a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
703fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  cu->cur_block = bb;
704fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  label_list[block_id].operands[0] = bb->start_offset;
705a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
706a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  /* Insert the block label */
707fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  label_list[block_id].opcode = kPseudoNormalBlockLabel;
708fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  AppendLIR(cu, &label_list[block_id]);
709a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
710fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  LIR* head_lir = NULL;
7118320f3867c02bae9bef6cdab267820cb7b412781buzbee
712a5b3024aed77a8204d5fb48ba7f763fb8c60fa76Bill Buzbee  /* If this is a catch block, export the start address */
713fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  if (bb->catch_entry) {
714fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    head_lir = NewLIR0(cu, kPseudoExportedPC);
7158320f3867c02bae9bef6cdab267820cb7b412781buzbee  }
7168320f3867c02bae9bef6cdab267820cb7b412781buzbee
717a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  /* Free temp registers and reset redundant store tracking */
718fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  ResetRegPool(cu);
719fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  ResetDefTracking(cu);
720a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
721fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  ClobberAllRegs(cu);
722e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
723e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
724fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  if (bb->block_type == kEntryBlock) {
725fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    int start_vreg = cu->num_dalvik_registers - cu->num_ins;
726fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    GenEntrySequence(cu, &cu->reg_location[start_vreg],
727fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee                     cu->reg_location[cu->method_sreg]);
728fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  } else if (bb->block_type == kExitBlock) {
729fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    GenExitSequence(cu);
730a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
731a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
73228c9a83398a6e48eefb9b79a390920629bbb8519buzbee  for (mir = bb->first_mir_insn; mir != NULL; mir = mir->next) {
733fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    ResetRegPool(cu);
734fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    if (cu->disable_opt & (1 << kTrackLiveTemps)) {
735fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      ClobberAllRegs(cu);
736a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
737e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
738fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    if (cu->disable_opt & (1 << kSuppressLoads)) {
739fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      ResetDefTracking(cu);
740e196567b50a084b163937ea9605b51ee1e48adebbuzbee    }
741e196567b50a084b163937ea9605b51ee1e48adebbuzbee
742a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee#ifndef NDEBUG
743a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    /* Reset temp tracking sanity check */
744fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    cu->live_sreg = INVALID_SREG;
745a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee#endif
746a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
747fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    cu->current_dalvik_offset = mir->offset;
748c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee    int opcode = mir->dalvikInsn.opcode;
749fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    LIR* boundary_lir;
750e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
751a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    /* Mark the beginning of a Dalvik instruction for line tracking */
752fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    char* inst_str = cu->verbose ?
753fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee       GetDalvikDisassembly(cu, mir->dalvikInsn, "") : NULL;
754fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    boundary_lir = MarkBoundary(cu, mir->offset, inst_str);
755a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    /* Remember the first LIR for this block */
756fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    if (head_lir == NULL) {
757fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      head_lir = boundary_lir;
758fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      /* Set the first boundary_lir as a scheduling barrier */
759fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      head_lir->def_mask = ENCODE_ALL;
760e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
761e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
762a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    /* Don't generate the SSA annotation unless verbose mode is on */
763fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    if (cu->verbose && mir->ssa_rep) {
764fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      char* ssa_string = GetSSAString(cu, mir->ssa_rep);
765fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      NewLIR1(cu, kPseudoSSARep, reinterpret_cast<uintptr_t>(ssa_string));
766a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
767e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
768c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee    if (opcode == kMirOpCheck) {
769c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee      // Combine check and work halves of throwing instruction.
770fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      MIR* work_half = mir->meta.throw_insn;
771fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      mir->dalvikInsn.opcode = work_half->dalvikInsn.opcode;
772fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      opcode = work_half->dalvikInsn.opcode;
773fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      SSARepresentation* ssa_rep = work_half->ssa_rep;
774fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      work_half->ssa_rep = mir->ssa_rep;
775fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      mir->ssa_rep = ssa_rep;
776fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      work_half->dalvikInsn.opcode = static_cast<Instruction::Code>(kMirOpNop);
777c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee    }
778c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee
779c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee    if (opcode >= kMirOpFirst) {
780fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      HandleExtendedMethodMIR(cu, bb, mir);
781a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      continue;
782a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
783e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
784fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    bool not_handled = CompileDalvikInstruction(cu, mir, bb, label_list);
785fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    if (not_handled) {
786c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee      LOG(FATAL) << StringPrintf("%#06x: Opcode %#x (%s)",
787c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee                                 mir->offset, opcode,
788c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee                                 Instruction::Name(mir->dalvikInsn.opcode));
789e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
790a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
791e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
792fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  if (head_lir) {
793a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    /*
794a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * Eliminate redundant loads/stores and delay stores into later
795a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * slots
796a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     */
797fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    ApplyLocalOptimizations(cu, head_lir, cu->last_lir_insn);
798a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
799a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    /*
800a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     * Generate an unconditional branch to the fallthrough block.
801a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee     */
802fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    if (bb->fall_through) {
803fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      OpUnconditionalBranch(cu, &label_list[bb->fall_through->id]);
804e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
805a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
806a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  return false;
807e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
808e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
809fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeevoid SpecialMIR2LIR(CompilationUnit* cu, SpecialCaseHandler special_case)
81016da88c70c4bdbd97b8482be8b42103a52f22d59buzbee{
811a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  /* Find the first DalvikByteCode block */
812fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  int num_reachable_blocks = cu->num_reachable_blocks;
813fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  const GrowableList *block_list = &cu->block_list;
814a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  BasicBlock*bb = NULL;
815fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  for (int idx = 0; idx < num_reachable_blocks; idx++) {
816fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    int dfs_index = cu->dfs_order.elem_list[idx];
817fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    bb = reinterpret_cast<BasicBlock*>(GrowableListGetElement(block_list, dfs_index));
818fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    if (bb->block_type == kDalvikByteCode) {
819a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
82016da88c70c4bdbd97b8482be8b42103a52f22d59buzbee    }
821a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
822a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  if (bb == NULL) {
823a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    return;
824a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
825fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  DCHECK_EQ(bb->start_offset, 0);
826fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  DCHECK(bb->first_mir_insn != NULL);
827a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
828a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  /* Get the first instruction */
829fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  MIR* mir = bb->first_mir_insn;
830a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
831a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  /* Free temp registers and reset redundant store tracking */
832fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  ResetRegPool(cu);
833fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  ResetDefTracking(cu);
834fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  ClobberAllRegs(cu);
835a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
836fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  GenSpecialCase(cu, bb, mir, special_case);
83716da88c70c4bdbd97b8482be8b42103a52f22d59buzbee}
83816da88c70c4bdbd97b8482be8b42103a52f22d59buzbee
839fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeevoid MethodMIR2LIR(CompilationUnit* cu)
840e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
841a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  /* Used to hold the labels of each block */
842fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  cu->block_label_list =
843fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      static_cast<LIR*>(NewMem(cu, sizeof(LIR) * cu->num_blocks, true, kAllocLIR));
844e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
845fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  DataFlowAnalysisDispatcher(cu, MethodBlockCodeGen,
846a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee                                kPreOrderDFSTraversal, false /* Iterative */);
847ab2b55dfcf630fdf8d03b5f506386f114fa2874cIan Rogers
848fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  HandleSuspendLaunchPads(cu);
849e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
850fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  HandleThrowLaunchPads(cu);
851e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
852fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  HandleIntrinsicLaunchPads(cu);
853fc9e6fabed89d948fa8c0e9d673e430076712c60buzbee
854fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  if (!(cu->disable_opt & (1 << kSafeOptimizations))) {
855fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    RemoveRedundantBranches(cu);
856a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
857e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
858e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
859e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}  // namespace art
860