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 #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. |
11 // Do not include anything from src/interpreter here! | 11 // Do not include anything from src/interpreter here! |
| 12 #include "src/frames.h" |
12 #include "src/utils.h" | 13 #include "src/utils.h" |
13 | 14 |
14 namespace v8 { | 15 namespace v8 { |
15 namespace internal { | 16 namespace internal { |
16 namespace interpreter { | 17 namespace interpreter { |
17 | 18 |
18 #define INVALID_OPERAND_TYPE_LIST(V) V(None, OperandTypeInfo::kNone) | 19 #define INVALID_OPERAND_TYPE_LIST(V) V(None, OperandTypeInfo::kNone) |
19 | 20 |
20 #define REGISTER_INPUT_OPERAND_TYPE_LIST(V) \ | 21 #define REGISTER_INPUT_OPERAND_TYPE_LIST(V) \ |
21 V(MaybeReg, OperandTypeInfo::kScalableSignedByte) \ | 22 V(MaybeReg, OperandTypeInfo::kScalableSignedByte) \ |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
328 | 329 |
329 // An interpreter Register which is located in the function's Register file | 330 // An interpreter Register which is located in the function's Register file |
330 // in its stack-frame. Register hold parameters, this, and expression values. | 331 // in its stack-frame. Register hold parameters, this, and expression values. |
331 class Register { | 332 class Register { |
332 public: | 333 public: |
333 explicit Register(int index = kInvalidIndex) : index_(index) {} | 334 explicit Register(int index = kInvalidIndex) : index_(index) {} |
334 | 335 |
335 int index() const { return index_; } | 336 int index() const { return index_; } |
336 bool is_parameter() const { return index() < 0; } | 337 bool is_parameter() const { return index() < 0; } |
337 bool is_valid() const { return index_ != kInvalidIndex; } | 338 bool is_valid() const { return index_ != kInvalidIndex; } |
338 bool is_byte_operand() const; | |
339 bool is_short_operand() const; | |
340 | 339 |
341 static Register FromParameterIndex(int index, int parameter_count); | 340 static Register FromParameterIndex(int index, int parameter_count); |
342 int ToParameterIndex(int parameter_count) const; | 341 int ToParameterIndex(int parameter_count) const; |
343 | 342 |
344 // Returns an invalid register. | 343 // Returns an invalid register. |
345 static Register invalid_value() { return Register(); } | 344 static Register invalid_value() { return Register(); } |
346 | 345 |
347 // Returns the register for the function's closure object. | 346 // Returns the register for the function's closure object. |
348 static Register function_closure(); | 347 static Register function_closure(); |
349 bool is_function_closure() const; | 348 bool is_function_closure() const; |
350 | 349 |
351 // Returns the register which holds the current context object. | 350 // Returns the register which holds the current context object. |
352 static Register current_context(); | 351 static Register current_context(); |
353 bool is_current_context() const; | 352 bool is_current_context() const; |
354 | 353 |
355 // Returns the register for the incoming new target value. | 354 // Returns the register for the incoming new target value. |
356 static Register new_target(); | 355 static Register new_target(); |
357 bool is_new_target() const; | 356 bool is_new_target() const; |
358 | 357 |
359 int32_t ToOperand() const { return -index_; } | 358 // Returns the register for the bytecode array. |
360 static Register FromOperand(int32_t operand) { return Register(-operand); } | 359 static Register bytecode_array(); |
| 360 bool is_bytecode_array() const; |
| 361 |
| 362 // Returns the register for the saved bytecode offset. |
| 363 static Register bytecode_offset(); |
| 364 bool is_bytecode_offset() const; |
| 365 |
| 366 OperandSize SizeOfOperand() const; |
| 367 |
| 368 int32_t ToOperand() const { return kRegisterFileStartOffset - index_; } |
| 369 static Register FromOperand(int32_t operand) { |
| 370 return Register(kRegisterFileStartOffset - operand); |
| 371 } |
361 | 372 |
362 static bool AreContiguous(Register reg1, Register reg2, | 373 static bool AreContiguous(Register reg1, Register reg2, |
363 Register reg3 = Register(), | 374 Register reg3 = Register(), |
364 Register reg4 = Register(), | 375 Register reg4 = Register(), |
365 Register reg5 = Register()); | 376 Register reg5 = Register()); |
366 | 377 |
367 std::string ToString(int parameter_count); | 378 std::string ToString(int parameter_count); |
368 | 379 |
369 bool operator==(const Register& other) const { | 380 bool operator==(const Register& other) const { |
370 return index() == other.index(); | 381 return index() == other.index(); |
371 } | 382 } |
372 bool operator!=(const Register& other) const { | 383 bool operator!=(const Register& other) const { |
373 return index() != other.index(); | 384 return index() != other.index(); |
374 } | 385 } |
375 bool operator<(const Register& other) const { | 386 bool operator<(const Register& other) const { |
376 return index() < other.index(); | 387 return index() < other.index(); |
377 } | 388 } |
378 bool operator<=(const Register& other) const { | 389 bool operator<=(const Register& other) const { |
379 return index() <= other.index(); | 390 return index() <= other.index(); |
380 } | 391 } |
381 bool operator>(const Register& other) const { | 392 bool operator>(const Register& other) const { |
382 return index() > other.index(); | 393 return index() > other.index(); |
383 } | 394 } |
384 bool operator>=(const Register& other) const { | 395 bool operator>=(const Register& other) const { |
385 return index() >= other.index(); | 396 return index() >= other.index(); |
386 } | 397 } |
387 | 398 |
388 private: | 399 private: |
389 static const int kInvalidIndex = kMaxInt; | 400 static const int kInvalidIndex = kMaxInt; |
| 401 static const int kRegisterFileStartOffset = |
| 402 InterpreterFrameConstants::kRegisterFileFromFp / kPointerSize; |
390 | 403 |
391 void* operator new(size_t size); | 404 void* operator new(size_t size); |
392 void operator delete(void* p); | 405 void operator delete(void* p); |
393 | 406 |
394 int index_; | 407 int index_; |
395 }; | 408 }; |
396 | 409 |
397 | 410 |
398 class Bytecodes { | 411 class Bytecodes { |
399 public: | 412 public: |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
570 std::ostream& operator<<(std::ostream& os, const AccumulatorUse& use); | 583 std::ostream& operator<<(std::ostream& os, const AccumulatorUse& use); |
571 std::ostream& operator<<(std::ostream& os, const OperandScale& operand_scale); | 584 std::ostream& operator<<(std::ostream& os, const OperandScale& operand_scale); |
572 std::ostream& operator<<(std::ostream& os, const OperandSize& operand_size); | 585 std::ostream& operator<<(std::ostream& os, const OperandSize& operand_size); |
573 std::ostream& operator<<(std::ostream& os, const OperandType& operand_type); | 586 std::ostream& operator<<(std::ostream& os, const OperandType& operand_type); |
574 | 587 |
575 } // namespace interpreter | 588 } // namespace interpreter |
576 } // namespace internal | 589 } // namespace internal |
577 } // namespace v8 | 590 } // namespace v8 |
578 | 591 |
579 #endif // V8_INTERPRETER_BYTECODES_H_ | 592 #endif // V8_INTERPRETER_BYTECODES_H_ |
OLD | NEW |