mir_to_lir.cc revision 311ca169f4727d46a55bdc8dfa0059719fa72b65
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
19395116cae130c983498c0a2f42b89e42f75bb9d0buzbee#include "compiler/dex/compiler_internals.h"
20311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee#include "compiler/dex/dataflow_iterator.h"
21eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee#include "local_optimizations.h"
221bc37c60da71c923ea9a2e99d31ba1b3d76d79a8buzbee#include "codegen_util.h"
231bc37c60da71c923ea9a2e99d31ba1b3d76d79a8buzbee#include "ralloc_util.h"
24eaf09bc65f9a10d12befcdb239156938c9bceef2buzbee
25e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeenamespace art {
26e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
27e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/*
28e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Target-independent code generation.  Use only high-level
29e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * load/store utilities here, or target-dependent genXX() handlers
30e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * when necessary.
31e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee */
32a5954be0aac5edd892fb31a209960543d00e4500buzbeestatic void CompileDalvikInstruction(CompilationUnit* cu, MIR* mir, BasicBlock* bb,
33fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee                                     LIR* label_list)
34e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
3502031b185b4653e6c72e21f7a51238b903f6d638buzbee  Codegen* cg = cu->cg.get();
36fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  RegLocation rl_src[3];
3702031b185b4653e6c72e21f7a51238b903f6d638buzbee  RegLocation rl_dest = GetBadLoc();
3802031b185b4653e6c72e21f7a51238b903f6d638buzbee  RegLocation rl_result = GetBadLoc();
39a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  Instruction::Code opcode = mir->dalvikInsn.opcode;
40fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  int opt_flags = mir->optimization_flags;
41408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee  uint32_t vB = mir->dalvikInsn.vB;
42408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee  uint32_t vC = mir->dalvikInsn.vC;
43a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
4402031b185b4653e6c72e21f7a51238b903f6d638buzbee  // Prep Src and Dest locations.
45fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  int next_sreg = 0;
46fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  int next_loc = 0;
47fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  int attrs = oat_data_flow_attributes[opcode];
4802031b185b4653e6c72e21f7a51238b903f6d638buzbee  rl_src[0] = rl_src[1] = rl_src[2] = GetBadLoc();
49a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  if (attrs & DF_UA) {
50bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    if (attrs & DF_A_WIDE) {
51fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_src[next_loc++] = GetSrcWide(cu, mir, next_sreg);
52fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      next_sreg+= 2;
53bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    } else {
54fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_src[next_loc++] = GetSrc(cu, mir, next_sreg);
55fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      next_sreg++;
56bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    }
57a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
58a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  if (attrs & DF_UB) {
59bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    if (attrs & DF_B_WIDE) {
60fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_src[next_loc++] = GetSrcWide(cu, mir, next_sreg);
61fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      next_sreg+= 2;
62bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    } else {
63fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_src[next_loc++] = GetSrc(cu, mir, next_sreg);
64fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      next_sreg++;
65bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    }
66a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
67a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  if (attrs & DF_UC) {
68bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    if (attrs & DF_C_WIDE) {
69fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_src[next_loc++] = GetSrcWide(cu, mir, next_sreg);
70bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    } else {
71fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_src[next_loc++] = GetSrc(cu, mir, next_sreg);
72bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    }
73a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
74a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  if (attrs & DF_DA) {
75bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    if (attrs & DF_A_WIDE) {
76fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_dest = GetDestWide(cu, mir);
77bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    } else {
78fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_dest = GetDest(cu, mir);
79bff2465abb4b0c097623c82f18a1307ea890bff1buzbee    }
80a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
81a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  switch (opcode) {
82a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NOP:
83a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
84a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
85474b6da273c7ce6df50a4e51eb9929a77e1611c3Ian Rogers    case Instruction::MOVE_EXCEPTION:
8602031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenMoveException(cu, rl_dest);
87a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
881eab958cde39a7e2f0e5ce01730f4e2e75c72519jeffhao
89a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::RETURN_VOID:
90fffdb023275613612a22ec62b3421ffe4d2b73feIan Rogers      if (((cu->access_flags & kAccConstructor) != 0) &&
911212a022fa5f8ef9585d765b1809521812af882cIan Rogers          cu->compiler_driver->RequiresConstructorBarrier(Thread::Current(), cu->dex_file,
921212a022fa5f8ef9585d765b1809521812af882cIan Rogers                                                          cu->class_def_idx)) {
93fffdb023275613612a22ec62b3421ffe4d2b73feIan Rogers        cg->GenMemBarrier(cu, kStoreStore);
94fffdb023275613612a22ec62b3421ffe4d2b73feIan Rogers      }
95311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee      if (!(cu->attributes & METHOD_IS_LEAF)) {
9602031b185b4653e6c72e21f7a51238b903f6d638buzbee        cg->GenSuspendTest(cu, opt_flags);
97a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
98a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
99a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
100a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::RETURN:
101a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::RETURN_OBJECT:
102311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee      if (!(cu->attributes & METHOD_IS_LEAF)) {
10302031b185b4653e6c72e21f7a51238b903f6d638buzbee        cg->GenSuspendTest(cu, opt_flags);
104a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
10502031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValue(cu, GetReturn(cu, cu->shorty[0] == 'F'), rl_src[0]);
106a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
107a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
108a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::RETURN_WIDE:
109311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee      if (!(cu->attributes & METHOD_IS_LEAF)) {
11002031b185b4653e6c72e21f7a51238b903f6d638buzbee        cg->GenSuspendTest(cu, opt_flags);
111a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
11202031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValueWide(cu, GetReturnWide(cu,
113fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee                       cu->shorty[0] == 'D'), rl_src[0]);
114a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
115a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
116a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_RESULT_WIDE:
117fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      if (opt_flags & MIR_INLINED)
11802031b185b4653e6c72e21f7a51238b903f6d638buzbee        break;  // Nop - combined w/ previous invoke.
11902031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValueWide(cu, rl_dest, GetReturnWide(cu, rl_dest.fp));
120a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
121a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
122a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_RESULT:
123a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_RESULT_OBJECT:
124fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      if (opt_flags & MIR_INLINED)
12502031b185b4653e6c72e21f7a51238b903f6d638buzbee        break;  // Nop - combined w/ previous invoke.
12602031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValue(cu, rl_dest, GetReturn(cu, rl_dest.fp));
127a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
128a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
129a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE:
130a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_OBJECT:
131a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_16:
132a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_OBJECT_16:
133a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_FROM16:
134a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_OBJECT_FROM16:
13502031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValue(cu, rl_dest, rl_src[0]);
136a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
137a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
138a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_WIDE:
139a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_WIDE_16:
140a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_WIDE_FROM16:
14102031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValueWide(cu, rl_dest, rl_src[0]);
142a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
143a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
144a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST:
145a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_4:
146a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_16:
147fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_result = EvalLoc(cu, rl_dest, kAnyReg, true);
14802031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->LoadConstantNoClobber(cu, rl_result.low_reg, vB);
14902031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValue(cu, rl_dest, rl_result);
1507da142fc1cefeeb24d997ae21b34381fdd2c0466buzbee      if (vB == 0) {
1517da142fc1cefeeb24d997ae21b34381fdd2c0466buzbee        cg->Workaround7250540(cu, rl_dest, rl_result.low_reg);
1527da142fc1cefeeb24d997ae21b34381fdd2c0466buzbee      }
153a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
154a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
155a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_HIGH16:
156fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_result = EvalLoc(cu, rl_dest, kAnyReg, true);
15702031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->LoadConstantNoClobber(cu, rl_result.low_reg, vB << 16);
15802031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValue(cu, rl_dest, rl_result);
1597da142fc1cefeeb24d997ae21b34381fdd2c0466buzbee      if (vB == 0) {
1607da142fc1cefeeb24d997ae21b34381fdd2c0466buzbee        cg->Workaround7250540(cu, rl_dest, rl_result.low_reg);
1617da142fc1cefeeb24d997ae21b34381fdd2c0466buzbee      }
162a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
163a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
164a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_WIDE_16:
165a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_WIDE_32:
166fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_result = EvalLoc(cu, rl_dest, kAnyReg, true);
1674ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee      cg->LoadConstantWide(cu, rl_result.low_reg, rl_result.high_reg,
1684ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee                           static_cast<int64_t>(static_cast<int32_t>(vB)));
16902031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValueWide(cu, rl_dest, rl_result);
170a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
171a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
172a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_WIDE:
173fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_result = EvalLoc(cu, rl_dest, kAnyReg, true);
1744ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee      cg->LoadConstantWide(cu, rl_result.low_reg, rl_result.high_reg, mir->dalvikInsn.vB_wide);
17502031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValueWide(cu, rl_dest, rl_result);
176a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
177a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
178a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_WIDE_HIGH16:
179fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_result = EvalLoc(cu, rl_dest, kAnyReg, true);
1804ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee      cg->LoadConstantWide(cu, rl_result.low_reg, rl_result.high_reg,
1814ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee                           static_cast<int64_t>(vB) << 48);
18202031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValueWide(cu, rl_dest, rl_result);
183a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
184a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
185a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MONITOR_ENTER:
18602031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenMonitorEnter(cu, opt_flags, rl_src[0]);
187a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
188a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
189a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MONITOR_EXIT:
19002031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenMonitorExit(cu, opt_flags, rl_src[0]);
191a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
192a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
193a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CHECK_CAST:
19402031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenCheckCast(cu, vB, rl_src[0]);
195a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
196a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
197a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INSTANCE_OF:
19802031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenInstanceof(cu, vC, rl_dest, rl_src[0]);
199a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
200a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
201a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NEW_INSTANCE:
20202031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenNewInstance(cu, vB, rl_dest);
203a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
204a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
205a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::THROW:
20602031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenThrow(cu, rl_src[0]);
207a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
208a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
209a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ARRAY_LENGTH:
210fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      int len_offset;
2112dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers      len_offset = mirror::Array::LengthOffset().Int32Value();
21202031b185b4653e6c72e21f7a51238b903f6d638buzbee      rl_src[0] = cg->LoadValue(cu, rl_src[0], kCoreReg);
21302031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenNullCheck(cu, rl_src[0].s_reg_low, rl_src[0].low_reg, opt_flags);
214fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_result = EvalLoc(cu, rl_dest, kCoreReg, true);
21502031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->LoadWordDisp(cu, rl_src[0].low_reg, len_offset, rl_result.low_reg);
21602031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValue(cu, rl_dest, rl_result);
217a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
218a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
219a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_STRING:
220a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_STRING_JUMBO:
22102031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenConstString(cu, vB, rl_dest);
222a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
223a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
224a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_CLASS:
22502031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenConstClass(cu, vB, rl_dest);
226a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
227a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
228a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FILL_ARRAY_DATA:
22902031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenFillArrayData(cu, vB, rl_src[0]);
230a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
231a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
232a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FILLED_NEW_ARRAY:
23302031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenFilledNewArray(cu, cg->NewMemCallInfo(cu, bb, mir, kStatic,
2343b3dbddcbc7a7bee505a608061304f9b26a91750buzbee                        false /* not range */));
235a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
236a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
237a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FILLED_NEW_ARRAY_RANGE:
23802031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenFilledNewArray(cu, cg->NewMemCallInfo(cu, bb, mir, kStatic,
2393b3dbddcbc7a7bee505a608061304f9b26a91750buzbee                        true /* range */));
240a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
241a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
242a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NEW_ARRAY:
24302031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenNewArray(cu, vC, rl_dest, rl_src[0]);
244a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
245a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
246a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::GOTO:
247a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::GOTO_16:
248a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::GOTO_32:
249fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      if (bb->taken->start_offset <= mir->offset) {
25002031b185b4653e6c72e21f7a51238b903f6d638buzbee        cg->GenSuspendTestAndBranch(cu, opt_flags, &label_list[bb->taken->id]);
251a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      } else {
25202031b185b4653e6c72e21f7a51238b903f6d638buzbee        cg->OpUnconditionalBranch(cu, &label_list[bb->taken->id]);
253a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
254a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
255a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
256a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::PACKED_SWITCH:
257311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee      cg->GenPackedSwitch(cu, mir, vB, rl_src[0]);
258a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
259a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
260a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPARSE_SWITCH:
261311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee      cg->GenSparseSwitch(cu, mir, vB, rl_src[0]);
262a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
263a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
264a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMPL_FLOAT:
265a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMPG_FLOAT:
266a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMPL_DOUBLE:
267a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMPG_DOUBLE:
268a5954be0aac5edd892fb31a209960543d00e4500buzbee      cg->GenCmpFP(cu, opcode, rl_dest, rl_src[0], rl_src[1]);
269a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
270a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
271a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMP_LONG:
27202031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenCmpLong(cu, rl_dest, rl_src[0], rl_src[1]);
273a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
274a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
275a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_EQ:
276a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_NE:
277a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_LT:
278a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_GE:
279a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_GT:
280a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_LE: {
281fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      LIR* taken = &label_list[bb->taken->id];
282fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      LIR* fall_through = &label_list[bb->fall_through->id];
283fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      bool backward_branch;
284fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      backward_branch = (bb->taken->start_offset <= mir->offset);
285e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee      // Result known at compile time?
286e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee      if (rl_src[0].is_const && rl_src[1].is_const) {
287311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee        bool is_taken = EvaluateBranch(opcode, cu->mir_graph->ConstantValue(rl_src[0].orig_sreg),
288311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee                                       cu->mir_graph->ConstantValue(rl_src[1].orig_sreg));
289e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee        if (is_taken && backward_branch) {
290e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee          cg->GenSuspendTest(cu, opt_flags);
291e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee        }
292e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee        int id = is_taken ? bb->taken->id : bb->fall_through->id;
293e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee        cg->OpUnconditionalBranch(cu, &label_list[id]);
294e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee      } else {
295e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee        if (backward_branch) {
296e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee          cg->GenSuspendTest(cu, opt_flags);
297e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee        }
298e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee        cg->GenCompareAndBranch(cu, opcode, rl_src[0], rl_src[1], taken,
299e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee                                fall_through);
300a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
301a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
302a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
303a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
304a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_EQZ:
305a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_NEZ:
306a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_LTZ:
307a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_GEZ:
308a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_GTZ:
309a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_LEZ: {
310fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      LIR* taken = &label_list[bb->taken->id];
311fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      LIR* fall_through = &label_list[bb->fall_through->id];
312fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      bool backward_branch;
313fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      backward_branch = (bb->taken->start_offset <= mir->offset);
314e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee      // Result known at compile time?
315e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee      if (rl_src[0].is_const) {
316311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee        bool is_taken = EvaluateBranch(opcode, cu->mir_graph->ConstantValue(rl_src[0].orig_sreg), 0);
317e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee        if (is_taken && backward_branch) {
318e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee          cg->GenSuspendTest(cu, opt_flags);
319e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee        }
320e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee        int id = is_taken ? bb->taken->id : bb->fall_through->id;
321e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee        cg->OpUnconditionalBranch(cu, &label_list[id]);
322e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee      } else {
323e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee        if (backward_branch) {
324e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee          cg->GenSuspendTest(cu, opt_flags);
325e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee        }
326e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee        cg->GenCompareZeroAndBranch(cu, opcode, rl_src[0], taken, fall_through);
327a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
328a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
329a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
330a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
331a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AGET_WIDE:
33202031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArrayGet(cu, opt_flags, kLong, rl_src[0], rl_src[1], rl_dest, 3);
333a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
334a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AGET:
335a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AGET_OBJECT:
33602031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArrayGet(cu, opt_flags, kWord, rl_src[0], rl_src[1], rl_dest, 2);
337a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
338a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AGET_BOOLEAN:
33902031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArrayGet(cu, opt_flags, kUnsignedByte, rl_src[0], rl_src[1], rl_dest, 0);
340a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
341a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AGET_BYTE:
34202031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArrayGet(cu, opt_flags, kSignedByte, rl_src[0], rl_src[1], rl_dest, 0);
343a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
344a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AGET_CHAR:
34502031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArrayGet(cu, opt_flags, kUnsignedHalf, rl_src[0], rl_src[1], rl_dest, 1);
346a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
347a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AGET_SHORT:
34802031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArrayGet(cu, opt_flags, kSignedHalf, rl_src[0], rl_src[1], rl_dest, 1);
349a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
350a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::APUT_WIDE:
35102031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArrayPut(cu, opt_flags, kLong, rl_src[1], rl_src[2], rl_src[0], 3);
352a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
353a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::APUT:
35402031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArrayPut(cu, opt_flags, kWord, rl_src[1], rl_src[2], rl_src[0], 2);
355a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
356a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::APUT_OBJECT:
35702031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArrayObjPut(cu, opt_flags, rl_src[1], rl_src[2], rl_src[0], 2);
358a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
359a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::APUT_SHORT:
360a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::APUT_CHAR:
36102031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArrayPut(cu, opt_flags, kUnsignedHalf, rl_src[1], rl_src[2], rl_src[0], 1);
362a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
363a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::APUT_BYTE:
364a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::APUT_BOOLEAN:
36502031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArrayPut(cu, opt_flags, kUnsignedByte, rl_src[1], rl_src[2],
366fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee            rl_src[0], 0);
367a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
368a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
369a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IGET_OBJECT:
37002031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIGet(cu, vC, opt_flags, kWord, rl_dest, rl_src[0], false, true);
371a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
372a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
373a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IGET_WIDE:
37402031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIGet(cu, vC, opt_flags, kLong, rl_dest, rl_src[0], true, false);
375a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
376a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
377a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IGET:
37802031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIGet(cu, vC, opt_flags, kWord, rl_dest, rl_src[0], false, false);
379a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
380a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
381a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IGET_CHAR:
38202031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIGet(cu, vC, opt_flags, kUnsignedHalf, rl_dest, rl_src[0], false, false);
383a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
384a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
385a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IGET_SHORT:
38602031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIGet(cu, vC, opt_flags, kSignedHalf, rl_dest, rl_src[0], false, false);
387a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
388a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
389a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IGET_BOOLEAN:
390a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IGET_BYTE:
39102031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIGet(cu, vC, opt_flags, kUnsignedByte, rl_dest, rl_src[0], false, false);
392a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
393a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
394a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IPUT_WIDE:
39502031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIPut(cu, vC, opt_flags, kLong, rl_src[0], rl_src[1], true, false);
396a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
397a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
398a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IPUT_OBJECT:
39902031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIPut(cu, vC, opt_flags, kWord, rl_src[0], rl_src[1], false, true);
400a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
401a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
402a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IPUT:
40302031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIPut(cu, vC, opt_flags, kWord, rl_src[0], rl_src[1], false, false);
404a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
405a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
406a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IPUT_BOOLEAN:
407a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IPUT_BYTE:
40802031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIPut(cu, vC, opt_flags, kUnsignedByte, rl_src[0], rl_src[1], false, false);
409a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
410a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
411a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IPUT_CHAR:
41202031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIPut(cu, vC, opt_flags, kUnsignedHalf, rl_src[0], rl_src[1], false, false);
413a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
414a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
415a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IPUT_SHORT:
41602031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIPut(cu, vC, opt_flags, kSignedHalf, rl_src[0], rl_src[1], false, false);
417a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
418a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
419a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SGET_OBJECT:
42002031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenSget(cu, vB, rl_dest, false, true);
421a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
422a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SGET:
423a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SGET_BOOLEAN:
424a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SGET_BYTE:
425a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SGET_CHAR:
426a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SGET_SHORT:
42702031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenSget(cu, vB, rl_dest, false, false);
428a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
429a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
430a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SGET_WIDE:
43102031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenSget(cu, vB, rl_dest, true, false);
432a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
433a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
434a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPUT_OBJECT:
43502031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenSput(cu, vB, rl_src[0], false, true);
436a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
437a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
438a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPUT:
439a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPUT_BOOLEAN:
440a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPUT_BYTE:
441a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPUT_CHAR:
442a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPUT_SHORT:
44302031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenSput(cu, vB, rl_src[0], false, false);
444a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
445a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
446a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPUT_WIDE:
44702031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenSput(cu, vB, rl_src[0], true, false);
448a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
449a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
450a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_STATIC_RANGE:
45102031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kStatic, true));
452a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
453a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_STATIC:
45402031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kStatic, false));
455a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
456a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
457a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_DIRECT:
45802031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kDirect, false));
459a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
460a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_DIRECT_RANGE:
46102031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kDirect, true));
462a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
463a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
464a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_VIRTUAL:
46502031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kVirtual, false));
466a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
467a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_VIRTUAL_RANGE:
46802031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kVirtual, true));
469a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
470a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
471a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_SUPER:
47202031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kSuper, false));
473a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
474a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_SUPER_RANGE:
47502031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kSuper, true));
476a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
477a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
478a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_INTERFACE:
47902031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kInterface, false));
480a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
481a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_INTERFACE_RANGE:
48202031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kInterface, true));
483a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
484a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
485a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NEG_INT:
486a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NOT_INT:
487a5954be0aac5edd892fb31a209960543d00e4500buzbee      cg->GenArithOpInt(cu, opcode, rl_dest, rl_src[0], rl_src[0]);
488a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
489a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
490a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NEG_LONG:
491a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NOT_LONG:
492a5954be0aac5edd892fb31a209960543d00e4500buzbee      cg->GenArithOpLong(cu, opcode, rl_dest, rl_src[0], rl_src[0]);
493a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
494a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
495a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NEG_FLOAT:
496a5954be0aac5edd892fb31a209960543d00e4500buzbee      cg->GenArithOpFloat(cu, opcode, rl_dest, rl_src[0], rl_src[0]);
497a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
498a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
499a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NEG_DOUBLE:
500a5954be0aac5edd892fb31a209960543d00e4500buzbee      cg->GenArithOpDouble(cu, opcode, rl_dest, rl_src[0], rl_src[0]);
501a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
502a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
503a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INT_TO_LONG:
50402031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIntToLong(cu, rl_dest, rl_src[0]);
505a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
506a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
507a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::LONG_TO_INT:
508fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_src[0] = UpdateLocWide(cu, rl_src[0]);
509fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_src[0] = WideToNarrow(cu, rl_src[0]);
51002031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValue(cu, rl_dest, rl_src[0]);
511a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
512a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
513a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INT_TO_BYTE:
514a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INT_TO_SHORT:
515a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INT_TO_CHAR:
51602031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIntNarrowing(cu, opcode, rl_dest, rl_src[0]);
517a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
518a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
519a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INT_TO_FLOAT:
520a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INT_TO_DOUBLE:
521a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::LONG_TO_FLOAT:
522a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::LONG_TO_DOUBLE:
523a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FLOAT_TO_INT:
524a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FLOAT_TO_LONG:
525a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FLOAT_TO_DOUBLE:
526a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DOUBLE_TO_INT:
527a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DOUBLE_TO_LONG:
528a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DOUBLE_TO_FLOAT:
52902031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenConversion(cu, opcode, rl_dest, rl_src[0]);
530a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
531a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
532e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee
533a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_INT:
534e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee    case Instruction::ADD_INT_2ADDR:
535a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_INT:
536e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee    case Instruction::MUL_INT_2ADDR:
537a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AND_INT:
538e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee    case Instruction::AND_INT_2ADDR:
539a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::OR_INT:
540e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee    case Instruction::OR_INT_2ADDR:
541a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::XOR_INT:
542e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee    case Instruction::XOR_INT_2ADDR:
543e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee      if (rl_src[0].is_const &&
544311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee          cu->cg->InexpensiveConstantInt(cu->mir_graph->ConstantValue(rl_src[0]))) {
545e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee        cg->GenArithOpIntLit(cu, opcode, rl_dest, rl_src[1],
546311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee                             cu->mir_graph->ConstantValue(rl_src[0].orig_sreg));
547e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee      } else if (rl_src[1].is_const &&
548311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee          cu->cg->InexpensiveConstantInt(cu->mir_graph->ConstantValue(rl_src[1]))) {
549e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee        cg->GenArithOpIntLit(cu, opcode, rl_dest, rl_src[0],
550311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee                             cu->mir_graph->ConstantValue(rl_src[1].orig_sreg));
551e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee      } else {
552e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee        cg->GenArithOpInt(cu, opcode, rl_dest, rl_src[0], rl_src[1]);
553e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee      }
554e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee      break;
555e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee
556e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee    case Instruction::SUB_INT:
557a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_INT_2ADDR:
558e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee    case Instruction::DIV_INT:
559a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_INT_2ADDR:
560e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee    case Instruction::REM_INT:
561a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_INT_2ADDR:
562e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee    case Instruction::SHL_INT:
563a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHL_INT_2ADDR:
564e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee    case Instruction::SHR_INT:
565a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHR_INT_2ADDR:
566e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee    case Instruction::USHR_INT:
567a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::USHR_INT_2ADDR:
568e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee      if (rl_src[1].is_const &&
569311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee          cu->cg->InexpensiveConstantInt(cu->mir_graph->ConstantValue(rl_src[1]))) {
570311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee        cg->GenArithOpIntLit(cu, opcode, rl_dest, rl_src[0], cu->mir_graph->ConstantValue(rl_src[1]));
571e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee      } else {
572e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee        cg->GenArithOpInt(cu, opcode, rl_dest, rl_src[0], rl_src[1]);
573e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee      }
574a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
575a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
576a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_LONG:
577a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_LONG:
578a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AND_LONG:
579a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::OR_LONG:
580a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::XOR_LONG:
581a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_LONG_2ADDR:
582a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_LONG_2ADDR:
583a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AND_LONG_2ADDR:
584a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::OR_LONG_2ADDR:
585a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::XOR_LONG_2ADDR:
5864ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee      if (rl_src[0].is_const || rl_src[1].is_const) {
5874ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee        cg->GenArithImmOpLong(cu, opcode, rl_dest, rl_src[0], rl_src[1]);
5884ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee        break;
5894ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee      }
5904ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee      // Note: intentional fallthrough.
5914ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee
5924ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee    case Instruction::MUL_LONG:
5934ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee    case Instruction::DIV_LONG:
5944ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee    case Instruction::REM_LONG:
5954ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee    case Instruction::MUL_LONG_2ADDR:
5964ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee    case Instruction::DIV_LONG_2ADDR:
5974ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee    case Instruction::REM_LONG_2ADDR:
59802031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArithOpLong(cu, opcode, rl_dest, rl_src[0], rl_src[1]);
599a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
600a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
601a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHL_LONG:
602a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHR_LONG:
603a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::USHR_LONG:
604a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHL_LONG_2ADDR:
605a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHR_LONG_2ADDR:
606a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::USHR_LONG_2ADDR:
6074ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee      if (rl_src[1].is_const) {
6084ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee        cg->GenShiftImmOpLong(cu, opcode, rl_dest, rl_src[0], rl_src[1]);
6094ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee      } else {
6104ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee        cg->GenShiftOpLong(cu, opcode, rl_dest, rl_src[0], rl_src[1]);
6114ef3e45d7c6ec3c482a1a48f4df470811aa3cf0abuzbee      }
612a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
613a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
614a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_FLOAT:
615a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_FLOAT:
616a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_FLOAT:
617a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_FLOAT:
618a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_FLOAT:
619a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_FLOAT_2ADDR:
620a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_FLOAT_2ADDR:
621a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_FLOAT_2ADDR:
622a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_FLOAT_2ADDR:
623a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_FLOAT_2ADDR:
62402031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArithOpFloat(cu, opcode, rl_dest, rl_src[0], rl_src[1]);
625a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
626a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
627a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_DOUBLE:
628a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_DOUBLE:
629a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_DOUBLE:
630a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_DOUBLE:
631a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_DOUBLE:
632a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_DOUBLE_2ADDR:
633a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_DOUBLE_2ADDR:
634a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_DOUBLE_2ADDR:
635a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_DOUBLE_2ADDR:
636a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_DOUBLE_2ADDR:
63702031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArithOpDouble(cu, opcode, rl_dest, rl_src[0], rl_src[1]);
638a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
639a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
640a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::RSUB_INT:
641a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_INT_LIT16:
642a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_INT_LIT16:
643a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_INT_LIT16:
644a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_INT_LIT16:
645a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AND_INT_LIT16:
646a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::OR_INT_LIT16:
647a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::XOR_INT_LIT16:
648a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_INT_LIT8:
649a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::RSUB_INT_LIT8:
650a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_INT_LIT8:
651a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_INT_LIT8:
652a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_INT_LIT8:
653a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AND_INT_LIT8:
654a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::OR_INT_LIT8:
655a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::XOR_INT_LIT8:
656a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHL_INT_LIT8:
657a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHR_INT_LIT8:
658a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::USHR_INT_LIT8:
65902031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArithOpIntLit(cu, opcode, rl_dest, rl_src[0], vC);
660a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
661a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
662a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    default:
663a5954be0aac5edd892fb31a209960543d00e4500buzbee      LOG(FATAL) << "Unexpected opcode: " << opcode;
664a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
665e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
666e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
667a169e1d8d968800380245cda450505d969ebff76buzbee// Process extended MIR instructions
668fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeestatic void HandleExtendedMethodMIR(CompilationUnit* cu, BasicBlock* bb, MIR* mir)
669e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
67002031b185b4653e6c72e21f7a51238b903f6d638buzbee  Codegen* cg = cu->cg.get();
671cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee  switch (static_cast<ExtendedMIROpcode>(mir->dalvikInsn.opcode)) {
672a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case kMirOpCopy: {
673fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      RegLocation rl_src = GetSrc(cu, mir, 0);
674fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      RegLocation rl_dest = GetDest(cu, mir);
67502031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValue(cu, rl_dest, rl_src);
676a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
677e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
678a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case kMirOpFusedCmplFloat:
67902031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenFusedFPCmpBranch(cu, bb, mir, false /*gt bias*/, false /*double*/);
680a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
681a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case kMirOpFusedCmpgFloat:
68202031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenFusedFPCmpBranch(cu, bb, mir, true /*gt bias*/, false /*double*/);
683a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
684a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case kMirOpFusedCmplDouble:
68502031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenFusedFPCmpBranch(cu, bb, mir, false /*gt bias*/, true /*double*/);
686a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
687a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case kMirOpFusedCmpgDouble:
68802031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenFusedFPCmpBranch(cu, bb, mir, true /*gt bias*/, true /*double*/);
689a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
690a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case kMirOpFusedCmpLong:
69102031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenFusedLongCmpBranch(cu, bb, mir);
692a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
693f662a7c625b1067f61b23c04459eba9b12bc027ebuzbee    case kMirOpSelect:
694f662a7c625b1067f61b23c04459eba9b12bc027ebuzbee      cg->GenSelect(cu, bb, mir);
695f662a7c625b1067f61b23c04459eba9b12bc027ebuzbee      break;
696a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    default:
697a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
698a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
699e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
700e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
70102031b185b4653e6c72e21f7a51238b903f6d638buzbee// Handle the content in each basic block.
702fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeestatic bool MethodBlockCodeGen(CompilationUnit* cu, BasicBlock* bb)
703e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
704fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  if (bb->block_type == kDead) return false;
70502031b185b4653e6c72e21f7a51238b903f6d638buzbee  Codegen* cg = cu->cg.get();
706fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  cu->current_dalvik_offset = bb->start_offset;
707a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  MIR* mir;
708fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  LIR* label_list = cu->block_label_list;
709fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  int block_id = bb->id;
710a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
711fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  label_list[block_id].operands[0] = bb->start_offset;
712a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
71302031b185b4653e6c72e21f7a51238b903f6d638buzbee  // Insert the block label.
714fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  label_list[block_id].opcode = kPseudoNormalBlockLabel;
715fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  AppendLIR(cu, &label_list[block_id]);
716a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
717fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  LIR* head_lir = NULL;
7188320f3867c02bae9bef6cdab267820cb7b412781buzbee
71902031b185b4653e6c72e21f7a51238b903f6d638buzbee  // If this is a catch block, export the start address.
720fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  if (bb->catch_entry) {
721fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    head_lir = NewLIR0(cu, kPseudoExportedPC);
7228320f3867c02bae9bef6cdab267820cb7b412781buzbee  }
7238320f3867c02bae9bef6cdab267820cb7b412781buzbee
72402031b185b4653e6c72e21f7a51238b903f6d638buzbee  // Free temp registers and reset redundant store tracking.
725fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  ResetRegPool(cu);
726fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  ResetDefTracking(cu);
727a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
728fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  ClobberAllRegs(cu);
729e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
730fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  if (bb->block_type == kEntryBlock) {
731fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    int start_vreg = cu->num_dalvik_registers - cu->num_ins;
73202031b185b4653e6c72e21f7a51238b903f6d638buzbee    cg->GenEntrySequence(cu, &cu->reg_location[start_vreg],
73302031b185b4653e6c72e21f7a51238b903f6d638buzbee                         cu->reg_location[cu->method_sreg]);
734fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  } else if (bb->block_type == kExitBlock) {
73502031b185b4653e6c72e21f7a51238b903f6d638buzbee    cg->GenExitSequence(cu);
736a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
737a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
73828c9a83398a6e48eefb9b79a390920629bbb8519buzbee  for (mir = bb->first_mir_insn; mir != NULL; mir = mir->next) {
739fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    ResetRegPool(cu);
740fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    if (cu->disable_opt & (1 << kTrackLiveTemps)) {
741fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      ClobberAllRegs(cu);
742a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
743e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
744fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    if (cu->disable_opt & (1 << kSuppressLoads)) {
745fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      ResetDefTracking(cu);
746e196567b50a084b163937ea9605b51ee1e48adebbuzbee    }
747e196567b50a084b163937ea9605b51ee1e48adebbuzbee
74802031b185b4653e6c72e21f7a51238b903f6d638buzbee    // Reset temp tracking sanity check.
749311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee    if (kIsDebugBuild) {
750311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee      cu->live_sreg = INVALID_SREG;
751311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee    }
752a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
753fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    cu->current_dalvik_offset = mir->offset;
754c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee    int opcode = mir->dalvikInsn.opcode;
755fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    LIR* boundary_lir;
756e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
75702031b185b4653e6c72e21f7a51238b903f6d638buzbee    // Mark the beginning of a Dalvik instruction for line tracking.
758fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    char* inst_str = cu->verbose ?
759a169e1d8d968800380245cda450505d969ebff76buzbee       GetDalvikDisassembly(cu, mir) : NULL;
760fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    boundary_lir = MarkBoundary(cu, mir->offset, inst_str);
76102031b185b4653e6c72e21f7a51238b903f6d638buzbee    // Remember the first LIR for this block.
762fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    if (head_lir == NULL) {
763fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      head_lir = boundary_lir;
76402031b185b4653e6c72e21f7a51238b903f6d638buzbee      // Set the first boundary_lir as a scheduling barrier.
765fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      head_lir->def_mask = ENCODE_ALL;
766e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
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;
776a169e1d8d968800380245cda450505d969ebff76buzbee      work_half->dalvikInsn.opcode = static_cast<Instruction::Code>(kMirOpCheckPart2);
777c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee    }
778c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee
779c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee    if (opcode >= kMirOpFirst) {
780fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      HandleExtendedMethodMIR(cu, bb, mir);
781a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      continue;
782a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
783e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
784a5954be0aac5edd892fb31a209960543d00e4500buzbee    CompileDalvikInstruction(cu, mir, bb, label_list);
785a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
786e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
787fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  if (head_lir) {
78802031b185b4653e6c72e21f7a51238b903f6d638buzbee    // Eliminate redundant loads/stores and delay stores into later slots.
789fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    ApplyLocalOptimizations(cu, head_lir, cu->last_lir_insn);
790a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
79102031b185b4653e6c72e21f7a51238b903f6d638buzbee    // Generate an unconditional branch to the fallthrough block.
792fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    if (bb->fall_through) {
79302031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->OpUnconditionalBranch(cu, &label_list[bb->fall_through->id]);
794e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
795a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
796a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  return false;
797e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
798e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
799fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeevoid SpecialMIR2LIR(CompilationUnit* cu, SpecialCaseHandler special_case)
80016da88c70c4bdbd97b8482be8b42103a52f22d59buzbee{
80102031b185b4653e6c72e21f7a51238b903f6d638buzbee  Codegen* cg = cu->cg.get();
80202031b185b4653e6c72e21f7a51238b903f6d638buzbee  // Find the first DalvikByteCode block.
803311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee  int num_reachable_blocks = cu->mir_graph->GetNumReachableBlocks();
804a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  BasicBlock*bb = NULL;
805fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  for (int idx = 0; idx < num_reachable_blocks; idx++) {
806311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee    // TODO: no direct access of growable lists.
807311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee    int dfs_index = cu->mir_graph->GetDfsOrder()->elem_list[idx];
808311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee    bb = cu->mir_graph->GetBasicBlock(dfs_index);
809fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    if (bb->block_type == kDalvikByteCode) {
810a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
81116da88c70c4bdbd97b8482be8b42103a52f22d59buzbee    }
812a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
813a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  if (bb == NULL) {
814a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    return;
815a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
816fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  DCHECK_EQ(bb->start_offset, 0);
817fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  DCHECK(bb->first_mir_insn != NULL);
818a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
81902031b185b4653e6c72e21f7a51238b903f6d638buzbee  // Get the first instruction.
820fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  MIR* mir = bb->first_mir_insn;
821a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
82202031b185b4653e6c72e21f7a51238b903f6d638buzbee  // Free temp registers and reset redundant store tracking.
823fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  ResetRegPool(cu);
824fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  ResetDefTracking(cu);
825fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  ClobberAllRegs(cu);
826a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
82702031b185b4653e6c72e21f7a51238b903f6d638buzbee  cg->GenSpecialCase(cu, bb, mir, special_case);
82816da88c70c4bdbd97b8482be8b42103a52f22d59buzbee}
82916da88c70c4bdbd97b8482be8b42103a52f22d59buzbee
830fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeevoid MethodMIR2LIR(CompilationUnit* cu)
831e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
83202031b185b4653e6c72e21f7a51238b903f6d638buzbee  Codegen* cg = cu->cg.get();
83302031b185b4653e6c72e21f7a51238b903f6d638buzbee  // Hold the labels of each block.
834fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  cu->block_label_list =
835311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee      static_cast<LIR*>(NewMem(cu, sizeof(LIR) * cu->mir_graph->GetNumBlocks(), true, kAllocLIR));
836e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
837311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee  DataflowIterator iter(cu->mir_graph.get(), kPreOrderDFSTraversal, false /* not iterative */);
838311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee  for (BasicBlock* bb = iter.Next(); bb != NULL; bb = iter.Next()) {
839311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee    MethodBlockCodeGen(cu, bb);
840311ca169f4727d46a55bdc8dfa0059719fa72b65buzbee  }
841ab2b55dfcf630fdf8d03b5f506386f114fa2874cIan Rogers
84202031b185b4653e6c72e21f7a51238b903f6d638buzbee  cg->HandleSuspendLaunchPads(cu);
843e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
84402031b185b4653e6c72e21f7a51238b903f6d638buzbee  cg->HandleThrowLaunchPads(cu);
845e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
84602031b185b4653e6c72e21f7a51238b903f6d638buzbee  cg->HandleIntrinsicLaunchPads(cu);
847fc9e6fabed89d948fa8c0e9d673e430076712c60buzbee
848fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  if (!(cu->disable_opt & (1 << kSafeOptimizations))) {
849fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    RemoveRedundantBranches(cu);
850a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
851e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
852e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
853e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}  // namespace art
854