• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /*
18  * This file contains Arm-specific register alloction support.
19  */
20 
21 #include "compiler/CompilerUtility.h"
22 #include "compiler/CompilerIR.h"
23 #include "compiler/Dataflow.h"
24 #include "ArmLIR.h"
25 #include "Codegen.h"
26 #include "compiler/codegen/Ralloc.h"
27 
28 /*
29  * Register usage for 16-bit Thumb systems:
30  *     r0-r3: Temp/argument
31  *     lr(r14):      Temp for translations, return address for handlers
32  *     rSELF(r6):    Pointer to Thread
33  *     rFP(r5):      Dalvik frame pointer
34  *     r4, r7:       Temp for translations
35  *     r8, r9, r10:   Temp preserved across C calls
36  *     r11, ip(r12):  Temp not preserved across C calls
37  *
38  * Register usage for 32-bit Thumb systems:
39  *     r0-r3: Temp/argument
40  *     lr(r14):      Temp for translations, return address for handlers
41  *     rSELF(r6):    Pointer to Thread
42  *     rFP(r5):      Dalvik frame pointer
43  *     r4, r7:       Temp for translations
44  *     r8, r9, r10   Temp preserved across C calls
45  *     r11, ip(r12):      Temp not preserved across C calls
46  *     fp0-fp15:     Hot temps, not preserved across C calls
47  *     fp16-fp31:    Promotion pool
48  *
49  */
50 
51 /* Clobber all regs that might be used by an external C call */
dvmCompilerClobberCallRegs(CompilationUnit * cUnit)52 extern void dvmCompilerClobberCallRegs(CompilationUnit *cUnit)
53 {
54     dvmCompilerClobber(cUnit, r0);
55     dvmCompilerClobber(cUnit, r1);
56     dvmCompilerClobber(cUnit, r2);
57     dvmCompilerClobber(cUnit, r3);
58     dvmCompilerClobber(cUnit, r9); // Need to do this?, be conservative
59     dvmCompilerClobber(cUnit, r11);
60     dvmCompilerClobber(cUnit, r12);
61     dvmCompilerClobber(cUnit, r14lr);
62 }
63 
64 /* Clobber all of the temps that might be used by a handler. */
dvmCompilerClobberHandlerRegs(CompilationUnit * cUnit)65 extern void dvmCompilerClobberHandlerRegs(CompilationUnit *cUnit)
66 {
67     //TUNING: reduce the set of regs used by handlers.  Only a few need lots.
68     dvmCompilerClobberCallRegs(cUnit);
69     dvmCompilerClobber(cUnit, r4PC);
70     dvmCompilerClobber(cUnit, r7);
71     dvmCompilerClobber(cUnit, r8);
72     dvmCompilerClobber(cUnit, r9);
73     dvmCompilerClobber(cUnit, r10);
74 }
75 
dvmCompilerGetReturnWide(CompilationUnit * cUnit)76 extern RegLocation dvmCompilerGetReturnWide(CompilationUnit *cUnit)
77 {
78     RegLocation res = LOC_C_RETURN_WIDE;
79     dvmCompilerClobber(cUnit, r0);
80     dvmCompilerClobber(cUnit, r1);
81     dvmCompilerMarkInUse(cUnit, r0);
82     dvmCompilerMarkInUse(cUnit, r1);
83     dvmCompilerMarkPair(cUnit, res.lowReg, res.highReg);
84     return res;
85 }
86 
dvmCompilerGetReturnWideAlt(CompilationUnit * cUnit)87 extern RegLocation dvmCompilerGetReturnWideAlt(CompilationUnit *cUnit)
88 {
89     RegLocation res = LOC_C_RETURN_WIDE;
90     res.lowReg = r2;
91     res.highReg = r3;
92     dvmCompilerClobber(cUnit, r2);
93     dvmCompilerClobber(cUnit, r3);
94     dvmCompilerMarkInUse(cUnit, r2);
95     dvmCompilerMarkInUse(cUnit, r3);
96     dvmCompilerMarkPair(cUnit, res.lowReg, res.highReg);
97     return res;
98 }
99 
dvmCompilerGetReturn(CompilationUnit * cUnit)100 extern RegLocation dvmCompilerGetReturn(CompilationUnit *cUnit)
101 {
102     RegLocation res = LOC_C_RETURN;
103     dvmCompilerClobber(cUnit, r0);
104     dvmCompilerMarkInUse(cUnit, r0);
105     return res;
106 }
107 
dvmCompilerGetReturnAlt(CompilationUnit * cUnit)108 extern RegLocation dvmCompilerGetReturnAlt(CompilationUnit *cUnit)
109 {
110     RegLocation res = LOC_C_RETURN;
111     res.lowReg = r1;
112     dvmCompilerClobber(cUnit, r1);
113     dvmCompilerMarkInUse(cUnit, r1);
114     return res;
115 }
116