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