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