mir_to_lir.cc revision 474b6da273c7ce6df50a4e51eb9929a77e1611c3
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 19e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeenamespace art { 20e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 21e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee#define DISPLAY_MISSING_TARGETS (cUnit->enableDebug & \ 22a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee (1 << kDebugDisplayMissingTargets)) 23e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 242cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbeeconst RegLocation badLoc = {kLocDalvikFrame, 0, 0, 0, 0, 0, 0, 0, 0, 252cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee INVALID_REG, INVALID_REG, INVALID_SREG, 262cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee INVALID_SREG}; 27e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 28e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/* Mark register usage state and return long retloc */ 29f7d9ad39541dd09030e26d54d3b73a076f90cc74Ian RogersRegLocation oatGetReturnWide(CompilationUnit* cUnit, bool isDouble) 30e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{ 31a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee RegLocation gpr_res = LOC_C_RETURN_WIDE; 32a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee RegLocation fpr_res = LOC_C_RETURN_WIDE_DOUBLE; 33a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee RegLocation res = isDouble ? fpr_res : gpr_res; 34a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee oatClobber(cUnit, res.lowReg); 35a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee oatClobber(cUnit, res.highReg); 36a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee oatLockTemp(cUnit, res.lowReg); 37a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee oatLockTemp(cUnit, res.highReg); 38a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee oatMarkPair(cUnit, res.lowReg, res.highReg); 39a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee return res; 40e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee} 41e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 42f7d9ad39541dd09030e26d54d3b73a076f90cc74Ian RogersRegLocation oatGetReturn(CompilationUnit* cUnit, bool isFloat) 43e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{ 44f7d9ad39541dd09030e26d54d3b73a076f90cc74Ian Rogers RegLocation gpr_res = LOC_C_RETURN; 45f7d9ad39541dd09030e26d54d3b73a076f90cc74Ian Rogers RegLocation fpr_res = LOC_C_RETURN_FLOAT; 46f7d9ad39541dd09030e26d54d3b73a076f90cc74Ian Rogers RegLocation res = isFloat ? fpr_res : gpr_res; 47a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee oatClobber(cUnit, res.lowReg); 48a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (cUnit->instructionSet == kMips) { 49a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee oatMarkInUse(cUnit, res.lowReg); 50a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } else { 51a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee oatLockTemp(cUnit, res.lowReg); 52a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 53a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee return res; 54e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee} 55e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 563b3dbddcbc7a7bee505a608061304f9b26a91750buzbeevoid genInvoke(CompilationUnit* cUnit, CallInfo* info) 57e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{ 5815bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee if (genIntrinsic(cUnit, info)) { 59a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee return; 60a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 6115bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee InvokeType originalType = info->type; // avoiding mutation by ComputeInvokeInfo 62a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int callState = 0; 63a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee LIR* nullCk; 64a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee LIR** pNullCk = NULL; 65a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee NextCallInsn nextCallInsn; 66a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee oatFlushAllRegs(cUnit); /* Everything to home location */ 67a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee // Explicit register usage 68a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee oatLockCallTemps(cUnit); 69a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 70a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee OatCompilationUnit mUnit(cUnit->class_loader, cUnit->class_linker, 7100f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers *cUnit->dex_file, 72a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee cUnit->code_item, cUnit->method_idx, 73a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee cUnit->access_flags); 74a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 753b3dbddcbc7a7bee505a608061304f9b26a91750buzbee uint32_t dexMethodIdx = info->index; 76a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int vtableIdx; 77a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee uintptr_t directCode; 78a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee uintptr_t directMethod; 79a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee bool skipThis; 80a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee bool fastPath = 8115bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee cUnit->compiler->ComputeInvokeInfo(dexMethodIdx, &mUnit, info->type, 82a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee vtableIdx, directCode, 83a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee directMethod) 84a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee && !SLOW_INVOKE_PATH; 8515bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee if (info->type == kInterface) { 86a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee nextCallInsn = fastPath ? nextInterfaceCallInsn 87a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee : nextInterfaceCallInsnWithAccessCheck; 88a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee skipThis = false; 8915bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee } else if (info->type == kDirect) { 90a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (fastPath) { 91a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee pNullCk = &nullCk; 92e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee } 93a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee nextCallInsn = fastPath ? nextSDCallInsn : nextDirectCallInsnSP; 94a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee skipThis = false; 9515bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee } else if (info->type == kStatic) { 96a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee nextCallInsn = fastPath ? nextSDCallInsn : nextStaticCallInsnSP; 97a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee skipThis = false; 9815bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee } else if (info->type == kSuper) { 99a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee DCHECK(!fastPath); // Fast path is a direct call. 100a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee nextCallInsn = nextSuperCallInsnSP; 101a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee skipThis = false; 102a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } else { 10315bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee DCHECK_EQ(info->type, kVirtual); 104a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee nextCallInsn = fastPath ? nextVCallInsn : nextVCallInsnSP; 105a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee skipThis = fastPath; 106a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 10715bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee if (!info->isRange) { 10815bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee callState = genDalvikArgsNoRange(cUnit, info, callState, pNullCk, 109a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee nextCallInsn, dexMethodIdx, 110a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee vtableIdx, directCode, directMethod, 111a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee originalType, skipThis); 112a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } else { 11315bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee callState = genDalvikArgsRange(cUnit, info, callState, pNullCk, 114a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee nextCallInsn, dexMethodIdx, vtableIdx, 115a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee directCode, directMethod, originalType, 116a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee skipThis); 117a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 118a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee // Finish up any of the call sequence not interleaved in arg loading 119a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee while (callState >= 0) { 12015bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee callState = nextCallInsn(cUnit, info, callState, dexMethodIdx, 121a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee vtableIdx, directCode, directMethod, 122a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee originalType); 123a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 124a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (DISPLAY_MISSING_TARGETS) { 125a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee genShowTarget(cUnit); 126a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 1278320f3867c02bae9bef6cdab267820cb7b412781buzbee LIR* callInst; 1286cbb2bd8ba9a52de7e50a5da1f4e98dd7a460f1bIan Rogers#if !defined(TARGET_X86) 1298320f3867c02bae9bef6cdab267820cb7b412781buzbee callInst = opReg(cUnit, kOpBlx, rINVOKE_TGT); 1306cbb2bd8ba9a52de7e50a5da1f4e98dd7a460f1bIan Rogers#else 13115bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee if (fastPath && info->type != kInterface) { 13266f19258f9728d4ffe026074d8fd429d639802faMathieu Chartier callInst = opMem(cUnit, kOpBlx, rARG0, AbstractMethod::GetCodeOffset().Int32Value()); 133a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } else { 134a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int trampoline = 0; 13515bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee switch (info->type) { 136a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case kInterface: 137a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee trampoline = fastPath ? ENTRYPOINT_OFFSET(pInvokeInterfaceTrampoline) 138a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee : ENTRYPOINT_OFFSET(pInvokeInterfaceTrampolineWithAccessCheck); 139a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 140a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case kDirect: 141a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee trampoline = ENTRYPOINT_OFFSET(pInvokeDirectTrampolineWithAccessCheck); 142a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 143a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case kStatic: 144a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee trampoline = ENTRYPOINT_OFFSET(pInvokeStaticTrampolineWithAccessCheck); 145a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 146a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case kSuper: 147a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee trampoline = ENTRYPOINT_OFFSET(pInvokeSuperTrampolineWithAccessCheck); 148a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 149a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case kVirtual: 150a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee trampoline = ENTRYPOINT_OFFSET(pInvokeVirtualTrampolineWithAccessCheck); 151a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 152a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee default: 153a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee LOG(FATAL) << "Unexpected invoke type"; 1546cbb2bd8ba9a52de7e50a5da1f4e98dd7a460f1bIan Rogers } 1558320f3867c02bae9bef6cdab267820cb7b412781buzbee callInst = opThreadMem(cUnit, kOpBlx, trampoline); 156a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 157a7678db092ac6bb79f7cad490099a1015fbbc714buzbee#endif 1588320f3867c02bae9bef6cdab267820cb7b412781buzbee markSafepointPC(cUnit, callInst); 1596cbb2bd8ba9a52de7e50a5da1f4e98dd7a460f1bIan Rogers 160a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee oatClobberCalleeSave(cUnit); 16115bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee if (info->result.location != kLocInvalid) { 16215bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee // We have a following MOVE_RESULT - do it now. 16315bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee if (info->result.wide) { 16452ed776c9b71abbdee7c24119859371549bd3172buzbee RegLocation retLoc = oatGetReturnWide(cUnit, info->result.fp); 16515bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee storeValueWide(cUnit, info->result, retLoc); 16615bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee } else { 16752ed776c9b71abbdee7c24119859371549bd3172buzbee RegLocation retLoc = oatGetReturn(cUnit, info->result.fp); 16815bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee storeValue(cUnit, info->result, retLoc); 16915bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee } 17015bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee } 17115bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee} 17215bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee 17315bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee/* 17415bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee * Build an array of location records for the incoming arguments. 17515bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee * Note: one location record per word of arguments, with dummy 17615bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee * high-word loc for wide arguments. Also pull up any following 17715bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee * MOVE_RESULT and incorporate it into the invoke. 17815bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee */ 1796969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbeeCallInfo* oatNewCallInfo(CompilationUnit* cUnit, BasicBlock* bb, MIR* mir, 1806969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee InvokeType type, bool isRange) 18115bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee{ 1823b3dbddcbc7a7bee505a608061304f9b26a91750buzbee CallInfo* info = (CallInfo*)oatNew(cUnit, sizeof(CallInfo), true, 18315bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee kAllocMisc); 18415bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee MIR* moveResultMIR = oatFindMoveResult(cUnit, bb, mir); 18515bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee if (moveResultMIR == NULL) { 18615bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee info->result.location = kLocInvalid; 18715bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee } else { 18815bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee info->result = oatGetRawDest(cUnit, moveResultMIR); 18915bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee moveResultMIR->dalvikInsn.opcode = Instruction::NOP; 19015bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee } 19115bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee info->numArgWords = mir->ssaRep->numUses; 19215bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee info->args = (info->numArgWords == 0) ? NULL : (RegLocation*) 19315bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee oatNew(cUnit, sizeof(RegLocation) * info->numArgWords, false, kAllocMisc); 19415bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee for (int i = 0; i < info->numArgWords; i++) { 19515bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee info->args[i] = oatGetRawSrc(cUnit, mir, i); 19615bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee } 19715bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee info->optFlags = mir->optimizationFlags; 19815bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee info->type = type; 19915bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee info->isRange = isRange; 2003b3dbddcbc7a7bee505a608061304f9b26a91750buzbee info->index = mir->dalvikInsn.vB; 20115bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee info->offset = mir->offset; 20215bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee return info; 203e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee} 204e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 205e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/* 206e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * Target-independent code generation. Use only high-level 207e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * load/store utilities here, or target-dependent genXX() handlers 208e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee * when necessary. 209e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee */ 21031a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbeebool compileDalvikInstruction(CompilationUnit* cUnit, MIR* mir, 21131a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbee BasicBlock* bb, LIR* labelList) 212e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{ 213a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee bool res = false; // Assume success 214a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee RegLocation rlSrc[3]; 215a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee RegLocation rlDest = badLoc; 216a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee RegLocation rlResult = badLoc; 217a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee Instruction::Code opcode = mir->dalvikInsn.opcode; 218408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee int optFlags = mir->optimizationFlags; 219408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee uint32_t vB = mir->dalvikInsn.vB; 220408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee uint32_t vC = mir->dalvikInsn.vC; 221a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 222a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* Prep Src and Dest locations */ 223a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int nextSreg = 0; 224a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int nextLoc = 0; 225a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int attrs = oatDataFlowAttributes[opcode]; 226a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee rlSrc[0] = rlSrc[1] = rlSrc[2] = badLoc; 227a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (attrs & DF_UA) { 228bff2465abb4b0c097623c82f18a1307ea890bff1buzbee if (attrs & DF_A_WIDE) { 22915bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee rlSrc[nextLoc++] = oatGetSrcWide(cUnit, mir, nextSreg); 230bff2465abb4b0c097623c82f18a1307ea890bff1buzbee nextSreg+= 2; 231bff2465abb4b0c097623c82f18a1307ea890bff1buzbee } else { 232bff2465abb4b0c097623c82f18a1307ea890bff1buzbee rlSrc[nextLoc++] = oatGetSrc(cUnit, mir, nextSreg); 233bff2465abb4b0c097623c82f18a1307ea890bff1buzbee nextSreg++; 234bff2465abb4b0c097623c82f18a1307ea890bff1buzbee } 235a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 236a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (attrs & DF_UB) { 237bff2465abb4b0c097623c82f18a1307ea890bff1buzbee if (attrs & DF_B_WIDE) { 23815bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee rlSrc[nextLoc++] = oatGetSrcWide(cUnit, mir, nextSreg); 239bff2465abb4b0c097623c82f18a1307ea890bff1buzbee nextSreg+= 2; 240bff2465abb4b0c097623c82f18a1307ea890bff1buzbee } else { 241bff2465abb4b0c097623c82f18a1307ea890bff1buzbee rlSrc[nextLoc++] = oatGetSrc(cUnit, mir, nextSreg); 242bff2465abb4b0c097623c82f18a1307ea890bff1buzbee nextSreg++; 243bff2465abb4b0c097623c82f18a1307ea890bff1buzbee } 244a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 245a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (attrs & DF_UC) { 246bff2465abb4b0c097623c82f18a1307ea890bff1buzbee if (attrs & DF_C_WIDE) { 24715bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee rlSrc[nextLoc++] = oatGetSrcWide(cUnit, mir, nextSreg); 248bff2465abb4b0c097623c82f18a1307ea890bff1buzbee } else { 249bff2465abb4b0c097623c82f18a1307ea890bff1buzbee rlSrc[nextLoc++] = oatGetSrc(cUnit, mir, nextSreg); 250bff2465abb4b0c097623c82f18a1307ea890bff1buzbee } 251a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 252a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (attrs & DF_DA) { 253bff2465abb4b0c097623c82f18a1307ea890bff1buzbee if (attrs & DF_A_WIDE) { 25415bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee rlDest = oatGetDestWide(cUnit, mir); 255bff2465abb4b0c097623c82f18a1307ea890bff1buzbee } else { 25615bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee rlDest = oatGetDest(cUnit, mir); 257bff2465abb4b0c097623c82f18a1307ea890bff1buzbee } 258a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 259a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee switch (opcode) { 260a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::NOP: 261a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 262a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 263474b6da273c7ce6df50a4e51eb9929a77e1611c3Ian Rogers case Instruction::MOVE_EXCEPTION: 264474b6da273c7ce6df50a4e51eb9929a77e1611c3Ian Rogers genMoveException(cUnit, rlDest); 265a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 266a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::RETURN_VOID: 2674f2935ef077529cc41aa0b590262fa91acbf6558TDYa if (!(cUnit->attrs & METHOD_IS_LEAF)) { 268408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genSuspendTest(cUnit, optFlags); 269a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 270a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 271a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 272a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::RETURN: 273a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::RETURN_OBJECT: 2744f2935ef077529cc41aa0b590262fa91acbf6558TDYa if (!(cUnit->attrs & METHOD_IS_LEAF)) { 275408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genSuspendTest(cUnit, optFlags); 276a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 277a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee storeValue(cUnit, oatGetReturn(cUnit, cUnit->shorty[0] == 'F'), rlSrc[0]); 278a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 279a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 280a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::RETURN_WIDE: 2814f2935ef077529cc41aa0b590262fa91acbf6558TDYa if (!(cUnit->attrs & METHOD_IS_LEAF)) { 282408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genSuspendTest(cUnit, optFlags); 283a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 284a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee storeValueWide(cUnit, oatGetReturnWide(cUnit, 285a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee cUnit->shorty[0] == 'D'), rlSrc[0]); 286a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 287a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 288a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE_RESULT_WIDE: 289408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee if (optFlags & MIR_INLINED) 290a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; // Nop - combined w/ previous invoke 291a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee storeValueWide(cUnit, rlDest, oatGetReturnWide(cUnit, rlDest.fp)); 292a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 293a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 294a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE_RESULT: 295a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE_RESULT_OBJECT: 296408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee if (optFlags & MIR_INLINED) 297a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; // Nop - combined w/ previous invoke 298a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee storeValue(cUnit, rlDest, oatGetReturn(cUnit, rlDest.fp)); 299a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 300a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 301a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE: 302a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE_OBJECT: 303a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE_16: 304a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE_OBJECT_16: 305a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE_FROM16: 306a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE_OBJECT_FROM16: 307a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee storeValue(cUnit, rlDest, rlSrc[0]); 308a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 309a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 310a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE_WIDE: 311a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE_WIDE_16: 312a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MOVE_WIDE_FROM16: 313a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee storeValueWide(cUnit, rlDest, rlSrc[0]); 314a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 315a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 316a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CONST: 317a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CONST_4: 318a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CONST_16: 319a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee rlResult = oatEvalLoc(cUnit, rlDest, kAnyReg, true); 320408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee loadConstantNoClobber(cUnit, rlResult.lowReg, vB); 321a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee storeValue(cUnit, rlDest, rlResult); 322a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 323a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 324a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CONST_HIGH16: 325a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee rlResult = oatEvalLoc(cUnit, rlDest, kAnyReg, true); 326408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee loadConstantNoClobber(cUnit, rlResult.lowReg, vB << 16); 327a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee storeValue(cUnit, rlDest, rlResult); 328a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 329a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 330a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CONST_WIDE_16: 331a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CONST_WIDE_32: 332a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee rlResult = oatEvalLoc(cUnit, rlDest, kAnyReg, true); 333408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee loadConstantValueWide(cUnit, rlResult.lowReg, rlResult.highReg, vB, 334408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee (vB & 0x80000000) ? -1 : 0); 335a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee storeValueWide(cUnit, rlDest, rlResult); 336a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 337a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 338a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CONST_WIDE: 339a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee rlResult = oatEvalLoc(cUnit, rlDest, kAnyReg, true); 340a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee loadConstantValueWide(cUnit, rlResult.lowReg, rlResult.highReg, 341a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee mir->dalvikInsn.vB_wide & 0xffffffff, 342a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee (mir->dalvikInsn.vB_wide >> 32) & 0xffffffff); 343a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee storeValueWide(cUnit, rlDest, rlResult); 344a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 345a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 346a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CONST_WIDE_HIGH16: 347a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee rlResult = oatEvalLoc(cUnit, rlDest, kAnyReg, true); 348a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee loadConstantValueWide(cUnit, rlResult.lowReg, rlResult.highReg, 349408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee 0, vB << 16); 350a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee storeValueWide(cUnit, rlDest, rlResult); 351a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 352a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 353a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MONITOR_ENTER: 354408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genMonitorEnter(cUnit, optFlags, rlSrc[0]); 355a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 356a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 357a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MONITOR_EXIT: 358408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genMonitorExit(cUnit, optFlags, rlSrc[0]); 359a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 360a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 361a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CHECK_CAST: 362408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genCheckCast(cUnit, vB, rlSrc[0]); 363a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 364a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 365a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INSTANCE_OF: 366408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genInstanceof(cUnit, vC, rlDest, rlSrc[0]); 367a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 368a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 369a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::NEW_INSTANCE: 370408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genNewInstance(cUnit, vB, rlDest); 371a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 372a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 373a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::THROW: 374408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genThrow(cUnit, rlSrc[0]); 375a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 376a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 377a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::ARRAY_LENGTH: 378a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int lenOffset; 379a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee lenOffset = Array::LengthOffset().Int32Value(); 380a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee rlSrc[0] = loadValue(cUnit, rlSrc[0], kCoreReg); 381408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genNullCheck(cUnit, rlSrc[0].sRegLow, rlSrc[0].lowReg, optFlags); 382a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee rlResult = oatEvalLoc(cUnit, rlDest, kCoreReg, true); 383a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee loadWordDisp(cUnit, rlSrc[0].lowReg, lenOffset, rlResult.lowReg); 384a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee storeValue(cUnit, rlDest, rlResult); 385a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 386a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 387a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CONST_STRING: 388a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CONST_STRING_JUMBO: 3896969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee genConstString(cUnit, vB, rlDest); 390a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 391a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 392a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CONST_CLASS: 3936969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee genConstClass(cUnit, vB, rlDest); 394a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 395a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 396a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::FILL_ARRAY_DATA: 397408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genFillArrayData(cUnit, vB, rlSrc[0]); 398a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 399a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 400a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::FILLED_NEW_ARRAY: 4016969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee genFilledNewArray(cUnit, oatNewCallInfo(cUnit, bb, mir, kStatic, 4023b3dbddcbc7a7bee505a608061304f9b26a91750buzbee false /* not range */)); 403a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 404a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 405a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::FILLED_NEW_ARRAY_RANGE: 4066969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee genFilledNewArray(cUnit, oatNewCallInfo(cUnit, bb, mir, kStatic, 4073b3dbddcbc7a7bee505a608061304f9b26a91750buzbee true /* range */)); 408a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 409a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 410a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::NEW_ARRAY: 411408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genNewArray(cUnit, vC, rlDest, rlSrc[0]); 412a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 413a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 414a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::GOTO: 415a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::GOTO_16: 416a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::GOTO_32: 417a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (bb->taken->startOffset <= mir->offset) { 418408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genSuspendTestAndBranch(cUnit, optFlags, &labelList[bb->taken->id]); 419a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } else { 420a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee opUnconditionalBranch(cUnit, &labelList[bb->taken->id]); 421a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 422a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 423a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 424a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::PACKED_SWITCH: 425408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genPackedSwitch(cUnit, vB, rlSrc[0]); 426a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 427a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 428a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SPARSE_SWITCH: 429a1da8a553681d1f7aec305610c8848c26373e0f0buzbee genSparseSwitch(cUnit, vB, rlSrc[0]); 430a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 431a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 432a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CMPL_FLOAT: 433a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CMPG_FLOAT: 434a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CMPL_DOUBLE: 435a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CMPG_DOUBLE: 436408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee res = genCmpFP(cUnit, opcode, rlDest, rlSrc[0], rlSrc[1]); 437a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 438a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 439a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::CMP_LONG: 440408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genCmpLong(cUnit, rlDest, rlSrc[0], rlSrc[1]); 441a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 442a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 443a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_EQ: 444a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_NE: 445a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_LT: 446a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_GE: 447a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_GT: 448a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_LE: { 4493b3dbddcbc7a7bee505a608061304f9b26a91750buzbee LIR* taken = &labelList[bb->taken->id]; 4503b3dbddcbc7a7bee505a608061304f9b26a91750buzbee LIR* fallThrough = &labelList[bb->fallThrough->id]; 451a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee bool backwardBranch; 452a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee backwardBranch = (bb->taken->startOffset <= mir->offset); 453a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (backwardBranch) { 454408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genSuspendTest(cUnit, optFlags); 455a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 4563b3dbddcbc7a7bee505a608061304f9b26a91750buzbee genCompareAndBranch(cUnit, opcode, rlSrc[0], rlSrc[1], taken, 4573b3dbddcbc7a7bee505a608061304f9b26a91750buzbee fallThrough); 458a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 459a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 460a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 461a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_EQZ: 462a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_NEZ: 463a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_LTZ: 464a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_GEZ: 465a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_GTZ: 466a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IF_LEZ: { 4673b3dbddcbc7a7bee505a608061304f9b26a91750buzbee LIR* taken = &labelList[bb->taken->id]; 4683b3dbddcbc7a7bee505a608061304f9b26a91750buzbee LIR* fallThrough = &labelList[bb->fallThrough->id]; 469a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee bool backwardBranch; 470a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee backwardBranch = (bb->taken->startOffset <= mir->offset); 471a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (backwardBranch) { 472408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genSuspendTest(cUnit, optFlags); 473a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 4743b3dbddcbc7a7bee505a608061304f9b26a91750buzbee genCompareZeroAndBranch(cUnit, opcode, rlSrc[0], taken, fallThrough); 475a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 476a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 477a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 478a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AGET_WIDE: 479408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genArrayGet(cUnit, optFlags, kLong, rlSrc[0], rlSrc[1], rlDest, 3); 480a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 481a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AGET: 482a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AGET_OBJECT: 483408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genArrayGet(cUnit, optFlags, kWord, rlSrc[0], rlSrc[1], rlDest, 2); 484a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 485a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AGET_BOOLEAN: 486408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genArrayGet(cUnit, optFlags, kUnsignedByte, rlSrc[0], rlSrc[1], rlDest, 0); 487a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 488a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AGET_BYTE: 489408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genArrayGet(cUnit, optFlags, kSignedByte, rlSrc[0], rlSrc[1], rlDest, 0); 490a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 491a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AGET_CHAR: 492408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genArrayGet(cUnit, optFlags, kUnsignedHalf, rlSrc[0], rlSrc[1], rlDest, 1); 493a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 494a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AGET_SHORT: 495408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genArrayGet(cUnit, optFlags, kSignedHalf, rlSrc[0], rlSrc[1], rlDest, 1); 496a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 497a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::APUT_WIDE: 498408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genArrayPut(cUnit, optFlags, kLong, rlSrc[1], rlSrc[2], rlSrc[0], 3); 499a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 500a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::APUT: 501408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genArrayPut(cUnit, optFlags, kWord, rlSrc[1], rlSrc[2], rlSrc[0], 2); 502a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 503a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::APUT_OBJECT: 504408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genArrayObjPut(cUnit, optFlags, rlSrc[1], rlSrc[2], rlSrc[0], 2); 505a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 506a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::APUT_SHORT: 507a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::APUT_CHAR: 508408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genArrayPut(cUnit, optFlags, kUnsignedHalf, rlSrc[1], rlSrc[2], rlSrc[0], 1); 509a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 510a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::APUT_BYTE: 511a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::APUT_BOOLEAN: 512408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genArrayPut(cUnit, optFlags, kUnsignedByte, rlSrc[1], rlSrc[2], 513a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee rlSrc[0], 0); 514a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 515a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 516a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IGET_OBJECT: 517a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee //case Instruction::IGET_OBJECT_VOLATILE: 518408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genIGet(cUnit, vC, optFlags, kWord, rlDest, rlSrc[0], false, true); 519a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 520a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 521a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IGET_WIDE: 522a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee //case Instruction::IGET_WIDE_VOLATILE: 523408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genIGet(cUnit, vC, optFlags, kLong, rlDest, rlSrc[0], true, false); 524a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 525a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 526a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IGET: 527a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee //case Instruction::IGET_VOLATILE: 528408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genIGet(cUnit, vC, optFlags, kWord, rlDest, rlSrc[0], false, false); 529a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 530a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 531a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IGET_CHAR: 532408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genIGet(cUnit, vC, optFlags, kUnsignedHalf, rlDest, rlSrc[0], false, false); 533a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 534a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 535a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IGET_SHORT: 536408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genIGet(cUnit, vC, optFlags, kSignedHalf, rlDest, rlSrc[0], false, false); 537a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 538a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 539a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IGET_BOOLEAN: 540a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IGET_BYTE: 541408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genIGet(cUnit, vC, optFlags, kUnsignedByte, rlDest, rlSrc[0], false, false); 542a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 543a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 544a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IPUT_WIDE: 545a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee //case Instruction::IPUT_WIDE_VOLATILE: 546408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genIPut(cUnit, vC, optFlags, kLong, rlSrc[0], rlSrc[1], true, false); 547a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 548a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 549a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IPUT_OBJECT: 550a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee //case Instruction::IPUT_OBJECT_VOLATILE: 551408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genIPut(cUnit, vC, optFlags, kWord, rlSrc[0], rlSrc[1], false, true); 552a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 553a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 554a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IPUT: 555a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee //case Instruction::IPUT_VOLATILE: 556408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genIPut(cUnit, vC, optFlags, kWord, rlSrc[0], rlSrc[1], false, false); 557a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 558a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 559a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IPUT_BOOLEAN: 560a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IPUT_BYTE: 561408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genIPut(cUnit, vC, optFlags, kUnsignedByte, rlSrc[0], rlSrc[1], false, false); 562a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 563a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 564a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IPUT_CHAR: 565408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genIPut(cUnit, vC, optFlags, kUnsignedHalf, rlSrc[0], rlSrc[1], false, false); 566a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 567a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 568a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::IPUT_SHORT: 569408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genIPut(cUnit, vC, optFlags, kSignedHalf, rlSrc[0], rlSrc[1], false, false); 570a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 571a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 572a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SGET_OBJECT: 573408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genSget(cUnit, vB, rlDest, false, true); 574a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 575a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SGET: 576a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SGET_BOOLEAN: 577a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SGET_BYTE: 578a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SGET_CHAR: 579a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SGET_SHORT: 580408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genSget(cUnit, vB, rlDest, false, false); 581a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 582a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 583a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SGET_WIDE: 584408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genSget(cUnit, vB, rlDest, true, false); 585a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 586a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 587a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SPUT_OBJECT: 588408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genSput(cUnit, vB, rlSrc[0], false, true); 589a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 590a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 591a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SPUT: 592a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SPUT_BOOLEAN: 593a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SPUT_BYTE: 594a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SPUT_CHAR: 595a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SPUT_SHORT: 596408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genSput(cUnit, vB, rlSrc[0], false, false); 597a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 598a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 599a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SPUT_WIDE: 600408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genSput(cUnit, vB, rlSrc[0], true, false); 601a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 602a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 603a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INVOKE_STATIC_RANGE: 6046969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee genInvoke(cUnit, oatNewCallInfo(cUnit, bb, mir, kStatic, true)); 605a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 606a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INVOKE_STATIC: 6076969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee genInvoke(cUnit, oatNewCallInfo(cUnit, bb, mir, kStatic, false)); 608a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 609a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 610a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INVOKE_DIRECT: 6116969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee genInvoke(cUnit, oatNewCallInfo(cUnit, bb, mir, kDirect, false)); 612a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 613a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INVOKE_DIRECT_RANGE: 6146969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee genInvoke(cUnit, oatNewCallInfo(cUnit, bb, mir, kDirect, true)); 615a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 616a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 617a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INVOKE_VIRTUAL: 6186969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee genInvoke(cUnit, oatNewCallInfo(cUnit, bb, mir, kVirtual, false)); 619a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 620a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INVOKE_VIRTUAL_RANGE: 6216969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee genInvoke(cUnit, oatNewCallInfo(cUnit, bb, mir, kVirtual, true)); 622a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 623a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 624a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INVOKE_SUPER: 6256969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee genInvoke(cUnit, oatNewCallInfo(cUnit, bb, mir, kSuper, false)); 626a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 627a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INVOKE_SUPER_RANGE: 6286969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee genInvoke(cUnit, oatNewCallInfo(cUnit, bb, mir, kSuper, true)); 629a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 630a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 631a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INVOKE_INTERFACE: 6326969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee genInvoke(cUnit, oatNewCallInfo(cUnit, bb, mir, kInterface, false)); 633a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 634a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INVOKE_INTERFACE_RANGE: 6356969d50c820bd63043940b0e0f0ddc6e6ac763b0buzbee genInvoke(cUnit, oatNewCallInfo(cUnit, bb, mir, kInterface, true)); 636a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 637a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 638a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::NEG_INT: 639a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::NOT_INT: 640408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee res = genArithOpInt(cUnit, opcode, rlDest, rlSrc[0], rlSrc[0]); 641a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 642a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 643a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::NEG_LONG: 644a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::NOT_LONG: 645408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee res = genArithOpLong(cUnit, opcode, rlDest, rlSrc[0], rlSrc[0]); 646a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 647a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 648a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::NEG_FLOAT: 649408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee res = genArithOpFloat(cUnit, opcode, rlDest, rlSrc[0], rlSrc[0]); 650a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 651a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 652a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::NEG_DOUBLE: 653408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee res = genArithOpDouble(cUnit, opcode, rlDest, rlSrc[0], rlSrc[0]); 654a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 655a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 656a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INT_TO_LONG: 657408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genIntToLong(cUnit, rlDest, rlSrc[0]); 658a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 659a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 660a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::LONG_TO_INT: 661a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee rlSrc[0] = oatUpdateLocWide(cUnit, rlSrc[0]); 662a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee rlSrc[0] = oatWideToNarrow(cUnit, rlSrc[0]); 663a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee storeValue(cUnit, rlDest, rlSrc[0]); 664a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 665a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 666a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INT_TO_BYTE: 667a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INT_TO_SHORT: 668a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INT_TO_CHAR: 669408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genIntNarrowing(cUnit, opcode, rlDest, rlSrc[0]); 670a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 671a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 672a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INT_TO_FLOAT: 673a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::INT_TO_DOUBLE: 674a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::LONG_TO_FLOAT: 675a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::LONG_TO_DOUBLE: 676a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::FLOAT_TO_INT: 677a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::FLOAT_TO_LONG: 678a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::FLOAT_TO_DOUBLE: 679a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DOUBLE_TO_INT: 680a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DOUBLE_TO_LONG: 681a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DOUBLE_TO_FLOAT: 682408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genConversion(cUnit, opcode, rlDest, rlSrc[0]); 683a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 684a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 685a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::ADD_INT: 686a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SUB_INT: 687a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MUL_INT: 688a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DIV_INT: 689a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::REM_INT: 690a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AND_INT: 691a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::OR_INT: 692a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::XOR_INT: 693a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SHL_INT: 694a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SHR_INT: 695a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::USHR_INT: 696a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::ADD_INT_2ADDR: 697a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SUB_INT_2ADDR: 698a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MUL_INT_2ADDR: 699a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DIV_INT_2ADDR: 700a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::REM_INT_2ADDR: 701a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AND_INT_2ADDR: 702a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::OR_INT_2ADDR: 703a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::XOR_INT_2ADDR: 704a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SHL_INT_2ADDR: 705a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SHR_INT_2ADDR: 706a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::USHR_INT_2ADDR: 707408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genArithOpInt(cUnit, opcode, rlDest, rlSrc[0], rlSrc[1]); 708a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 709a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 710a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::ADD_LONG: 711a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SUB_LONG: 712a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MUL_LONG: 713a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DIV_LONG: 714a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::REM_LONG: 715a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AND_LONG: 716a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::OR_LONG: 717a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::XOR_LONG: 718a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::ADD_LONG_2ADDR: 719a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SUB_LONG_2ADDR: 720a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MUL_LONG_2ADDR: 721a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DIV_LONG_2ADDR: 722a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::REM_LONG_2ADDR: 723a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AND_LONG_2ADDR: 724a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::OR_LONG_2ADDR: 725a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::XOR_LONG_2ADDR: 726408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genArithOpLong(cUnit, opcode, rlDest, rlSrc[0], rlSrc[1]); 727a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 728a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 729a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SHL_LONG: 730a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SHR_LONG: 731a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::USHR_LONG: 732a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SHL_LONG_2ADDR: 733a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SHR_LONG_2ADDR: 734a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::USHR_LONG_2ADDR: 735408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genShiftOpLong(cUnit, opcode, rlDest, rlSrc[0], rlSrc[1]); 736a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 737a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 738a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::ADD_FLOAT: 739a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SUB_FLOAT: 740a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MUL_FLOAT: 741a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DIV_FLOAT: 742a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::REM_FLOAT: 743a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::ADD_FLOAT_2ADDR: 744a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SUB_FLOAT_2ADDR: 745a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MUL_FLOAT_2ADDR: 746a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DIV_FLOAT_2ADDR: 747a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::REM_FLOAT_2ADDR: 748408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genArithOpFloat(cUnit, opcode, rlDest, rlSrc[0], rlSrc[1]); 749a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 750a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 751a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::ADD_DOUBLE: 752a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SUB_DOUBLE: 753a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MUL_DOUBLE: 754a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DIV_DOUBLE: 755a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::REM_DOUBLE: 756a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::ADD_DOUBLE_2ADDR: 757a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SUB_DOUBLE_2ADDR: 758a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MUL_DOUBLE_2ADDR: 759a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DIV_DOUBLE_2ADDR: 760a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::REM_DOUBLE_2ADDR: 761408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genArithOpDouble(cUnit, opcode, rlDest, rlSrc[0], rlSrc[1]); 762a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 763a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 764a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::RSUB_INT: 765a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::ADD_INT_LIT16: 766a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MUL_INT_LIT16: 767a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DIV_INT_LIT16: 768a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::REM_INT_LIT16: 769a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AND_INT_LIT16: 770a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::OR_INT_LIT16: 771a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::XOR_INT_LIT16: 772a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::ADD_INT_LIT8: 773a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::RSUB_INT_LIT8: 774a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::MUL_INT_LIT8: 775a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::DIV_INT_LIT8: 776a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::REM_INT_LIT8: 777a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::AND_INT_LIT8: 778a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::OR_INT_LIT8: 779a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::XOR_INT_LIT8: 780a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SHL_INT_LIT8: 781a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::SHR_INT_LIT8: 782a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case Instruction::USHR_INT_LIT8: 783408ad16bf7c460bf34ca55ff6351b79841a6fcd5buzbee genArithOpIntLit(cUnit, opcode, rlDest, rlSrc[0], vC); 784a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 785a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 786a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee default: 787a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee res = true; 788a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 789a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee return res; 790e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee} 791e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 79231a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbeeconst char* extendedMIROpNames[kMirOpLast - kMirOpFirst] = { 793a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee "kMirOpPhi", 794a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee "kMirOpCopy", 795a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee "kMirFusedCmplFloat", 796a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee "kMirFusedCmpgFloat", 797a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee "kMirFusedCmplDouble", 798a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee "kMirFusedCmpgDouble", 799a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee "kMirFusedCmpLong", 800a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee "kMirNop", 801c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee "kMirOpNullCheck", 802c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee "kMirOpRangeCheck", 803c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee "kMirOpDivZeroCheck", 804c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee "kMirOpCheck", 805e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee}; 806e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 807e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/* Extended MIR instructions like PHI */ 80884fd693103dddd50b6a18522bfb5eaab0e51b6ecbuzbeevoid handleExtendedMethodMIR(CompilationUnit* cUnit, BasicBlock* bb, MIR* mir) 809e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{ 810a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int opOffset = mir->dalvikInsn.opcode - kMirOpFirst; 811a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee char* msg = NULL; 812a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (cUnit->printMe) { 813a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee msg = (char*)oatNew(cUnit, strlen(extendedMIROpNames[opOffset]) + 1, 814a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee false, kAllocDebugInfo); 815a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee strcpy(msg, extendedMIROpNames[opOffset]); 816a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 817a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee LIR* op = newLIR1(cUnit, kPseudoExtended, (int) msg); 818a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 819a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee switch ((ExtendedMIROpcode)mir->dalvikInsn.opcode) { 820a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case kMirOpPhi: { 821a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee char* ssaString = NULL; 822a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (cUnit->printMe) { 823a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee ssaString = oatGetSSAString(cUnit, mir->ssaRep); 824a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 825a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee op->flags.isNop = true; 826a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee newLIR1(cUnit, kPseudoSSARep, (int) ssaString); 827a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 828a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 829a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case kMirOpCopy: { 830a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee RegLocation rlSrc = oatGetSrc(cUnit, mir, 0); 83115bf9804820b73765899e4b3e0d8a1fa15e0dbd3buzbee RegLocation rlDest = oatGetDest(cUnit, mir); 832a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee storeValue(cUnit, rlDest, rlSrc); 833a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 834e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee } 835a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case kMirOpFusedCmplFloat: 836a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee genFusedFPCmpBranch(cUnit, bb, mir, false /*gt bias*/, false /*double*/); 837a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 838a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case kMirOpFusedCmpgFloat: 839a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee genFusedFPCmpBranch(cUnit, bb, mir, true /*gt bias*/, false /*double*/); 840a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 841a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case kMirOpFusedCmplDouble: 842a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee genFusedFPCmpBranch(cUnit, bb, mir, false /*gt bias*/, true /*double*/); 843a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 844a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case kMirOpFusedCmpgDouble: 845a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee genFusedFPCmpBranch(cUnit, bb, mir, true /*gt bias*/, true /*double*/); 846a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 847a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee case kMirOpFusedCmpLong: 848a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee genFusedLongCmpBranch(cUnit, bb, mir); 849a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 850a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee default: 851a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 852a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 853e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee} 854e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 855e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/* Handle the content in each basic block */ 85631a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbeebool methodBlockCodeGen(CompilationUnit* cUnit, BasicBlock* bb) 857e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{ 858488a78ca207898490da3cfb58399534fa9fb3fbfbuzbee if (bb->blockType == kDead) return false; 8598320f3867c02bae9bef6cdab267820cb7b412781buzbee cUnit->currentDalvikOffset = bb->startOffset; 860a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee MIR* mir; 861a1da8a553681d1f7aec305610c8848c26373e0f0buzbee LIR* labelList = cUnit->blockLabelList; 862a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int blockId = bb->id; 863a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 864a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee cUnit->curBlock = bb; 865a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee labelList[blockId].operands[0] = bb->startOffset; 866a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 867a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* Insert the block label */ 868a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee labelList[blockId].opcode = kPseudoNormalBlockLabel; 869a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee oatAppendLIR(cUnit, (LIR*) &labelList[blockId]); 870a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 8718320f3867c02bae9bef6cdab267820cb7b412781buzbee LIR* headLIR = NULL; 8728320f3867c02bae9bef6cdab267820cb7b412781buzbee 8738320f3867c02bae9bef6cdab267820cb7b412781buzbee /* If this is a catch block, mark the beginning as a safepoint */ 8748320f3867c02bae9bef6cdab267820cb7b412781buzbee if (bb->catchEntry) { 8758320f3867c02bae9bef6cdab267820cb7b412781buzbee headLIR = newLIR0(cUnit, kPseudoSafepointPC); 8768320f3867c02bae9bef6cdab267820cb7b412781buzbee } 8778320f3867c02bae9bef6cdab267820cb7b412781buzbee 878a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* Free temp registers and reset redundant store tracking */ 879a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee oatResetRegPool(cUnit); 880a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee oatResetDefTracking(cUnit); 881a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 882d1643e41ef242ae656f667bf3c8b0324635cefd3buzbee oatClobberAllRegs(cUnit); 883e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 884e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 885a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (bb->blockType == kEntryBlock) { 886ad8f15e0b13383b2eaa2486b230debeae7a55661buzbee int startVReg = cUnit->numDalvikRegisters - cUnit->numIns; 887ad8f15e0b13383b2eaa2486b230debeae7a55661buzbee genEntrySequence(cUnit, &cUnit->regLocation[startVReg], 888ad8f15e0b13383b2eaa2486b230debeae7a55661buzbee cUnit->regLocation[cUnit->methodSReg]); 889a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } else if (bb->blockType == kExitBlock) { 8902cfc639fc803bf67e3d2a961f2b637220c86d5f7buzbee genExitSequence(cUnit); 891a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 892a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 893a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee for (mir = bb->firstMIRInsn; mir; mir = mir->next) { 894e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee oatResetRegPool(cUnit); 895a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (cUnit->disableOpt & (1 << kTrackLiveTemps)) { 896a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee oatClobberAllRegs(cUnit); 897a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 898e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 899a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (cUnit->disableOpt & (1 << kSuppressLoads)) { 900a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee oatResetDefTracking(cUnit); 901e196567b50a084b163937ea9605b51ee1e48adebbuzbee } 902e196567b50a084b163937ea9605b51ee1e48adebbuzbee 903a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee#ifndef NDEBUG 904a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* Reset temp tracking sanity check */ 905a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee cUnit->liveSReg = INVALID_SREG; 906a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee#endif 907a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 908a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee cUnit->currentDalvikOffset = mir->offset; 909c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee int opcode = mir->dalvikInsn.opcode; 910a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee LIR* boundaryLIR; 911e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 912a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* Mark the beginning of a Dalvik instruction for line tracking */ 913a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee char* instStr = cUnit->printMe ? 914a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee oatGetDalvikDisassembly(cUnit, mir->dalvikInsn, "") : NULL; 915d1643e41ef242ae656f667bf3c8b0324635cefd3buzbee boundaryLIR = markBoundary(cUnit, mir->offset, instStr); 916a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* Remember the first LIR for this block */ 917a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (headLIR == NULL) { 918a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee headLIR = boundaryLIR; 919a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* Set the first boundaryLIR as a scheduling barrier */ 920a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee headLIR->defMask = ENCODE_ALL; 921e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee } 922e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 923a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* If we're compiling for the debugger, generate an update callout */ 924a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (cUnit->genDebugger) { 925a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee genDebuggerUpdate(cUnit, mir->offset); 926a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 927e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 928a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* Don't generate the SSA annotation unless verbose mode is on */ 929a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (cUnit->printMe && mir->ssaRep) { 930a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee char* ssaString = oatGetSSAString(cUnit, mir->ssaRep); 931a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee newLIR1(cUnit, kPseudoSSARep, (int) ssaString); 932a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 933e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 934c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee if (opcode == kMirOpCheck) { 935c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee // Combine check and work halves of throwing instruction. 936c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee MIR* workHalf = mir->meta.throwInsn; 937c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee mir->dalvikInsn.opcode = workHalf->dalvikInsn.opcode; 938c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee opcode = workHalf->dalvikInsn.opcode; 939c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee SSARepresentation* ssaRep = workHalf->ssaRep; 940c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee workHalf->ssaRep = mir->ssaRep; 941c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee mir->ssaRep = ssaRep; 942c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee workHalf->dalvikInsn.opcode = static_cast<Instruction::Code>(kMirOpNop); 943c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee } 944c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee 945c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee if (opcode >= kMirOpFirst) { 946a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee handleExtendedMethodMIR(cUnit, bb, mir); 947a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee continue; 948a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 949e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 950a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee bool notHandled = compileDalvikInstruction(cUnit, mir, bb, labelList); 951a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (notHandled) { 952c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee LOG(FATAL) << StringPrintf("%#06x: Opcode %#x (%s)", 953c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee mir->offset, opcode, 954c9f40dd0a3dba696fc694d51fb82b61dcff19066Bill Buzbee Instruction::Name(mir->dalvikInsn.opcode)); 955e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee } 956a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 957e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 958a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (headLIR) { 959a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* 960a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee * Eliminate redundant loads/stores and delay stores into later 961a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee * slots 962a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee */ 963a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee oatApplyLocalOptimizations(cUnit, (LIR*) headLIR, cUnit->lastLIRInsn); 964a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 965a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* 966a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee * Generate an unconditional branch to the fallthrough block. 967a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee */ 968a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (bb->fallThrough) { 969a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee opUnconditionalBranch(cUnit, &labelList[bb->fallThrough->id]); 970e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee } 971a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 972a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee return false; 973e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee} 974e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 97516da88c70c4bdbd97b8482be8b42103a52f22d59buzbee/* Set basic block labels */ 97616da88c70c4bdbd97b8482be8b42103a52f22d59buzbeebool labelBlocks(CompilationUnit* cUnit, BasicBlock* bb) 97716da88c70c4bdbd97b8482be8b42103a52f22d59buzbee{ 978a1da8a553681d1f7aec305610c8848c26373e0f0buzbee LIR* labelList = cUnit->blockLabelList; 979a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int blockId = bb->id; 98016da88c70c4bdbd97b8482be8b42103a52f22d59buzbee 981a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee cUnit->curBlock = bb; 982a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee labelList[blockId].operands[0] = bb->startOffset; 98316da88c70c4bdbd97b8482be8b42103a52f22d59buzbee 984a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* Insert the block label */ 985a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee labelList[blockId].opcode = kPseudoNormalBlockLabel; 986a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee return false; 98716da88c70c4bdbd97b8482be8b42103a52f22d59buzbee} 98816da88c70c4bdbd97b8482be8b42103a52f22d59buzbee 98916da88c70c4bdbd97b8482be8b42103a52f22d59buzbeevoid oatSpecialMIR2LIR(CompilationUnit* cUnit, SpecialCaseHandler specialCase) 99016da88c70c4bdbd97b8482be8b42103a52f22d59buzbee{ 991a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* Find the first DalvikByteCode block */ 992a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int numReachableBlocks = cUnit->numReachableBlocks; 993a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee const GrowableList *blockList = &cUnit->blockList; 994a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee BasicBlock*bb = NULL; 995a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee for (int idx = 0; idx < numReachableBlocks; idx++) { 996a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int dfsIndex = cUnit->dfsOrder.elemList[idx]; 997a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee bb = (BasicBlock*)oatGrowableListGetElement(blockList, dfsIndex); 998a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (bb->blockType == kDalvikByteCode) { 999a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee break; 100016da88c70c4bdbd97b8482be8b42103a52f22d59buzbee } 1001a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 1002a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (bb == NULL) { 1003a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee return; 1004a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 1005a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee DCHECK_EQ(bb->startOffset, 0); 1006748474146da0c6484fa3dca0a700f612d47550c3Elliott Hughes DCHECK(bb->firstMIRInsn != NULL); 1007a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 1008a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* Get the first instruction */ 1009a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee MIR* mir = bb->firstMIRInsn; 1010a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 1011a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* Free temp registers and reset redundant store tracking */ 1012a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee oatResetRegPool(cUnit); 1013a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee oatResetDefTracking(cUnit); 1014a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee oatClobberAllRegs(cUnit); 1015a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee 1016a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee genSpecialCase(cUnit, bb, mir, specialCase); 101716da88c70c4bdbd97b8482be8b42103a52f22d59buzbee} 101816da88c70c4bdbd97b8482be8b42103a52f22d59buzbee 1019e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeevoid oatMethodMIR2LIR(CompilationUnit* cUnit) 1020e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{ 1021a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee /* Used to hold the labels of each block */ 1022a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee cUnit->blockLabelList = 1023a1da8a553681d1f7aec305610c8848c26373e0f0buzbee (LIR*) oatNew(cUnit, sizeof(LIR) * cUnit->numBlocks, true, kAllocLIR); 1024e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 1025a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee oatDataFlowAnalysisDispatcher(cUnit, methodBlockCodeGen, 1026a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee kPreOrderDFSTraversal, false /* Iterative */); 1027ab2b55dfcf630fdf8d03b5f506386f114fa2874cIan Rogers 1028a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee handleSuspendLaunchpads(cUnit); 1029e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 1030a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee handleThrowLaunchpads(cUnit); 1031e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 1032a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee handleIntrinsicLaunchpads(cUnit); 1033fc9e6fabed89d948fa8c0e9d673e430076712c60buzbee 1034a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee if (!(cUnit->disableOpt & (1 << kSafeOptimizations))) { 1035a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee removeRedundantBranches(cUnit); 1036a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee } 1037e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee} 1038e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 1039e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/* Needed by the ld/st optmizatons */ 104031a4a6f5717f645da6b97ccc1e420ae1e1c71ce0buzbeeLIR* oatRegCopyNoInsert(CompilationUnit* cUnit, int rDest, int rSrc) 1041e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{ 1042a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee return opRegCopyNoInsert(cUnit, rDest, rSrc); 1043e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee} 1044e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 1045e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/* Needed by the register allocator */ 1046e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeevoid oatRegCopy(CompilationUnit* cUnit, int rDest, int rSrc) 1047e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{ 1048a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee opRegCopy(cUnit, rDest, rSrc); 1049e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee} 1050e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 1051e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee/* Needed by the register allocator */ 1052e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeevoid oatRegCopyWide(CompilationUnit* cUnit, int destLo, int destHi, 1053a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int srcLo, int srcHi) 1054e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{ 1055a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee opRegCopyWide(cUnit, destLo, destHi, srcLo, srcHi); 1056e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee} 1057e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 1058e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeevoid oatFlushRegImpl(CompilationUnit* cUnit, int rBase, 1059a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int displacement, int rSrc, OpSize size) 1060e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{ 1061a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee storeBaseDisp(cUnit, rBase, displacement, rSrc, size); 1062e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee} 1063e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 1064e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbeevoid oatFlushRegWideImpl(CompilationUnit* cUnit, int rBase, 1065a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee int displacement, int rSrcLo, int rSrcHi) 1066e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee{ 1067a114add0300b95eeaae7465493f39144e07324e8Bill Buzbee storeBaseDispWide(cUnit, rBase, displacement, rSrcLo, rSrcHi); 1068e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee} 1069e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee 1070e3acd07f28d5625062b599c2817cb5f7a53f54a9buzbee} // namespace art 1071