blob: 2d1396544a040a3c80fc5c6c35aaf58bf39427f4 [file] [log] [blame]
buzbee67bf8852011-08-17 17:51:35 -07001/*
2 * Copyright (C) 2011 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#ifndef ART_SRC_COMPILER_COMPILERCODEGEN_H_
18#define ART_SRC_COMPILER_COMPILERCODEGEN_H_
19
buzbeeefc63692012-11-14 16:31:52 -080020#include "../compiler_ir.h"
buzbee67bf8852011-08-17 17:51:35 -070021
Elliott Hughes11d1b0c2012-01-23 16:57:47 -080022namespace art {
23
buzbeeec137432012-11-13 12:13:16 -080024// Set to 1 to measure cost of suspend check
25#define NO_SUSPEND 0
26
27/* Bit flags describing the behavior of native opcodes (Arm/Mips/x86 combined) */
28enum OpFeatureFlags {
29 kIsBranch = 0,
30 kNoOperand,
31 kIsUnaryOp,
32 kIsBinaryOp,
33 kIsTertiaryOp,
34 kIsQuadOp,
35 kIsQuinOp,
36 kIsSextupleOp,
37 kIsIT,
38 kMemLoad,
39 kMemStore,
40 kPCRelFixup, // x86 FIXME: add NEEDS_FIXUP to instruction attributes
41 kRegDef0,
42 kRegDef1,
43 kRegDefA,
44 kRegDefD,
45 kRegDefFPCSList0,
46 kRegDefFPCSList2,
47 kRegDefList0,
48 kRegDefList1,
49 kRegDefList2,
50 kRegDefLR,
51 kRegDefSP,
52 kRegUse0,
53 kRegUse1,
54 kRegUse2,
55 kRegUse3,
56 kRegUse4,
57 kRegUseA,
58 kRegUseC,
59 kRegUseD,
60 kRegUseFPCSList0,
61 kRegUseFPCSList2,
62 kRegUseList0,
63 kRegUseList1,
64 kRegUseLR,
65 kRegUsePC,
66 kRegUseSP,
67 kSetsCCodes,
68 kUsesCCodes
69};
70
71#define IS_BINARY_OP (1ULL << kIsBinaryOp)
72#define IS_BRANCH (1ULL << kIsBranch)
73#define IS_IT (1ULL << kIsIT)
74#define IS_LOAD (1ULL << kMemLoad)
75#define IS_QUAD_OP (1ULL << kIsQuadOp)
76#define IS_QUIN_OP (1ULL << kIsQuinOp)
77#define IS_SEXTUPLE_OP (1ULL << kIsSextupleOp)
78#define IS_STORE (1ULL << kMemStore)
79#define IS_TERTIARY_OP (1ULL << kIsTertiaryOp)
80#define IS_UNARY_OP (1ULL << kIsUnaryOp)
81#define NEEDS_FIXUP (1ULL << kPCRelFixup)
82#define NO_OPERAND (1ULL << kNoOperand)
83#define REG_DEF0 (1ULL << kRegDef0)
84#define REG_DEF1 (1ULL << kRegDef1)
85#define REG_DEFA (1ULL << kRegDefA)
86#define REG_DEFD (1ULL << kRegDefD)
87#define REG_DEF_FPCS_LIST0 (1ULL << kRegDefFPCSList0)
88#define REG_DEF_FPCS_LIST2 (1ULL << kRegDefFPCSList2)
89#define REG_DEF_LIST0 (1ULL << kRegDefList0)
90#define REG_DEF_LIST1 (1ULL << kRegDefList1)
91#define REG_DEF_LR (1ULL << kRegDefLR)
92#define REG_DEF_SP (1ULL << kRegDefSP)
93#define REG_USE0 (1ULL << kRegUse0)
94#define REG_USE1 (1ULL << kRegUse1)
95#define REG_USE2 (1ULL << kRegUse2)
96#define REG_USE3 (1ULL << kRegUse3)
97#define REG_USE4 (1ULL << kRegUse4)
98#define REG_USEA (1ULL << kRegUseA)
99#define REG_USEC (1ULL << kRegUseC)
100#define REG_USED (1ULL << kRegUseD)
101#define REG_USE_FPCS_LIST0 (1ULL << kRegUseFPCSList0)
102#define REG_USE_FPCS_LIST2 (1ULL << kRegUseFPCSList2)
103#define REG_USE_LIST0 (1ULL << kRegUseList0)
104#define REG_USE_LIST1 (1ULL << kRegUseList1)
105#define REG_USE_LR (1ULL << kRegUseLR)
106#define REG_USE_PC (1ULL << kRegUsePC)
107#define REG_USE_SP (1ULL << kRegUseSP)
108#define SETS_CCODES (1ULL << kSetsCCodes)
109#define USES_CCODES (1ULL << kUsesCCodes)
110
111/* Common combo register usage patterns */
112#define REG_DEF01 (REG_DEF0 | REG_DEF1)
113#define REG_DEF01_USE2 (REG_DEF0 | REG_DEF1 | REG_USE2)
114#define REG_DEF0_USE01 (REG_DEF0 | REG_USE01)
115#define REG_DEF0_USE0 (REG_DEF0 | REG_USE0)
116#define REG_DEF0_USE12 (REG_DEF0 | REG_USE12)
117#define REG_DEF0_USE1 (REG_DEF0 | REG_USE1)
118#define REG_DEF0_USE2 (REG_DEF0 | REG_USE2)
119#define REG_DEFAD_USEAD (REG_DEFAD_USEA | REG_USED)
120#define REG_DEFAD_USEA (REG_DEFA_USEA | REG_DEFD)
121#define REG_DEFA_USEA (REG_DEFA | REG_USEA)
122#define REG_USE012 (REG_USE01 | REG_USE2)
123#define REG_USE014 (REG_USE01 | REG_USE4)
124#define REG_USE01 (REG_USE0 | REG_USE1)
125#define REG_USE02 (REG_USE0 | REG_USE2)
126#define REG_USE12 (REG_USE1 | REG_USE2)
127#define REG_USE23 (REG_USE2 | REG_USE3)
128
buzbeeeaf09bc2012-11-15 14:51:41 -0800129// TEMP
130#include "gen_loadstore.h"
131#include "gen_common.h"
132#include "gen_invoke.h"
133#include "target_list.h"
buzbeeb046e162012-10-30 15:48:42 -0700134
Elliott Hughes11d1b0c2012-01-23 16:57:47 -0800135} // namespace art
136
buzbee67bf8852011-08-17 17:51:35 -0700137#endif // ART_SRC_COMPILER_COMPILERCODEGEN_H_