OLD | NEW |
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 #include "src/interpreter/bytecode-array-builder.h" | 5 #include "src/interpreter/bytecode-array-builder.h" |
6 | 6 |
7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
8 #include "src/interpreter/bytecode-array-writer.h" | 8 #include "src/interpreter/bytecode-array-writer.h" |
9 #include "src/interpreter/bytecode-label.h" | 9 #include "src/interpreter/bytecode-label.h" |
10 #include "src/interpreter/bytecode-peephole-optimizer.h" | 10 #include "src/interpreter/bytecode-peephole-optimizer.h" |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 latest_source_info_.set_invalid(); | 85 latest_source_info_.set_invalid(); |
86 } | 86 } |
87 } | 87 } |
88 | 88 |
89 void BytecodeArrayBuilder::Output(Bytecode bytecode) { | 89 void BytecodeArrayBuilder::Output(Bytecode bytecode) { |
90 BytecodeNode node(bytecode); | 90 BytecodeNode node(bytecode); |
91 AttachSourceInfo(&node); | 91 AttachSourceInfo(&node); |
92 pipeline()->Write(&node); | 92 pipeline()->Write(&node); |
93 } | 93 } |
94 | 94 |
95 void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, | 95 void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0, |
96 OperandScale operand_scale, | 96 uint32_t operand1, uint32_t operand2, |
97 uint32_t operand0, uint32_t operand1, | 97 uint32_t operand3) { |
98 uint32_t operand2, uint32_t operand3) { | 98 BytecodeNode node(bytecode, operand0, operand1, operand2, operand3); |
99 DCHECK(OperandIsValid(bytecode, operand_scale, 0, operand0)); | |
100 DCHECK(OperandIsValid(bytecode, operand_scale, 1, operand1)); | |
101 DCHECK(OperandIsValid(bytecode, operand_scale, 2, operand2)); | |
102 DCHECK(OperandIsValid(bytecode, operand_scale, 3, operand3)); | |
103 BytecodeNode node(bytecode, operand0, operand1, operand2, operand3, | |
104 operand_scale); | |
105 AttachSourceInfo(&node); | 99 AttachSourceInfo(&node); |
106 pipeline()->Write(&node); | 100 pipeline()->Write(&node); |
107 } | 101 } |
108 | 102 |
109 void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, | 103 void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0, |
110 OperandScale operand_scale, | 104 uint32_t operand1, uint32_t operand2) { |
111 uint32_t operand0, uint32_t operand1, | 105 BytecodeNode node(bytecode, operand0, operand1, operand2); |
112 uint32_t operand2) { | |
113 DCHECK(OperandIsValid(bytecode, operand_scale, 0, operand0)); | |
114 DCHECK(OperandIsValid(bytecode, operand_scale, 1, operand1)); | |
115 DCHECK(OperandIsValid(bytecode, operand_scale, 2, operand2)); | |
116 BytecodeNode node(bytecode, operand0, operand1, operand2, operand_scale); | |
117 AttachSourceInfo(&node); | 106 AttachSourceInfo(&node); |
118 pipeline()->Write(&node); | 107 pipeline()->Write(&node); |
119 } | 108 } |
120 | 109 |
121 void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, | 110 void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0, |
122 OperandScale operand_scale, | 111 uint32_t operand1) { |
123 uint32_t operand0, uint32_t operand1) { | 112 BytecodeNode node(bytecode, operand0, operand1); |
124 DCHECK(OperandIsValid(bytecode, operand_scale, 0, operand0)); | |
125 DCHECK(OperandIsValid(bytecode, operand_scale, 1, operand1)); | |
126 BytecodeNode node(bytecode, operand0, operand1, operand_scale); | |
127 AttachSourceInfo(&node); | 113 AttachSourceInfo(&node); |
128 pipeline()->Write(&node); | 114 pipeline()->Write(&node); |
129 } | 115 } |
130 | 116 |
131 void BytecodeArrayBuilder::OutputScaled(Bytecode bytecode, | 117 void BytecodeArrayBuilder::Output(Bytecode bytecode, uint32_t operand0) { |
132 OperandScale operand_scale, | 118 BytecodeNode node(bytecode, operand0); |
133 uint32_t operand0) { | |
134 DCHECK(OperandIsValid(bytecode, operand_scale, 0, operand0)); | |
135 BytecodeNode node(bytecode, operand0, operand_scale); | |
136 AttachSourceInfo(&node); | 119 AttachSourceInfo(&node); |
137 pipeline()->Write(&node); | 120 pipeline()->Write(&node); |
138 } | 121 } |
139 | 122 |
140 BytecodeArrayBuilder& BytecodeArrayBuilder::BinaryOperation(Token::Value op, | 123 BytecodeArrayBuilder& BytecodeArrayBuilder::BinaryOperation(Token::Value op, |
141 Register reg) { | 124 Register reg) { |
142 OperandScale operand_scale = | 125 Output(BytecodeForBinaryOperation(op), RegisterOperand(reg)); |
143 Bytecodes::OperandSizesToScale(reg.SizeOfOperand()); | |
144 OutputScaled(BytecodeForBinaryOperation(op), operand_scale, | |
145 RegisterOperand(reg)); | |
146 return *this; | 126 return *this; |
147 } | 127 } |
148 | 128 |
149 BytecodeArrayBuilder& BytecodeArrayBuilder::CountOperation(Token::Value op) { | 129 BytecodeArrayBuilder& BytecodeArrayBuilder::CountOperation(Token::Value op) { |
150 Output(BytecodeForCountOperation(op)); | 130 Output(BytecodeForCountOperation(op)); |
151 return *this; | 131 return *this; |
152 } | 132 } |
153 | 133 |
154 BytecodeArrayBuilder& BytecodeArrayBuilder::LogicalNot() { | 134 BytecodeArrayBuilder& BytecodeArrayBuilder::LogicalNot() { |
155 Output(Bytecode::kToBooleanLogicalNot); | 135 Output(Bytecode::kToBooleanLogicalNot); |
156 return *this; | 136 return *this; |
157 } | 137 } |
158 | 138 |
159 | 139 |
160 BytecodeArrayBuilder& BytecodeArrayBuilder::TypeOf() { | 140 BytecodeArrayBuilder& BytecodeArrayBuilder::TypeOf() { |
161 Output(Bytecode::kTypeOf); | 141 Output(Bytecode::kTypeOf); |
162 return *this; | 142 return *this; |
163 } | 143 } |
164 | 144 |
165 BytecodeArrayBuilder& BytecodeArrayBuilder::CompareOperation(Token::Value op, | 145 BytecodeArrayBuilder& BytecodeArrayBuilder::CompareOperation(Token::Value op, |
166 Register reg) { | 146 Register reg) { |
167 OperandScale operand_scale = | 147 Output(BytecodeForCompareOperation(op), RegisterOperand(reg)); |
168 Bytecodes::OperandSizesToScale(reg.SizeOfOperand()); | |
169 OutputScaled(BytecodeForCompareOperation(op), operand_scale, | |
170 RegisterOperand(reg)); | |
171 return *this; | 148 return *this; |
172 } | 149 } |
173 | 150 |
174 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral( | 151 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral( |
175 v8::internal::Smi* smi) { | 152 v8::internal::Smi* smi) { |
176 int32_t raw_smi = smi->value(); | 153 int32_t raw_smi = smi->value(); |
177 if (raw_smi == 0) { | 154 if (raw_smi == 0) { |
178 Output(Bytecode::kLdaZero); | 155 Output(Bytecode::kLdaZero); |
179 } else { | 156 } else { |
180 OperandSize operand_size = Bytecodes::SizeForSignedOperand(raw_smi); | 157 Output(Bytecode::kLdaSmi, SignedOperand(raw_smi)); |
181 OperandScale operand_scale = Bytecodes::OperandSizesToScale(operand_size); | |
182 OutputScaled(Bytecode::kLdaSmi, operand_scale, | |
183 SignedOperand(raw_smi, operand_size)); | |
184 } | 158 } |
185 return *this; | 159 return *this; |
186 } | 160 } |
187 | 161 |
188 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral(Handle<Object> object) { | 162 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLiteral(Handle<Object> object) { |
189 size_t entry = GetConstantPoolEntry(object); | 163 size_t entry = GetConstantPoolEntry(object); |
190 OperandScale operand_scale = | 164 Output(Bytecode::kLdaConstant, UnsignedOperand(entry)); |
191 Bytecodes::OperandSizesToScale(Bytecodes::SizeForUnsignedOperand(entry)); | |
192 OutputScaled(Bytecode::kLdaConstant, operand_scale, UnsignedOperand(entry)); | |
193 return *this; | 165 return *this; |
194 } | 166 } |
195 | 167 |
196 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadUndefined() { | 168 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadUndefined() { |
197 Output(Bytecode::kLdaUndefined); | 169 Output(Bytecode::kLdaUndefined); |
198 return *this; | 170 return *this; |
199 } | 171 } |
200 | 172 |
201 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNull() { | 173 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNull() { |
202 Output(Bytecode::kLdaNull); | 174 Output(Bytecode::kLdaNull); |
(...skipping 10 matching lines...) Expand all Loading... |
213 return *this; | 185 return *this; |
214 } | 186 } |
215 | 187 |
216 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadFalse() { | 188 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadFalse() { |
217 Output(Bytecode::kLdaFalse); | 189 Output(Bytecode::kLdaFalse); |
218 return *this; | 190 return *this; |
219 } | 191 } |
220 | 192 |
221 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadAccumulatorWithRegister( | 193 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadAccumulatorWithRegister( |
222 Register reg) { | 194 Register reg) { |
223 OperandScale operand_scale = | 195 Output(Bytecode::kLdar, RegisterOperand(reg)); |
224 Bytecodes::OperandSizesToScale(reg.SizeOfOperand()); | |
225 OutputScaled(Bytecode::kLdar, operand_scale, RegisterOperand(reg)); | |
226 return *this; | 196 return *this; |
227 } | 197 } |
228 | 198 |
229 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreAccumulatorInRegister( | 199 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreAccumulatorInRegister( |
230 Register reg) { | 200 Register reg) { |
231 OperandScale operand_scale = | 201 Output(Bytecode::kStar, RegisterOperand(reg)); |
232 Bytecodes::OperandSizesToScale(reg.SizeOfOperand()); | |
233 OutputScaled(Bytecode::kStar, operand_scale, RegisterOperand(reg)); | |
234 return *this; | 202 return *this; |
235 } | 203 } |
236 | 204 |
237 BytecodeArrayBuilder& BytecodeArrayBuilder::MoveRegister(Register from, | 205 BytecodeArrayBuilder& BytecodeArrayBuilder::MoveRegister(Register from, |
238 Register to) { | 206 Register to) { |
239 DCHECK(from != to); | 207 DCHECK(from != to); |
240 OperandScale operand_scale = | 208 Output(Bytecode::kMov, RegisterOperand(from), RegisterOperand(to)); |
241 Bytecodes::OperandSizesToScale(from.SizeOfOperand(), to.SizeOfOperand()); | |
242 OutputScaled(Bytecode::kMov, operand_scale, RegisterOperand(from), | |
243 RegisterOperand(to)); | |
244 return *this; | 209 return *this; |
245 } | 210 } |
246 | 211 |
247 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadGlobal( | 212 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadGlobal( |
248 const Handle<String> name, int feedback_slot, TypeofMode typeof_mode) { | 213 const Handle<String> name, int feedback_slot, TypeofMode typeof_mode) { |
249 // TODO(rmcilroy): Potentially store typeof information in an | 214 // TODO(rmcilroy): Potentially store typeof information in an |
250 // operand rather than having extra bytecodes. | 215 // operand rather than having extra bytecodes. |
251 Bytecode bytecode = BytecodeForLoadGlobal(typeof_mode); | 216 Bytecode bytecode = BytecodeForLoadGlobal(typeof_mode); |
252 size_t name_index = GetConstantPoolEntry(name); | 217 size_t name_index = GetConstantPoolEntry(name); |
253 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 218 Output(bytecode, UnsignedOperand(name_index), UnsignedOperand(feedback_slot)); |
254 Bytecodes::SizeForUnsignedOperand(name_index), | |
255 Bytecodes::SizeForUnsignedOperand(feedback_slot)); | |
256 OutputScaled(bytecode, operand_scale, UnsignedOperand(name_index), | |
257 UnsignedOperand(feedback_slot)); | |
258 return *this; | 219 return *this; |
259 } | 220 } |
260 | 221 |
261 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreGlobal( | 222 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreGlobal( |
262 const Handle<String> name, int feedback_slot, LanguageMode language_mode) { | 223 const Handle<String> name, int feedback_slot, LanguageMode language_mode) { |
263 Bytecode bytecode = BytecodeForStoreGlobal(language_mode); | 224 Bytecode bytecode = BytecodeForStoreGlobal(language_mode); |
264 size_t name_index = GetConstantPoolEntry(name); | 225 size_t name_index = GetConstantPoolEntry(name); |
265 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 226 Output(bytecode, UnsignedOperand(name_index), UnsignedOperand(feedback_slot)); |
266 Bytecodes::SizeForUnsignedOperand(name_index), | |
267 Bytecodes::SizeForUnsignedOperand(feedback_slot)); | |
268 OutputScaled(bytecode, operand_scale, UnsignedOperand(name_index), | |
269 UnsignedOperand(feedback_slot)); | |
270 return *this; | 227 return *this; |
271 } | 228 } |
272 | 229 |
273 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadContextSlot(Register context, | 230 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadContextSlot(Register context, |
274 int slot_index) { | 231 int slot_index) { |
275 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 232 Output(Bytecode::kLdaContextSlot, RegisterOperand(context), |
276 context.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(slot_index)); | 233 UnsignedOperand(slot_index)); |
277 OutputScaled(Bytecode::kLdaContextSlot, operand_scale, | |
278 RegisterOperand(context), UnsignedOperand(slot_index)); | |
279 return *this; | 234 return *this; |
280 } | 235 } |
281 | 236 |
282 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreContextSlot(Register context, | 237 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreContextSlot(Register context, |
283 int slot_index) { | 238 int slot_index) { |
284 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 239 Output(Bytecode::kStaContextSlot, RegisterOperand(context), |
285 context.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(slot_index)); | 240 UnsignedOperand(slot_index)); |
286 OutputScaled(Bytecode::kStaContextSlot, operand_scale, | |
287 RegisterOperand(context), UnsignedOperand(slot_index)); | |
288 return *this; | 241 return *this; |
289 } | 242 } |
290 | 243 |
291 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLookupSlot( | 244 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadLookupSlot( |
292 const Handle<String> name, TypeofMode typeof_mode) { | 245 const Handle<String> name, TypeofMode typeof_mode) { |
293 Bytecode bytecode = (typeof_mode == INSIDE_TYPEOF) | 246 Bytecode bytecode = (typeof_mode == INSIDE_TYPEOF) |
294 ? Bytecode::kLdaLookupSlotInsideTypeof | 247 ? Bytecode::kLdaLookupSlotInsideTypeof |
295 : Bytecode::kLdaLookupSlot; | 248 : Bytecode::kLdaLookupSlot; |
296 size_t name_index = GetConstantPoolEntry(name); | 249 size_t name_index = GetConstantPoolEntry(name); |
297 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 250 Output(bytecode, UnsignedOperand(name_index)); |
298 Bytecodes::SizeForUnsignedOperand(name_index)); | |
299 OutputScaled(bytecode, operand_scale, UnsignedOperand(name_index)); | |
300 return *this; | 251 return *this; |
301 } | 252 } |
302 | 253 |
303 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreLookupSlot( | 254 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreLookupSlot( |
304 const Handle<String> name, LanguageMode language_mode) { | 255 const Handle<String> name, LanguageMode language_mode) { |
305 Bytecode bytecode = BytecodeForStoreLookupSlot(language_mode); | 256 Bytecode bytecode = BytecodeForStoreLookupSlot(language_mode); |
306 size_t name_index = GetConstantPoolEntry(name); | 257 size_t name_index = GetConstantPoolEntry(name); |
307 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 258 Output(bytecode, UnsignedOperand(name_index)); |
308 Bytecodes::SizeForUnsignedOperand(name_index)); | |
309 OutputScaled(bytecode, operand_scale, UnsignedOperand(name_index)); | |
310 return *this; | 259 return *this; |
311 } | 260 } |
312 | 261 |
313 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNamedProperty( | 262 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadNamedProperty( |
314 Register object, const Handle<Name> name, int feedback_slot) { | 263 Register object, const Handle<Name> name, int feedback_slot) { |
315 size_t name_index = GetConstantPoolEntry(name); | 264 size_t name_index = GetConstantPoolEntry(name); |
316 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 265 Output(Bytecode::kLdaNamedProperty, RegisterOperand(object), |
317 object.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(name_index), | 266 UnsignedOperand(name_index), UnsignedOperand(feedback_slot)); |
318 Bytecodes::SizeForUnsignedOperand(feedback_slot)); | |
319 OutputScaled(Bytecode::kLdaNamedProperty, operand_scale, | |
320 RegisterOperand(object), UnsignedOperand(name_index), | |
321 UnsignedOperand(feedback_slot)); | |
322 return *this; | 267 return *this; |
323 } | 268 } |
324 | 269 |
325 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadKeyedProperty( | 270 BytecodeArrayBuilder& BytecodeArrayBuilder::LoadKeyedProperty( |
326 Register object, int feedback_slot) { | 271 Register object, int feedback_slot) { |
327 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 272 Output(Bytecode::kLdaKeyedProperty, RegisterOperand(object), |
328 object.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(feedback_slot)); | 273 UnsignedOperand(feedback_slot)); |
329 OutputScaled(Bytecode::kLdaKeyedProperty, operand_scale, | |
330 RegisterOperand(object), UnsignedOperand(feedback_slot)); | |
331 return *this; | 274 return *this; |
332 } | 275 } |
333 | 276 |
334 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreNamedProperty( | 277 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreNamedProperty( |
335 Register object, const Handle<Name> name, int feedback_slot, | 278 Register object, const Handle<Name> name, int feedback_slot, |
336 LanguageMode language_mode) { | 279 LanguageMode language_mode) { |
337 Bytecode bytecode = BytecodeForStoreNamedProperty(language_mode); | 280 Bytecode bytecode = BytecodeForStoreNamedProperty(language_mode); |
338 size_t name_index = GetConstantPoolEntry(name); | 281 size_t name_index = GetConstantPoolEntry(name); |
339 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 282 Output(bytecode, RegisterOperand(object), UnsignedOperand(name_index), |
340 object.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(name_index), | 283 UnsignedOperand(feedback_slot)); |
341 Bytecodes::SizeForUnsignedOperand(feedback_slot)); | |
342 OutputScaled(bytecode, operand_scale, RegisterOperand(object), | |
343 UnsignedOperand(name_index), UnsignedOperand(feedback_slot)); | |
344 return *this; | 284 return *this; |
345 } | 285 } |
346 | 286 |
347 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreKeyedProperty( | 287 BytecodeArrayBuilder& BytecodeArrayBuilder::StoreKeyedProperty( |
348 Register object, Register key, int feedback_slot, | 288 Register object, Register key, int feedback_slot, |
349 LanguageMode language_mode) { | 289 LanguageMode language_mode) { |
350 Bytecode bytecode = BytecodeForStoreKeyedProperty(language_mode); | 290 Bytecode bytecode = BytecodeForStoreKeyedProperty(language_mode); |
351 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 291 Output(bytecode, RegisterOperand(object), RegisterOperand(key), |
352 object.SizeOfOperand(), key.SizeOfOperand(), | 292 UnsignedOperand(feedback_slot)); |
353 Bytecodes::SizeForUnsignedOperand(feedback_slot)); | |
354 OutputScaled(bytecode, operand_scale, RegisterOperand(object), | |
355 RegisterOperand(key), UnsignedOperand(feedback_slot)); | |
356 return *this; | 293 return *this; |
357 } | 294 } |
358 | 295 |
359 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateClosure( | 296 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateClosure( |
360 Handle<SharedFunctionInfo> shared_info, PretenureFlag tenured) { | 297 Handle<SharedFunctionInfo> shared_info, PretenureFlag tenured) { |
361 size_t entry = GetConstantPoolEntry(shared_info); | 298 size_t entry = GetConstantPoolEntry(shared_info); |
362 OperandScale operand_scale = | 299 Output(Bytecode::kCreateClosure, UnsignedOperand(entry), |
363 Bytecodes::OperandSizesToScale(Bytecodes::SizeForUnsignedOperand(entry)); | 300 UnsignedOperand(static_cast<size_t>(tenured))); |
364 OutputScaled(Bytecode::kCreateClosure, operand_scale, UnsignedOperand(entry), | |
365 UnsignedOperand(static_cast<size_t>(tenured))); | |
366 return *this; | 301 return *this; |
367 } | 302 } |
368 | 303 |
369 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateArguments( | 304 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateArguments( |
370 CreateArgumentsType type) { | 305 CreateArgumentsType type) { |
371 // TODO(rmcilroy): Consider passing the type as a bytecode operand rather | 306 // TODO(rmcilroy): Consider passing the type as a bytecode operand rather |
372 // than having two different bytecodes once we have better support for | 307 // than having two different bytecodes once we have better support for |
373 // branches in the InterpreterAssembler. | 308 // branches in the InterpreterAssembler. |
374 Bytecode bytecode = BytecodeForCreateArguments(type); | 309 Bytecode bytecode = BytecodeForCreateArguments(type); |
375 Output(bytecode); | 310 Output(bytecode); |
376 return *this; | 311 return *this; |
377 } | 312 } |
378 | 313 |
379 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateRegExpLiteral( | 314 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateRegExpLiteral( |
380 Handle<String> pattern, int literal_index, int flags) { | 315 Handle<String> pattern, int literal_index, int flags) { |
381 size_t pattern_entry = GetConstantPoolEntry(pattern); | 316 size_t pattern_entry = GetConstantPoolEntry(pattern); |
382 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 317 Output(Bytecode::kCreateRegExpLiteral, UnsignedOperand(pattern_entry), |
383 Bytecodes::SizeForUnsignedOperand(pattern_entry), | 318 UnsignedOperand(literal_index), UnsignedOperand(flags)); |
384 Bytecodes::SizeForUnsignedOperand(literal_index), | |
385 Bytecodes::SizeForUnsignedOperand(flags)); | |
386 OutputScaled(Bytecode::kCreateRegExpLiteral, operand_scale, | |
387 UnsignedOperand(pattern_entry), UnsignedOperand(literal_index), | |
388 UnsignedOperand(flags)); | |
389 return *this; | 319 return *this; |
390 } | 320 } |
391 | 321 |
392 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateArrayLiteral( | 322 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateArrayLiteral( |
393 Handle<FixedArray> constant_elements, int literal_index, int flags) { | 323 Handle<FixedArray> constant_elements, int literal_index, int flags) { |
394 size_t constant_elements_entry = GetConstantPoolEntry(constant_elements); | 324 size_t constant_elements_entry = GetConstantPoolEntry(constant_elements); |
395 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 325 Output(Bytecode::kCreateArrayLiteral, |
396 Bytecodes::SizeForUnsignedOperand(constant_elements_entry), | 326 UnsignedOperand(constant_elements_entry), |
397 Bytecodes::SizeForUnsignedOperand(literal_index), | 327 UnsignedOperand(literal_index), UnsignedOperand(flags)); |
398 Bytecodes::SizeForUnsignedOperand(flags)); | |
399 OutputScaled(Bytecode::kCreateArrayLiteral, operand_scale, | |
400 UnsignedOperand(constant_elements_entry), | |
401 UnsignedOperand(literal_index), UnsignedOperand(flags)); | |
402 return *this; | 328 return *this; |
403 } | 329 } |
404 | 330 |
405 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateObjectLiteral( | 331 BytecodeArrayBuilder& BytecodeArrayBuilder::CreateObjectLiteral( |
406 Handle<FixedArray> constant_properties, int literal_index, int flags) { | 332 Handle<FixedArray> constant_properties, int literal_index, int flags) { |
407 size_t constant_properties_entry = GetConstantPoolEntry(constant_properties); | 333 size_t constant_properties_entry = GetConstantPoolEntry(constant_properties); |
408 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 334 Output(Bytecode::kCreateObjectLiteral, |
409 Bytecodes::SizeForUnsignedOperand(constant_properties_entry), | 335 UnsignedOperand(constant_properties_entry), |
410 Bytecodes::SizeForUnsignedOperand(literal_index), | 336 UnsignedOperand(literal_index), UnsignedOperand(flags)); |
411 Bytecodes::SizeForUnsignedOperand(flags)); | |
412 OutputScaled(Bytecode::kCreateObjectLiteral, operand_scale, | |
413 UnsignedOperand(constant_properties_entry), | |
414 UnsignedOperand(literal_index), UnsignedOperand(flags)); | |
415 return *this; | 337 return *this; |
416 } | 338 } |
417 | 339 |
418 BytecodeArrayBuilder& BytecodeArrayBuilder::PushContext(Register context) { | 340 BytecodeArrayBuilder& BytecodeArrayBuilder::PushContext(Register context) { |
419 OperandScale operand_scale = | 341 Output(Bytecode::kPushContext, RegisterOperand(context)); |
420 Bytecodes::OperandSizesToScale(context.SizeOfOperand()); | |
421 OutputScaled(Bytecode::kPushContext, operand_scale, RegisterOperand(context)); | |
422 return *this; | 342 return *this; |
423 } | 343 } |
424 | 344 |
425 BytecodeArrayBuilder& BytecodeArrayBuilder::PopContext(Register context) { | 345 BytecodeArrayBuilder& BytecodeArrayBuilder::PopContext(Register context) { |
426 OperandScale operand_scale = | 346 Output(Bytecode::kPopContext, RegisterOperand(context)); |
427 Bytecodes::OperandSizesToScale(context.SizeOfOperand()); | |
428 OutputScaled(Bytecode::kPopContext, operand_scale, RegisterOperand(context)); | |
429 return *this; | 347 return *this; |
430 } | 348 } |
431 | 349 |
432 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToJSObject() { | 350 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToJSObject() { |
433 Output(Bytecode::kToObject); | 351 Output(Bytecode::kToObject); |
434 return *this; | 352 return *this; |
435 } | 353 } |
436 | 354 |
437 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToName() { | 355 BytecodeArrayBuilder& BytecodeArrayBuilder::CastAccumulatorToName() { |
438 Output(Bytecode::kToName); | 356 Output(Bytecode::kToName); |
(...skipping 13 matching lines...) Expand all Loading... |
452 | 370 |
453 BytecodeArrayBuilder& BytecodeArrayBuilder::Bind(const BytecodeLabel& target, | 371 BytecodeArrayBuilder& BytecodeArrayBuilder::Bind(const BytecodeLabel& target, |
454 BytecodeLabel* label) { | 372 BytecodeLabel* label) { |
455 pipeline_->BindLabel(target, label); | 373 pipeline_->BindLabel(target, label); |
456 LeaveBasicBlock(); | 374 LeaveBasicBlock(); |
457 return *this; | 375 return *this; |
458 } | 376 } |
459 | 377 |
460 BytecodeArrayBuilder& BytecodeArrayBuilder::OutputJump(Bytecode jump_bytecode, | 378 BytecodeArrayBuilder& BytecodeArrayBuilder::OutputJump(Bytecode jump_bytecode, |
461 BytecodeLabel* label) { | 379 BytecodeLabel* label) { |
462 BytecodeNode node(jump_bytecode, 0, OperandScale::kSingle); | 380 BytecodeNode node(jump_bytecode, 0); |
463 AttachSourceInfo(&node); | 381 AttachSourceInfo(&node); |
464 pipeline_->WriteJump(&node, label); | 382 pipeline_->WriteJump(&node, label); |
465 LeaveBasicBlock(); | 383 LeaveBasicBlock(); |
466 return *this; | 384 return *this; |
467 } | 385 } |
468 | 386 |
469 BytecodeArrayBuilder& BytecodeArrayBuilder::Jump(BytecodeLabel* label) { | 387 BytecodeArrayBuilder& BytecodeArrayBuilder::Jump(BytecodeLabel* label) { |
470 return OutputJump(Bytecode::kJump, label); | 388 return OutputJump(Bytecode::kJump, label); |
471 } | 389 } |
472 | 390 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
522 return *this; | 440 return *this; |
523 } | 441 } |
524 | 442 |
525 BytecodeArrayBuilder& BytecodeArrayBuilder::Debugger() { | 443 BytecodeArrayBuilder& BytecodeArrayBuilder::Debugger() { |
526 Output(Bytecode::kDebugger); | 444 Output(Bytecode::kDebugger); |
527 return *this; | 445 return *this; |
528 } | 446 } |
529 | 447 |
530 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInPrepare( | 448 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInPrepare( |
531 Register cache_info_triple) { | 449 Register cache_info_triple) { |
532 OperandScale operand_scale = | 450 Output(Bytecode::kForInPrepare, RegisterOperand(cache_info_triple)); |
533 Bytecodes::OperandSizesToScale(cache_info_triple.SizeOfOperand()); | |
534 OutputScaled(Bytecode::kForInPrepare, operand_scale, | |
535 RegisterOperand(cache_info_triple)); | |
536 return *this; | 451 return *this; |
537 } | 452 } |
538 | 453 |
539 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInDone(Register index, | 454 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInDone(Register index, |
540 Register cache_length) { | 455 Register cache_length) { |
541 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 456 Output(Bytecode::kForInDone, RegisterOperand(index), |
542 index.SizeOfOperand(), cache_length.SizeOfOperand()); | 457 RegisterOperand(cache_length)); |
543 OutputScaled(Bytecode::kForInDone, operand_scale, RegisterOperand(index), | |
544 RegisterOperand(cache_length)); | |
545 return *this; | 458 return *this; |
546 } | 459 } |
547 | 460 |
548 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInNext( | 461 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInNext( |
549 Register receiver, Register index, Register cache_type_array_pair, | 462 Register receiver, Register index, Register cache_type_array_pair, |
550 int feedback_slot) { | 463 int feedback_slot) { |
551 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 464 Output(Bytecode::kForInNext, RegisterOperand(receiver), |
552 receiver.SizeOfOperand(), index.SizeOfOperand(), | 465 RegisterOperand(index), RegisterOperand(cache_type_array_pair), |
553 cache_type_array_pair.SizeOfOperand(), | 466 UnsignedOperand(feedback_slot)); |
554 Bytecodes::SizeForUnsignedOperand(feedback_slot)); | |
555 OutputScaled(Bytecode::kForInNext, operand_scale, RegisterOperand(receiver), | |
556 RegisterOperand(index), RegisterOperand(cache_type_array_pair), | |
557 UnsignedOperand(feedback_slot)); | |
558 return *this; | 467 return *this; |
559 } | 468 } |
560 | 469 |
561 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInStep(Register index) { | 470 BytecodeArrayBuilder& BytecodeArrayBuilder::ForInStep(Register index) { |
562 OperandScale operand_scale = | 471 Output(Bytecode::kForInStep, RegisterOperand(index)); |
563 Bytecodes::OperandSizesToScale(index.SizeOfOperand()); | |
564 OutputScaled(Bytecode::kForInStep, operand_scale, RegisterOperand(index)); | |
565 return *this; | 472 return *this; |
566 } | 473 } |
567 | 474 |
568 BytecodeArrayBuilder& BytecodeArrayBuilder::SuspendGenerator( | 475 BytecodeArrayBuilder& BytecodeArrayBuilder::SuspendGenerator( |
569 Register generator) { | 476 Register generator) { |
570 OperandScale operand_scale = | 477 Output(Bytecode::kSuspendGenerator, RegisterOperand(generator)); |
571 Bytecodes::OperandSizesToScale(generator.SizeOfOperand()); | |
572 OutputScaled(Bytecode::kSuspendGenerator, operand_scale, | |
573 RegisterOperand(generator)); | |
574 return *this; | 478 return *this; |
575 } | 479 } |
576 | 480 |
577 BytecodeArrayBuilder& BytecodeArrayBuilder::ResumeGenerator( | 481 BytecodeArrayBuilder& BytecodeArrayBuilder::ResumeGenerator( |
578 Register generator) { | 482 Register generator) { |
579 OperandScale operand_scale = | 483 Output(Bytecode::kResumeGenerator, RegisterOperand(generator)); |
580 Bytecodes::OperandSizesToScale(generator.SizeOfOperand()); | |
581 OutputScaled(Bytecode::kResumeGenerator, operand_scale, | |
582 RegisterOperand(generator)); | |
583 return *this; | 484 return *this; |
584 } | 485 } |
585 | 486 |
586 BytecodeArrayBuilder& BytecodeArrayBuilder::MarkHandler(int handler_id, | 487 BytecodeArrayBuilder& BytecodeArrayBuilder::MarkHandler(int handler_id, |
587 bool will_catch) { | 488 bool will_catch) { |
588 BytecodeLabel handler; | 489 BytecodeLabel handler; |
589 Bind(&handler); | 490 Bind(&handler); |
590 handler_table_builder()->SetHandlerTarget(handler_id, handler.offset()); | 491 handler_table_builder()->SetHandlerTarget(handler_id, handler.offset()); |
591 handler_table_builder()->SetPrediction(handler_id, will_catch); | 492 handler_table_builder()->SetPrediction(handler_id, will_catch); |
592 return *this; | 493 return *this; |
(...skipping 23 matching lines...) Expand all Loading... |
616 } | 517 } |
617 DCHECK(return_seen_in_block_); | 518 DCHECK(return_seen_in_block_); |
618 } | 519 } |
619 | 520 |
620 BytecodeArrayBuilder& BytecodeArrayBuilder::Call(Register callable, | 521 BytecodeArrayBuilder& BytecodeArrayBuilder::Call(Register callable, |
621 Register receiver_args, | 522 Register receiver_args, |
622 size_t receiver_args_count, | 523 size_t receiver_args_count, |
623 int feedback_slot, | 524 int feedback_slot, |
624 TailCallMode tail_call_mode) { | 525 TailCallMode tail_call_mode) { |
625 Bytecode bytecode = BytecodeForCall(tail_call_mode); | 526 Bytecode bytecode = BytecodeForCall(tail_call_mode); |
626 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 527 Output(bytecode, RegisterOperand(callable), RegisterOperand(receiver_args), |
627 callable.SizeOfOperand(), receiver_args.SizeOfOperand(), | 528 UnsignedOperand(receiver_args_count), UnsignedOperand(feedback_slot)); |
628 Bytecodes::SizeForUnsignedOperand(receiver_args_count), | |
629 Bytecodes::SizeForUnsignedOperand(feedback_slot)); | |
630 OutputScaled(bytecode, operand_scale, RegisterOperand(callable), | |
631 RegisterOperand(receiver_args), | |
632 UnsignedOperand(receiver_args_count), | |
633 UnsignedOperand(feedback_slot)); | |
634 return *this; | 529 return *this; |
635 } | 530 } |
636 | 531 |
637 BytecodeArrayBuilder& BytecodeArrayBuilder::New(Register constructor, | 532 BytecodeArrayBuilder& BytecodeArrayBuilder::New(Register constructor, |
638 Register first_arg, | 533 Register first_arg, |
639 size_t arg_count) { | 534 size_t arg_count) { |
640 if (!first_arg.is_valid()) { | 535 if (!first_arg.is_valid()) { |
641 DCHECK_EQ(0u, arg_count); | 536 DCHECK_EQ(0u, arg_count); |
642 first_arg = Register(0); | 537 first_arg = Register(0); |
643 } | 538 } |
644 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 539 Output(Bytecode::kNew, RegisterOperand(constructor), |
645 constructor.SizeOfOperand(), first_arg.SizeOfOperand(), | 540 RegisterOperand(first_arg), UnsignedOperand(arg_count)); |
646 Bytecodes::SizeForUnsignedOperand(arg_count)); | |
647 OutputScaled(Bytecode::kNew, operand_scale, RegisterOperand(constructor), | |
648 RegisterOperand(first_arg), UnsignedOperand(arg_count)); | |
649 return *this; | 541 return *this; |
650 } | 542 } |
651 | 543 |
652 BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntime( | 544 BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntime( |
653 Runtime::FunctionId function_id, Register first_arg, size_t arg_count) { | 545 Runtime::FunctionId function_id, Register first_arg, size_t arg_count) { |
654 DCHECK_EQ(1, Runtime::FunctionForId(function_id)->result_size); | 546 DCHECK_EQ(1, Runtime::FunctionForId(function_id)->result_size); |
655 DCHECK(Bytecodes::SizeForUnsignedOperand(function_id) <= OperandSize::kShort); | 547 DCHECK(Bytecodes::SizeForUnsignedOperand(function_id) <= OperandSize::kShort); |
656 if (!first_arg.is_valid()) { | 548 if (!first_arg.is_valid()) { |
657 DCHECK_EQ(0u, arg_count); | 549 DCHECK_EQ(0u, arg_count); |
658 first_arg = Register(0); | 550 first_arg = Register(0); |
659 } | 551 } |
660 Bytecode bytecode = IntrinsicsHelper::IsSupported(function_id) | 552 Bytecode bytecode = IntrinsicsHelper::IsSupported(function_id) |
661 ? Bytecode::kInvokeIntrinsic | 553 ? Bytecode::kInvokeIntrinsic |
662 : Bytecode::kCallRuntime; | 554 : Bytecode::kCallRuntime; |
663 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 555 Output(bytecode, static_cast<uint16_t>(function_id), |
664 first_arg.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(arg_count)); | 556 RegisterOperand(first_arg), UnsignedOperand(arg_count)); |
665 OutputScaled(bytecode, operand_scale, static_cast<uint16_t>(function_id), | |
666 RegisterOperand(first_arg), UnsignedOperand(arg_count)); | |
667 return *this; | 557 return *this; |
668 } | 558 } |
669 | 559 |
670 BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntimeForPair( | 560 BytecodeArrayBuilder& BytecodeArrayBuilder::CallRuntimeForPair( |
671 Runtime::FunctionId function_id, Register first_arg, size_t arg_count, | 561 Runtime::FunctionId function_id, Register first_arg, size_t arg_count, |
672 Register first_return) { | 562 Register first_return) { |
673 DCHECK_EQ(2, Runtime::FunctionForId(function_id)->result_size); | 563 DCHECK_EQ(2, Runtime::FunctionForId(function_id)->result_size); |
674 DCHECK(Bytecodes::SizeForUnsignedOperand(function_id) <= OperandSize::kShort); | 564 DCHECK(Bytecodes::SizeForUnsignedOperand(function_id) <= OperandSize::kShort); |
675 if (!first_arg.is_valid()) { | 565 if (!first_arg.is_valid()) { |
676 DCHECK_EQ(0u, arg_count); | 566 DCHECK_EQ(0u, arg_count); |
677 first_arg = Register(0); | 567 first_arg = Register(0); |
678 } | 568 } |
679 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 569 Output(Bytecode::kCallRuntimeForPair, static_cast<uint16_t>(function_id), |
680 first_arg.SizeOfOperand(), Bytecodes::SizeForUnsignedOperand(arg_count), | 570 RegisterOperand(first_arg), UnsignedOperand(arg_count), |
681 first_return.SizeOfOperand()); | 571 RegisterOperand(first_return)); |
682 OutputScaled(Bytecode::kCallRuntimeForPair, operand_scale, | |
683 static_cast<uint16_t>(function_id), RegisterOperand(first_arg), | |
684 UnsignedOperand(arg_count), RegisterOperand(first_return)); | |
685 return *this; | 572 return *this; |
686 } | 573 } |
687 | 574 |
688 BytecodeArrayBuilder& BytecodeArrayBuilder::CallJSRuntime( | 575 BytecodeArrayBuilder& BytecodeArrayBuilder::CallJSRuntime( |
689 int context_index, Register receiver_args, size_t receiver_args_count) { | 576 int context_index, Register receiver_args, size_t receiver_args_count) { |
690 OperandScale operand_scale = Bytecodes::OperandSizesToScale( | 577 Output(Bytecode::kCallJSRuntime, UnsignedOperand(context_index), |
691 Bytecodes::SizeForUnsignedOperand(context_index), | 578 RegisterOperand(receiver_args), UnsignedOperand(receiver_args_count)); |
692 receiver_args.SizeOfOperand(), | |
693 Bytecodes::SizeForUnsignedOperand(receiver_args_count)); | |
694 OutputScaled(Bytecode::kCallJSRuntime, operand_scale, | |
695 UnsignedOperand(context_index), RegisterOperand(receiver_args), | |
696 UnsignedOperand(receiver_args_count)); | |
697 return *this; | 579 return *this; |
698 } | 580 } |
699 | 581 |
700 BytecodeArrayBuilder& BytecodeArrayBuilder::Delete(Register object, | 582 BytecodeArrayBuilder& BytecodeArrayBuilder::Delete(Register object, |
701 LanguageMode language_mode) { | 583 LanguageMode language_mode) { |
702 OperandScale operand_scale = | 584 Output(BytecodeForDelete(language_mode), RegisterOperand(object)); |
703 Bytecodes::OperandSizesToScale(object.SizeOfOperand()); | |
704 OutputScaled(BytecodeForDelete(language_mode), operand_scale, | |
705 RegisterOperand(object)); | |
706 return *this; | 585 return *this; |
707 } | 586 } |
708 | 587 |
709 size_t BytecodeArrayBuilder::GetConstantPoolEntry(Handle<Object> object) { | 588 size_t BytecodeArrayBuilder::GetConstantPoolEntry(Handle<Object> object) { |
710 return constant_array_builder()->Insert(object); | 589 return constant_array_builder()->Insert(object); |
711 } | 590 } |
712 | 591 |
713 void BytecodeArrayBuilder::SetReturnPosition() { | 592 void BytecodeArrayBuilder::SetReturnPosition() { |
714 if (return_position_ == RelocInfo::kNoPosition) return; | 593 if (return_position_ == RelocInfo::kNoPosition) return; |
715 latest_source_info_.Update({return_position_, true}); | 594 latest_source_info_.Update({return_position_, true}); |
(...skipping 11 matching lines...) Expand all Loading... |
727 | 606 |
728 void BytecodeArrayBuilder::SetExpressionAsStatementPosition(Expression* expr) { | 607 void BytecodeArrayBuilder::SetExpressionAsStatementPosition(Expression* expr) { |
729 if (expr->position() == RelocInfo::kNoPosition) return; | 608 if (expr->position() == RelocInfo::kNoPosition) return; |
730 latest_source_info_.Update({expr->position(), true}); | 609 latest_source_info_.Update({expr->position(), true}); |
731 } | 610 } |
732 | 611 |
733 bool BytecodeArrayBuilder::TemporaryRegisterIsLive(Register reg) const { | 612 bool BytecodeArrayBuilder::TemporaryRegisterIsLive(Register reg) const { |
734 return temporary_register_allocator()->RegisterIsLive(reg); | 613 return temporary_register_allocator()->RegisterIsLive(reg); |
735 } | 614 } |
736 | 615 |
737 bool BytecodeArrayBuilder::OperandIsValid(Bytecode bytecode, | |
738 OperandScale operand_scale, | |
739 int operand_index, | |
740 uint32_t operand_value) const { | |
741 OperandSize operand_size = | |
742 Bytecodes::GetOperandSize(bytecode, operand_index, operand_scale); | |
743 OperandType operand_type = Bytecodes::GetOperandType(bytecode, operand_index); | |
744 switch (operand_type) { | |
745 case OperandType::kNone: | |
746 return false; | |
747 case OperandType::kRegCount: { | |
748 if (operand_index > 0) { | |
749 OperandType previous_operand_type = | |
750 Bytecodes::GetOperandType(bytecode, operand_index - 1); | |
751 if (previous_operand_type != OperandType::kMaybeReg && | |
752 previous_operand_type != OperandType::kReg) { | |
753 return false; | |
754 } | |
755 } | |
756 } // Fall-through | |
757 case OperandType::kFlag8: | |
758 case OperandType::kIdx: | |
759 case OperandType::kRuntimeId: | |
760 case OperandType::kImm: { | |
761 size_t unsigned_value = static_cast<size_t>(operand_value); | |
762 return Bytecodes::SizeForUnsignedOperand(unsigned_value) <= operand_size; | |
763 } | |
764 case OperandType::kMaybeReg: | |
765 if (RegisterFromOperand(operand_value) == Register(0)) { | |
766 return true; | |
767 } | |
768 // Fall-through to kReg case. | |
769 case OperandType::kReg: | |
770 case OperandType::kRegOut: { | |
771 Register reg = RegisterFromOperand(operand_value); | |
772 return RegisterIsValid(reg, operand_size); | |
773 } | |
774 case OperandType::kRegOutPair: | |
775 case OperandType::kRegPair: { | |
776 Register reg0 = RegisterFromOperand(operand_value); | |
777 Register reg1 = Register(reg0.index() + 1); | |
778 // The size of reg1 is immaterial. | |
779 return RegisterIsValid(reg0, operand_size) && | |
780 RegisterIsValid(reg1, OperandSize::kQuad); | |
781 } | |
782 case OperandType::kRegOutTriple: { | |
783 Register reg0 = RegisterFromOperand(operand_value); | |
784 Register reg1 = Register(reg0.index() + 1); | |
785 Register reg2 = Register(reg0.index() + 2); | |
786 // The size of reg1 and reg2 is immaterial. | |
787 return RegisterIsValid(reg0, operand_size) && | |
788 RegisterIsValid(reg1, OperandSize::kQuad) && | |
789 RegisterIsValid(reg2, OperandSize::kQuad); | |
790 } | |
791 } | |
792 UNREACHABLE(); | |
793 return false; | |
794 } | |
795 | |
796 bool BytecodeArrayBuilder::RegisterIsValid(Register reg, | |
797 OperandSize reg_size) const { | |
798 if (!reg.is_valid()) { | |
799 return false; | |
800 } | |
801 | |
802 if (reg.SizeOfOperand() > reg_size) { | |
803 return false; | |
804 } | |
805 | |
806 if (reg.is_current_context() || reg.is_function_closure() || | |
807 reg.is_new_target()) { | |
808 return true; | |
809 } else if (reg.is_parameter()) { | |
810 int parameter_index = reg.ToParameterIndex(parameter_count()); | |
811 return parameter_index >= 0 && parameter_index < parameter_count(); | |
812 } else if (reg.index() < fixed_register_count()) { | |
813 return true; | |
814 } else { | |
815 return TemporaryRegisterIsLive(reg); | |
816 } | |
817 } | |
818 | |
819 // static | 616 // static |
820 Bytecode BytecodeArrayBuilder::BytecodeForBinaryOperation(Token::Value op) { | 617 Bytecode BytecodeArrayBuilder::BytecodeForBinaryOperation(Token::Value op) { |
821 switch (op) { | 618 switch (op) { |
822 case Token::Value::ADD: | 619 case Token::Value::ADD: |
823 return Bytecode::kAdd; | 620 return Bytecode::kAdd; |
824 case Token::Value::SUB: | 621 case Token::Value::SUB: |
825 return Bytecode::kSub; | 622 return Bytecode::kSub; |
826 case Token::Value::MUL: | 623 case Token::Value::MUL: |
827 return Bytecode::kMul; | 624 return Bytecode::kMul; |
828 case Token::Value::DIV: | 625 case Token::Value::DIV: |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
991 } | 788 } |
992 | 789 |
993 uint32_t BytecodeArrayBuilder::RegisterOperand(Register reg) { | 790 uint32_t BytecodeArrayBuilder::RegisterOperand(Register reg) { |
994 return static_cast<uint32_t>(reg.ToOperand()); | 791 return static_cast<uint32_t>(reg.ToOperand()); |
995 } | 792 } |
996 | 793 |
997 Register BytecodeArrayBuilder::RegisterFromOperand(uint32_t operand) { | 794 Register BytecodeArrayBuilder::RegisterFromOperand(uint32_t operand) { |
998 return Register::FromOperand(static_cast<int32_t>(operand)); | 795 return Register::FromOperand(static_cast<int32_t>(operand)); |
999 } | 796 } |
1000 | 797 |
1001 uint32_t BytecodeArrayBuilder::SignedOperand(int value, OperandSize size) { | 798 uint32_t BytecodeArrayBuilder::SignedOperand(int value) { |
1002 switch (size) { | 799 return static_cast<uint32_t>(value); |
1003 case OperandSize::kByte: | |
1004 return static_cast<uint8_t>(value & 0xff); | |
1005 case OperandSize::kShort: | |
1006 return static_cast<uint16_t>(value & 0xffff); | |
1007 case OperandSize::kQuad: | |
1008 return static_cast<uint32_t>(value); | |
1009 case OperandSize::kNone: | |
1010 UNREACHABLE(); | |
1011 } | |
1012 return 0; | |
1013 } | 800 } |
1014 | 801 |
1015 uint32_t BytecodeArrayBuilder::UnsignedOperand(int value) { | 802 uint32_t BytecodeArrayBuilder::UnsignedOperand(int value) { |
1016 DCHECK_GE(value, 0); | 803 DCHECK_GE(value, 0); |
1017 return static_cast<uint32_t>(value); | 804 return static_cast<uint32_t>(value); |
1018 } | 805 } |
1019 | 806 |
1020 uint32_t BytecodeArrayBuilder::UnsignedOperand(size_t value) { | 807 uint32_t BytecodeArrayBuilder::UnsignedOperand(size_t value) { |
1021 DCHECK_LE(value, kMaxUInt32); | 808 DCHECK_LE(value, kMaxUInt32); |
1022 return static_cast<uint32_t>(value); | 809 return static_cast<uint32_t>(value); |
1023 } | 810 } |
1024 | 811 |
1025 } // namespace interpreter | 812 } // namespace interpreter |
1026 } // namespace internal | 813 } // namespace internal |
1027 } // namespace v8 | 814 } // namespace v8 |
OLD | NEW |