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