mir_to_lir.cc revision 7da142fc1cefeeb24d997ae21b34381fdd2c0466
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
26e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/*
27e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Target-independent code generation.  Use only high-level
28e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * load/store utilities here, or target-dependent genXX() handlers
29e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * when necessary.
30e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee */
31fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeestatic bool CompileDalvikInstruction(CompilationUnit* cu, MIR* mir, BasicBlock* bb,
32fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee                                     LIR* label_list)
33e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
3402031b185b4653e6c72e21f7a51238b903f6d638buzbee  Codegen* cg = cu->cg.get();
35a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  bool res = false;   // Assume success
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;
88a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::RETURN_VOID:
89fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      if (!(cu->attrs & METHOD_IS_LEAF)) {
9002031b185b4653e6c72e21f7a51238b903f6d638buzbee        cg->GenSuspendTest(cu, opt_flags);
91a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
92a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
93a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
94a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::RETURN:
95a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::RETURN_OBJECT:
96fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      if (!(cu->attrs & METHOD_IS_LEAF)) {
9702031b185b4653e6c72e21f7a51238b903f6d638buzbee        cg->GenSuspendTest(cu, opt_flags);
98a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
9902031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValue(cu, GetReturn(cu, cu->shorty[0] == 'F'), rl_src[0]);
100a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
101a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
102a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::RETURN_WIDE:
103fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      if (!(cu->attrs & METHOD_IS_LEAF)) {
10402031b185b4653e6c72e21f7a51238b903f6d638buzbee        cg->GenSuspendTest(cu, opt_flags);
105a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
10602031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValueWide(cu, GetReturnWide(cu,
107fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee                       cu->shorty[0] == 'D'), rl_src[0]);
108a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
109a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
110a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_RESULT_WIDE:
111fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      if (opt_flags & MIR_INLINED)
11202031b185b4653e6c72e21f7a51238b903f6d638buzbee        break;  // Nop - combined w/ previous invoke.
11302031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValueWide(cu, rl_dest, GetReturnWide(cu, rl_dest.fp));
114a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
115a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
116a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_RESULT:
117a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_RESULT_OBJECT:
118fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      if (opt_flags & MIR_INLINED)
11902031b185b4653e6c72e21f7a51238b903f6d638buzbee        break;  // Nop - combined w/ previous invoke.
12002031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValue(cu, rl_dest, GetReturn(cu, rl_dest.fp));
121a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
122a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
123a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE:
124a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_OBJECT:
125a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_16:
126a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_OBJECT_16:
127a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_FROM16:
128a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_OBJECT_FROM16:
12902031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValue(cu, rl_dest, rl_src[0]);
130a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
131a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
132a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_WIDE:
133a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_WIDE_16:
134a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MOVE_WIDE_FROM16:
13502031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValueWide(cu, rl_dest, rl_src[0]);
136a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
137a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
138a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST:
139a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_4:
140a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_16:
141fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_result = EvalLoc(cu, rl_dest, kAnyReg, true);
14202031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->LoadConstantNoClobber(cu, rl_result.low_reg, vB);
14302031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValue(cu, rl_dest, rl_result);
1447da142fc1cefeeb24d997ae21b34381fdd2c0466buzbee      if (vB == 0) {
1457da142fc1cefeeb24d997ae21b34381fdd2c0466buzbee        cg->Workaround7250540(cu, rl_dest, rl_result.low_reg);
1467da142fc1cefeeb24d997ae21b34381fdd2c0466buzbee      }
147a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
148a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
149a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_HIGH16:
150fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_result = EvalLoc(cu, rl_dest, kAnyReg, true);
15102031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->LoadConstantNoClobber(cu, rl_result.low_reg, vB << 16);
15202031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValue(cu, rl_dest, rl_result);
1537da142fc1cefeeb24d997ae21b34381fdd2c0466buzbee      if (vB == 0) {
1547da142fc1cefeeb24d997ae21b34381fdd2c0466buzbee        cg->Workaround7250540(cu, rl_dest, rl_result.low_reg);
1557da142fc1cefeeb24d997ae21b34381fdd2c0466buzbee      }
156a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
157a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
158a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_WIDE_16:
159a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_WIDE_32:
160fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_result = EvalLoc(cu, rl_dest, kAnyReg, true);
16102031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->LoadConstantValueWide(cu, rl_result.low_reg, rl_result.high_reg, vB,
162408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee                            (vB & 0x80000000) ? -1 : 0);
16302031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValueWide(cu, rl_dest, rl_result);
164a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
165a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
166a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_WIDE:
167fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_result = EvalLoc(cu, rl_dest, kAnyReg, true);
16802031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->LoadConstantValueWide(cu, rl_result.low_reg, rl_result.high_reg,
169a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee                            mir->dalvikInsn.vB_wide & 0xffffffff,
170a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee                            (mir->dalvikInsn.vB_wide >> 32) & 0xffffffff);
17102031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValueWide(cu, rl_dest, rl_result);
172a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
173a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
174a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_WIDE_HIGH16:
175fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_result = EvalLoc(cu, rl_dest, kAnyReg, true);
17602031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->LoadConstantValueWide(cu, rl_result.low_reg, rl_result.high_reg,
177408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee                            0, vB << 16);
17802031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValueWide(cu, rl_dest, rl_result);
179a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
180a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
181a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MONITOR_ENTER:
18202031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenMonitorEnter(cu, opt_flags, rl_src[0]);
183a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
184a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
185a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MONITOR_EXIT:
18602031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenMonitorExit(cu, opt_flags, rl_src[0]);
187a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
188a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
189a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CHECK_CAST:
19002031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenCheckCast(cu, vB, rl_src[0]);
191a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
192a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
193a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INSTANCE_OF:
19402031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenInstanceof(cu, vC, rl_dest, rl_src[0]);
195a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
196a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
197a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NEW_INSTANCE:
19802031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenNewInstance(cu, vB, rl_dest);
199a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
200a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
201a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::THROW:
20202031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenThrow(cu, rl_src[0]);
203a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
204a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
205a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ARRAY_LENGTH:
206fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      int len_offset;
207fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      len_offset = Array::LengthOffset().Int32Value();
20802031b185b4653e6c72e21f7a51238b903f6d638buzbee      rl_src[0] = cg->LoadValue(cu, rl_src[0], kCoreReg);
20902031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenNullCheck(cu, rl_src[0].s_reg_low, rl_src[0].low_reg, opt_flags);
210fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_result = EvalLoc(cu, rl_dest, kCoreReg, true);
21102031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->LoadWordDisp(cu, rl_src[0].low_reg, len_offset, rl_result.low_reg);
21202031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValue(cu, rl_dest, rl_result);
213a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
214a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
215a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_STRING:
216a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_STRING_JUMBO:
21702031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenConstString(cu, vB, rl_dest);
218a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
219a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
220a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CONST_CLASS:
22102031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenConstClass(cu, vB, rl_dest);
222a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
223a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
224a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FILL_ARRAY_DATA:
22502031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenFillArrayData(cu, vB, rl_src[0]);
226a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
227a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
228a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FILLED_NEW_ARRAY:
22902031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenFilledNewArray(cu, cg->NewMemCallInfo(cu, bb, mir, kStatic,
2303b3dbddcbc7a7bee505a608061304f9b26a91750buzbee                        false /* not range */));
231a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
232a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
233a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FILLED_NEW_ARRAY_RANGE:
23402031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenFilledNewArray(cu, cg->NewMemCallInfo(cu, bb, mir, kStatic,
2353b3dbddcbc7a7bee505a608061304f9b26a91750buzbee                        true /* range */));
236a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
237a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
238a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NEW_ARRAY:
23902031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenNewArray(cu, vC, rl_dest, rl_src[0]);
240a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
241a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
242a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::GOTO:
243a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::GOTO_16:
244a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::GOTO_32:
245fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      if (bb->taken->start_offset <= mir->offset) {
24602031b185b4653e6c72e21f7a51238b903f6d638buzbee        cg->GenSuspendTestAndBranch(cu, opt_flags, &label_list[bb->taken->id]);
247a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      } else {
24802031b185b4653e6c72e21f7a51238b903f6d638buzbee        cg->OpUnconditionalBranch(cu, &label_list[bb->taken->id]);
249a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
250a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
251a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
252a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::PACKED_SWITCH:
25302031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenPackedSwitch(cu, vB, rl_src[0]);
254a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
255a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
256a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPARSE_SWITCH:
25702031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenSparseSwitch(cu, vB, rl_src[0]);
258a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
259a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
260a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMPL_FLOAT:
261a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMPG_FLOAT:
262a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMPL_DOUBLE:
263a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMPG_DOUBLE:
26402031b185b4653e6c72e21f7a51238b903f6d638buzbee      res = cg->GenCmpFP(cu, opcode, rl_dest, rl_src[0], rl_src[1]);
265a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
266a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
267a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::CMP_LONG:
26802031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenCmpLong(cu, rl_dest, rl_src[0], rl_src[1]);
269a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
270a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
271a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_EQ:
272a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_NE:
273a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_LT:
274a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_GE:
275a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_GT:
276a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_LE: {
277fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      LIR* taken = &label_list[bb->taken->id];
278fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      LIR* fall_through = &label_list[bb->fall_through->id];
279fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      bool backward_branch;
280fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      backward_branch = (bb->taken->start_offset <= mir->offset);
281fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      if (backward_branch) {
28202031b185b4653e6c72e21f7a51238b903f6d638buzbee        cg->GenSuspendTest(cu, opt_flags);
283a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
28402031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenCompareAndBranch(cu, opcode, rl_src[0], rl_src[1], taken,
285fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee                          fall_through);
286a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
287a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
288a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
289a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_EQZ:
290a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_NEZ:
291a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_LTZ:
292a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_GEZ:
293a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_GTZ:
294a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IF_LEZ: {
295fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      LIR* taken = &label_list[bb->taken->id];
296fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      LIR* fall_through = &label_list[bb->fall_through->id];
297fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      bool backward_branch;
298fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      backward_branch = (bb->taken->start_offset <= mir->offset);
299fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      if (backward_branch) {
30002031b185b4653e6c72e21f7a51238b903f6d638buzbee        cg->GenSuspendTest(cu, opt_flags);
301a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
30202031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenCompareZeroAndBranch(cu, opcode, rl_src[0], taken, fall_through);
303a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
304a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
305a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
306a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AGET_WIDE:
30702031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArrayGet(cu, opt_flags, kLong, rl_src[0], rl_src[1], rl_dest, 3);
308a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
309a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AGET:
310a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AGET_OBJECT:
31102031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArrayGet(cu, opt_flags, kWord, rl_src[0], rl_src[1], rl_dest, 2);
312a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
313a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AGET_BOOLEAN:
31402031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArrayGet(cu, opt_flags, kUnsignedByte, rl_src[0], rl_src[1], rl_dest, 0);
315a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
316a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AGET_BYTE:
31702031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArrayGet(cu, opt_flags, kSignedByte, rl_src[0], rl_src[1], rl_dest, 0);
318a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
319a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AGET_CHAR:
32002031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArrayGet(cu, opt_flags, kUnsignedHalf, rl_src[0], rl_src[1], rl_dest, 1);
321a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
322a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AGET_SHORT:
32302031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArrayGet(cu, opt_flags, kSignedHalf, rl_src[0], rl_src[1], rl_dest, 1);
324a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
325a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::APUT_WIDE:
32602031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArrayPut(cu, opt_flags, kLong, rl_src[1], rl_src[2], rl_src[0], 3);
327a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
328a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::APUT:
32902031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArrayPut(cu, opt_flags, kWord, rl_src[1], rl_src[2], rl_src[0], 2);
330a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
331a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::APUT_OBJECT:
33202031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArrayObjPut(cu, opt_flags, rl_src[1], rl_src[2], rl_src[0], 2);
333a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
334a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::APUT_SHORT:
335a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::APUT_CHAR:
33602031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArrayPut(cu, opt_flags, kUnsignedHalf, rl_src[1], rl_src[2], rl_src[0], 1);
337a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
338a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::APUT_BYTE:
339a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::APUT_BOOLEAN:
34002031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArrayPut(cu, opt_flags, kUnsignedByte, rl_src[1], rl_src[2],
341fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee            rl_src[0], 0);
342a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
343a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
344a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IGET_OBJECT:
34502031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIGet(cu, vC, opt_flags, kWord, rl_dest, rl_src[0], false, true);
346a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
347a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
348a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IGET_WIDE:
34902031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIGet(cu, vC, opt_flags, kLong, rl_dest, rl_src[0], true, false);
350a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
351a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
352a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IGET:
35302031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIGet(cu, vC, opt_flags, kWord, rl_dest, rl_src[0], false, false);
354a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
355a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
356a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IGET_CHAR:
35702031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIGet(cu, vC, opt_flags, kUnsignedHalf, rl_dest, rl_src[0], false, false);
358a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
359a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
360a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IGET_SHORT:
36102031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIGet(cu, vC, opt_flags, kSignedHalf, rl_dest, rl_src[0], false, false);
362a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
363a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
364a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IGET_BOOLEAN:
365a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IGET_BYTE:
36602031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIGet(cu, vC, opt_flags, kUnsignedByte, rl_dest, rl_src[0], false, false);
367a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
368a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
369a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IPUT_WIDE:
37002031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIPut(cu, vC, opt_flags, kLong, rl_src[0], rl_src[1], true, false);
371a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
372a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
373a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IPUT_OBJECT:
37402031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIPut(cu, vC, opt_flags, kWord, rl_src[0], rl_src[1], false, true);
375a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
376a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
377a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IPUT:
37802031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIPut(cu, vC, opt_flags, kWord, rl_src[0], rl_src[1], false, false);
379a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
380a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
381a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IPUT_BOOLEAN:
382a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IPUT_BYTE:
38302031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIPut(cu, vC, opt_flags, kUnsignedByte, rl_src[0], rl_src[1], false, false);
384a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
385a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
386a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IPUT_CHAR:
38702031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIPut(cu, vC, opt_flags, kUnsignedHalf, rl_src[0], rl_src[1], false, false);
388a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
389a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
390a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::IPUT_SHORT:
39102031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIPut(cu, vC, opt_flags, kSignedHalf, rl_src[0], rl_src[1], false, false);
392a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
393a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
394a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SGET_OBJECT:
39502031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenSget(cu, vB, rl_dest, false, true);
396a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
397a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SGET:
398a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SGET_BOOLEAN:
399a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SGET_BYTE:
400a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SGET_CHAR:
401a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SGET_SHORT:
40202031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenSget(cu, vB, rl_dest, false, false);
403a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
404a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
405a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SGET_WIDE:
40602031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenSget(cu, vB, rl_dest, true, false);
407a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
408a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
409a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPUT_OBJECT:
41002031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenSput(cu, vB, rl_src[0], false, true);
411a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
412a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
413a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPUT:
414a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPUT_BOOLEAN:
415a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPUT_BYTE:
416a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPUT_CHAR:
417a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPUT_SHORT:
41802031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenSput(cu, vB, rl_src[0], false, false);
419a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
420a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
421a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SPUT_WIDE:
42202031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenSput(cu, vB, rl_src[0], true, false);
423a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
424a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
425a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_STATIC_RANGE:
42602031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kStatic, true));
427a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
428a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_STATIC:
42902031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kStatic, false));
430a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
431a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
432a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_DIRECT:
43302031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kDirect, false));
434a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
435a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_DIRECT_RANGE:
43602031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kDirect, true));
437a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
438a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
439a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_VIRTUAL:
44002031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kVirtual, false));
441a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
442a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_VIRTUAL_RANGE:
44302031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kVirtual, true));
444a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
445a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
446a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_SUPER:
44702031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kSuper, false));
448a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
449a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_SUPER_RANGE:
45002031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kSuper, true));
451a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
452a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
453a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_INTERFACE:
45402031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kInterface, false));
455a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
456a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INVOKE_INTERFACE_RANGE:
45702031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kInterface, true));
458a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
459a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
460a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NEG_INT:
461a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NOT_INT:
46202031b185b4653e6c72e21f7a51238b903f6d638buzbee      res = cg->GenArithOpInt(cu, opcode, rl_dest, rl_src[0], rl_src[0]);
463a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
464a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
465a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NEG_LONG:
466a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NOT_LONG:
46702031b185b4653e6c72e21f7a51238b903f6d638buzbee      res = cg->GenArithOpLong(cu, opcode, rl_dest, rl_src[0], rl_src[0]);
468a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
469a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
470a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NEG_FLOAT:
47102031b185b4653e6c72e21f7a51238b903f6d638buzbee      res = cg->GenArithOpFloat(cu, opcode, rl_dest, rl_src[0], rl_src[0]);
472a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
473a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
474a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::NEG_DOUBLE:
47502031b185b4653e6c72e21f7a51238b903f6d638buzbee      res = cg->GenArithOpDouble(cu, opcode, rl_dest, rl_src[0], rl_src[0]);
476a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
477a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
478a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INT_TO_LONG:
47902031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIntToLong(cu, rl_dest, rl_src[0]);
480a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
481a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
482a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::LONG_TO_INT:
483fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_src[0] = UpdateLocWide(cu, rl_src[0]);
484fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      rl_src[0] = WideToNarrow(cu, rl_src[0]);
48502031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValue(cu, rl_dest, rl_src[0]);
486a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
487a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
488a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INT_TO_BYTE:
489a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INT_TO_SHORT:
490a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INT_TO_CHAR:
49102031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenIntNarrowing(cu, opcode, rl_dest, rl_src[0]);
492a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
493a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
494a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INT_TO_FLOAT:
495a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::INT_TO_DOUBLE:
496a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::LONG_TO_FLOAT:
497a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::LONG_TO_DOUBLE:
498a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FLOAT_TO_INT:
499a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FLOAT_TO_LONG:
500a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::FLOAT_TO_DOUBLE:
501a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DOUBLE_TO_INT:
502a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DOUBLE_TO_LONG:
503a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DOUBLE_TO_FLOAT:
50402031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenConversion(cu, opcode, rl_dest, rl_src[0]);
505a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
506a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
507a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_INT:
508a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_INT:
509a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_INT:
510a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_INT:
511a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_INT:
512a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AND_INT:
513a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::OR_INT:
514a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::XOR_INT:
515a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHL_INT:
516a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHR_INT:
517a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::USHR_INT:
518a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_INT_2ADDR:
519a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_INT_2ADDR:
520a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_INT_2ADDR:
521a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_INT_2ADDR:
522a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_INT_2ADDR:
523a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AND_INT_2ADDR:
524a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::OR_INT_2ADDR:
525a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::XOR_INT_2ADDR:
526a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHL_INT_2ADDR:
527a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHR_INT_2ADDR:
528a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::USHR_INT_2ADDR:
52902031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArithOpInt(cu, opcode, rl_dest, rl_src[0], rl_src[1]);
530a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
531a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
532a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_LONG:
533a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_LONG:
534a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_LONG:
535a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_LONG:
536a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_LONG:
537a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AND_LONG:
538a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::OR_LONG:
539a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::XOR_LONG:
540a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_LONG_2ADDR:
541a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_LONG_2ADDR:
542a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_LONG_2ADDR:
543a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_LONG_2ADDR:
544a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_LONG_2ADDR:
545a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AND_LONG_2ADDR:
546a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::OR_LONG_2ADDR:
547a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::XOR_LONG_2ADDR:
54802031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArithOpLong(cu, opcode, rl_dest, rl_src[0], rl_src[1]);
549a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
550a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
551a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHL_LONG:
552a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHR_LONG:
553a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::USHR_LONG:
554a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHL_LONG_2ADDR:
555a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHR_LONG_2ADDR:
556a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::USHR_LONG_2ADDR:
55702031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenShiftOpLong(cu, opcode, rl_dest, rl_src[0], rl_src[1]);
558a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
559a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
560a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_FLOAT:
561a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_FLOAT:
562a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_FLOAT:
563a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_FLOAT:
564a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_FLOAT:
565a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_FLOAT_2ADDR:
566a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_FLOAT_2ADDR:
567a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_FLOAT_2ADDR:
568a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_FLOAT_2ADDR:
569a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_FLOAT_2ADDR:
57002031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArithOpFloat(cu, opcode, rl_dest, rl_src[0], rl_src[1]);
571a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
572a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
573a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_DOUBLE:
574a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_DOUBLE:
575a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_DOUBLE:
576a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_DOUBLE:
577a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_DOUBLE:
578a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_DOUBLE_2ADDR:
579a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SUB_DOUBLE_2ADDR:
580a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_DOUBLE_2ADDR:
581a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_DOUBLE_2ADDR:
582a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_DOUBLE_2ADDR:
58302031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArithOpDouble(cu, opcode, rl_dest, rl_src[0], rl_src[1]);
584a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
585a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
586a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::RSUB_INT:
587a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_INT_LIT16:
588a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_INT_LIT16:
589a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_INT_LIT16:
590a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_INT_LIT16:
591a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AND_INT_LIT16:
592a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::OR_INT_LIT16:
593a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::XOR_INT_LIT16:
594a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::ADD_INT_LIT8:
595a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::RSUB_INT_LIT8:
596a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::MUL_INT_LIT8:
597a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::DIV_INT_LIT8:
598a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::REM_INT_LIT8:
599a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::AND_INT_LIT8:
600a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::OR_INT_LIT8:
601a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::XOR_INT_LIT8:
602a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHL_INT_LIT8:
603a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::SHR_INT_LIT8:
604a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case Instruction::USHR_INT_LIT8:
60502031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenArithOpIntLit(cu, opcode, rl_dest, rl_src[0], vC);
606a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
607a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
608a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    default:
609a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      res = true;
610a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
611a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  return res;
612e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
613e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
61402031b185b4653e6c72e21f7a51238b903f6d638buzbee// Process extended MIR instructions (such as PHI).
615fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeestatic void HandleExtendedMethodMIR(CompilationUnit* cu, BasicBlock* bb, MIR* mir)
616e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
61702031b185b4653e6c72e21f7a51238b903f6d638buzbee  Codegen* cg = cu->cg.get();
618fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  int op_offset = mir->dalvikInsn.opcode - kMirOpFirst;
619a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  char* msg = NULL;
620fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  if (cu->verbose) {
621fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    msg = static_cast<char*>(NewMem(cu, strlen(extended_mir_op_names[op_offset]) + 1,
622cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee                                    false, kAllocDebugInfo));
623fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    strcpy(msg, extended_mir_op_names[op_offset]);
624a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
625fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  LIR* op = NewLIR1(cu, kPseudoExtended, reinterpret_cast<uintptr_t>(msg));
626a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
627cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee  switch (static_cast<ExtendedMIROpcode>(mir->dalvikInsn.opcode)) {
628a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case kMirOpPhi: {
629fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      char* ssa_string = NULL;
630fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      if (cu->verbose) {
631fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee        ssa_string = GetSSAString(cu, mir->ssa_rep);
632a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      }
633fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      op->flags.is_nop = true;
634fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      NewLIR1(cu, kPseudoSSARep, reinterpret_cast<uintptr_t>(ssa_string));
635a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
636a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
637a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case kMirOpCopy: {
638fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      RegLocation rl_src = GetSrc(cu, mir, 0);
639fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      RegLocation rl_dest = GetDest(cu, mir);
64002031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->StoreValue(cu, rl_dest, rl_src);
641a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
642e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
643a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case kMirOpFusedCmplFloat:
64402031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenFusedFPCmpBranch(cu, bb, mir, false /*gt bias*/, false /*double*/);
645a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
646a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case kMirOpFusedCmpgFloat:
64702031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenFusedFPCmpBranch(cu, bb, mir, true /*gt bias*/, false /*double*/);
648a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
649a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case kMirOpFusedCmplDouble:
65002031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenFusedFPCmpBranch(cu, bb, mir, false /*gt bias*/, true /*double*/);
651a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
652a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case kMirOpFusedCmpgDouble:
65302031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenFusedFPCmpBranch(cu, bb, mir, true /*gt bias*/, true /*double*/);
654a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
655a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    case kMirOpFusedCmpLong:
65602031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->GenFusedLongCmpBranch(cu, bb, mir);
657a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
658a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    default:
659a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
660a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
661e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
662e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
66302031b185b4653e6c72e21f7a51238b903f6d638buzbee// Handle the content in each basic block.
664fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeestatic bool MethodBlockCodeGen(CompilationUnit* cu, BasicBlock* bb)
665e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
666fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  if (bb->block_type == kDead) return false;
66702031b185b4653e6c72e21f7a51238b903f6d638buzbee  Codegen* cg = cu->cg.get();
668fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  cu->current_dalvik_offset = bb->start_offset;
669a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  MIR* mir;
670fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  LIR* label_list = cu->block_label_list;
671fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  int block_id = bb->id;
672a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
673fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  cu->cur_block = bb;
674fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  label_list[block_id].operands[0] = bb->start_offset;
675a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
67602031b185b4653e6c72e21f7a51238b903f6d638buzbee  // Insert the block label.
677fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  label_list[block_id].opcode = kPseudoNormalBlockLabel;
678fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  AppendLIR(cu, &label_list[block_id]);
679a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
680fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  LIR* head_lir = NULL;
6818320f3867c02bae9bef6cdab267820cb7b412781buzbee
68202031b185b4653e6c72e21f7a51238b903f6d638buzbee  // If this is a catch block, export the start address.
683fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  if (bb->catch_entry) {
684fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    head_lir = NewLIR0(cu, kPseudoExportedPC);
6858320f3867c02bae9bef6cdab267820cb7b412781buzbee  }
6868320f3867c02bae9bef6cdab267820cb7b412781buzbee
68702031b185b4653e6c72e21f7a51238b903f6d638buzbee  // Free temp registers and reset redundant store tracking.
688fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  ResetRegPool(cu);
689fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  ResetDefTracking(cu);
690a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
691fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  ClobberAllRegs(cu);
692e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
693fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  if (bb->block_type == kEntryBlock) {
694fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    int start_vreg = cu->num_dalvik_registers - cu->num_ins;
69502031b185b4653e6c72e21f7a51238b903f6d638buzbee    cg->GenEntrySequence(cu, &cu->reg_location[start_vreg],
69602031b185b4653e6c72e21f7a51238b903f6d638buzbee                         cu->reg_location[cu->method_sreg]);
697fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  } else if (bb->block_type == kExitBlock) {
69802031b185b4653e6c72e21f7a51238b903f6d638buzbee    cg->GenExitSequence(cu);
699a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
700a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
70128c9a83398a6e48eefb9b79a390920629bbb8519buzbee  for (mir = bb->first_mir_insn; mir != NULL; mir = mir->next) {
702fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    ResetRegPool(cu);
703fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    if (cu->disable_opt & (1 << kTrackLiveTemps)) {
704fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      ClobberAllRegs(cu);
705a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
706e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
707fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    if (cu->disable_opt & (1 << kSuppressLoads)) {
708fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      ResetDefTracking(cu);
709e196567b50a084b163937ea9605b51ee1e48adebbuzbee    }
710e196567b50a084b163937ea9605b51ee1e48adebbuzbee
711a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee#ifndef NDEBUG
71202031b185b4653e6c72e21f7a51238b903f6d638buzbee    // Reset temp tracking sanity check.
713fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    cu->live_sreg = INVALID_SREG;
714a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee#endif
715a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
716fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    cu->current_dalvik_offset = mir->offset;
717c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee    int opcode = mir->dalvikInsn.opcode;
718fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    LIR* boundary_lir;
719e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
72002031b185b4653e6c72e21f7a51238b903f6d638buzbee    // Mark the beginning of a Dalvik instruction for line tracking.
721fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    char* inst_str = cu->verbose ?
722fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee       GetDalvikDisassembly(cu, mir->dalvikInsn, "") : NULL;
723fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    boundary_lir = MarkBoundary(cu, mir->offset, inst_str);
72402031b185b4653e6c72e21f7a51238b903f6d638buzbee    // Remember the first LIR for this block.
725fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    if (head_lir == NULL) {
726fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      head_lir = boundary_lir;
72702031b185b4653e6c72e21f7a51238b903f6d638buzbee      // Set the first boundary_lir as a scheduling barrier.
728fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      head_lir->def_mask = ENCODE_ALL;
729e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
730e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
73102031b185b4653e6c72e21f7a51238b903f6d638buzbee    // Don't generate the SSA annotation unless verbose mode is on.
732fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    if (cu->verbose && mir->ssa_rep) {
733fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      char* ssa_string = GetSSAString(cu, mir->ssa_rep);
734fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      NewLIR1(cu, kPseudoSSARep, reinterpret_cast<uintptr_t>(ssa_string));
735a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
736e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
737c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee    if (opcode == kMirOpCheck) {
738c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee      // Combine check and work halves of throwing instruction.
739fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      MIR* work_half = mir->meta.throw_insn;
740fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      mir->dalvikInsn.opcode = work_half->dalvikInsn.opcode;
741fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      opcode = work_half->dalvikInsn.opcode;
742fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      SSARepresentation* ssa_rep = work_half->ssa_rep;
743fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      work_half->ssa_rep = mir->ssa_rep;
744fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      mir->ssa_rep = ssa_rep;
745fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      work_half->dalvikInsn.opcode = static_cast<Instruction::Code>(kMirOpNop);
746c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee    }
747c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee
748c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee    if (opcode >= kMirOpFirst) {
749fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      HandleExtendedMethodMIR(cu, bb, mir);
750a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      continue;
751a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    }
752e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
753fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    bool not_handled = CompileDalvikInstruction(cu, mir, bb, label_list);
754fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    if (not_handled) {
755c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee      LOG(FATAL) << StringPrintf("%#06x: Opcode %#x (%s)",
756c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee                                 mir->offset, opcode,
757c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee                                 Instruction::Name(mir->dalvikInsn.opcode));
758e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
759a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
760e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
761fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  if (head_lir) {
76202031b185b4653e6c72e21f7a51238b903f6d638buzbee    // Eliminate redundant loads/stores and delay stores into later slots.
763fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    ApplyLocalOptimizations(cu, head_lir, cu->last_lir_insn);
764a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
76502031b185b4653e6c72e21f7a51238b903f6d638buzbee    // Generate an unconditional branch to the fallthrough block.
766fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    if (bb->fall_through) {
76702031b185b4653e6c72e21f7a51238b903f6d638buzbee      cg->OpUnconditionalBranch(cu, &label_list[bb->fall_through->id]);
768e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee    }
769a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
770a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  return false;
771e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
772e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
773fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeevoid SpecialMIR2LIR(CompilationUnit* cu, SpecialCaseHandler special_case)
77416da88c70c4bdbd97b8482be8b42103a52f22d59buzbee{
77502031b185b4653e6c72e21f7a51238b903f6d638buzbee  Codegen* cg = cu->cg.get();
77602031b185b4653e6c72e21f7a51238b903f6d638buzbee  // Find the first DalvikByteCode block.
777fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  int num_reachable_blocks = cu->num_reachable_blocks;
778fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  const GrowableList *block_list = &cu->block_list;
779a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  BasicBlock*bb = NULL;
780fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  for (int idx = 0; idx < num_reachable_blocks; idx++) {
781fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    int dfs_index = cu->dfs_order.elem_list[idx];
782fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    bb = reinterpret_cast<BasicBlock*>(GrowableListGetElement(block_list, dfs_index));
783fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    if (bb->block_type == kDalvikByteCode) {
784a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee      break;
78516da88c70c4bdbd97b8482be8b42103a52f22d59buzbee    }
786a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
787a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  if (bb == NULL) {
788a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee    return;
789a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
790fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  DCHECK_EQ(bb->start_offset, 0);
791fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  DCHECK(bb->first_mir_insn != NULL);
792a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
79302031b185b4653e6c72e21f7a51238b903f6d638buzbee  // Get the first instruction.
794fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  MIR* mir = bb->first_mir_insn;
795a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
79602031b185b4653e6c72e21f7a51238b903f6d638buzbee  // Free temp registers and reset redundant store tracking.
797fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  ResetRegPool(cu);
798fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  ResetDefTracking(cu);
799fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  ClobberAllRegs(cu);
800a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee
80102031b185b4653e6c72e21f7a51238b903f6d638buzbee  cg->GenSpecialCase(cu, bb, mir, special_case);
80216da88c70c4bdbd97b8482be8b42103a52f22d59buzbee}
80316da88c70c4bdbd97b8482be8b42103a52f22d59buzbee
804fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeevoid MethodMIR2LIR(CompilationUnit* cu)
805e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{
80602031b185b4653e6c72e21f7a51238b903f6d638buzbee  Codegen* cg = cu->cg.get();
80702031b185b4653e6c72e21f7a51238b903f6d638buzbee  // Hold the labels of each block.
808fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  cu->block_label_list =
809fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee      static_cast<LIR*>(NewMem(cu, sizeof(LIR) * cu->num_blocks, true, kAllocLIR));
810e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
811fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  DataFlowAnalysisDispatcher(cu, MethodBlockCodeGen,
812a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee                                kPreOrderDFSTraversal, false /* Iterative */);
813ab2b55dfcf630fdf8d03b5f506386f114fa2874cIan Rogers
81402031b185b4653e6c72e21f7a51238b903f6d638buzbee  cg->HandleSuspendLaunchPads(cu);
815e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
81602031b185b4653e6c72e21f7a51238b903f6d638buzbee  cg->HandleThrowLaunchPads(cu);
817e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
81802031b185b4653e6c72e21f7a51238b903f6d638buzbee  cg->HandleIntrinsicLaunchPads(cu);
819fc9e6fabed89d948fa8c0e9d673e430076712c60buzbee
820fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee  if (!(cu->disable_opt & (1 << kSafeOptimizations))) {
821fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee    RemoveRedundantBranches(cu);
822a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee  }
823e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}
824e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee
825e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}  // namespace art
826