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