| 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/utils.h" | 12 #include "src/utils.h" | 
| 13 | 13 | 
| 14 namespace v8 { | 14 namespace v8 { | 
| 15 namespace internal { | 15 namespace internal { | 
| 16 namespace interpreter { | 16 namespace interpreter { | 
| 17 | 17 | 
|  | 18 #define INVALID_OPERAND_TYPE_LIST(V) \ | 
|  | 19   V(None, OperandSize::kNone) | 
|  | 20 | 
|  | 21 #define REGISTER_OPERAND_TYPE_LIST(V) \ | 
|  | 22   /* Byte operands. */                \ | 
|  | 23   V(MaybeReg8, OperandSize::kByte)    \ | 
|  | 24   V(Reg8, OperandSize::kByte)         \ | 
|  | 25   V(RegPair8, OperandSize::kByte)     \ | 
|  | 26   V(RegTriple8, OperandSize::kByte)   \ | 
|  | 27   /* Short operands. */               \ | 
|  | 28   V(MaybeReg16, OperandSize::kShort)  \ | 
|  | 29   V(Reg16, OperandSize::kShort)       \ | 
|  | 30   V(RegPair16, OperandSize::kShort)   \ | 
|  | 31   V(RegTriple16, OperandSize::kShort) | 
|  | 32 | 
|  | 33 #define SCALAR_OPERAND_TYPE_LIST(V) \ | 
|  | 34   /* Byte operands. */              \ | 
|  | 35   V(Idx8, OperandSize::kByte)       \ | 
|  | 36   V(Imm8, OperandSize::kByte)       \ | 
|  | 37   V(RegCount8, OperandSize::kByte)  \ | 
|  | 38   /* Short operands. */             \ | 
|  | 39   V(Idx16, OperandSize::kShort)     \ | 
|  | 40   V(RegCount16, OperandSize::kShort) | 
|  | 41 | 
| 18 // The list of operand types used by bytecodes. | 42 // The list of operand types used by bytecodes. | 
| 19 #define OPERAND_TYPE_LIST(V)        \ | 43 #define OPERAND_TYPE_LIST(V)    \ | 
| 20                                     \ | 44   INVALID_OPERAND_TYPE_LIST(V)  \ | 
| 21   /* None operand. */               \ | 45   REGISTER_OPERAND_TYPE_LIST(V) \ | 
| 22   V(None, OperandSize::kNone)       \ | 46   SCALAR_OPERAND_TYPE_LIST(V) | 
| 23                                     \ |  | 
| 24   /* Byte operands. */              \ |  | 
| 25   V(Count8, OperandSize::kByte)     \ |  | 
| 26   V(Imm8, OperandSize::kByte)       \ |  | 
| 27   V(Idx8, OperandSize::kByte)       \ |  | 
| 28   V(MaybeReg8, OperandSize::kByte)  \ |  | 
| 29   V(Reg8, OperandSize::kByte)       \ |  | 
| 30   V(RegPair8, OperandSize::kByte)   \ |  | 
| 31   V(RegTriple8, OperandSize::kByte) \ |  | 
| 32                                     \ |  | 
| 33   /* Short operands. */             \ |  | 
| 34   V(Count16, OperandSize::kShort)   \ |  | 
| 35   V(Idx16, OperandSize::kShort)     \ |  | 
| 36   V(Reg16, OperandSize::kShort) |  | 
| 37 | 47 | 
| 38 // The list of bytecodes which are interpreted by the interpreter. | 48 // The list of bytecodes which are interpreted by the interpreter. | 
| 39 #define BYTECODE_LIST(V)                                                       \ | 49 #define BYTECODE_LIST(V)                                                       \ | 
| 40                                                                                \ | 50                                                                                \ | 
| 41   /* Loading the accumulator */                                                \ | 51   /* Loading the accumulator */                                                \ | 
| 42   V(LdaZero, OperandType::kNone)                                               \ | 52   V(LdaZero, OperandType::kNone)                                               \ | 
| 43   V(LdaSmi8, OperandType::kImm8)                                               \ | 53   V(LdaSmi8, OperandType::kImm8)                                               \ | 
| 44   V(LdaUndefined, OperandType::kNone)                                          \ | 54   V(LdaUndefined, OperandType::kNone)                                          \ | 
| 45   V(LdaNull, OperandType::kNone)                                               \ | 55   V(LdaNull, OperandType::kNone)                                               \ | 
| 46   V(LdaTheHole, OperandType::kNone)                                            \ | 56   V(LdaTheHole, OperandType::kNone)                                            \ | 
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 80   V(StaLookupSlotStrict, OperandType::kIdx8)                                   \ | 90   V(StaLookupSlotStrict, OperandType::kIdx8)                                   \ | 
| 81   V(StaLookupSlotSloppyWide, OperandType::kIdx16)                              \ | 91   V(StaLookupSlotSloppyWide, OperandType::kIdx16)                              \ | 
| 82   V(StaLookupSlotStrictWide, OperandType::kIdx16)                              \ | 92   V(StaLookupSlotStrictWide, OperandType::kIdx16)                              \ | 
| 83                                                                                \ | 93                                                                                \ | 
| 84   /* Register-accumulator transfers */                                         \ | 94   /* Register-accumulator transfers */                                         \ | 
| 85   V(Ldar, OperandType::kReg8)                                                  \ | 95   V(Ldar, OperandType::kReg8)                                                  \ | 
| 86   V(Star, OperandType::kReg8)                                                  \ | 96   V(Star, OperandType::kReg8)                                                  \ | 
| 87                                                                                \ | 97                                                                                \ | 
| 88   /* Register-register transfers */                                            \ | 98   /* Register-register transfers */                                            \ | 
| 89   V(Mov, OperandType::kReg8, OperandType::kReg8)                               \ | 99   V(Mov, OperandType::kReg8, OperandType::kReg8)                               \ | 
| 90   V(Exchange, OperandType::kReg8, OperandType::kReg16)                         \ | 100   V(MovWide, OperandType::kReg16, OperandType::kReg16)                         \ | 
| 91   V(ExchangeWide, OperandType::kReg16, OperandType::kReg16)                    \ |  | 
| 92                                                                                \ | 101                                                                                \ | 
| 93   /* LoadIC operations */                                                      \ | 102   /* LoadIC operations */                                                      \ | 
| 94   V(LoadICSloppy, OperandType::kReg8, OperandType::kIdx8, OperandType::kIdx8)  \ | 103   V(LoadICSloppy, OperandType::kReg8, OperandType::kIdx8, OperandType::kIdx8)  \ | 
| 95   V(LoadICStrict, OperandType::kReg8, OperandType::kIdx8, OperandType::kIdx8)  \ | 104   V(LoadICStrict, OperandType::kReg8, OperandType::kIdx8, OperandType::kIdx8)  \ | 
| 96   V(KeyedLoadICSloppy, OperandType::kReg8, OperandType::kIdx8)                 \ | 105   V(KeyedLoadICSloppy, OperandType::kReg8, OperandType::kIdx8)                 \ | 
| 97   V(KeyedLoadICStrict, OperandType::kReg8, OperandType::kIdx8)                 \ | 106   V(KeyedLoadICStrict, OperandType::kReg8, OperandType::kIdx8)                 \ | 
| 98   /* TODO(rmcilroy): Wide register operands too? */                            \ | 107   /* TODO(rmcilroy): Wide register operands too? */                            \ | 
| 99   V(LoadICSloppyWide, OperandType::kReg8, OperandType::kIdx16,                 \ | 108   V(LoadICSloppyWide, OperandType::kReg8, OperandType::kIdx16,                 \ | 
| 100     OperandType::kIdx16)                                                       \ | 109     OperandType::kIdx16)                                                       \ | 
| 101   V(LoadICStrictWide, OperandType::kReg8, OperandType::kIdx16,                 \ | 110   V(LoadICStrictWide, OperandType::kReg8, OperandType::kIdx16,                 \ | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 136   /* Unary Operators */                                                        \ | 145   /* Unary Operators */                                                        \ | 
| 137   V(Inc, OperandType::kNone)                                                   \ | 146   V(Inc, OperandType::kNone)                                                   \ | 
| 138   V(Dec, OperandType::kNone)                                                   \ | 147   V(Dec, OperandType::kNone)                                                   \ | 
| 139   V(LogicalNot, OperandType::kNone)                                            \ | 148   V(LogicalNot, OperandType::kNone)                                            \ | 
| 140   V(TypeOf, OperandType::kNone)                                                \ | 149   V(TypeOf, OperandType::kNone)                                                \ | 
| 141   V(DeletePropertyStrict, OperandType::kReg8)                                  \ | 150   V(DeletePropertyStrict, OperandType::kReg8)                                  \ | 
| 142   V(DeletePropertySloppy, OperandType::kReg8)                                  \ | 151   V(DeletePropertySloppy, OperandType::kReg8)                                  \ | 
| 143   V(DeleteLookupSlot, OperandType::kNone)                                      \ | 152   V(DeleteLookupSlot, OperandType::kNone)                                      \ | 
| 144                                                                                \ | 153                                                                                \ | 
| 145   /* Call operations */                                                        \ | 154   /* Call operations */                                                        \ | 
| 146   V(Call, OperandType::kReg8, OperandType::kReg8, OperandType::kCount8,        \ | 155   V(Call, OperandType::kReg8, OperandType::kReg8, OperandType::kRegCount8,     \ | 
| 147     OperandType::kIdx8)                                                        \ | 156     OperandType::kIdx8)                                                        \ | 
| 148   V(CallWide, OperandType::kReg8, OperandType::kReg8, OperandType::kCount16,   \ | 157   V(CallWide, OperandType::kReg16, OperandType::kReg16,                        \ | 
| 149     OperandType::kIdx16)                                                       \ | 158     OperandType::kRegCount16, OperandType::kIdx16)                             \ | 
| 150   V(CallRuntime, OperandType::kIdx16, OperandType::kMaybeReg8,                 \ | 159   V(CallRuntime, OperandType::kIdx16, OperandType::kMaybeReg8,                 \ | 
| 151     OperandType::kCount8)                                                      \ | 160     OperandType::kRegCount8)                                                   \ | 
|  | 161   V(CallRuntimeWide, OperandType::kIdx16, OperandType::kMaybeReg16,            \ | 
|  | 162     OperandType::kRegCount8)                                                   \ | 
| 152   V(CallRuntimeForPair, OperandType::kIdx16, OperandType::kMaybeReg8,          \ | 163   V(CallRuntimeForPair, OperandType::kIdx16, OperandType::kMaybeReg8,          \ | 
| 153     OperandType::kCount8, OperandType::kRegPair8)                              \ | 164     OperandType::kRegCount8, OperandType::kRegPair8)                           \ | 
|  | 165   V(CallRuntimeForPairWide, OperandType::kIdx16, OperandType::kMaybeReg16,     \ | 
|  | 166     OperandType::kRegCount8, OperandType::kRegPair16)                          \ | 
| 154   V(CallJSRuntime, OperandType::kIdx16, OperandType::kReg8,                    \ | 167   V(CallJSRuntime, OperandType::kIdx16, OperandType::kReg8,                    \ | 
| 155     OperandType::kCount8)                                                      \ | 168     OperandType::kRegCount8)                                                   \ | 
|  | 169   V(CallJSRuntimeWide, OperandType::kIdx16, OperandType::kReg16,               \ | 
|  | 170     OperandType::kRegCount16)                                                  \ | 
| 156                                                                                \ | 171                                                                                \ | 
| 157   /* New operator */                                                           \ | 172   /* New operator */                                                           \ | 
| 158   V(New, OperandType::kReg8, OperandType::kMaybeReg8, OperandType::kCount8)    \ | 173   V(New, OperandType::kReg8, OperandType::kMaybeReg8, OperandType::kRegCount8) \ | 
|  | 174   V(NewWide, OperandType::kReg16, OperandType::kMaybeReg16,                    \ | 
|  | 175     OperandType::kRegCount16)                                                  \ | 
| 159                                                                                \ | 176                                                                                \ | 
| 160   /* Test Operators */                                                         \ | 177   /* Test Operators */                                                         \ | 
| 161   V(TestEqual, OperandType::kReg8)                                             \ | 178   V(TestEqual, OperandType::kReg8)                                             \ | 
| 162   V(TestNotEqual, OperandType::kReg8)                                          \ | 179   V(TestNotEqual, OperandType::kReg8)                                          \ | 
| 163   V(TestEqualStrict, OperandType::kReg8)                                       \ | 180   V(TestEqualStrict, OperandType::kReg8)                                       \ | 
| 164   V(TestNotEqualStrict, OperandType::kReg8)                                    \ | 181   V(TestNotEqualStrict, OperandType::kReg8)                                    \ | 
| 165   V(TestLessThan, OperandType::kReg8)                                          \ | 182   V(TestLessThan, OperandType::kReg8)                                          \ | 
| 166   V(TestGreaterThan, OperandType::kReg8)                                       \ | 183   V(TestGreaterThan, OperandType::kReg8)                                       \ | 
| 167   V(TestLessThanOrEqual, OperandType::kReg8)                                   \ | 184   V(TestLessThanOrEqual, OperandType::kReg8)                                   \ | 
| 168   V(TestGreaterThanOrEqual, OperandType::kReg8)                                \ | 185   V(TestGreaterThanOrEqual, OperandType::kReg8)                                \ | 
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 214   V(JumpIfToBooleanFalseConstantWide, OperandType::kIdx16)                     \ | 231   V(JumpIfToBooleanFalseConstantWide, OperandType::kIdx16)                     \ | 
| 215   V(JumpIfNull, OperandType::kImm8)                                            \ | 232   V(JumpIfNull, OperandType::kImm8)                                            \ | 
| 216   V(JumpIfNullConstant, OperandType::kIdx8)                                    \ | 233   V(JumpIfNullConstant, OperandType::kIdx8)                                    \ | 
| 217   V(JumpIfNullConstantWide, OperandType::kIdx16)                               \ | 234   V(JumpIfNullConstantWide, OperandType::kIdx16)                               \ | 
| 218   V(JumpIfUndefined, OperandType::kImm8)                                       \ | 235   V(JumpIfUndefined, OperandType::kImm8)                                       \ | 
| 219   V(JumpIfUndefinedConstant, OperandType::kIdx8)                               \ | 236   V(JumpIfUndefinedConstant, OperandType::kIdx8)                               \ | 
| 220   V(JumpIfUndefinedConstantWide, OperandType::kIdx16)                          \ | 237   V(JumpIfUndefinedConstantWide, OperandType::kIdx16)                          \ | 
| 221                                                                                \ | 238                                                                                \ | 
| 222   /* Complex flow control For..in */                                           \ | 239   /* Complex flow control For..in */                                           \ | 
| 223   V(ForInPrepare, OperandType::kRegTriple8)                                    \ | 240   V(ForInPrepare, OperandType::kRegTriple8)                                    \ | 
|  | 241   V(ForInPrepareWide, OperandType::kRegTriple16)                               \ | 
| 224   V(ForInDone, OperandType::kReg8, OperandType::kReg8)                         \ | 242   V(ForInDone, OperandType::kReg8, OperandType::kReg8)                         \ | 
| 225   V(ForInNext, OperandType::kReg8, OperandType::kReg8, OperandType::kRegPair8) \ | 243   V(ForInNext, OperandType::kReg8, OperandType::kReg8, OperandType::kRegPair8) \ | 
|  | 244   V(ForInNextWide, OperandType::kReg16, OperandType::kReg16,                   \ | 
|  | 245     OperandType::kRegPair16)                                                   \ | 
| 226   V(ForInStep, OperandType::kReg8)                                             \ | 246   V(ForInStep, OperandType::kReg8)                                             \ | 
| 227                                                                                \ | 247                                                                                \ | 
| 228   /* Non-local flow control */                                                 \ | 248   /* Non-local flow control */                                                 \ | 
| 229   V(Throw, OperandType::kNone)                                                 \ | 249   V(Throw, OperandType::kNone)                                                 \ | 
| 230   V(Return, OperandType::kNone) | 250   V(Return, OperandType::kNone) | 
| 231 | 251 | 
| 232 | 252 | 
| 233 // Enumeration of the size classes of operand types used by bytecodes. | 253 // Enumeration of the size classes of operand types used by bytecodes. | 
| 234 enum class OperandSize : uint8_t { | 254 enum class OperandSize : uint8_t { | 
| 235   kNone = 0, | 255   kNone = 0, | 
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 294   // Returns the register for the incoming new target value. | 314   // Returns the register for the incoming new target value. | 
| 295   static Register new_target(); | 315   static Register new_target(); | 
| 296   bool is_new_target() const; | 316   bool is_new_target() const; | 
| 297 | 317 | 
| 298   static Register FromOperand(uint8_t operand); | 318   static Register FromOperand(uint8_t operand); | 
| 299   uint8_t ToOperand() const; | 319   uint8_t ToOperand() const; | 
| 300 | 320 | 
| 301   static Register FromWideOperand(uint16_t operand); | 321   static Register FromWideOperand(uint16_t operand); | 
| 302   uint16_t ToWideOperand() const; | 322   uint16_t ToWideOperand() const; | 
| 303 | 323 | 
|  | 324   static Register FromRawOperand(uint32_t raw_operand); | 
|  | 325   uint32_t ToRawOperand() const; | 
|  | 326 | 
| 304   static bool AreContiguous(Register reg1, Register reg2, | 327   static bool AreContiguous(Register reg1, Register reg2, | 
| 305                             Register reg3 = Register(), | 328                             Register reg3 = Register(), | 
| 306                             Register reg4 = Register(), | 329                             Register reg4 = Register(), | 
| 307                             Register reg5 = Register()); | 330                             Register reg5 = Register()); | 
| 308 | 331 | 
| 309   bool operator==(const Register& other) const { | 332   bool operator==(const Register& other) const { | 
| 310     return index() == other.index(); | 333     return index() == other.index(); | 
| 311   } | 334   } | 
| 312   bool operator!=(const Register& other) const { | 335   bool operator!=(const Register& other) const { | 
| 313     return index() != other.index(); | 336     return index() != other.index(); | 
| 314   } | 337   } | 
| 315   bool operator<(const Register& other) const { | 338   bool operator<(const Register& other) const { | 
| 316     return index() < other.index(); | 339     return index() < other.index(); | 
| 317   } | 340   } | 
| 318   bool operator<=(const Register& other) const { | 341   bool operator<=(const Register& other) const { | 
| 319     return index() <= other.index(); | 342     return index() <= other.index(); | 
| 320   } | 343   } | 
|  | 344   bool operator>(const Register& other) const { | 
|  | 345     return index() > other.index(); | 
|  | 346   } | 
|  | 347   bool operator>=(const Register& other) const { | 
|  | 348     return index() >= other.index(); | 
|  | 349   } | 
| 321 | 350 | 
| 322  private: | 351  private: | 
| 323   static const int kIllegalIndex = kMaxInt; | 352   static const int kIllegalIndex = kMaxInt; | 
| 324 | 353 | 
| 325   void* operator new(size_t size); | 354   void* operator new(size_t size); | 
| 326   void operator delete(void* p); | 355   void operator delete(void* p); | 
| 327 | 356 | 
| 328   int index_; | 357   int index_; | 
| 329 }; | 358 }; | 
| 330 | 359 | 
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 410 | 439 | 
| 411 std::ostream& operator<<(std::ostream& os, const Bytecode& bytecode); | 440 std::ostream& operator<<(std::ostream& os, const Bytecode& bytecode); | 
| 412 std::ostream& operator<<(std::ostream& os, const OperandType& operand_type); | 441 std::ostream& operator<<(std::ostream& os, const OperandType& operand_type); | 
| 413 std::ostream& operator<<(std::ostream& os, const OperandSize& operand_type); | 442 std::ostream& operator<<(std::ostream& os, const OperandSize& operand_type); | 
| 414 | 443 | 
| 415 }  // namespace interpreter | 444 }  // namespace interpreter | 
| 416 }  // namespace internal | 445 }  // namespace internal | 
| 417 }  // namespace v8 | 446 }  // namespace v8 | 
| 418 | 447 | 
| 419 #endif  // V8_INTERPRETER_BYTECODES_H_ | 448 #endif  // V8_INTERPRETER_BYTECODES_H_ | 
| OLD | NEW | 
|---|