blob: 6242e9804e2cbd510c0c3a8df5813b258b4c2f78 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// Copyright 2014 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_COMPILER_INSTRUCTION_CODES_H_
6#define V8_COMPILER_INSTRUCTION_CODES_H_
7
Emily Bernier958fae72015-03-24 16:35:39 -04008#include <iosfwd>
9
Ben Murdochb8a8cc12014-11-26 15:28:44 +000010#if V8_TARGET_ARCH_ARM
11#include "src/compiler/arm/instruction-codes-arm.h"
12#elif V8_TARGET_ARCH_ARM64
13#include "src/compiler/arm64/instruction-codes-arm64.h"
14#elif V8_TARGET_ARCH_IA32
15#include "src/compiler/ia32/instruction-codes-ia32.h"
Emily Bernier958fae72015-03-24 16:35:39 -040016#elif V8_TARGET_ARCH_MIPS
17#include "src/compiler/mips/instruction-codes-mips.h"
18#elif V8_TARGET_ARCH_MIPS64
19#include "src/compiler/mips64/instruction-codes-mips64.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +000020#elif V8_TARGET_ARCH_X64
21#include "src/compiler/x64/instruction-codes-x64.h"
Ben Murdoch014dc512016-03-22 12:00:34 +000022#elif V8_TARGET_ARCH_PPC
23#include "src/compiler/ppc/instruction-codes-ppc.h"
Ben Murdoch3b9bc312016-06-02 14:46:10 +010024#elif V8_TARGET_ARCH_S390
25#include "src/compiler/s390/instruction-codes-s390.h"
Ben Murdoch014dc512016-03-22 12:00:34 +000026#elif V8_TARGET_ARCH_X87
27#include "src/compiler/x87/instruction-codes-x87.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +000028#else
29#define TARGET_ARCH_OPCODE_LIST(V)
30#define TARGET_ADDRESSING_MODE_LIST(V)
31#endif
Ben Murdochc8c1d9e2017-03-08 14:04:23 +000032#include "src/globals.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +000033#include "src/utils.h"
34
35namespace v8 {
36namespace internal {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000037namespace compiler {
38
Ben Murdoch014dc512016-03-22 12:00:34 +000039// Modes for ArchStoreWithWriteBarrier below.
40enum class RecordWriteMode { kValueIsMap, kValueIsPointer, kValueIsAny };
41
42
Ben Murdochb8a8cc12014-11-26 15:28:44 +000043// Target-specific opcodes that specify which assembly sequence to emit.
44// Most opcodes specify a single instruction.
Ben Murdoch3b9bc312016-06-02 14:46:10 +010045#define COMMON_ARCH_OPCODE_LIST(V) \
46 V(ArchCallCodeObject) \
47 V(ArchTailCallCodeObjectFromJSFunction) \
48 V(ArchTailCallCodeObject) \
49 V(ArchCallJSFunction) \
50 V(ArchTailCallJSFunctionFromJSFunction) \
Ben Murdochbcf72ee2016-08-08 18:44:38 +010051 V(ArchTailCallAddress) \
Ben Murdoch3b9bc312016-06-02 14:46:10 +010052 V(ArchPrepareCallCFunction) \
53 V(ArchCallCFunction) \
54 V(ArchPrepareTailCall) \
55 V(ArchJmp) \
56 V(ArchLookupSwitch) \
57 V(ArchTableSwitch) \
58 V(ArchNop) \
Ben Murdoch13e2dad2016-09-16 13:49:30 +010059 V(ArchDebugBreak) \
60 V(ArchComment) \
Ben Murdoch3b9bc312016-06-02 14:46:10 +010061 V(ArchThrowTerminator) \
62 V(ArchDeoptimize) \
63 V(ArchRet) \
64 V(ArchStackPointer) \
65 V(ArchFramePointer) \
66 V(ArchParentFramePointer) \
67 V(ArchTruncateDoubleToI) \
68 V(ArchStoreWithWriteBarrier) \
69 V(CheckedLoadInt8) \
70 V(CheckedLoadUint8) \
71 V(CheckedLoadInt16) \
72 V(CheckedLoadUint16) \
73 V(CheckedLoadWord32) \
74 V(CheckedLoadWord64) \
75 V(CheckedLoadFloat32) \
76 V(CheckedLoadFloat64) \
77 V(CheckedStoreWord8) \
78 V(CheckedStoreWord16) \
79 V(CheckedStoreWord32) \
80 V(CheckedStoreWord64) \
81 V(CheckedStoreFloat32) \
82 V(CheckedStoreFloat64) \
Ben Murdochbcf72ee2016-08-08 18:44:38 +010083 V(ArchStackSlot) \
84 V(AtomicLoadInt8) \
85 V(AtomicLoadUint8) \
86 V(AtomicLoadInt16) \
87 V(AtomicLoadUint16) \
88 V(AtomicLoadWord32) \
89 V(AtomicStoreWord8) \
90 V(AtomicStoreWord16) \
Ben Murdoch13e2dad2016-09-16 13:49:30 +010091 V(AtomicStoreWord32) \
Ben Murdochf91f0612016-11-29 16:50:11 +000092 V(Ieee754Float64Acos) \
93 V(Ieee754Float64Acosh) \
94 V(Ieee754Float64Asin) \
95 V(Ieee754Float64Asinh) \
Ben Murdoch13e2dad2016-09-16 13:49:30 +010096 V(Ieee754Float64Atan) \
Ben Murdoch13e2dad2016-09-16 13:49:30 +010097 V(Ieee754Float64Atanh) \
Ben Murdochf91f0612016-11-29 16:50:11 +000098 V(Ieee754Float64Atan2) \
Ben Murdoch13e2dad2016-09-16 13:49:30 +010099 V(Ieee754Float64Cbrt) \
100 V(Ieee754Float64Cos) \
Ben Murdochf91f0612016-11-29 16:50:11 +0000101 V(Ieee754Float64Cosh) \
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100102 V(Ieee754Float64Exp) \
103 V(Ieee754Float64Expm1) \
104 V(Ieee754Float64Log) \
105 V(Ieee754Float64Log1p) \
106 V(Ieee754Float64Log10) \
107 V(Ieee754Float64Log2) \
Ben Murdochf91f0612016-11-29 16:50:11 +0000108 V(Ieee754Float64Pow) \
Ben Murdoch13e2dad2016-09-16 13:49:30 +0100109 V(Ieee754Float64Sin) \
Ben Murdochf91f0612016-11-29 16:50:11 +0000110 V(Ieee754Float64Sinh) \
111 V(Ieee754Float64Tan) \
112 V(Ieee754Float64Tanh)
Ben Murdoch014dc512016-03-22 12:00:34 +0000113
114#define ARCH_OPCODE_LIST(V) \
115 COMMON_ARCH_OPCODE_LIST(V) \
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000116 TARGET_ARCH_OPCODE_LIST(V)
117
118enum ArchOpcode {
119#define DECLARE_ARCH_OPCODE(Name) k##Name,
120 ARCH_OPCODE_LIST(DECLARE_ARCH_OPCODE)
121#undef DECLARE_ARCH_OPCODE
122#define COUNT_ARCH_OPCODE(Name) +1
123 kLastArchOpcode = -1 ARCH_OPCODE_LIST(COUNT_ARCH_OPCODE)
124#undef COUNT_ARCH_OPCODE
125};
126
Ben Murdochc8c1d9e2017-03-08 14:04:23 +0000127V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
128 const ArchOpcode& ao);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000129
130// Addressing modes represent the "shape" of inputs to an instruction.
131// Many instructions support multiple addressing modes. Addressing modes
132// are encoded into the InstructionCode of the instruction and tell the
133// code generator after register allocation which assembler method to call.
134#define ADDRESSING_MODE_LIST(V) \
135 V(None) \
136 TARGET_ADDRESSING_MODE_LIST(V)
137
138enum AddressingMode {
139#define DECLARE_ADDRESSING_MODE(Name) kMode_##Name,
140 ADDRESSING_MODE_LIST(DECLARE_ADDRESSING_MODE)
141#undef DECLARE_ADDRESSING_MODE
142#define COUNT_ADDRESSING_MODE(Name) +1
143 kLastAddressingMode = -1 ADDRESSING_MODE_LIST(COUNT_ADDRESSING_MODE)
144#undef COUNT_ADDRESSING_MODE
145};
146
Ben Murdochc8c1d9e2017-03-08 14:04:23 +0000147V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
148 const AddressingMode& am);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000149
150// The mode of the flags continuation (see below).
Ben Murdoch3b9bc312016-06-02 14:46:10 +0100151enum FlagsMode {
152 kFlags_none = 0,
153 kFlags_branch = 1,
154 kFlags_deoptimize = 2,
155 kFlags_set = 3
156};
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000157
Ben Murdochc8c1d9e2017-03-08 14:04:23 +0000158V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
159 const FlagsMode& fm);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000160
161// The condition of flags continuation (see below).
162enum FlagsCondition {
163 kEqual,
164 kNotEqual,
165 kSignedLessThan,
166 kSignedGreaterThanOrEqual,
167 kSignedLessThanOrEqual,
168 kSignedGreaterThan,
169 kUnsignedLessThan,
170 kUnsignedGreaterThanOrEqual,
171 kUnsignedLessThanOrEqual,
172 kUnsignedGreaterThan,
Ben Murdoch014dc512016-03-22 12:00:34 +0000173 kFloatLessThanOrUnordered,
174 kFloatGreaterThanOrEqual,
175 kFloatLessThanOrEqual,
176 kFloatGreaterThanOrUnordered,
177 kFloatLessThan,
178 kFloatGreaterThanOrEqualOrUnordered,
179 kFloatLessThanOrEqualOrUnordered,
180 kFloatGreaterThan,
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000181 kUnorderedEqual,
182 kUnorderedNotEqual,
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000183 kOverflow,
Ben Murdochf91f0612016-11-29 16:50:11 +0000184 kNotOverflow,
185 kPositiveOrZero,
186 kNegative
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000187};
188
Emily Bernier958fae72015-03-24 16:35:39 -0400189inline FlagsCondition NegateFlagsCondition(FlagsCondition condition) {
190 return static_cast<FlagsCondition>(condition ^ 1);
191}
192
Ben Murdoch014dc512016-03-22 12:00:34 +0000193FlagsCondition CommuteFlagsCondition(FlagsCondition condition);
194
Ben Murdochc8c1d9e2017-03-08 14:04:23 +0000195V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os,
196 const FlagsCondition& fc);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000197
198// The InstructionCode is an opaque, target-specific integer that encodes
199// what code to emit for an instruction in the code generator. It is not
200// interesting to the register allocator, as the inputs and flags on the
201// instructions specify everything of interest.
202typedef int32_t InstructionCode;
203
204// Helpers for encoding / decoding InstructionCode into the fields needed
205// for code generation. We encode the instruction, addressing mode, and flags
206// continuation into a single InstructionCode which is stored as part of
207// the instruction.
Ben Murdoch014dc512016-03-22 12:00:34 +0000208typedef BitField<ArchOpcode, 0, 8> ArchOpcodeField;
209typedef BitField<AddressingMode, 8, 5> AddressingModeField;
210typedef BitField<FlagsMode, 13, 2> FlagsModeField;
211typedef BitField<FlagsCondition, 15, 5> FlagsConditionField;
212typedef BitField<int, 20, 12> MiscField;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000213
214} // namespace compiler
215} // namespace internal
216} // namespace v8
217
218#endif // V8_COMPILER_INSTRUCTION_CODES_H_