| 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 |