Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(321)

Side by Side Diff: src/interpreter/bytecodes.h

Issue 1852213002: [interpreter] Add accumulator use description to bytecodes. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_INTERPRETER_BYTECODES_H_ 5 #ifndef V8_INTERPRETER_BYTECODES_H_
6 #define V8_INTERPRETER_BYTECODES_H_ 6 #define V8_INTERPRETER_BYTECODES_H_
7 7
8 #include <iosfwd> 8 #include <iosfwd>
9 9
10 // Clients of this interface shouldn't depend on lots of interpreter internals. 10 // Clients of this interface shouldn't depend on lots of interpreter internals.
(...skipping 30 matching lines...) Expand all
41 #define NON_REGISTER_OPERAND_TYPE_LIST(V) \ 41 #define NON_REGISTER_OPERAND_TYPE_LIST(V) \
42 INVALID_OPERAND_TYPE_LIST(V) \ 42 INVALID_OPERAND_TYPE_LIST(V) \
43 SCALAR_OPERAND_TYPE_LIST(V) 43 SCALAR_OPERAND_TYPE_LIST(V)
44 44
45 // The list of operand types used by bytecodes. 45 // The list of operand types used by bytecodes.
46 #define OPERAND_TYPE_LIST(V) \ 46 #define OPERAND_TYPE_LIST(V) \
47 NON_REGISTER_OPERAND_TYPE_LIST(V) \ 47 NON_REGISTER_OPERAND_TYPE_LIST(V) \
48 REGISTER_OPERAND_TYPE_LIST(V) 48 REGISTER_OPERAND_TYPE_LIST(V)
49 49
50 // Define one debug break bytecode for each possible size of unscaled 50 // Define one debug break bytecode for each possible size of unscaled
51 // bytecodes. 51 // bytecodes. Format is V(<bytecode>, <accumulator_use>, <operands>).
52 #define DEBUG_BREAK_PLAIN_BYTECODE_LIST(V) \ 52 #define DEBUG_BREAK_PLAIN_BYTECODE_LIST(V) \
53 V(DebugBreak0, OperandType::kNone) \ 53 V(DebugBreak0, AccumulatorUse::kRead) \
54 V(DebugBreak1, OperandType::kReg) \ 54 V(DebugBreak1, AccumulatorUse::kRead, OperandType::kReg) \
55 V(DebugBreak2, OperandType::kReg, OperandType::kReg) \ 55 V(DebugBreak2, AccumulatorUse::kRead, OperandType::kReg, OperandType::kReg) \
56 V(DebugBreak3, OperandType::kReg, OperandType::kReg, OperandType::kReg) \ 56 V(DebugBreak3, AccumulatorUse::kRead, OperandType::kReg, OperandType::kReg, \
57 V(DebugBreak4, OperandType::kReg, OperandType::kReg, OperandType::kReg, \ 57 OperandType::kReg) \
58 OperandType::kReg) \ 58 V(DebugBreak4, AccumulatorUse::kRead, OperandType::kReg, OperandType::kReg, \
59 V(DebugBreak5, OperandType::kRuntimeId, OperandType::kReg, \ 59 OperandType::kReg, OperandType::kReg) \
60 OperandType::kReg) \ 60 V(DebugBreak5, AccumulatorUse::kRead, OperandType::kRuntimeId, \
61 V(DebugBreak6, OperandType::kRuntimeId, OperandType::kReg, \ 61 OperandType::kReg, OperandType::kReg) \
62 OperandType::kReg, OperandType::kReg) 62 V(DebugBreak6, AccumulatorUse::kRead, OperandType::kRuntimeId, \
63 OperandType::kReg, OperandType::kReg, OperandType::kReg)
63 64
64 // Define one debug break for each widening prefix. 65 // Define one debug break for each widening prefix.
65 #define DEBUG_BREAK_PREFIX_BYTECODE_LIST(V) \ 66 #define DEBUG_BREAK_PREFIX_BYTECODE_LIST(V) \
66 V(DebugBreakWide, OperandType::kNone) \ 67 V(DebugBreakWide, AccumulatorUse::kRead) \
67 V(DebugBreakExtraWide, OperandType::kNone) 68 V(DebugBreakExtraWide, AccumulatorUse::kRead)
68 69
69 #define DEBUG_BREAK_BYTECODE_LIST(V) \ 70 #define DEBUG_BREAK_BYTECODE_LIST(V) \
70 DEBUG_BREAK_PLAIN_BYTECODE_LIST(V) \ 71 DEBUG_BREAK_PLAIN_BYTECODE_LIST(V) \
71 DEBUG_BREAK_PREFIX_BYTECODE_LIST(V) 72 DEBUG_BREAK_PREFIX_BYTECODE_LIST(V)
72 73
73 // The list of bytecodes which are interpreted by the interpreter. 74 // The list of bytecodes which are interpreted by the interpreter.
74 #define BYTECODE_LIST(V) \ 75 #define BYTECODE_LIST(V) \
75 /* Extended width operands */ \ 76 /* Extended width operands */ \
76 V(Wide, OperandType::kNone) \ 77 V(Wide, AccumulatorUse::kNone) \
77 V(ExtraWide, OperandType::kNone) \ 78 V(ExtraWide, AccumulatorUse::kNone) \
78 \ 79 \
79 /* Loading the accumulator */ \ 80 /* Loading the accumulator */ \
80 V(LdaZero, OperandType::kNone) \ 81 V(LdaZero, AccumulatorUse::kWrite) \
81 V(LdaSmi, OperandType::kImm) \ 82 V(LdaSmi, AccumulatorUse::kWrite, OperandType::kImm) \
82 V(LdaUndefined, OperandType::kNone) \ 83 V(LdaUndefined, AccumulatorUse::kWrite) \
83 V(LdaNull, OperandType::kNone) \ 84 V(LdaNull, AccumulatorUse::kWrite) \
84 V(LdaTheHole, OperandType::kNone) \ 85 V(LdaTheHole, AccumulatorUse::kWrite) \
85 V(LdaTrue, OperandType::kNone) \ 86 V(LdaTrue, AccumulatorUse::kWrite) \
86 V(LdaFalse, OperandType::kNone) \ 87 V(LdaFalse, AccumulatorUse::kWrite) \
87 V(LdaConstant, OperandType::kIdx) \ 88 V(LdaConstant, AccumulatorUse::kWrite, OperandType::kIdx) \
88 \ 89 \
89 /* Globals */ \ 90 /* Globals */ \
90 V(LdaGlobal, OperandType::kIdx, OperandType::kIdx) \ 91 V(LdaGlobal, AccumulatorUse::kWrite, OperandType::kIdx, OperandType::kIdx) \
91 V(LdaGlobalInsideTypeof, OperandType::kIdx, OperandType::kIdx) \ 92 V(LdaGlobalInsideTypeof, AccumulatorUse::kWrite, OperandType::kIdx, \
92 V(StaGlobalSloppy, OperandType::kIdx, OperandType::kIdx) \ 93 OperandType::kIdx) \
93 V(StaGlobalStrict, OperandType::kIdx, OperandType::kIdx) \ 94 V(StaGlobalSloppy, AccumulatorUse::kRead, OperandType::kIdx, \
94 \ 95 OperandType::kIdx) \
95 /* Context operations */ \ 96 V(StaGlobalStrict, AccumulatorUse::kRead, OperandType::kIdx, \
96 V(PushContext, OperandType::kReg) \ 97 OperandType::kIdx) \
97 V(PopContext, OperandType::kReg) \ 98 \
98 V(LdaContextSlot, OperandType::kReg, OperandType::kIdx) \ 99 /* Context operations */ \
99 V(StaContextSlot, OperandType::kReg, OperandType::kIdx) \ 100 V(PushContext, AccumulatorUse::kRead, OperandType::kReg) \
100 \ 101 V(PopContext, AccumulatorUse::kNone, OperandType::kReg) \
101 /* Load-Store lookup slots */ \ 102 V(LdaContextSlot, AccumulatorUse::kWrite, OperandType::kReg, \
102 V(LdaLookupSlot, OperandType::kIdx) \ 103 OperandType::kIdx) \
103 V(LdaLookupSlotInsideTypeof, OperandType::kIdx) \ 104 V(StaContextSlot, AccumulatorUse::kRead, OperandType::kReg, \
104 V(StaLookupSlotSloppy, OperandType::kIdx) \ 105 OperandType::kIdx) \
105 V(StaLookupSlotStrict, OperandType::kIdx) \ 106 \
106 \ 107 /* Load-Store lookup slots */ \
107 /* Register-accumulator transfers */ \ 108 V(LdaLookupSlot, AccumulatorUse::kWrite, OperandType::kIdx) \
108 V(Ldar, OperandType::kReg) \ 109 V(LdaLookupSlotInsideTypeof, AccumulatorUse::kWrite, OperandType::kIdx) \
109 V(Star, OperandType::kRegOut) \ 110 V(StaLookupSlotSloppy, AccumulatorUse::kReadWrite, OperandType::kIdx) \
110 \ 111 V(StaLookupSlotStrict, AccumulatorUse::kReadWrite, OperandType::kIdx) \
111 /* Register-register transfers */ \ 112 \
112 V(Mov, OperandType::kReg, OperandType::kRegOut) \ 113 /* Register-accumulator transfers */ \
113 \ 114 V(Ldar, AccumulatorUse::kWrite, OperandType::kReg) \
114 /* LoadIC operations */ \ 115 V(Star, AccumulatorUse::kRead, OperandType::kRegOut) \
115 V(LoadIC, OperandType::kReg, OperandType::kIdx, OperandType::kIdx) \ 116 \
116 V(KeyedLoadIC, OperandType::kReg, OperandType::kIdx) \ 117 /* Register-register transfers */ \
117 \ 118 V(Mov, AccumulatorUse::kNone, OperandType::kReg, OperandType::kRegOut) \
118 /* StoreIC operations */ \ 119 \
119 V(StoreICSloppy, OperandType::kReg, OperandType::kIdx, OperandType::kIdx) \ 120 /* LoadIC operations */ \
120 V(StoreICStrict, OperandType::kReg, OperandType::kIdx, OperandType::kIdx) \ 121 V(LoadIC, AccumulatorUse::kWrite, OperandType::kReg, OperandType::kIdx, \
121 V(KeyedStoreICSloppy, OperandType::kReg, OperandType::kReg, \ 122 OperandType::kIdx) \
122 OperandType::kIdx) \ 123 V(KeyedLoadIC, AccumulatorUse::kReadWrite, OperandType::kReg, \
123 V(KeyedStoreICStrict, OperandType::kReg, OperandType::kReg, \ 124 OperandType::kIdx) \
124 OperandType::kIdx) \ 125 \
125 \ 126 /* StoreIC operations */ \
126 /* Binary Operators */ \ 127 V(StoreICSloppy, AccumulatorUse::kRead, OperandType::kReg, \
127 V(Add, OperandType::kReg) \ 128 OperandType::kIdx, OperandType::kIdx) \
128 V(Sub, OperandType::kReg) \ 129 V(StoreICStrict, AccumulatorUse::kRead, OperandType::kReg, \
129 V(Mul, OperandType::kReg) \ 130 OperandType::kIdx, OperandType::kIdx) \
130 V(Div, OperandType::kReg) \ 131 V(KeyedStoreICSloppy, AccumulatorUse::kRead, OperandType::kReg, \
131 V(Mod, OperandType::kReg) \ 132 OperandType::kReg, OperandType::kIdx) \
132 V(BitwiseOr, OperandType::kReg) \ 133 V(KeyedStoreICStrict, AccumulatorUse::kRead, OperandType::kReg, \
133 V(BitwiseXor, OperandType::kReg) \ 134 OperandType::kReg, OperandType::kIdx) \
134 V(BitwiseAnd, OperandType::kReg) \ 135 \
135 V(ShiftLeft, OperandType::kReg) \ 136 /* Binary Operators */ \
136 V(ShiftRight, OperandType::kReg) \ 137 V(Add, AccumulatorUse::kReadWrite, OperandType::kReg) \
137 V(ShiftRightLogical, OperandType::kReg) \ 138 V(Sub, AccumulatorUse::kReadWrite, OperandType::kReg) \
138 \ 139 V(Mul, AccumulatorUse::kReadWrite, OperandType::kReg) \
139 /* Unary Operators */ \ 140 V(Div, AccumulatorUse::kReadWrite, OperandType::kReg) \
140 V(Inc, OperandType::kNone) \ 141 V(Mod, AccumulatorUse::kReadWrite, OperandType::kReg) \
141 V(Dec, OperandType::kNone) \ 142 V(BitwiseOr, AccumulatorUse::kReadWrite, OperandType::kReg) \
142 V(LogicalNot, OperandType::kNone) \ 143 V(BitwiseXor, AccumulatorUse::kReadWrite, OperandType::kReg) \
143 V(TypeOf, OperandType::kNone) \ 144 V(BitwiseAnd, AccumulatorUse::kReadWrite, OperandType::kReg) \
144 V(DeletePropertyStrict, OperandType::kReg) \ 145 V(ShiftLeft, AccumulatorUse::kReadWrite, OperandType::kReg) \
145 V(DeletePropertySloppy, OperandType::kReg) \ 146 V(ShiftRight, AccumulatorUse::kReadWrite, OperandType::kReg) \
146 \ 147 V(ShiftRightLogical, AccumulatorUse::kReadWrite, OperandType::kReg) \
147 /* Call operations */ \ 148 \
148 V(Call, OperandType::kReg, OperandType::kReg, OperandType::kRegCount, \ 149 /* Unary Operators */ \
149 OperandType::kIdx) \ 150 V(Inc, AccumulatorUse::kReadWrite) \
150 V(TailCall, OperandType::kReg, OperandType::kReg, OperandType::kRegCount, \ 151 V(Dec, AccumulatorUse::kReadWrite) \
151 OperandType::kIdx) \ 152 V(LogicalNot, AccumulatorUse::kReadWrite) \
152 V(CallRuntime, OperandType::kRuntimeId, OperandType::kMaybeReg, \ 153 V(TypeOf, AccumulatorUse::kReadWrite) \
153 OperandType::kRegCount) \ 154 V(DeletePropertyStrict, AccumulatorUse::kReadWrite, OperandType::kReg) \
154 V(CallRuntimeForPair, OperandType::kRuntimeId, OperandType::kMaybeReg, \ 155 V(DeletePropertySloppy, AccumulatorUse::kReadWrite, OperandType::kReg) \
155 OperandType::kRegCount, OperandType::kRegOutPair) \ 156 \
156 V(CallJSRuntime, OperandType::kIdx, OperandType::kReg, \ 157 /* Call operations */ \
157 OperandType::kRegCount) \ 158 V(Call, AccumulatorUse::kWrite, OperandType::kReg, OperandType::kReg, \
158 \ 159 OperandType::kRegCount, OperandType::kIdx) \
159 /* Intrinsics */ \ 160 V(TailCall, AccumulatorUse::kWrite, OperandType::kReg, OperandType::kReg, \
160 V(InvokeIntrinsic, OperandType::kRuntimeId, OperandType::kMaybeReg, \ 161 OperandType::kRegCount, OperandType::kIdx) \
161 OperandType::kRegCount) \ 162 V(CallRuntime, AccumulatorUse::kWrite, OperandType::kRuntimeId, \
162 \ 163 OperandType::kMaybeReg, OperandType::kRegCount) \
163 /* New operator */ \ 164 V(CallRuntimeForPair, AccumulatorUse::kNone, OperandType::kRuntimeId, \
164 V(New, OperandType::kReg, OperandType::kMaybeReg, OperandType::kRegCount) \ 165 OperandType::kMaybeReg, OperandType::kRegCount, OperandType::kRegOutPair) \
165 \ 166 V(CallJSRuntime, AccumulatorUse::kWrite, OperandType::kIdx, \
166 /* Test Operators */ \ 167 OperandType::kReg, OperandType::kRegCount) \
167 V(TestEqual, OperandType::kReg) \ 168 \
168 V(TestNotEqual, OperandType::kReg) \ 169 /* Intrinsics */ \
169 V(TestEqualStrict, OperandType::kReg) \ 170 V(InvokeIntrinsic, AccumulatorUse::kWrite, OperandType::kRuntimeId, \
170 V(TestLessThan, OperandType::kReg) \ 171 OperandType::kMaybeReg, OperandType::kRegCount) \
171 V(TestGreaterThan, OperandType::kReg) \ 172 \
172 V(TestLessThanOrEqual, OperandType::kReg) \ 173 /* New operator */ \
173 V(TestGreaterThanOrEqual, OperandType::kReg) \ 174 V(New, AccumulatorUse::kReadWrite, OperandType::kReg, \
174 V(TestInstanceOf, OperandType::kReg) \ 175 OperandType::kMaybeReg, OperandType::kRegCount) \
175 V(TestIn, OperandType::kReg) \ 176 \
176 \ 177 /* Test Operators */ \
177 /* Cast operators */ \ 178 V(TestEqual, AccumulatorUse::kReadWrite, OperandType::kReg) \
178 V(ToName, OperandType::kNone) \ 179 V(TestNotEqual, AccumulatorUse::kReadWrite, OperandType::kReg) \
179 V(ToNumber, OperandType::kNone) \ 180 V(TestEqualStrict, AccumulatorUse::kReadWrite, OperandType::kReg) \
180 V(ToObject, OperandType::kNone) \ 181 V(TestLessThan, AccumulatorUse::kReadWrite, OperandType::kReg) \
181 \ 182 V(TestGreaterThan, AccumulatorUse::kReadWrite, OperandType::kReg) \
182 /* Literals */ \ 183 V(TestLessThanOrEqual, AccumulatorUse::kReadWrite, OperandType::kReg) \
183 V(CreateRegExpLiteral, OperandType::kIdx, OperandType::kIdx, \ 184 V(TestGreaterThanOrEqual, AccumulatorUse::kReadWrite, OperandType::kReg) \
184 OperandType::kFlag8) \ 185 V(TestInstanceOf, AccumulatorUse::kReadWrite, OperandType::kReg) \
185 V(CreateArrayLiteral, OperandType::kIdx, OperandType::kIdx, \ 186 V(TestIn, AccumulatorUse::kReadWrite, OperandType::kReg) \
186 OperandType::kFlag8) \ 187 \
187 V(CreateObjectLiteral, OperandType::kIdx, OperandType::kIdx, \ 188 /* Cast operators */ \
188 OperandType::kFlag8) \ 189 V(ToName, AccumulatorUse::kReadWrite) \
189 \ 190 V(ToNumber, AccumulatorUse::kReadWrite) \
190 /* Closure allocation */ \ 191 V(ToObject, AccumulatorUse::kReadWrite) \
191 V(CreateClosure, OperandType::kIdx, OperandType::kFlag8) \ 192 \
192 \ 193 /* Literals */ \
193 /* Arguments allocation */ \ 194 V(CreateRegExpLiteral, AccumulatorUse::kWrite, OperandType::kIdx, \
194 V(CreateMappedArguments, OperandType::kNone) \ 195 OperandType::kIdx, OperandType::kFlag8) \
195 V(CreateUnmappedArguments, OperandType::kNone) \ 196 V(CreateArrayLiteral, AccumulatorUse::kWrite, OperandType::kIdx, \
196 V(CreateRestParameter, OperandType::kNone) \ 197 OperandType::kIdx, OperandType::kFlag8) \
197 \ 198 V(CreateObjectLiteral, AccumulatorUse::kWrite, OperandType::kIdx, \
198 /* Control Flow */ \ 199 OperandType::kIdx, OperandType::kFlag8) \
199 V(Jump, OperandType::kImm) \ 200 \
200 V(JumpConstant, OperandType::kIdx) \ 201 /* Closure allocation */ \
201 V(JumpIfTrue, OperandType::kImm) \ 202 V(CreateClosure, AccumulatorUse::kWrite, OperandType::kIdx, \
202 V(JumpIfTrueConstant, OperandType::kIdx) \ 203 OperandType::kFlag8) \
203 V(JumpIfFalse, OperandType::kImm) \ 204 \
204 V(JumpIfFalseConstant, OperandType::kIdx) \ 205 /* Arguments allocation */ \
205 V(JumpIfToBooleanTrue, OperandType::kImm) \ 206 V(CreateMappedArguments, AccumulatorUse::kWrite) \
206 V(JumpIfToBooleanTrueConstant, OperandType::kIdx) \ 207 V(CreateUnmappedArguments, AccumulatorUse::kWrite) \
207 V(JumpIfToBooleanFalse, OperandType::kImm) \ 208 V(CreateRestParameter, AccumulatorUse::kWrite) \
208 V(JumpIfToBooleanFalseConstant, OperandType::kIdx) \ 209 \
209 V(JumpIfNull, OperandType::kImm) \ 210 /* Control Flow */ \
210 V(JumpIfNullConstant, OperandType::kIdx) \ 211 V(Jump, AccumulatorUse::kNone, OperandType::kImm) \
211 V(JumpIfUndefined, OperandType::kImm) \ 212 V(JumpConstant, AccumulatorUse::kNone, OperandType::kIdx) \
212 V(JumpIfUndefinedConstant, OperandType::kIdx) \ 213 V(JumpIfTrue, AccumulatorUse::kRead, OperandType::kImm) \
213 V(JumpIfNotHole, OperandType::kImm) \ 214 V(JumpIfTrueConstant, AccumulatorUse::kRead, OperandType::kIdx) \
214 V(JumpIfNotHoleConstant, OperandType::kIdx) \ 215 V(JumpIfFalse, AccumulatorUse::kRead, OperandType::kImm) \
215 \ 216 V(JumpIfFalseConstant, AccumulatorUse::kRead, OperandType::kIdx) \
216 /* Complex flow control For..in */ \ 217 V(JumpIfToBooleanTrue, AccumulatorUse::kRead, OperandType::kImm) \
217 V(ForInPrepare, OperandType::kRegOutTriple) \ 218 V(JumpIfToBooleanTrueConstant, AccumulatorUse::kRead, OperandType::kIdx) \
218 V(ForInDone, OperandType::kReg, OperandType::kReg) \ 219 V(JumpIfToBooleanFalse, AccumulatorUse::kRead, OperandType::kImm) \
219 V(ForInNext, OperandType::kReg, OperandType::kReg, OperandType::kRegPair, \ 220 V(JumpIfToBooleanFalseConstant, AccumulatorUse::kRead, OperandType::kIdx) \
220 OperandType::kIdx) \ 221 V(JumpIfNull, AccumulatorUse::kRead, OperandType::kImm) \
221 V(ForInStep, OperandType::kReg) \ 222 V(JumpIfNullConstant, AccumulatorUse::kRead, OperandType::kIdx) \
222 \ 223 V(JumpIfUndefined, AccumulatorUse::kRead, OperandType::kImm) \
223 /* Perform a stack guard check */ \ 224 V(JumpIfUndefinedConstant, AccumulatorUse::kRead, OperandType::kIdx) \
224 V(StackCheck, OperandType::kNone) \ 225 V(JumpIfNotHole, AccumulatorUse::kRead, OperandType::kImm) \
225 \ 226 V(JumpIfNotHoleConstant, AccumulatorUse::kRead, OperandType::kIdx) \
226 /* Non-local flow control */ \ 227 \
227 V(Throw, OperandType::kNone) \ 228 /* Complex flow control For..in */ \
228 V(ReThrow, OperandType::kNone) \ 229 V(ForInPrepare, AccumulatorUse::kRead, OperandType::kRegOutTriple) \
229 V(Return, OperandType::kNone) \ 230 V(ForInDone, AccumulatorUse::kWrite, OperandType::kReg, OperandType::kReg) \
230 \ 231 V(ForInNext, AccumulatorUse::kWrite, OperandType::kReg, OperandType::kReg, \
231 /* Debugger */ \ 232 OperandType::kRegPair, OperandType::kIdx) \
232 V(Debugger, OperandType::kNone) \ 233 V(ForInStep, AccumulatorUse::kWrite, OperandType::kReg) \
233 DEBUG_BREAK_BYTECODE_LIST(V) \ 234 \
234 \ 235 /* Perform a stack guard check */ \
235 /* Illegal bytecode (terminates execution) */ \ 236 V(StackCheck, AccumulatorUse::kNone) \
236 V(Illegal, OperandType::kNone) 237 \
238 /* Non-local flow control */ \
239 V(Throw, AccumulatorUse::kRead) \
240 V(ReThrow, AccumulatorUse::kRead) \
241 V(Return, AccumulatorUse::kNone) \
242 \
243 /* Debugger */ \
244 V(Debugger, AccumulatorUse::kNone) \
245 DEBUG_BREAK_BYTECODE_LIST(V) \
246 \
247 /* Illegal bytecode (terminates execution) */ \
248 V(Illegal, AccumulatorUse::kNone)
249
250 enum class AccumulatorUse : uint8_t {
251 kNone = 0,
252 kRead = 1,
253 kWrite = 2,
rmcilroy 2016/04/05 12:59:22 Nit - could you make this 1 << 1 (and read 1 << 0)
oth 2016/04/05 14:12:10 Done.
254 kReadWrite = kRead | kWrite
255 };
256
257 V8_INLINE AccumulatorUse operator&(AccumulatorUse lhs, AccumulatorUse rhs) {
258 int result = static_cast<int>(lhs) & static_cast<int>(rhs);
259 return static_cast<AccumulatorUse>(result);
260 }
261
262 V8_INLINE AccumulatorUse operator|(AccumulatorUse lhs, AccumulatorUse rhs) {
263 int result = static_cast<int>(lhs) | static_cast<int>(rhs);
264 return static_cast<AccumulatorUse>(result);
265 }
237 266
238 // Enumeration of scaling factors applicable to scalable operands. Code 267 // Enumeration of scaling factors applicable to scalable operands. Code
239 // relies on being able to cast values to integer scaling values. 268 // relies on being able to cast values to integer scaling values.
240 enum class OperandScale : uint8_t { 269 enum class OperandScale : uint8_t {
241 kSingle = 1, 270 kSingle = 1,
242 kDouble = 2, 271 kDouble = 2,
243 kQuadruple = 4, 272 kQuadruple = 4,
244 kMaxValid = kQuadruple, 273 kMaxValid = kQuadruple,
245 kInvalid = 8, 274 kInvalid = 8,
246 }; 275 };
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 396
368 397
369 class Bytecodes { 398 class Bytecodes {
370 public: 399 public:
371 // Returns string representation of |bytecode|. 400 // Returns string representation of |bytecode|.
372 static const char* ToString(Bytecode bytecode); 401 static const char* ToString(Bytecode bytecode);
373 402
374 // Returns string representation of |bytecode|. 403 // Returns string representation of |bytecode|.
375 static std::string ToString(Bytecode bytecode, OperandScale operand_scale); 404 static std::string ToString(Bytecode bytecode, OperandScale operand_scale);
376 405
406 // Returns string representation of |accumulator_use|.
407 static const char* AccumulatorUseToString(AccumulatorUse accumulator_use);
408
377 // Returns string representation of |operand_type|. 409 // Returns string representation of |operand_type|.
378 static const char* OperandTypeToString(OperandType operand_type); 410 static const char* OperandTypeToString(OperandType operand_type);
379 411
380 // Returns string representation of |operand_scale|. 412 // Returns string representation of |operand_scale|.
381 static const char* OperandScaleToString(OperandScale operand_scale); 413 static const char* OperandScaleToString(OperandScale operand_scale);
382 414
383 // Returns string representation of |operand_size|. 415 // Returns string representation of |operand_size|.
384 static const char* OperandSizeToString(OperandSize operand_size); 416 static const char* OperandSizeToString(OperandSize operand_size);
385 417
386 // Returns byte value of bytecode. 418 // Returns byte value of bytecode.
(...skipping 12 matching lines...) Expand all
399 // applied to a a bytecode. 431 // applied to a a bytecode.
400 static Bytecode OperandScaleToPrefixBytecode(OperandScale operand_scale); 432 static Bytecode OperandScaleToPrefixBytecode(OperandScale operand_scale);
401 433
402 // Returns true if the operand scale requires a prefix bytecode. 434 // Returns true if the operand scale requires a prefix bytecode.
403 static bool OperandScaleRequiresPrefixBytecode(OperandScale operand_scale); 435 static bool OperandScaleRequiresPrefixBytecode(OperandScale operand_scale);
404 436
405 // Returns the scaling applied to scalable operands if bytecode is 437 // Returns the scaling applied to scalable operands if bytecode is
406 // is a scaling prefix. 438 // is a scaling prefix.
407 static OperandScale PrefixBytecodeToOperandScale(Bytecode bytecode); 439 static OperandScale PrefixBytecodeToOperandScale(Bytecode bytecode);
408 440
441 // Returns how accumulator is used by |bytecode|.
442 static AccumulatorUse GetAccumulatorUse(Bytecode bytecode);
443
444 // Returns true if |bytecode| reads the accumulator.
445 static bool ReadsAccumulator(Bytecode bytecode);
446
447 // Returns true if |bytecode| writes the accumulator.
448 static bool WritesAccumulator(Bytecode bytecode);
449
409 // Returns the i-th operand of |bytecode|. 450 // Returns the i-th operand of |bytecode|.
410 static OperandType GetOperandType(Bytecode bytecode, int i); 451 static OperandType GetOperandType(Bytecode bytecode, int i);
411 452
412 // Returns the size of the i-th operand of |bytecode|. 453 // Returns the size of the i-th operand of |bytecode|.
413 static OperandSize GetOperandSize(Bytecode bytecode, int i, 454 static OperandSize GetOperandSize(Bytecode bytecode, int i,
414 OperandScale operand_scale); 455 OperandScale operand_scale);
415 456
416 // Returns the offset of the i-th operand of |bytecode| relative to the start 457 // Returns the offset of the i-th operand of |bytecode| relative to the start
417 // of the bytecode. 458 // of the bytecode.
418 static int GetOperandOffset(Bytecode bytecode, int i, 459 static int GetOperandOffset(Bytecode bytecode, int i,
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 int number_of_parameters); 554 int number_of_parameters);
514 555
515 // Return the next larger operand scale. 556 // Return the next larger operand scale.
516 static OperandScale NextOperandScale(OperandScale operand_scale); 557 static OperandScale NextOperandScale(OperandScale operand_scale);
517 558
518 private: 559 private:
519 DISALLOW_IMPLICIT_CONSTRUCTORS(Bytecodes); 560 DISALLOW_IMPLICIT_CONSTRUCTORS(Bytecodes);
520 }; 561 };
521 562
522 std::ostream& operator<<(std::ostream& os, const Bytecode& bytecode); 563 std::ostream& operator<<(std::ostream& os, const Bytecode& bytecode);
564 std::ostream& operator<<(std::ostream& os, const AccumulatorUse& use);
523 std::ostream& operator<<(std::ostream& os, const OperandScale& operand_scale); 565 std::ostream& operator<<(std::ostream& os, const OperandScale& operand_scale);
524 std::ostream& operator<<(std::ostream& os, const OperandSize& operand_size); 566 std::ostream& operator<<(std::ostream& os, const OperandSize& operand_size);
525 std::ostream& operator<<(std::ostream& os, const OperandType& operand_type); 567 std::ostream& operator<<(std::ostream& os, const OperandType& operand_type);
526 568
527 } // namespace interpreter 569 } // namespace interpreter
528 } // namespace internal 570 } // namespace internal
529 } // namespace v8 571 } // namespace v8
530 572
531 #endif // V8_INTERPRETER_BYTECODES_H_ 573 #endif // V8_INTERPRETER_BYTECODES_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698