mir_to_lir.cc revision 1eab958cde39a7e2f0e5ce01730f4e2e75c72519
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; 881eab958cde39a7e2f0e5ce01730f4e2e75c72519jeffhao 89a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::RETURN_VOID: 90fffdb023275613612a22ec62b3421ffe4d2b73feIan Rogers if (((cu->access_flags & kAccConstructor) != 0) && 91fffdb023275613612a22ec62b3421ffe4d2b73feIan Rogers cu->compiler->RequiresConstructorBarrier(Thread::Current(), cu->dex_file, 92fffdb023275613612a22ec62b3421ffe4d2b73feIan Rogers cu->class_def_idx)) { 93fffdb023275613612a22ec62b3421ffe4d2b73feIan Rogers cg->GenMemBarrier(cu, kStoreStore); 94fffdb023275613612a22ec62b3421ffe4d2b73feIan Rogers } 95fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (!(cu->attrs & METHOD_IS_LEAF)) { 9602031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenSuspendTest(cu, opt_flags); 97a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 98a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 99a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 100a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::RETURN: 101a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::RETURN_OBJECT: 102fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (!(cu->attrs & METHOD_IS_LEAF)) { 10302031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenSuspendTest(cu, opt_flags); 104a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 10502031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->StoreValue(cu, GetReturn(cu, cu->shorty[0] == 'F'), rl_src[0]); 106a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 107a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 108a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::RETURN_WIDE: 109fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (!(cu->attrs & METHOD_IS_LEAF)) { 11002031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenSuspendTest(cu, opt_flags); 111a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 11202031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->StoreValueWide(cu, GetReturnWide(cu, 113fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee cu->shorty[0] == 'D'), rl_src[0]); 114a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 115a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 116a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE_RESULT_WIDE: 117fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (opt_flags & MIR_INLINED) 11802031b185b4653e6c72e21f7a51238b903f6d638buzbee break; // Nop - combined w/ previous invoke. 11902031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->StoreValueWide(cu, rl_dest, GetReturnWide(cu, rl_dest.fp)); 120a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 121a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 122a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE_RESULT: 123a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE_RESULT_OBJECT: 124fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (opt_flags & MIR_INLINED) 12502031b185b4653e6c72e21f7a51238b903f6d638buzbee break; // Nop - combined w/ previous invoke. 12602031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->StoreValue(cu, rl_dest, GetReturn(cu, rl_dest.fp)); 127a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 128a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 129a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE: 130a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE_OBJECT: 131a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE_16: 132a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE_OBJECT_16: 133a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE_FROM16: 134a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE_OBJECT_FROM16: 13502031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->StoreValue(cu, rl_dest, rl_src[0]); 136a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 137a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 138a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE_WIDE: 139a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE_WIDE_16: 140a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE_WIDE_FROM16: 14102031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->StoreValueWide(cu, rl_dest, rl_src[0]); 142a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 143a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 144a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CONST: 145a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CONST_4: 146a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CONST_16: 147fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_result = EvalLoc(cu, rl_dest, kAnyReg, true); 14802031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->LoadConstantNoClobber(cu, rl_result.low_reg, vB); 14902031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->StoreValue(cu, rl_dest, rl_result); 1507da142fc1cefeeb24d997ae21b34381fdd2c0466buzbee if (vB == 0) { 1517da142fc1cefeeb24d997ae21b34381fdd2c0466buzbee cg->Workaround7250540(cu, rl_dest, rl_result.low_reg); 1527da142fc1cefeeb24d997ae21b34381fdd2c0466buzbee } 153a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 154a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 155a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CONST_HIGH16: 156fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_result = EvalLoc(cu, rl_dest, kAnyReg, true); 15702031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->LoadConstantNoClobber(cu, rl_result.low_reg, vB << 16); 15802031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->StoreValue(cu, rl_dest, rl_result); 1597da142fc1cefeeb24d997ae21b34381fdd2c0466buzbee if (vB == 0) { 1607da142fc1cefeeb24d997ae21b34381fdd2c0466buzbee cg->Workaround7250540(cu, rl_dest, rl_result.low_reg); 1617da142fc1cefeeb24d997ae21b34381fdd2c0466buzbee } 162a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 163a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 164a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CONST_WIDE_16: 165a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CONST_WIDE_32: 166fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_result = EvalLoc(cu, rl_dest, kAnyReg, true); 16702031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->LoadConstantValueWide(cu, rl_result.low_reg, rl_result.high_reg, vB, 168408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee (vB & 0x80000000) ? -1 : 0); 16902031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->StoreValueWide(cu, rl_dest, rl_result); 170a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 171a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 172a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CONST_WIDE: 173fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_result = EvalLoc(cu, rl_dest, kAnyReg, true); 17402031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->LoadConstantValueWide(cu, rl_result.low_reg, rl_result.high_reg, 175a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee mir->dalvikInsn.vB_wide & 0xffffffff, 176a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee (mir->dalvikInsn.vB_wide >> 32) & 0xffffffff); 17702031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->StoreValueWide(cu, rl_dest, rl_result); 178a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 179a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 180a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CONST_WIDE_HIGH16: 181fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_result = EvalLoc(cu, rl_dest, kAnyReg, true); 18202031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->LoadConstantValueWide(cu, rl_result.low_reg, rl_result.high_reg, 183408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee 0, vB << 16); 18402031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->StoreValueWide(cu, rl_dest, rl_result); 185a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 186a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 187a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MONITOR_ENTER: 18802031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenMonitorEnter(cu, opt_flags, rl_src[0]); 189a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 190a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 191a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MONITOR_EXIT: 19202031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenMonitorExit(cu, opt_flags, rl_src[0]); 193a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 194a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 195a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CHECK_CAST: 19602031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenCheckCast(cu, vB, rl_src[0]); 197a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 198a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 199a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INSTANCE_OF: 20002031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenInstanceof(cu, vC, rl_dest, rl_src[0]); 201a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 202a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 203a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::NEW_INSTANCE: 20402031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenNewInstance(cu, vB, rl_dest); 205a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 206a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 207a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::THROW: 20802031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenThrow(cu, rl_src[0]); 209a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 210a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 211a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::ARRAY_LENGTH: 212fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int len_offset; 213fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee len_offset = Array::LengthOffset().Int32Value(); 21402031b185b4653e6c72e21f7a51238b903f6d638buzbee rl_src[0] = cg->LoadValue(cu, rl_src[0], kCoreReg); 21502031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenNullCheck(cu, rl_src[0].s_reg_low, rl_src[0].low_reg, opt_flags); 216fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_result = EvalLoc(cu, rl_dest, kCoreReg, true); 21702031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->LoadWordDisp(cu, rl_src[0].low_reg, len_offset, rl_result.low_reg); 21802031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->StoreValue(cu, rl_dest, rl_result); 219a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 220a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 221a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CONST_STRING: 222a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CONST_STRING_JUMBO: 22302031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenConstString(cu, vB, rl_dest); 224a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 225a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 226a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CONST_CLASS: 22702031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenConstClass(cu, vB, rl_dest); 228a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 229a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 230a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::FILL_ARRAY_DATA: 23102031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenFillArrayData(cu, vB, rl_src[0]); 232a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 233a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 234a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::FILLED_NEW_ARRAY: 23502031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenFilledNewArray(cu, cg->NewMemCallInfo(cu, bb, mir, kStatic, 2363b3dbddcbc7a7bee505a608061304f9b26a91750buzbee false /* not range */)); 237a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 238a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 239a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::FILLED_NEW_ARRAY_RANGE: 24002031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenFilledNewArray(cu, cg->NewMemCallInfo(cu, bb, mir, kStatic, 2413b3dbddcbc7a7bee505a608061304f9b26a91750buzbee true /* range */)); 242a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 243a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 244a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::NEW_ARRAY: 24502031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenNewArray(cu, vC, rl_dest, rl_src[0]); 246a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 247a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 248a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::GOTO: 249a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::GOTO_16: 250a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::GOTO_32: 251fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (bb->taken->start_offset <= mir->offset) { 25202031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenSuspendTestAndBranch(cu, opt_flags, &label_list[bb->taken->id]); 253a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } else { 25402031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->OpUnconditionalBranch(cu, &label_list[bb->taken->id]); 255a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 256a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 257a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 258a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::PACKED_SWITCH: 25902031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenPackedSwitch(cu, vB, rl_src[0]); 260a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 261a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 262a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SPARSE_SWITCH: 26302031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenSparseSwitch(cu, vB, rl_src[0]); 264a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 265a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 266a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CMPL_FLOAT: 267a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CMPG_FLOAT: 268a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CMPL_DOUBLE: 269a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CMPG_DOUBLE: 27002031b185b4653e6c72e21f7a51238b903f6d638buzbee res = cg->GenCmpFP(cu, opcode, rl_dest, rl_src[0], rl_src[1]); 271a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 272a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 273a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CMP_LONG: 27402031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenCmpLong(cu, rl_dest, rl_src[0], rl_src[1]); 275a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 276a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 277a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_EQ: 278a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_NE: 279a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_LT: 280a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_GE: 281a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_GT: 282a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_LE: { 283fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee LIR* taken = &label_list[bb->taken->id]; 284fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee LIR* fall_through = &label_list[bb->fall_through->id]; 285fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bool backward_branch; 286fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee backward_branch = (bb->taken->start_offset <= mir->offset); 287e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee // Result known at compile time? 288e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee if (rl_src[0].is_const && rl_src[1].is_const) { 289e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee bool is_taken = EvaluateBranch(opcode, cu->constant_values[rl_src[0].orig_sreg], 290e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee cu->constant_values[rl_src[1].orig_sreg]); 291e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee if (is_taken && backward_branch) { 292e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee cg->GenSuspendTest(cu, opt_flags); 293e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee } 294e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee int id = is_taken ? bb->taken->id : bb->fall_through->id; 295e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee cg->OpUnconditionalBranch(cu, &label_list[id]); 296e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee } else { 297e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee if (backward_branch) { 298e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee cg->GenSuspendTest(cu, opt_flags); 299e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee } 300e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee cg->GenCompareAndBranch(cu, opcode, rl_src[0], rl_src[1], taken, 301e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee fall_through); 302a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 303a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 304a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 305a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 306a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_EQZ: 307a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_NEZ: 308a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_LTZ: 309a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_GEZ: 310a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_GTZ: 311a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_LEZ: { 312fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee LIR* taken = &label_list[bb->taken->id]; 313fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee LIR* fall_through = &label_list[bb->fall_through->id]; 314fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bool backward_branch; 315fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee backward_branch = (bb->taken->start_offset <= mir->offset); 316e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee // Result known at compile time? 317e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee if (rl_src[0].is_const) { 318e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee bool is_taken = EvaluateBranch(opcode, cu->constant_values[rl_src[0].orig_sreg], 0); 319e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee if (is_taken && backward_branch) { 320e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee cg->GenSuspendTest(cu, opt_flags); 321e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee } 322e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee int id = is_taken ? bb->taken->id : bb->fall_through->id; 323e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee cg->OpUnconditionalBranch(cu, &label_list[id]); 324e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee } else { 325e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee if (backward_branch) { 326e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee cg->GenSuspendTest(cu, opt_flags); 327e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee } 328e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee cg->GenCompareZeroAndBranch(cu, opcode, rl_src[0], taken, fall_through); 329a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 330a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 331a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 332a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 333a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AGET_WIDE: 33402031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenArrayGet(cu, opt_flags, kLong, rl_src[0], rl_src[1], rl_dest, 3); 335a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 336a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AGET: 337a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AGET_OBJECT: 33802031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenArrayGet(cu, opt_flags, kWord, rl_src[0], rl_src[1], rl_dest, 2); 339a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 340a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AGET_BOOLEAN: 34102031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenArrayGet(cu, opt_flags, kUnsignedByte, rl_src[0], rl_src[1], rl_dest, 0); 342a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 343a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AGET_BYTE: 34402031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenArrayGet(cu, opt_flags, kSignedByte, rl_src[0], rl_src[1], rl_dest, 0); 345a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 346a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AGET_CHAR: 34702031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenArrayGet(cu, opt_flags, kUnsignedHalf, rl_src[0], rl_src[1], rl_dest, 1); 348a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 349a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AGET_SHORT: 35002031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenArrayGet(cu, opt_flags, kSignedHalf, rl_src[0], rl_src[1], rl_dest, 1); 351a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 352a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::APUT_WIDE: 35302031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenArrayPut(cu, opt_flags, kLong, rl_src[1], rl_src[2], rl_src[0], 3); 354a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 355a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::APUT: 35602031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenArrayPut(cu, opt_flags, kWord, rl_src[1], rl_src[2], rl_src[0], 2); 357a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 358a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::APUT_OBJECT: 35902031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenArrayObjPut(cu, opt_flags, rl_src[1], rl_src[2], rl_src[0], 2); 360a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 361a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::APUT_SHORT: 362a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::APUT_CHAR: 36302031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenArrayPut(cu, opt_flags, kUnsignedHalf, rl_src[1], rl_src[2], rl_src[0], 1); 364a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 365a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::APUT_BYTE: 366a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::APUT_BOOLEAN: 36702031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenArrayPut(cu, opt_flags, kUnsignedByte, rl_src[1], rl_src[2], 368fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0], 0); 369a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 370a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 371a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IGET_OBJECT: 37202031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenIGet(cu, vC, opt_flags, kWord, rl_dest, rl_src[0], false, true); 373a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 374a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 375a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IGET_WIDE: 37602031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenIGet(cu, vC, opt_flags, kLong, rl_dest, rl_src[0], true, false); 377a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 378a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 379a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IGET: 38002031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenIGet(cu, vC, opt_flags, kWord, rl_dest, rl_src[0], false, false); 381a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 382a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 383a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IGET_CHAR: 38402031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenIGet(cu, vC, opt_flags, kUnsignedHalf, rl_dest, rl_src[0], false, false); 385a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 386a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 387a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IGET_SHORT: 38802031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenIGet(cu, vC, opt_flags, kSignedHalf, rl_dest, rl_src[0], false, false); 389a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 390a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 391a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IGET_BOOLEAN: 392a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IGET_BYTE: 39302031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenIGet(cu, vC, opt_flags, kUnsignedByte, rl_dest, rl_src[0], false, false); 394a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 395a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 396a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IPUT_WIDE: 39702031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenIPut(cu, vC, opt_flags, kLong, rl_src[0], rl_src[1], true, false); 398a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 399a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 400a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IPUT_OBJECT: 40102031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenIPut(cu, vC, opt_flags, kWord, rl_src[0], rl_src[1], false, true); 402a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 403a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 404a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IPUT: 40502031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenIPut(cu, vC, opt_flags, kWord, rl_src[0], rl_src[1], false, false); 406a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 407a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 408a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IPUT_BOOLEAN: 409a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IPUT_BYTE: 41002031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenIPut(cu, vC, opt_flags, kUnsignedByte, rl_src[0], rl_src[1], false, false); 411a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 412a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 413a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IPUT_CHAR: 41402031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenIPut(cu, vC, opt_flags, kUnsignedHalf, rl_src[0], rl_src[1], false, false); 415a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 416a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 417a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IPUT_SHORT: 41802031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenIPut(cu, vC, opt_flags, kSignedHalf, rl_src[0], rl_src[1], false, false); 419a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 420a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 421a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SGET_OBJECT: 42202031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenSget(cu, vB, rl_dest, false, true); 423a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 424a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SGET: 425a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SGET_BOOLEAN: 426a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SGET_BYTE: 427a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SGET_CHAR: 428a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SGET_SHORT: 42902031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenSget(cu, vB, rl_dest, false, false); 430a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 431a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 432a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SGET_WIDE: 43302031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenSget(cu, vB, rl_dest, true, false); 434a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 435a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 436a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SPUT_OBJECT: 43702031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenSput(cu, vB, rl_src[0], false, true); 438a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 439a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 440a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SPUT: 441a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SPUT_BOOLEAN: 442a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SPUT_BYTE: 443a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SPUT_CHAR: 444a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SPUT_SHORT: 44502031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenSput(cu, vB, rl_src[0], false, false); 446a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 447a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 448a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SPUT_WIDE: 44902031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenSput(cu, vB, rl_src[0], true, false); 450a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 451a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 452a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INVOKE_STATIC_RANGE: 45302031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kStatic, true)); 454a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 455a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INVOKE_STATIC: 45602031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kStatic, false)); 457a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 458a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 459a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INVOKE_DIRECT: 46002031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kDirect, false)); 461a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 462a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INVOKE_DIRECT_RANGE: 46302031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kDirect, true)); 464a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 465a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 466a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INVOKE_VIRTUAL: 46702031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kVirtual, false)); 468a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 469a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INVOKE_VIRTUAL_RANGE: 47002031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kVirtual, true)); 471a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 472a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 473a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INVOKE_SUPER: 47402031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kSuper, false)); 475a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 476a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INVOKE_SUPER_RANGE: 47702031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kSuper, true)); 478a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 479a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 480a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INVOKE_INTERFACE: 48102031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kInterface, false)); 482a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 483a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INVOKE_INTERFACE_RANGE: 48402031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenInvoke(cu, cg->NewMemCallInfo(cu, bb, mir, kInterface, true)); 485a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 486a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 487a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::NEG_INT: 488a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::NOT_INT: 48902031b185b4653e6c72e21f7a51238b903f6d638buzbee res = cg->GenArithOpInt(cu, opcode, rl_dest, rl_src[0], rl_src[0]); 490a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 491a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 492a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::NEG_LONG: 493a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::NOT_LONG: 49402031b185b4653e6c72e21f7a51238b903f6d638buzbee res = cg->GenArithOpLong(cu, opcode, rl_dest, rl_src[0], rl_src[0]); 495a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 496a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 497a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::NEG_FLOAT: 49802031b185b4653e6c72e21f7a51238b903f6d638buzbee res = cg->GenArithOpFloat(cu, opcode, rl_dest, rl_src[0], rl_src[0]); 499a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 500a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 501a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::NEG_DOUBLE: 50202031b185b4653e6c72e21f7a51238b903f6d638buzbee res = cg->GenArithOpDouble(cu, opcode, rl_dest, rl_src[0], rl_src[0]); 503a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 504a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 505a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INT_TO_LONG: 50602031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenIntToLong(cu, rl_dest, rl_src[0]); 507a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 508a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 509a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::LONG_TO_INT: 510fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0] = UpdateLocWide(cu, rl_src[0]); 511fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee rl_src[0] = WideToNarrow(cu, rl_src[0]); 51202031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->StoreValue(cu, rl_dest, rl_src[0]); 513a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 514a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 515a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INT_TO_BYTE: 516a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INT_TO_SHORT: 517a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INT_TO_CHAR: 51802031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenIntNarrowing(cu, opcode, rl_dest, rl_src[0]); 519a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 520a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 521a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INT_TO_FLOAT: 522a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INT_TO_DOUBLE: 523a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::LONG_TO_FLOAT: 524a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::LONG_TO_DOUBLE: 525a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::FLOAT_TO_INT: 526a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::FLOAT_TO_LONG: 527a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::FLOAT_TO_DOUBLE: 528a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DOUBLE_TO_INT: 529a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DOUBLE_TO_LONG: 530a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DOUBLE_TO_FLOAT: 53102031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenConversion(cu, opcode, rl_dest, rl_src[0]); 532a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 533a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 534e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee 535a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::ADD_INT: 536e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee case Instruction::ADD_INT_2ADDR: 537a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MUL_INT: 538e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee case Instruction::MUL_INT_2ADDR: 539a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AND_INT: 540e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee case Instruction::AND_INT_2ADDR: 541a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::OR_INT: 542e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee case Instruction::OR_INT_2ADDR: 543a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::XOR_INT: 544e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee case Instruction::XOR_INT_2ADDR: 545e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee if (rl_src[0].is_const && 546e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee cu->cg->InexpensiveConstant(0, cu->constant_values[rl_src[0].orig_sreg])) { 547e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee cg->GenArithOpIntLit(cu, opcode, rl_dest, rl_src[1], 548e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee cu->constant_values[rl_src[0].orig_sreg]); 549e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee } else if (rl_src[1].is_const && 550e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee cu->cg->InexpensiveConstant(0, cu->constant_values[rl_src[1].orig_sreg])) { 551e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee cg->GenArithOpIntLit(cu, opcode, rl_dest, rl_src[0], 552e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee cu->constant_values[rl_src[1].orig_sreg]); 553e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee } else { 554e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee cg->GenArithOpInt(cu, opcode, rl_dest, rl_src[0], rl_src[1]); 555e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee } 556e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee break; 557e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee 558e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee case Instruction::SUB_INT: 559a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SUB_INT_2ADDR: 560e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee case Instruction::DIV_INT: 561a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DIV_INT_2ADDR: 562e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee case Instruction::REM_INT: 563a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::REM_INT_2ADDR: 564e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee case Instruction::SHL_INT: 565a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SHL_INT_2ADDR: 566e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee case Instruction::SHR_INT: 567a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SHR_INT_2ADDR: 568e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee case Instruction::USHR_INT: 569a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::USHR_INT_2ADDR: 570e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee if (rl_src[1].is_const && 571e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee cu->cg->InexpensiveConstant(0, cu->constant_values[rl_src[1].orig_sreg])) { 572e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee cg->GenArithOpIntLit(cu, opcode, rl_dest, rl_src[0], 573e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee cu->constant_values[rl_src[1].orig_sreg]); 574e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee } else { 575e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee cg->GenArithOpInt(cu, opcode, rl_dest, rl_src[0], rl_src[1]); 576e6285f99a53a344efd6f8409ff5f43a3e80190dbbuzbee } 577a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 578a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 579a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::ADD_LONG: 580a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SUB_LONG: 581a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MUL_LONG: 582a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DIV_LONG: 583a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::REM_LONG: 584a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AND_LONG: 585a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::OR_LONG: 586a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::XOR_LONG: 587a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::ADD_LONG_2ADDR: 588a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SUB_LONG_2ADDR: 589a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MUL_LONG_2ADDR: 590a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DIV_LONG_2ADDR: 591a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::REM_LONG_2ADDR: 592a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AND_LONG_2ADDR: 593a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::OR_LONG_2ADDR: 594a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::XOR_LONG_2ADDR: 59502031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenArithOpLong(cu, opcode, rl_dest, rl_src[0], rl_src[1]); 596a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 597a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 598a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SHL_LONG: 599a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SHR_LONG: 600a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::USHR_LONG: 601a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SHL_LONG_2ADDR: 602a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SHR_LONG_2ADDR: 603a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::USHR_LONG_2ADDR: 60402031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenShiftOpLong(cu, opcode, rl_dest, rl_src[0], rl_src[1]); 605a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 606a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 607a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::ADD_FLOAT: 608a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SUB_FLOAT: 609a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MUL_FLOAT: 610a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DIV_FLOAT: 611a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::REM_FLOAT: 612a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::ADD_FLOAT_2ADDR: 613a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SUB_FLOAT_2ADDR: 614a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MUL_FLOAT_2ADDR: 615a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DIV_FLOAT_2ADDR: 616a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::REM_FLOAT_2ADDR: 61702031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenArithOpFloat(cu, opcode, rl_dest, rl_src[0], rl_src[1]); 618a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 619a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 620a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::ADD_DOUBLE: 621a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SUB_DOUBLE: 622a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MUL_DOUBLE: 623a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DIV_DOUBLE: 624a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::REM_DOUBLE: 625a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::ADD_DOUBLE_2ADDR: 626a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SUB_DOUBLE_2ADDR: 627a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MUL_DOUBLE_2ADDR: 628a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DIV_DOUBLE_2ADDR: 629a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::REM_DOUBLE_2ADDR: 63002031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenArithOpDouble(cu, opcode, rl_dest, rl_src[0], rl_src[1]); 631a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 632a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 633a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::RSUB_INT: 634a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::ADD_INT_LIT16: 635a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MUL_INT_LIT16: 636a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DIV_INT_LIT16: 637a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::REM_INT_LIT16: 638a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AND_INT_LIT16: 639a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::OR_INT_LIT16: 640a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::XOR_INT_LIT16: 641a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::ADD_INT_LIT8: 642a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::RSUB_INT_LIT8: 643a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MUL_INT_LIT8: 644a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DIV_INT_LIT8: 645a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::REM_INT_LIT8: 646a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AND_INT_LIT8: 647a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::OR_INT_LIT8: 648a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::XOR_INT_LIT8: 649a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SHL_INT_LIT8: 650a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SHR_INT_LIT8: 651a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::USHR_INT_LIT8: 65202031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenArithOpIntLit(cu, opcode, rl_dest, rl_src[0], vC); 653a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 654a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 655a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee default: 656a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee res = true; 657a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 658a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee return res; 659e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee} 660e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 661a169e1d8d968800380245cda450505d969ebff76buzbee// Process extended MIR instructions 662fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeestatic void HandleExtendedMethodMIR(CompilationUnit* cu, BasicBlock* bb, MIR* mir) 663e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{ 66402031b185b4653e6c72e21f7a51238b903f6d638buzbee Codegen* cg = cu->cg.get(); 665cbd6d44c0a94f3d26671b5325aa21bbf1335ffe8buzbee switch (static_cast<ExtendedMIROpcode>(mir->dalvikInsn.opcode)) { 666a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case kMirOpCopy: { 667fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee RegLocation rl_src = GetSrc(cu, mir, 0); 668fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee RegLocation rl_dest = GetDest(cu, mir); 66902031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->StoreValue(cu, rl_dest, rl_src); 670a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 671e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee } 672a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case kMirOpFusedCmplFloat: 67302031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenFusedFPCmpBranch(cu, bb, mir, false /*gt bias*/, false /*double*/); 674a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 675a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case kMirOpFusedCmpgFloat: 67602031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenFusedFPCmpBranch(cu, bb, mir, true /*gt bias*/, false /*double*/); 677a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 678a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case kMirOpFusedCmplDouble: 67902031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenFusedFPCmpBranch(cu, bb, mir, false /*gt bias*/, true /*double*/); 680a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 681a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case kMirOpFusedCmpgDouble: 68202031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenFusedFPCmpBranch(cu, bb, mir, true /*gt bias*/, true /*double*/); 683a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 684a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case kMirOpFusedCmpLong: 68502031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenFusedLongCmpBranch(cu, bb, mir); 686a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 687a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee default: 688a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 689a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 690e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee} 691e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 69202031b185b4653e6c72e21f7a51238b903f6d638buzbee// Handle the content in each basic block. 693fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeestatic bool MethodBlockCodeGen(CompilationUnit* cu, BasicBlock* bb) 694e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{ 695fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (bb->block_type == kDead) return false; 69602031b185b4653e6c72e21f7a51238b903f6d638buzbee Codegen* cg = cu->cg.get(); 697fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee cu->current_dalvik_offset = bb->start_offset; 698a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee MIR* mir; 699fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee LIR* label_list = cu->block_label_list; 700fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int block_id = bb->id; 701a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 702fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee cu->cur_block = bb; 703fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee label_list[block_id].operands[0] = bb->start_offset; 704a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 70502031b185b4653e6c72e21f7a51238b903f6d638buzbee // Insert the block label. 706fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee label_list[block_id].opcode = kPseudoNormalBlockLabel; 707fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee AppendLIR(cu, &label_list[block_id]); 708a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 709fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee LIR* head_lir = NULL; 7108320f3867c02bae9bef6cdab267820cb7b412781buzbee 71102031b185b4653e6c72e21f7a51238b903f6d638buzbee // If this is a catch block, export the start address. 712fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (bb->catch_entry) { 713fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee head_lir = NewLIR0(cu, kPseudoExportedPC); 7148320f3867c02bae9bef6cdab267820cb7b412781buzbee } 7158320f3867c02bae9bef6cdab267820cb7b412781buzbee 71602031b185b4653e6c72e21f7a51238b903f6d638buzbee // Free temp registers and reset redundant store tracking. 717fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ResetRegPool(cu); 718fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ResetDefTracking(cu); 719a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 720fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ClobberAllRegs(cu); 721e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 722fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (bb->block_type == kEntryBlock) { 723fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int start_vreg = cu->num_dalvik_registers - cu->num_ins; 72402031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenEntrySequence(cu, &cu->reg_location[start_vreg], 72502031b185b4653e6c72e21f7a51238b903f6d638buzbee cu->reg_location[cu->method_sreg]); 726fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee } else if (bb->block_type == kExitBlock) { 72702031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenExitSequence(cu); 728a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 729a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 73028c9a83398a6e48eefb9b79a390920629bbb8519buzbee for (mir = bb->first_mir_insn; mir != NULL; mir = mir->next) { 731fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ResetRegPool(cu); 732fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (cu->disable_opt & (1 << kTrackLiveTemps)) { 733fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ClobberAllRegs(cu); 734a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 735e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 736fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (cu->disable_opt & (1 << kSuppressLoads)) { 737fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ResetDefTracking(cu); 738e196567b50a084b163937ea9605b51ee1e48adebbuzbee } 739e196567b50a084b163937ea9605b51ee1e48adebbuzbee 740a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee#ifndef NDEBUG 74102031b185b4653e6c72e21f7a51238b903f6d638buzbee // Reset temp tracking sanity check. 742fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee cu->live_sreg = INVALID_SREG; 743a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee#endif 744a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 745fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee cu->current_dalvik_offset = mir->offset; 746c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee int opcode = mir->dalvikInsn.opcode; 747fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee LIR* boundary_lir; 748e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 74902031b185b4653e6c72e21f7a51238b903f6d638buzbee // Mark the beginning of a Dalvik instruction for line tracking. 750fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee char* inst_str = cu->verbose ? 751a169e1d8d968800380245cda450505d969ebff76buzbee GetDalvikDisassembly(cu, mir) : NULL; 752fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee boundary_lir = MarkBoundary(cu, mir->offset, inst_str); 75302031b185b4653e6c72e21f7a51238b903f6d638buzbee // Remember the first LIR for this block. 754fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (head_lir == NULL) { 755fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee head_lir = boundary_lir; 75602031b185b4653e6c72e21f7a51238b903f6d638buzbee // Set the first boundary_lir as a scheduling barrier. 757fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee head_lir->def_mask = ENCODE_ALL; 758e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee } 759e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 760c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee if (opcode == kMirOpCheck) { 761c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee // Combine check and work halves of throwing instruction. 762fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee MIR* work_half = mir->meta.throw_insn; 763fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee mir->dalvikInsn.opcode = work_half->dalvikInsn.opcode; 764fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee opcode = work_half->dalvikInsn.opcode; 765fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee SSARepresentation* ssa_rep = work_half->ssa_rep; 766fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee work_half->ssa_rep = mir->ssa_rep; 767fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee mir->ssa_rep = ssa_rep; 768a169e1d8d968800380245cda450505d969ebff76buzbee work_half->dalvikInsn.opcode = static_cast<Instruction::Code>(kMirOpCheckPart2); 769c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee } 770c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee 771c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee if (opcode >= kMirOpFirst) { 772fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee HandleExtendedMethodMIR(cu, bb, mir); 773a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee continue; 774a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 775e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 776fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bool not_handled = CompileDalvikInstruction(cu, mir, bb, label_list); 777fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (not_handled) { 778c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee LOG(FATAL) << StringPrintf("%#06x: Opcode %#x (%s)", 779c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee mir->offset, opcode, 780c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee Instruction::Name(mir->dalvikInsn.opcode)); 781e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee } 782a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 783e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 784fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (head_lir) { 78502031b185b4653e6c72e21f7a51238b903f6d638buzbee // Eliminate redundant loads/stores and delay stores into later slots. 786fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ApplyLocalOptimizations(cu, head_lir, cu->last_lir_insn); 787a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 78802031b185b4653e6c72e21f7a51238b903f6d638buzbee // Generate an unconditional branch to the fallthrough block. 789fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (bb->fall_through) { 79002031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->OpUnconditionalBranch(cu, &label_list[bb->fall_through->id]); 791e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee } 792a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 793a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee return false; 794e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee} 795e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 796fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeevoid SpecialMIR2LIR(CompilationUnit* cu, SpecialCaseHandler special_case) 79716da88c70c4bdbd97b8482be8b42103a52f22d59buzbee{ 79802031b185b4653e6c72e21f7a51238b903f6d638buzbee Codegen* cg = cu->cg.get(); 79902031b185b4653e6c72e21f7a51238b903f6d638buzbee // Find the first DalvikByteCode block. 800fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int num_reachable_blocks = cu->num_reachable_blocks; 801fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee const GrowableList *block_list = &cu->block_list; 802a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee BasicBlock*bb = NULL; 803fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee for (int idx = 0; idx < num_reachable_blocks; idx++) { 804fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee int dfs_index = cu->dfs_order.elem_list[idx]; 805fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee bb = reinterpret_cast<BasicBlock*>(GrowableListGetElement(block_list, dfs_index)); 806fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (bb->block_type == kDalvikByteCode) { 807a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 80816da88c70c4bdbd97b8482be8b42103a52f22d59buzbee } 809a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 810a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (bb == NULL) { 811a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee return; 812a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 813fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee DCHECK_EQ(bb->start_offset, 0); 814fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee DCHECK(bb->first_mir_insn != NULL); 815a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 81602031b185b4653e6c72e21f7a51238b903f6d638buzbee // Get the first instruction. 817fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee MIR* mir = bb->first_mir_insn; 818a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 81902031b185b4653e6c72e21f7a51238b903f6d638buzbee // Free temp registers and reset redundant store tracking. 820fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ResetRegPool(cu); 821fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ResetDefTracking(cu); 822fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee ClobberAllRegs(cu); 823a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 82402031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->GenSpecialCase(cu, bb, mir, special_case); 82516da88c70c4bdbd97b8482be8b42103a52f22d59buzbee} 82616da88c70c4bdbd97b8482be8b42103a52f22d59buzbee 827fa57c47f1b72916371a9c2d5c1389219bce655b4buzbeevoid MethodMIR2LIR(CompilationUnit* cu) 828e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{ 82902031b185b4653e6c72e21f7a51238b903f6d638buzbee Codegen* cg = cu->cg.get(); 83002031b185b4653e6c72e21f7a51238b903f6d638buzbee // Hold the labels of each block. 831fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee cu->block_label_list = 832fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee static_cast<LIR*>(NewMem(cu, sizeof(LIR) * cu->num_blocks, true, kAllocLIR)); 833e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 834fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee DataFlowAnalysisDispatcher(cu, MethodBlockCodeGen, 835a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kPreOrderDFSTraversal, false /* Iterative */); 836ab2b55dfcf630fdf8d03b5f506386f114fa2874cIan Rogers 83702031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->HandleSuspendLaunchPads(cu); 838e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 83902031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->HandleThrowLaunchPads(cu); 840e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 84102031b185b4653e6c72e21f7a51238b903f6d638buzbee cg->HandleIntrinsicLaunchPads(cu); 842fc9e6fabed89d948fa8c0e9d673e430076712c60buzbee 843fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee if (!(cu->disable_opt & (1 << kSafeOptimizations))) { 844fa57c47f1b72916371a9c2d5c1389219bce655b4buzbee RemoveRedundantBranches(cu); 845a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 846e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee} 847e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 848e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee} // namespace art 849