• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "x64_cgfunc.h"
17 #include "becommon.h"
18 #include "x64_isa.h"
19 
20 namespace maplebe {
21 using namespace maple;
22 namespace x64 {
IsAvailableReg(X64reg reg)23 bool IsAvailableReg(X64reg reg)
24 {
25     switch (reg) {
26 /* integer registers */
27 #define INT_REG(ID, PREF8, PREF8_16, PREF16, PREF32, PREF64, canBeAssigned, isCalleeSave, isParam, isSpill, \
28                 isExtraSpill)                                                                               \
29     case R##ID:                                                                                             \
30         return canBeAssigned;
31 #define INT_REG_ALIAS(ALIAS, ID)
32 #include "x64_int_regs.def"
33 #undef INT_REG
34 #undef INT_REG_ALIAS
35 /* fp-simd registers */
36 #define FP_SIMD_REG(ID, P8, P16, P32, P64, P128, canBeAssigned, isCalleeSave, isParam, isSpill, isExtraSpill) \
37     case V##ID:                                                                                               \
38         return canBeAssigned;
39 #include "x64_fp_simd_regs.def"
40 #undef FP_SIMD_REG
41         default:
42             return false;
43     }
44 }
45 
IsCalleeSavedReg(X64reg reg)46 bool IsCalleeSavedReg(X64reg reg)
47 {
48     switch (reg) {
49 /* integer registers */
50 #define INT_REG(ID, PREF8, PREF8_16, PREF16, PREF32, PREF64, canBeAssigned, isCalleeSave, isParam, isSpill, \
51                 isExtraSpill)                                                                               \
52     case R##ID:                                                                                             \
53         return isCalleeSave;
54 #define INT_REG_ALIAS(ALIAS, ID)
55 #include "x64_int_regs.def"
56 #undef INT_REG
57 #undef INT_REG_ALIAS
58 /* fp-simd registers */
59 #define FP_SIMD_REG(ID, P8, P16, P32, P64, P128, canBeAssigned, isCalleeSave, isParam, isSpill, isExtraSpill) \
60     case V##ID:                                                                                               \
61         return isCalleeSave;
62 #include "x64_fp_simd_regs.def"
63 #undef FP_SIMD_REG
64         default:
65             return false;
66     }
67 }
68 
IsSpillReg(X64reg reg)69 bool IsSpillReg(X64reg reg)
70 {
71     switch (reg) {
72 /* integer registers */
73 #define INT_REG(ID, PREF8, PREF8_16, PREF16, PREF32, PREF64, canBeAssigned, isCalleeSave, isParam, isSpill, \
74                 isExtraSpill)                                                                               \
75     case R##ID:                                                                                             \
76         return isSpill;
77 #define INT_REG_ALIAS(ALIAS, ID)
78 #include "x64_int_regs.def"
79 #undef INT_REG
80 #undef INT_REG_ALIAS
81 /* fp-simd registers */
82 #define FP_SIMD_REG(ID, P8, P16, P32, P64, P128, canBeAssigned, isCalleeSave, isParam, isSpill, isExtraSpill) \
83     case V##ID:                                                                                               \
84         return isSpill;
85 #include "x64_fp_simd_regs.def"
86 #undef FP_SIMD_REG
87         default:
88             return false;
89     }
90 }
91 
IsExtraSpillReg(X64reg reg)92 bool IsExtraSpillReg(X64reg reg)
93 {
94     switch (reg) {
95 /* integer registers */
96 #define INT_REG(ID, PREF8, PREF8_16, PREF16, PREF32, PREF64, canBeAssigned, isCalleeSave, isParam, isSpill, \
97                 isExtraSpill)                                                                               \
98     case R##ID:                                                                                             \
99         return isExtraSpill;
100 #define INT_REG_ALIAS(ALIAS, ID)
101 #include "x64_int_regs.def"
102 #undef INT_REG
103 #undef INT_REG_ALIAS
104 /* fp-simd registers */
105 #define FP_SIMD_REG(ID, P8, P16, P32, P64, P128, canBeAssigned, isCalleeSave, isParam, isSpill, isExtraSpill) \
106     case V##ID:                                                                                               \
107         return isExtraSpill;
108 #include "x64_fp_simd_regs.def"
109 #undef FP_SIMD_REG
110         default:
111             return false;
112     }
113 }
114 
IsSpillRegInRA(X64reg regNO,bool has3RegOpnd)115 bool IsSpillRegInRA(X64reg regNO, bool has3RegOpnd)
116 {
117     /* if has 3 RegOpnd, previous reg used to spill. */
118     if (has3RegOpnd) {
119         return IsSpillReg(regNO) || IsExtraSpillReg(regNO);
120     }
121     return IsSpillReg(regNO);
122 }
123 } /* namespace x64 */
124 } /* namespace maplebe */
125