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