1a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* 2a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Copyright (C) 2009 The Android Open Source Project 3a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * 4a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Licensed under the Apache License, Version 2.0 (the "License"); 5a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * you may not use this file except in compliance with the License. 6a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * You may obtain a copy of the License at 7a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * 8a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * http://www.apache.org/licenses/LICENSE-2.0 9a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * 10a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Unless required by applicable law or agreed to in writing, software 11a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * distributed under the License is distributed on an "AS IS" BASIS, 12a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * See the License for the specific language governing permissions and 14a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * limitations under the License. 15a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham */ 16a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 17a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* 18a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * This file contains register alloction support and is intended to be 19a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * included by: 20a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * 21a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Codegen-$(TARGET_ARCH_VARIANT).c 22a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * 23a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham */ 24a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 25a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#include "compiler/CompilerUtility.h" 26a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#include "compiler/CompilerIR.h" 27a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#include "compiler/Dataflow.h" 28a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#include "MipsLIR.h" 29a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#include "Codegen.h" 30a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#include "Ralloc.h" 31a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 32a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#define SREG(c, s) ((c)->regLocation[(s)].sRegLow) 33a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* 34a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Get the "real" sreg number associated with an sReg slot. In general, 35a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * sReg values passed through codegen are the SSA names created by 36a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * dataflow analysis and refer to slot numbers in the cUnit->regLocation 37a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * array. However, renaming is accomplished by simply replacing RegLocation 38a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * entries in the cUnit->reglocation[] array. Therefore, when location 39a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * records for operands are first created, we need to ask the locRecord 40a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * identified by the dataflow pass what it's new name is. 41a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham */ 42a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 43a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* 44a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Free all allocated temps in the temp pools. Note that this does 45a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * not affect the "liveness" of a temp register, which will stay 46a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * live until it is either explicitly killed or reallocated. 47a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham */ 48a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerResetRegPool(CompilationUnit *cUnit) 49a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 50a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int i; 51a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i < cUnit->regPool->numCoreTemps; i++) { 52a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham cUnit->regPool->coreTemps[i].inUse = false; 53a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 54a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i < cUnit->regPool->numFPTemps; i++) { 55a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham cUnit->regPool->FPTemps[i].inUse = false; 56a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 57a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 58a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 59a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* Set up temp & preserved register pools specialized by target */ 60a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerInitPool(RegisterInfo *regs, int *regNums, int num) 61a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 62a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int i; 63a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i < num; i++) { 64a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham regs[i].reg = regNums[i]; 65a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham regs[i].inUse = false; 66a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham regs[i].pair = false; 67a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham regs[i].live = false; 68a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham regs[i].dirty = false; 69a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham regs[i].sReg = INVALID_SREG; 70a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 71a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 72a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 73a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamstatic void dumpRegPool(RegisterInfo *p, int numRegs) 74a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 75a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int i; 76fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGE("================================================"); 77a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i < numRegs; i++ ){ 78fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGE("R[%d]: U:%d, P:%d, part:%d, LV:%d, D:%d, SR:%d, ST:%x, EN:%x", 79a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[i].reg, p[i].inUse, p[i].pair, p[i].partner, p[i].live, 80a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[i].dirty, p[i].sReg,(int)p[i].defStart, (int)p[i].defEnd); 81a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 82fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGE("================================================"); 83a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 84a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 85a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamstatic RegisterInfo *getRegInfo(CompilationUnit *cUnit, int reg) 86a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 87a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int numTemps = cUnit->regPool->numCoreTemps; 88a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *p = cUnit->regPool->coreTemps; 89a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int i; 90a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i< numTemps; i++) { 91a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (p[i].reg == reg) { 92a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return &p[i]; 93a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 94a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 95a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p = cUnit->regPool->FPTemps; 96a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham numTemps = cUnit->regPool->numFPTemps; 97a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i< numTemps; i++) { 98a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (p[i].reg == reg) { 99a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return &p[i]; 100a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 101a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 102fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGE("Tried to get info on a non-existant temp: r%d",reg); 103a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerAbort(cUnit); 104a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return NULL; 105a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 106a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 107a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamstatic void flushRegWide(CompilationUnit *cUnit, int reg1, int reg2) 108a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 109a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *info1 = getRegInfo(cUnit, reg1); 110a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *info2 = getRegInfo(cUnit, reg2); 111a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(info1 && info2 && info1->pair && info2->pair && 112a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham (info1->partner == info2->reg) && 113a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham (info2->partner == info1->reg)); 114a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if ((info1->live && info1->dirty) || (info2->live && info2->dirty)) { 115a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham info1->dirty = false; 116a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham info2->dirty = false; 117a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (dvmCompilerS2VReg(cUnit, info2->sReg) < 118a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerS2VReg(cUnit, info1->sReg)) 119a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham info1 = info2; 120a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerFlushRegWideImpl(cUnit, rFP, 121a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerS2VReg(cUnit, info1->sReg) << 2, 122a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham info1->reg, info1->partner); 123a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 124a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 125a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 126a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamstatic void flushReg(CompilationUnit *cUnit, int reg) 127a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 128a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *info = getRegInfo(cUnit, reg); 129a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (info->live && info->dirty) { 130a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham info->dirty = false; 131a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerFlushRegImpl(cUnit, rFP, 132a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerS2VReg(cUnit, info->sReg) << 2, 133a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham reg, kWord); 134a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 135a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 136a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 137a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* return true if found reg to clobber */ 138a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamstatic bool clobberRegBody(CompilationUnit *cUnit, RegisterInfo *p, 139a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int numTemps, int reg) 140a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 141a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int i; 142a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i< numTemps; i++) { 143a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (p[i].reg == reg) { 144a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (p[i].live && p[i].dirty) { 145a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (p[i].pair) { 146a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham flushRegWide(cUnit, p[i].reg, p[i].partner); 147a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } else { 148a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham flushReg(cUnit, p[i].reg); 149a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 150a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 151a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[i].live = false; 152a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[i].sReg = INVALID_SREG; 153a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[i].defStart = NULL; 154a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[i].defEnd = NULL; 155a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (p[i].pair) { 156a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[i].pair = false; 157a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* partners should be in same pool */ 158a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham clobberRegBody(cUnit, p, numTemps, p[i].partner); 159a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 160a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return true; 161a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 162a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 163a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return false; 164a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 165a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 166a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* Mark a temp register as dead. Does not affect allocation state. */ 167a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamvoid dvmCompilerClobber(CompilationUnit *cUnit, int reg) 168a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 169a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (!clobberRegBody(cUnit, cUnit->regPool->coreTemps, 170a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham cUnit->regPool->numCoreTemps, reg)) { 171a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham clobberRegBody(cUnit, cUnit->regPool->FPTemps, 172a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham cUnit->regPool->numFPTemps, reg); 173a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 174a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 175a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 176a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamstatic void clobberSRegBody(RegisterInfo *p, int numTemps, int sReg) 177a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 178a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int i; 179a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i< numTemps; i++) { 180a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (p[i].sReg == sReg) { 181a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[i].live = false; 182a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[i].defStart = NULL; 183a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[i].defEnd = NULL; 184a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 185a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 186a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 187a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 188a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* Clobber any temp associated with an sReg. Could be in either class */ 189a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerClobberSReg(CompilationUnit *cUnit, int sReg) 190a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 191a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham clobberSRegBody(cUnit->regPool->coreTemps, cUnit->regPool->numCoreTemps, 192a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham sReg); 193a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham clobberSRegBody(cUnit->regPool->FPTemps, cUnit->regPool->numFPTemps, 194a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham sReg); 195a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 196a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 197a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamstatic int allocTempBody(CompilationUnit *cUnit, RegisterInfo *p, int numTemps, 198a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int *nextTemp, bool required) 199a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 200a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int i; 201a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int next = *nextTemp; 202a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i< numTemps; i++) { 203a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (next >= numTemps) 204a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham next = 0; 205a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (!p[next].inUse && !p[next].live) { 206a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, p[next].reg); 207a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[next].inUse = true; 208a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[next].pair = false; 209a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham *nextTemp = next + 1; 210a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return p[next].reg; 211a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 212a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham next++; 213a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 214a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham next = *nextTemp; 215a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i< numTemps; i++) { 216a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (next >= numTemps) 217a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham next = 0; 218a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (!p[next].inUse) { 219a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, p[next].reg); 220a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[next].inUse = true; 221a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[next].pair = false; 222a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham *nextTemp = next + 1; 223a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return p[next].reg; 224a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 225a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham next++; 226a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 227a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (required) { 228fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGE("No free temp registers"); 229a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerAbort(cUnit); 230a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 231a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return -1; // No register available 232a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 233a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 234a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham//REDO: too many assumptions. 235a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern int dvmCompilerAllocTempDouble(CompilationUnit *cUnit) 236a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 237a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *p = cUnit->regPool->FPTemps; 238a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int numTemps = cUnit->regPool->numFPTemps; 239a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* Cleanup - not all targets need aligned regs */ 240a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int start = cUnit->regPool->nextFPTemp + (cUnit->regPool->nextFPTemp & 1); 241a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int next = start; 242a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int i; 243a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 244a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i < numTemps; i+=2) { 245a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (next >= numTemps) 246a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham next = 0; 247a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if ((!p[next].inUse && !p[next].live) && 248a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham (!p[next+1].inUse && !p[next+1].live)) { 249a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, p[next].reg); 250a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, p[next+1].reg); 251a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[next].inUse = true; 252a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[next+1].inUse = true; 253a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert((p[next].reg+1) == p[next+1].reg); 254a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert((p[next].reg & 0x1) == 0); 255a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham cUnit->regPool->nextFPTemp += 2; 256a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return p[next].reg; 257a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 258a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham next += 2; 259a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 260a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham next = start; 261a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i < numTemps; i+=2) { 262a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (next >= numTemps) 263a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham next = 0; 264a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (!p[next].inUse && !p[next+1].inUse) { 265a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, p[next].reg); 266a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, p[next+1].reg); 267a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[next].inUse = true; 268a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[next+1].inUse = true; 269a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert((p[next].reg+1) == p[next+1].reg); 270a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert((p[next].reg & 0x1) == 0); 271a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham cUnit->regPool->nextFPTemp += 2; 272a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return p[next].reg; 273a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 274a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham next += 2; 275a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 276fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGE("No free temp registers"); 277a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerAbort(cUnit); 278a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return -1; 279a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 280a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 281a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* Return a temp if one is available, -1 otherwise */ 282a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern int dvmCompilerAllocFreeTemp(CompilationUnit *cUnit) 283a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 284a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return allocTempBody(cUnit, cUnit->regPool->coreTemps, 285a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham cUnit->regPool->numCoreTemps, 286a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham &cUnit->regPool->nextCoreTemp, true); 287a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 288a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 289a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern int dvmCompilerAllocTemp(CompilationUnit *cUnit) 290a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 291a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return allocTempBody(cUnit, cUnit->regPool->coreTemps, 292a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham cUnit->regPool->numCoreTemps, 293a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham &cUnit->regPool->nextCoreTemp, true); 294a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 295a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 296a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern int dvmCompilerAllocTempFloat(CompilationUnit *cUnit) 297a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 298a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return allocTempBody(cUnit, cUnit->regPool->FPTemps, 299a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham cUnit->regPool->numFPTemps, 300a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham &cUnit->regPool->nextFPTemp, true); 301a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 302a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 303a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamstatic RegisterInfo *allocLiveBody(RegisterInfo *p, int numTemps, int sReg) 304a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 305a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int i; 306a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (sReg == -1) 307a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return NULL; 308a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i < numTemps; i++) { 309a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (p[i].live && (p[i].sReg == sReg)) { 310a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[i].inUse = true; 311a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return &p[i]; 312a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 313a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 314a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return NULL; 315a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 316a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 317a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamstatic RegisterInfo *allocLive(CompilationUnit *cUnit, int sReg, 318a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int regClass) 319a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 320a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *res = NULL; 321a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham switch(regClass) { 322a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kAnyReg: 323a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham res = allocLiveBody(cUnit->regPool->FPTemps, 324a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham cUnit->regPool->numFPTemps, sReg); 325a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (res) 326a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 327a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* Intentional fallthrough */ 328a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kCoreReg: 329a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham res = allocLiveBody(cUnit->regPool->coreTemps, 330a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham cUnit->regPool->numCoreTemps, sReg); 331a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 332a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham case kFPReg: 333a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham res = allocLiveBody(cUnit->regPool->FPTemps, 334a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham cUnit->regPool->numFPTemps, sReg); 335a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 336a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham default: 337fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGE("Invalid register type"); 338a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerAbort(cUnit); 339a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 340a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return res; 341a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 342a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 343a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerFreeTemp(CompilationUnit *cUnit, int reg) 344a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 345a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *p = cUnit->regPool->coreTemps; 346a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int numTemps = cUnit->regPool->numCoreTemps; 347a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int i; 348a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i< numTemps; i++) { 349a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (p[i].reg == reg) { 350a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[i].inUse = false; 351a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[i].pair = false; 352a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return; 353a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 354a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 355a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p = cUnit->regPool->FPTemps; 356a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham numTemps = cUnit->regPool->numFPTemps; 357a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i< numTemps; i++) { 358a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (p[i].reg == reg) { 359a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[i].inUse = false; 360a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[i].pair = false; 361a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return; 362a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 363a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 364fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGE("Tried to free a non-existant temp: r%d",reg); 365a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerAbort(cUnit); 366a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 367a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 368a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* 369a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * FIXME - this needs to also check the preserved pool once we start 370a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * start using preserved registers. 371a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham */ 372a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern RegisterInfo *dvmCompilerIsLive(CompilationUnit *cUnit, int reg) 373a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 374a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *p = cUnit->regPool->coreTemps; 375a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int numTemps = cUnit->regPool->numCoreTemps; 376a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int i; 377a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i< numTemps; i++) { 378a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (p[i].reg == reg) { 379a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return p[i].live ? &p[i] : NULL; 380a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 381a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 382a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p = cUnit->regPool->FPTemps; 383a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham numTemps = cUnit->regPool->numFPTemps; 384a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i< numTemps; i++) { 385a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (p[i].reg == reg) { 386a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return p[i].live ? &p[i] : NULL; 387a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 388a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 389a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return NULL; 390a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 391a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 392a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern RegisterInfo *dvmCompilerIsTemp(CompilationUnit *cUnit, int reg) 393a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 394a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *p = cUnit->regPool->coreTemps; 395a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int numTemps = cUnit->regPool->numCoreTemps; 396a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int i; 397a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i< numTemps; i++) { 398a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (p[i].reg == reg) { 399a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return &p[i]; 400a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 401a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 402a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p = cUnit->regPool->FPTemps; 403a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham numTemps = cUnit->regPool->numFPTemps; 404a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i< numTemps; i++) { 405a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (p[i].reg == reg) { 406a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return &p[i]; 407a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 408a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 409a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return NULL; 410a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 411a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 412a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* 413a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Similar to dvmCompilerAllocTemp(), but forces the allocation of a specific 414a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * register. No check is made to see if the register was previously 415a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * allocated. Use with caution. 416a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham */ 417a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerLockTemp(CompilationUnit *cUnit, int reg) 418a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 419a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *p = cUnit->regPool->coreTemps; 420a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int numTemps = cUnit->regPool->numCoreTemps; 421a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int i; 422a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i< numTemps; i++) { 423a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (p[i].reg == reg) { 424a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[i].inUse = true; 425a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[i].live = false; 426a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return; 427a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 428a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 429a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p = cUnit->regPool->FPTemps; 430a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham numTemps = cUnit->regPool->numFPTemps; 431a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i< numTemps; i++) { 432a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (p[i].reg == reg) { 433a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[i].inUse = true; 434a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p[i].live = false; 435a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return; 436a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 437a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 438fc3b0c4ba9e0ecabb0f6df1ceb6a3eb69da07c7bRaghu Gandham ALOGE("Tried to lock a non-existant temp: r%d",reg); 439a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerAbort(cUnit); 440a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 441a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 442a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* Clobber all regs that might be used by an external C call */ 443a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerClobberCallRegs(CompilationUnit *cUnit) 444a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 445a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_ZERO); 446a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_AT); 447a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_V0); 448a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_V1); 449a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_A0); 450a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_A1); 451a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_A2); 452a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_A3); 453a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_T0); 454a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_T1); 455a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_T2); 456a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_T3); 457a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_T4); 458a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_T5); 459a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_T6); 460a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_T7); 461a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_T8); 462a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_T9); 463a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_K0); 464a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_K1); 465a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_GP); 466a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_FP); 467a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_RA); 468a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_HI); 469a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_LO); 470a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_F0); 471a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_F1); 472a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_F2); 473a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_F3); 474a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_F4); 475a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_F5); 476a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_F6); 477a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_F7); 478a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_F8); 479a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_F9); 480a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_F10); 481a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_F11); 482a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_F12); 483a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_F13); 484a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_F14); 485a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_F15); 486a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 487a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 488a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* Clobber all of the temps that might be used by a handler. */ 489a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerClobberHandlerRegs(CompilationUnit *cUnit) 490a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 491a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham //TUNING: reduce the set of regs used by handlers. Only a few need lots. 492a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobberCallRegs(cUnit); 493a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_S0); 494a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_S1); 495a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_S2); 496a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_S3); 497a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_S4); 498a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_S5); 499a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_S6); 500a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_S7); 501a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 502a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 503a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerResetDef(CompilationUnit *cUnit, int reg) 504a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 505a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *p = getRegInfo(cUnit, reg); 506a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p->defStart = NULL; 507a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p->defEnd = NULL; 508a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 509a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 510a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamstatic void nullifyRange(CompilationUnit *cUnit, LIR *start, LIR *finish, 511a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int sReg1, int sReg2) 512a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 513a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (start && finish) { 514a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham LIR *p; 515a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(sReg1 == sReg2); 516a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (p = start; ;p = p->next) { 517a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham ((MipsLIR *)p)->flags.isNop = true; 518a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (p == finish) 519a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham break; 520a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 521a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 522a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 523a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 524a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* 525a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Mark the beginning and end LIR of a def sequence. Note that 526a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * on entry start points to the LIR prior to the beginning of the 527a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * sequence. 528a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham */ 529a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerMarkDef(CompilationUnit *cUnit, RegLocation rl, 530a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham LIR *start, LIR *finish) 531a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 532a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(!rl.wide); 533a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(start && start->next); 534a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(finish); 535a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *p = getRegInfo(cUnit, rl.lowReg); 536a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p->defStart = start->next; 537a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p->defEnd = finish; 538a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 539a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 540a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* 541a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Mark the beginning and end LIR of a def sequence. Note that 542a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * on entry start points to the LIR prior to the beginning of the 543a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * sequence. 544a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham */ 545a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerMarkDefWide(CompilationUnit *cUnit, RegLocation rl, 546a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham LIR *start, LIR *finish) 547a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 548a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(rl.wide); 549a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(start && start->next); 550a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(finish); 551a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *p = getRegInfo(cUnit, rl.lowReg); 552a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerResetDef(cUnit, rl.highReg); // Only track low of pair 553a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p->defStart = start->next; 554a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p->defEnd = finish; 555a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 556a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 557a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern RegLocation dvmCompilerWideToNarrow(CompilationUnit *cUnit, 558a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegLocation rl) 559a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 560a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(rl.wide); 561a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (rl.location == kLocPhysReg) { 562a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *infoLo = getRegInfo(cUnit, rl.lowReg); 563a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *infoHi = getRegInfo(cUnit, rl.highReg); 564a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (!infoLo->pair) { 565a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dumpRegPool(cUnit->regPool->coreTemps, 566a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham cUnit->regPool->numCoreTemps); 567a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(infoLo->pair); 568a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 569a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (!infoHi->pair) { 570a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dumpRegPool(cUnit->regPool->coreTemps, 571a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham cUnit->regPool->numCoreTemps); 572a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(infoHi->pair); 573a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 574a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(infoLo->pair); 575a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(infoHi->pair); 576a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(infoLo->partner == infoHi->reg); 577a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(infoHi->partner == infoLo->reg); 578a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham infoLo->pair = false; 579a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham infoHi->pair = false; 580a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham infoLo->defStart = NULL; 581a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham infoLo->defEnd = NULL; 582a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham infoHi->defStart = NULL; 583a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham infoHi->defEnd = NULL; 584a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 585a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#ifndef HAVE_LITTLE_ENDIAN 586a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham else if (rl.location == kLocDalvikFrame) { 587a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham rl.sRegLow = dvmCompilerSRegHi(rl.sRegLow); 588a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 589a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham#endif 590a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 591a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham rl.wide = false; 592a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return rl; 593a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 594a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 595a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerResetDefLoc(CompilationUnit *cUnit, RegLocation rl) 596a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 597a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(!rl.wide); 598a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (!(gDvmJit.disableOpt & (1 << kSuppressLoads))) { 599a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *p = getRegInfo(cUnit, rl.lowReg); 600a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(!p->pair); 601a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham nullifyRange(cUnit, p->defStart, p->defEnd, 602a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p->sReg, rl.sRegLow); 603a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 604a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerResetDef(cUnit, rl.lowReg); 605a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 606a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 607a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerResetDefLocWide(CompilationUnit *cUnit, RegLocation rl) 608a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 609a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(rl.wide); 610a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (!(gDvmJit.disableOpt & (1 << kSuppressLoads))) { 611a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *p = getRegInfo(cUnit, rl.lowReg); 612a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(p->pair); 613a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham nullifyRange(cUnit, p->defStart, p->defEnd, 614a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham p->sReg, rl.sRegLow); 615a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 616a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerResetDef(cUnit, rl.lowReg); 617a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerResetDef(cUnit, rl.highReg); 618a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 619a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 620a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerResetDefTracking(CompilationUnit *cUnit) 621a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 622a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int i; 623a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i< cUnit->regPool->numCoreTemps; i++) { 624a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerResetDef(cUnit, cUnit->regPool->coreTemps[i].reg); 625a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 626a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i< cUnit->regPool->numFPTemps; i++) { 627a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerResetDef(cUnit, cUnit->regPool->FPTemps[i].reg); 628a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 629a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 630a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 631a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerClobberAllRegs(CompilationUnit *cUnit) 632a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 633a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int i; 634a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i< cUnit->regPool->numCoreTemps; i++) { 635a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, cUnit->regPool->coreTemps[i].reg); 636a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 637a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i< cUnit->regPool->numFPTemps; i++) { 638a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, cUnit->regPool->FPTemps[i].reg); 639a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 640a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 641a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 642a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* To be used when explicitly managing register use */ 643a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerLockAllTemps(CompilationUnit *cUnit) 644a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 645a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int i; 646a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i< cUnit->regPool->numCoreTemps; i++) { 647a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerLockTemp(cUnit, cUnit->regPool->coreTemps[i].reg); 648a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 649a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 650a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 651a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham// Make sure nothing is live and dirty 652a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamstatic void flushAllRegsBody(CompilationUnit *cUnit, RegisterInfo *info, 653a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int numRegs) 654a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 655a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int i; 656a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham for (i=0; i < numRegs; i++) { 657a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (info[i].live && info[i].dirty) { 658a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (info[i].pair) { 659a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham flushRegWide(cUnit, info[i].reg, info[i].partner); 660a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } else { 661a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham flushReg(cUnit, info[i].reg); 662a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 663a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 664a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 665a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 666a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 667a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerFlushAllRegs(CompilationUnit *cUnit) 668a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 669a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham flushAllRegsBody(cUnit, cUnit->regPool->coreTemps, 670a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham cUnit->regPool->numCoreTemps); 671a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham flushAllRegsBody(cUnit, cUnit->regPool->FPTemps, 672a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham cUnit->regPool->numFPTemps); 673a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobberAllRegs(cUnit); 674a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 675a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 676a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 677a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham//TUNING: rewrite all of this reg stuff. Probably use an attribute table 678a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamstatic bool regClassMatches(int regClass, int reg) 679a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 680a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (regClass == kAnyReg) { 681a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return true; 682a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } else if (regClass == kCoreReg) { 683a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return !FPREG(reg); 684a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } else { 685a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return FPREG(reg); 686a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 687a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 688a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 689a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerMarkLive(CompilationUnit *cUnit, int reg, int sReg) 690a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 691a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *info = getRegInfo(cUnit, reg); 692a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if ((info->reg == reg) && (info->sReg == sReg) && info->live) { 693a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return; /* already live */ 694a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } else if (sReg != INVALID_SREG) { 695a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobberSReg(cUnit, sReg); 696a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham info->live = true; 697a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } else { 698a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* Can't be live if no associated sReg */ 699a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham info->live = false; 700a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 701a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham info->sReg = sReg; 702a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 703a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 704a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerMarkPair(CompilationUnit *cUnit, int lowReg, int highReg) 705a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 706a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *infoLo = getRegInfo(cUnit, lowReg); 707a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *infoHi = getRegInfo(cUnit, highReg); 708a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham infoLo->pair = infoHi->pair = true; 709a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham infoLo->partner = highReg; 710a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham infoHi->partner = lowReg; 711a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 712a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 713a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerMarkClean(CompilationUnit *cUnit, int reg) 714a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 715a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *info = getRegInfo(cUnit, reg); 716a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham info->dirty = false; 717a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 718a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 719a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerMarkDirty(CompilationUnit *cUnit, int reg) 720a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 721a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *info = getRegInfo(cUnit, reg); 722a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham info->dirty = true; 723a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 724a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 725a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerMarkInUse(CompilationUnit *cUnit, int reg) 726a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 727a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *info = getRegInfo(cUnit, reg); 728a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham info->inUse = true; 729a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 730a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 731a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamvoid copyRegInfo(CompilationUnit *cUnit, int newReg, int oldReg) 732a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 733a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *newInfo = getRegInfo(cUnit, newReg); 734a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *oldInfo = getRegInfo(cUnit, oldReg); 735a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham *newInfo = *oldInfo; 736a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham newInfo->reg = newReg; 737a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 738a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 739a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* 740a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * Return an updated location record with current in-register status. 741a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * If the value lives in live temps, reflect that fact. No code 742a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * is generated. The the live value is part of an older pair, 743a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * clobber both low and high. 744a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * TUNING: clobbering both is a bit heavy-handed, but the alternative 745a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * is a bit complex when dealing with FP regs. Examine code to see 746a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham * if it's worthwhile trying to be more clever here. 747a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham */ 748a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern RegLocation dvmCompilerUpdateLoc(CompilationUnit *cUnit, RegLocation loc) 749a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 750a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(!loc.wide); 751a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (loc.location == kLocDalvikFrame) { 752a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *infoLo = allocLive(cUnit, loc.sRegLow, kAnyReg); 753a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (infoLo) { 754a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (infoLo->pair) { 755a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, infoLo->reg); 756a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, infoLo->partner); 757a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } else { 758a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham loc.lowReg = infoLo->reg; 759a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham loc.location = kLocPhysReg; 760a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 761a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 762a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 763a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 764a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return loc; 765a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 766a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 767a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* see comments for updateLoc */ 768a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern RegLocation dvmCompilerUpdateLocWide(CompilationUnit *cUnit, 769a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegLocation loc) 770a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 771a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(loc.wide); 772a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (loc.location == kLocDalvikFrame) { 773a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham // Are the dalvik regs already live in physical registers? 774a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *infoLo = allocLive(cUnit, loc.sRegLow, kAnyReg); 775a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegisterInfo *infoHi = allocLive(cUnit, 776a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerSRegHi(loc.sRegLow), kAnyReg); 777a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham bool match = true; 778a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham match = match && (infoLo != NULL); 779a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham match = match && (infoHi != NULL); 780a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham // Are they both core or both FP? 781a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham match = match && (FPREG(infoLo->reg) == FPREG(infoHi->reg)); 782a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham // If a pair of floating point singles, are they properly aligned? 783a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (match && FPREG(infoLo->reg)) { 784a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham match &= ((infoLo->reg & 0x1) == 0); 785a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham match &= ((infoHi->reg - infoLo->reg) == 1); 786a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 787a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham // If previously used as a pair, it is the same pair? 788a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (match && (infoLo->pair || infoHi->pair)) { 789a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham match = (infoLo->pair == infoHi->pair); 790a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham match &= ((infoLo->reg == infoHi->partner) && 791a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham (infoHi->reg == infoLo->partner)); 792a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 793a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (match) { 794a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham // Can reuse - update the register usage info 795a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham loc.lowReg = infoLo->reg; 796a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham loc.highReg = infoHi->reg; 797a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham loc.location = kLocPhysReg; 798a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerMarkPair(cUnit, loc.lowReg, loc.highReg); 799a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(!FPREG(loc.lowReg) || ((loc.lowReg & 0x1) == 0)); 800a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return loc; 801a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 802a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham // Can't easily reuse - clobber any overlaps 803a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (infoLo) { 804a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, infoLo->reg); 805a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (infoLo->pair) 806a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, infoLo->partner); 807a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 808a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (infoHi) { 809a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, infoHi->reg); 810a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (infoHi->pair) 811a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, infoHi->partner); 812a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 813a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 814a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 815a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return loc; 816a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 817a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 818a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamstatic RegLocation evalLocWide(CompilationUnit *cUnit, RegLocation loc, 819a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int regClass, bool update) 820a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 821a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(loc.wide); 822a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int newRegs; 823a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int lowReg; 824a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int highReg; 825a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 826a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham loc = dvmCompilerUpdateLocWide(cUnit, loc); 827a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 828a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* If already in registers, we can assume proper form. Right reg class? */ 829a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (loc.location == kLocPhysReg) { 830a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(FPREG(loc.lowReg) == FPREG(loc.highReg)); 831a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(!FPREG(loc.lowReg) || ((loc.lowReg & 0x1) == 0)); 832a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (!regClassMatches(regClass, loc.lowReg)) { 833a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* Wrong register class. Reallocate and copy */ 834a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham newRegs = dvmCompilerAllocTypedTempPair(cUnit, loc.fp, regClass); 835a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham lowReg = newRegs & 0xff; 836a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham highReg = (newRegs >> 8) & 0xff; 837a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerRegCopyWide(cUnit, lowReg, highReg, loc.lowReg, 838a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham loc.highReg); 839a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham copyRegInfo(cUnit, lowReg, loc.lowReg); 840a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham copyRegInfo(cUnit, highReg, loc.highReg); 841a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, loc.lowReg); 842a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, loc.highReg); 843a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham loc.lowReg = lowReg; 844a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham loc.highReg = highReg; 845a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerMarkPair(cUnit, loc.lowReg, loc.highReg); 846a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(!FPREG(loc.lowReg) || ((loc.lowReg & 0x1) == 0)); 847a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 848a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return loc; 849a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 850a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 851a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert((loc.location != kLocRetval) || (loc.sRegLow == INVALID_SREG)); 852a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert((loc.location != kLocRetval) || 853a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham (dvmCompilerSRegHi(loc.sRegLow) == INVALID_SREG)); 854a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 855a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham newRegs = dvmCompilerAllocTypedTempPair(cUnit, loc.fp, regClass); 856a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham loc.lowReg = newRegs & 0xff; 857a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham loc.highReg = (newRegs >> 8) & 0xff; 858a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 859a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerMarkPair(cUnit, loc.lowReg, loc.highReg); 860a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (update) { 861a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham loc.location = kLocPhysReg; 862a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerMarkLive(cUnit, loc.lowReg, loc.sRegLow); 863a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerMarkLive(cUnit, loc.highReg, dvmCompilerSRegHi(loc.sRegLow)); 864a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 865a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(!FPREG(loc.lowReg) || ((loc.lowReg & 0x1) == 0)); 866a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return loc; 867a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 868a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 869a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern RegLocation dvmCompilerEvalLoc(CompilationUnit *cUnit, RegLocation loc, 870a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int regClass, bool update) 871a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 872a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int newReg; 873a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (loc.wide) 874a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return evalLocWide(cUnit, loc, regClass, update); 875a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham loc = dvmCompilerUpdateLoc(cUnit, loc); 876a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 877a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (loc.location == kLocPhysReg) { 878a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (!regClassMatches(regClass, loc.lowReg)) { 879a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* Wrong register class. Realloc, copy and transfer ownership */ 880a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham newReg = dvmCompilerAllocTypedTemp(cUnit, loc.fp, regClass); 881a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerRegCopy(cUnit, newReg, loc.lowReg); 882a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham copyRegInfo(cUnit, newReg, loc.lowReg); 883a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, loc.lowReg); 884a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham loc.lowReg = newReg; 885a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 886a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return loc; 887a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 888a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 889a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert((loc.location != kLocRetval) || (loc.sRegLow == INVALID_SREG)); 890a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 891a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham newReg = dvmCompilerAllocTypedTemp(cUnit, loc.fp, regClass); 892a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham loc.lowReg = newReg; 893a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 894a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (update) { 895a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham loc.location = kLocPhysReg; 896a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerMarkLive(cUnit, loc.lowReg, loc.sRegLow); 897a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 898a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return loc; 899a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 900a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 901a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamstatic inline int getDestSSAName(MIR *mir, int num) 902a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 903a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(mir->ssaRep->numDefs > num); 904a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return mir->ssaRep->defs[num]; 905a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 906a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 907a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham// Get the LocRecord associated with an SSA name use. 908a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern RegLocation dvmCompilerGetSrc(CompilationUnit *cUnit, MIR *mir, int num) 909a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 910a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegLocation loc = cUnit->regLocation[ 911a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham SREG(cUnit, dvmCompilerSSASrc(mir, num))]; 912a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham loc.fp = cUnit->regLocation[dvmCompilerSSASrc(mir, num)].fp; 913a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham loc.wide = false; 914a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return loc; 915a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 916a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 917a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham// Get the LocRecord associated with an SSA name def. 918a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern RegLocation dvmCompilerGetDest(CompilationUnit *cUnit, MIR *mir, 919a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int num) 920a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 921a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegLocation loc = cUnit->regLocation[SREG(cUnit, getDestSSAName(mir, num))]; 922a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham loc.fp = cUnit->regLocation[getDestSSAName(mir, num)].fp; 923a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham loc.wide = false; 924a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return loc; 925a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 926a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 927a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamstatic RegLocation getLocWide(CompilationUnit *cUnit, MIR *mir, 928a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int low, int high, bool isSrc) 929a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 930a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegLocation lowLoc; 931a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegLocation highLoc; 932a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* Copy loc record for low word and patch in data from high word */ 933a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (isSrc) { 934a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham lowLoc = dvmCompilerGetSrc(cUnit, mir, low); 935a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham highLoc = dvmCompilerGetSrc(cUnit, mir, high); 936a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } else { 937a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham lowLoc = dvmCompilerGetDest(cUnit, mir, low); 938a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham highLoc = dvmCompilerGetDest(cUnit, mir, high); 939a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 940a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* Avoid this case by either promoting both or neither. */ 941a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(lowLoc.location == highLoc.location); 942a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (lowLoc.location == kLocPhysReg) { 943a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham /* This case shouldn't happen if we've named correctly */ 944a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(lowLoc.fp == highLoc.fp); 945a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 946a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham lowLoc.wide = true; 947a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham lowLoc.highReg = highLoc.lowReg; 948a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return lowLoc; 949a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 950a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 951a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern RegLocation dvmCompilerGetDestWide(CompilationUnit *cUnit, MIR *mir, 952a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int low, int high) 953a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 954a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return getLocWide(cUnit, mir, low, high, false); 955a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 956a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 957a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern RegLocation dvmCompilerGetSrcWide(CompilationUnit *cUnit, MIR *mir, 958a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int low, int high) 959a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 960a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return getLocWide(cUnit, mir, low, high, true); 961a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 962a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 963a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern RegLocation dvmCompilerGetReturnWide(CompilationUnit *cUnit) 964a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 965a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegLocation res = LOC_C_RETURN_WIDE; 966a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_V0); 967a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_V1); 968a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerMarkInUse(cUnit, r_V0); 969a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerMarkInUse(cUnit, r_V1); 970a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerMarkPair(cUnit, res.lowReg, res.highReg); 971a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return res; 972a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 973a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 974a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern RegLocation dvmCompilerGetReturn(CompilationUnit *cUnit) 975a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 976a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegLocation res = LOC_C_RETURN; 977a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_V0); 978a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerMarkInUse(cUnit, r_V0); 979a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return res; 980a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 981a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 982a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern RegLocation dvmCompilerGetReturnWideAlt(CompilationUnit *cUnit) 983a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 984a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegLocation res = LOC_C_RETURN_WIDE_ALT; 985a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_F0); 986a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_F1); 987a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerMarkInUse(cUnit, r_F0); 988a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerMarkInUse(cUnit, r_F1); 989a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerMarkPair(cUnit, res.lowReg, res.highReg); 990a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return res; 991a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 992a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 993a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern RegLocation dvmCompilerGetReturnAlt(CompilationUnit *cUnit) 994a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 995a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegLocation res = LOC_C_RETURN_ALT; 996a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerClobber(cUnit, r_F0); 997a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerMarkInUse(cUnit, r_F0); 998a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham return res; 999a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 1000a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 1001a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham/* Kill the corresponding bit in the null-checked register list */ 1002a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerKillNullCheckedLoc(CompilationUnit *cUnit, 1003a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham RegLocation loc) 1004a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 1005a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (loc.location != kLocRetval) { 1006a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(loc.sRegLow != INVALID_SREG); 1007a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmClearBit(cUnit->regPool->nullCheckedRegs, loc.sRegLow); 1008a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham if (loc.wide) { 1009a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham assert(dvmCompilerSRegHi(loc.sRegLow) != INVALID_SREG); 1010a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmClearBit(cUnit->regPool->nullCheckedRegs, 1011a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham dvmCompilerSRegHi(loc.sRegLow)); 1012a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 1013a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham } 1014a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 1015a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 1016a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerFlushRegWideForV5TEVFP(CompilationUnit *cUnit, 1017a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham int reg1, int reg2) 1018a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 1019a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham flushRegWide(cUnit, reg1, reg2); 1020a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 1021a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham 1022a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandhamextern void dvmCompilerFlushRegForV5TEVFP(CompilationUnit *cUnit, int reg) 1023a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham{ 1024a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham flushReg(cUnit, reg); 1025a8b91c52fd8a90b784835dfe1f8898035266c4ddRaghu Gandham} 1026