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