| 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 <cstdint> | 8 #include <cstdint> |
| 9 #include <iosfwd> | 9 #include <iosfwd> |
| 10 #include <string> | 10 #include <string> |
| (...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 305 #define DECLARE_BYTECODE(Name, ...) k##Name, | 305 #define DECLARE_BYTECODE(Name, ...) k##Name, |
| 306 BYTECODE_LIST(DECLARE_BYTECODE) | 306 BYTECODE_LIST(DECLARE_BYTECODE) |
| 307 #undef DECLARE_BYTECODE | 307 #undef DECLARE_BYTECODE |
| 308 #define COUNT_BYTECODE(x, ...) +1 | 308 #define COUNT_BYTECODE(x, ...) +1 |
| 309 // The COUNT_BYTECODE macro will turn this into kLast = -1 +1 +1... which will | 309 // The COUNT_BYTECODE macro will turn this into kLast = -1 +1 +1... which will |
| 310 // evaluate to the same value as the last real bytecode. | 310 // evaluate to the same value as the last real bytecode. |
| 311 kLast = -1 BYTECODE_LIST(COUNT_BYTECODE) | 311 kLast = -1 BYTECODE_LIST(COUNT_BYTECODE) |
| 312 #undef COUNT_BYTECODE | 312 #undef COUNT_BYTECODE |
| 313 }; | 313 }; |
| 314 | 314 |
| 315 // TODO(rmcilroy): Remove once we switch to MSVC 2015 which supports constexpr. | |
| 316 // See crbug.com/603131. | |
| 317 #if V8_CC_MSVC | |
| 318 #define CONSTEXPR const | |
| 319 #else | |
| 320 #define CONSTEXPR constexpr | |
| 321 #endif | |
| 322 | |
| 323 class V8_EXPORT_PRIVATE Bytecodes final { | 315 class V8_EXPORT_PRIVATE Bytecodes final { |
| 324 public: | 316 public: |
| 325 // The maximum number of operands a bytecode may have. | 317 // The maximum number of operands a bytecode may have. |
| 326 static const int kMaxOperands = 4; | 318 static const int kMaxOperands = 4; |
| 327 | 319 |
| 328 // Returns string representation of |bytecode|. | 320 // Returns string representation of |bytecode|. |
| 329 static const char* ToString(Bytecode bytecode); | 321 static const char* ToString(Bytecode bytecode); |
| 330 | 322 |
| 331 // Returns string representation of |bytecode|. | 323 // Returns string representation of |bytecode|. |
| 332 static std::string ToString(Bytecode bytecode, OperandScale operand_scale); | 324 static std::string ToString(Bytecode bytecode, OperandScale operand_scale); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 380 } | 372 } |
| 381 | 373 |
| 382 // Returns how accumulator is used by |bytecode|. | 374 // Returns how accumulator is used by |bytecode|. |
| 383 static AccumulatorUse GetAccumulatorUse(Bytecode bytecode) { | 375 static AccumulatorUse GetAccumulatorUse(Bytecode bytecode) { |
| 384 DCHECK(bytecode <= Bytecode::kLast); | 376 DCHECK(bytecode <= Bytecode::kLast); |
| 385 return kAccumulatorUse[static_cast<size_t>(bytecode)]; | 377 return kAccumulatorUse[static_cast<size_t>(bytecode)]; |
| 386 } | 378 } |
| 387 | 379 |
| 388 // Returns true if |bytecode| reads the accumulator. | 380 // Returns true if |bytecode| reads the accumulator. |
| 389 static bool ReadsAccumulator(Bytecode bytecode) { | 381 static bool ReadsAccumulator(Bytecode bytecode) { |
| 390 return (GetAccumulatorUse(bytecode) & AccumulatorUse::kRead) == | 382 return BytecodeOperands::ReadsAccumulator(GetAccumulatorUse(bytecode)); |
| 391 AccumulatorUse::kRead; | |
| 392 } | 383 } |
| 393 | 384 |
| 394 // Returns true if |bytecode| writes the accumulator. | 385 // Returns true if |bytecode| writes the accumulator. |
| 395 static bool WritesAccumulator(Bytecode bytecode) { | 386 static bool WritesAccumulator(Bytecode bytecode) { |
| 396 return (GetAccumulatorUse(bytecode) & AccumulatorUse::kWrite) == | 387 return BytecodeOperands::WritesAccumulator(GetAccumulatorUse(bytecode)); |
| 397 AccumulatorUse::kWrite; | |
| 398 } | 388 } |
| 399 | 389 |
| 400 // Return true if |bytecode| writes the accumulator with a boolean value. | 390 // Return true if |bytecode| writes the accumulator with a boolean value. |
| 401 static bool WritesBooleanToAccumulator(Bytecode bytecode) { | 391 static bool WritesBooleanToAccumulator(Bytecode bytecode) { |
| 402 switch (bytecode) { | 392 switch (bytecode) { |
| 403 case Bytecode::kLdaTrue: | 393 case Bytecode::kLdaTrue: |
| 404 case Bytecode::kLdaFalse: | 394 case Bytecode::kLdaFalse: |
| 405 case Bytecode::kToBooleanLogicalNot: | 395 case Bytecode::kToBooleanLogicalNot: |
| 406 case Bytecode::kLogicalNot: | 396 case Bytecode::kLogicalNot: |
| 407 case Bytecode::kTestEqual: | 397 case Bytecode::kTestEqual: |
| 408 case Bytecode::kTestNotEqual: | 398 case Bytecode::kTestNotEqual: |
| 409 case Bytecode::kTestEqualStrict: | 399 case Bytecode::kTestEqualStrict: |
| 410 case Bytecode::kTestLessThan: | 400 case Bytecode::kTestLessThan: |
| 411 case Bytecode::kTestLessThanOrEqual: | 401 case Bytecode::kTestLessThanOrEqual: |
| 412 case Bytecode::kTestGreaterThan: | 402 case Bytecode::kTestGreaterThan: |
| 413 case Bytecode::kTestGreaterThanOrEqual: | 403 case Bytecode::kTestGreaterThanOrEqual: |
| 414 case Bytecode::kTestInstanceOf: | 404 case Bytecode::kTestInstanceOf: |
| 415 case Bytecode::kTestIn: | 405 case Bytecode::kTestIn: |
| 416 case Bytecode::kForInContinue: | 406 case Bytecode::kForInContinue: |
| 417 return true; | 407 return true; |
| 418 default: | 408 default: |
| 419 return false; | 409 return false; |
| 420 } | 410 } |
| 421 } | 411 } |
| 422 | 412 |
| 423 // Return true if |bytecode| is an accumulator load without effects, | 413 // Return true if |bytecode| is an accumulator load without effects, |
| 424 // e.g. LdaConstant, LdaTrue, Ldar. | 414 // e.g. LdaConstant, LdaTrue, Ldar. |
| 425 static CONSTEXPR bool IsAccumulatorLoadWithoutEffects(Bytecode bytecode) { | 415 static constexpr bool IsAccumulatorLoadWithoutEffects(Bytecode bytecode) { |
| 426 return bytecode == Bytecode::kLdar || bytecode == Bytecode::kLdaZero || | 416 return bytecode == Bytecode::kLdar || bytecode == Bytecode::kLdaZero || |
| 427 bytecode == Bytecode::kLdaSmi || bytecode == Bytecode::kLdaNull || | 417 bytecode == Bytecode::kLdaSmi || bytecode == Bytecode::kLdaNull || |
| 428 bytecode == Bytecode::kLdaTrue || bytecode == Bytecode::kLdaFalse || | 418 bytecode == Bytecode::kLdaTrue || bytecode == Bytecode::kLdaFalse || |
| 429 bytecode == Bytecode::kLdaUndefined || | 419 bytecode == Bytecode::kLdaUndefined || |
| 430 bytecode == Bytecode::kLdaTheHole || | 420 bytecode == Bytecode::kLdaTheHole || |
| 431 bytecode == Bytecode::kLdaConstant || | 421 bytecode == Bytecode::kLdaConstant || |
| 432 bytecode == Bytecode::kLdaContextSlot || | 422 bytecode == Bytecode::kLdaContextSlot || |
| 433 bytecode == Bytecode::kLdaCurrentContextSlot; | 423 bytecode == Bytecode::kLdaCurrentContextSlot; |
| 434 } | 424 } |
| 435 | 425 |
| 436 // Return true if |bytecode| is a register load without effects, | 426 // Return true if |bytecode| is a register load without effects, |
| 437 // e.g. Mov, Star. | 427 // e.g. Mov, Star. |
| 438 static CONSTEXPR bool IsRegisterLoadWithoutEffects(Bytecode bytecode) { | 428 static constexpr bool IsRegisterLoadWithoutEffects(Bytecode bytecode) { |
| 439 return bytecode == Bytecode::kMov || bytecode == Bytecode::kPopContext || | 429 return bytecode == Bytecode::kMov || bytecode == Bytecode::kPopContext || |
| 440 bytecode == Bytecode::kPushContext || bytecode == Bytecode::kStar; | 430 bytecode == Bytecode::kPushContext || bytecode == Bytecode::kStar; |
| 441 } | 431 } |
| 442 | 432 |
| 443 // Returns true if the bytecode is a conditional jump taking | 433 // Returns true if the bytecode is a conditional jump taking |
| 444 // an immediate byte operand (OperandType::kImm). | 434 // an immediate byte operand (OperandType::kImm). |
| 445 static CONSTEXPR bool IsConditionalJumpImmediate(Bytecode bytecode) { | 435 static constexpr bool IsConditionalJumpImmediate(Bytecode bytecode) { |
| 446 return bytecode == Bytecode::kJumpIfTrue || | 436 return bytecode == Bytecode::kJumpIfTrue || |
| 447 bytecode == Bytecode::kJumpIfFalse || | 437 bytecode == Bytecode::kJumpIfFalse || |
| 448 bytecode == Bytecode::kJumpIfToBooleanTrue || | 438 bytecode == Bytecode::kJumpIfToBooleanTrue || |
| 449 bytecode == Bytecode::kJumpIfToBooleanFalse || | 439 bytecode == Bytecode::kJumpIfToBooleanFalse || |
| 450 bytecode == Bytecode::kJumpIfNotHole || | 440 bytecode == Bytecode::kJumpIfNotHole || |
| 451 bytecode == Bytecode::kJumpIfNull || | 441 bytecode == Bytecode::kJumpIfNull || |
| 452 bytecode == Bytecode::kJumpIfUndefined; | 442 bytecode == Bytecode::kJumpIfUndefined; |
| 453 } | 443 } |
| 454 | 444 |
| 455 // Returns true if the bytecode is a conditional jump taking | 445 // Returns true if the bytecode is a conditional jump taking |
| 456 // a constant pool entry (OperandType::kIdx). | 446 // a constant pool entry (OperandType::kIdx). |
| 457 static CONSTEXPR bool IsConditionalJumpConstant(Bytecode bytecode) { | 447 static constexpr bool IsConditionalJumpConstant(Bytecode bytecode) { |
| 458 return bytecode == Bytecode::kJumpIfTrueConstant || | 448 return bytecode == Bytecode::kJumpIfTrueConstant || |
| 459 bytecode == Bytecode::kJumpIfFalseConstant || | 449 bytecode == Bytecode::kJumpIfFalseConstant || |
| 460 bytecode == Bytecode::kJumpIfToBooleanTrueConstant || | 450 bytecode == Bytecode::kJumpIfToBooleanTrueConstant || |
| 461 bytecode == Bytecode::kJumpIfToBooleanFalseConstant || | 451 bytecode == Bytecode::kJumpIfToBooleanFalseConstant || |
| 462 bytecode == Bytecode::kJumpIfNotHoleConstant || | 452 bytecode == Bytecode::kJumpIfNotHoleConstant || |
| 463 bytecode == Bytecode::kJumpIfNullConstant || | 453 bytecode == Bytecode::kJumpIfNullConstant || |
| 464 bytecode == Bytecode::kJumpIfUndefinedConstant; | 454 bytecode == Bytecode::kJumpIfUndefinedConstant; |
| 465 } | 455 } |
| 466 | 456 |
| 467 // Returns true if the bytecode is a conditional jump taking | 457 // Returns true if the bytecode is a conditional jump taking |
| 468 // any kind of operand. | 458 // any kind of operand. |
| 469 static CONSTEXPR bool IsConditionalJump(Bytecode bytecode) { | 459 static constexpr bool IsConditionalJump(Bytecode bytecode) { |
| 470 return IsConditionalJumpImmediate(bytecode) || | 460 return IsConditionalJumpImmediate(bytecode) || |
| 471 IsConditionalJumpConstant(bytecode); | 461 IsConditionalJumpConstant(bytecode); |
| 472 } | 462 } |
| 473 | 463 |
| 474 // Returns true if the bytecode is an unconditional jump. | 464 // Returns true if the bytecode is an unconditional jump. |
| 475 static CONSTEXPR bool IsUnconditionalJump(Bytecode bytecode) { | 465 static constexpr bool IsUnconditionalJump(Bytecode bytecode) { |
| 476 return bytecode == Bytecode::kJump || bytecode == Bytecode::kJumpConstant || | 466 return bytecode == Bytecode::kJump || bytecode == Bytecode::kJumpConstant || |
| 477 bytecode == Bytecode::kJumpLoop; | 467 bytecode == Bytecode::kJumpLoop; |
| 478 } | 468 } |
| 479 | 469 |
| 480 // Returns true if the bytecode is a jump or a conditional jump taking | 470 // Returns true if the bytecode is a jump or a conditional jump taking |
| 481 // an immediate byte operand (OperandType::kImm). | 471 // an immediate byte operand (OperandType::kImm). |
| 482 static CONSTEXPR bool IsJumpImmediate(Bytecode bytecode) { | 472 static constexpr bool IsJumpImmediate(Bytecode bytecode) { |
| 483 return bytecode == Bytecode::kJump || bytecode == Bytecode::kJumpLoop || | 473 return bytecode == Bytecode::kJump || bytecode == Bytecode::kJumpLoop || |
| 484 IsConditionalJumpImmediate(bytecode); | 474 IsConditionalJumpImmediate(bytecode); |
| 485 } | 475 } |
| 486 | 476 |
| 487 // Returns true if the bytecode is a jump or conditional jump taking a | 477 // Returns true if the bytecode is a jump or conditional jump taking a |
| 488 // constant pool entry (OperandType::kIdx). | 478 // constant pool entry (OperandType::kIdx). |
| 489 static CONSTEXPR bool IsJumpConstant(Bytecode bytecode) { | 479 static constexpr bool IsJumpConstant(Bytecode bytecode) { |
| 490 return bytecode == Bytecode::kJumpConstant || | 480 return bytecode == Bytecode::kJumpConstant || |
| 491 IsConditionalJumpConstant(bytecode); | 481 IsConditionalJumpConstant(bytecode); |
| 492 } | 482 } |
| 493 | 483 |
| 494 // Returns true if the bytecode is a jump that internally coerces the | 484 // Returns true if the bytecode is a jump that internally coerces the |
| 495 // accumulator to a boolean. | 485 // accumulator to a boolean. |
| 496 static CONSTEXPR bool IsJumpIfToBoolean(Bytecode bytecode) { | 486 static constexpr bool IsJumpIfToBoolean(Bytecode bytecode) { |
| 497 return bytecode == Bytecode::kJumpIfToBooleanTrue || | 487 return bytecode == Bytecode::kJumpIfToBooleanTrue || |
| 498 bytecode == Bytecode::kJumpIfToBooleanFalse || | 488 bytecode == Bytecode::kJumpIfToBooleanFalse || |
| 499 bytecode == Bytecode::kJumpIfToBooleanTrueConstant || | 489 bytecode == Bytecode::kJumpIfToBooleanTrueConstant || |
| 500 bytecode == Bytecode::kJumpIfToBooleanFalseConstant; | 490 bytecode == Bytecode::kJumpIfToBooleanFalseConstant; |
| 501 } | 491 } |
| 502 | 492 |
| 503 // Returns true if the bytecode is a jump or conditional jump taking | 493 // Returns true if the bytecode is a jump or conditional jump taking |
| 504 // any kind of operand. | 494 // any kind of operand. |
| 505 static CONSTEXPR bool IsJump(Bytecode bytecode) { | 495 static constexpr bool IsJump(Bytecode bytecode) { |
| 506 return IsJumpImmediate(bytecode) || IsJumpConstant(bytecode); | 496 return IsJumpImmediate(bytecode) || IsJumpConstant(bytecode); |
| 507 } | 497 } |
| 508 | 498 |
| 509 // Returns true if the bytecode is a forward jump or conditional jump taking | 499 // Returns true if the bytecode is a forward jump or conditional jump taking |
| 510 // any kind of operand. | 500 // any kind of operand. |
| 511 static CONSTEXPR bool IsForwardJump(Bytecode bytecode) { | 501 static constexpr bool IsForwardJump(Bytecode bytecode) { |
| 512 return bytecode != Bytecode::kJumpLoop && IsJump(bytecode); | 502 return bytecode != Bytecode::kJumpLoop && IsJump(bytecode); |
| 513 } | 503 } |
| 514 | 504 |
| 515 // Returns true if the bytecode is a conditional jump, a jump, or a return. | 505 // Returns true if the bytecode is a conditional jump, a jump, or a return. |
| 516 static CONSTEXPR bool IsJumpOrReturn(Bytecode bytecode) { | 506 static constexpr bool IsJumpOrReturn(Bytecode bytecode) { |
| 517 return bytecode == Bytecode::kReturn || IsJump(bytecode); | 507 return bytecode == Bytecode::kReturn || IsJump(bytecode); |
| 518 } | 508 } |
| 519 | 509 |
| 520 // Return true if |bytecode| is a jump without effects, | 510 // Return true if |bytecode| is a jump without effects, |
| 521 // e.g. any jump excluding those that include type coercion like | 511 // e.g. any jump excluding those that include type coercion like |
| 522 // JumpIfTrueToBoolean. | 512 // JumpIfTrueToBoolean. |
| 523 static CONSTEXPR bool IsJumpWithoutEffects(Bytecode bytecode) { | 513 static constexpr bool IsJumpWithoutEffects(Bytecode bytecode) { |
| 524 return IsJump(bytecode) && !IsJumpIfToBoolean(bytecode); | 514 return IsJump(bytecode) && !IsJumpIfToBoolean(bytecode); |
| 525 } | 515 } |
| 526 | 516 |
| 527 // Returns true if |bytecode| has no effects. These bytecodes only manipulate | 517 // Returns true if |bytecode| has no effects. These bytecodes only manipulate |
| 528 // interpreter frame state and will never throw. | 518 // interpreter frame state and will never throw. |
| 529 static CONSTEXPR bool IsWithoutExternalSideEffects(Bytecode bytecode) { | 519 static constexpr bool IsWithoutExternalSideEffects(Bytecode bytecode) { |
| 530 return (IsAccumulatorLoadWithoutEffects(bytecode) || | 520 return (IsAccumulatorLoadWithoutEffects(bytecode) || |
| 531 IsRegisterLoadWithoutEffects(bytecode) || | 521 IsRegisterLoadWithoutEffects(bytecode) || |
| 532 bytecode == Bytecode::kNop || IsJumpWithoutEffects(bytecode)); | 522 bytecode == Bytecode::kNop || IsJumpWithoutEffects(bytecode)); |
| 533 } | 523 } |
| 534 | 524 |
| 535 // Returns true if the bytecode is Ldar or Star. | 525 // Returns true if the bytecode is Ldar or Star. |
| 536 static CONSTEXPR bool IsLdarOrStar(Bytecode bytecode) { | 526 static constexpr bool IsLdarOrStar(Bytecode bytecode) { |
| 537 return bytecode == Bytecode::kLdar || bytecode == Bytecode::kStar; | 527 return bytecode == Bytecode::kLdar || bytecode == Bytecode::kStar; |
| 538 } | 528 } |
| 539 | 529 |
| 540 // Returns true if |bytecode| puts a name in the accumulator. | 530 // Returns true if |bytecode| puts a name in the accumulator. |
| 541 static CONSTEXPR bool PutsNameInAccumulator(Bytecode bytecode) { | 531 static constexpr bool PutsNameInAccumulator(Bytecode bytecode) { |
| 542 return bytecode == Bytecode::kTypeOf; | 532 return bytecode == Bytecode::kTypeOf; |
| 543 } | 533 } |
| 544 | 534 |
| 545 // Returns true if the bytecode is a call or a constructor call. | 535 // Returns true if the bytecode is a call or a constructor call. |
| 546 static CONSTEXPR bool IsCallOrNew(Bytecode bytecode) { | 536 static constexpr bool IsCallOrNew(Bytecode bytecode) { |
| 547 return bytecode == Bytecode::kCall || bytecode == Bytecode::kCallProperty || | 537 return bytecode == Bytecode::kCall || bytecode == Bytecode::kCallProperty || |
| 548 bytecode == Bytecode::kTailCall || bytecode == Bytecode::kNew; | 538 bytecode == Bytecode::kTailCall || bytecode == Bytecode::kNew; |
| 549 } | 539 } |
| 550 | 540 |
| 551 // Returns true if the bytecode is a call to the runtime. | 541 // Returns true if the bytecode is a call to the runtime. |
| 552 static CONSTEXPR bool IsCallRuntime(Bytecode bytecode) { | 542 static constexpr bool IsCallRuntime(Bytecode bytecode) { |
| 553 return bytecode == Bytecode::kCallRuntime || | 543 return bytecode == Bytecode::kCallRuntime || |
| 554 bytecode == Bytecode::kCallRuntimeForPair || | 544 bytecode == Bytecode::kCallRuntimeForPair || |
| 555 bytecode == Bytecode::kInvokeIntrinsic; | 545 bytecode == Bytecode::kInvokeIntrinsic; |
| 556 } | 546 } |
| 557 | 547 |
| 558 // Returns true if the bytecode is a scaling prefix bytecode. | 548 // Returns true if the bytecode is a scaling prefix bytecode. |
| 559 static CONSTEXPR bool IsPrefixScalingBytecode(Bytecode bytecode) { | 549 static constexpr bool IsPrefixScalingBytecode(Bytecode bytecode) { |
| 560 return bytecode == Bytecode::kExtraWide || bytecode == Bytecode::kWide || | 550 return bytecode == Bytecode::kExtraWide || bytecode == Bytecode::kWide || |
| 561 bytecode == Bytecode::kDebugBreakExtraWide || | 551 bytecode == Bytecode::kDebugBreakExtraWide || |
| 562 bytecode == Bytecode::kDebugBreakWide; | 552 bytecode == Bytecode::kDebugBreakWide; |
| 563 } | 553 } |
| 564 | 554 |
| 565 // Returns the number of values which |bytecode| returns. | 555 // Returns the number of values which |bytecode| returns. |
| 566 static CONSTEXPR size_t ReturnCount(Bytecode bytecode) { | 556 static constexpr size_t ReturnCount(Bytecode bytecode) { |
| 567 return bytecode == Bytecode::kReturn ? 1 : 0; | 557 return bytecode == Bytecode::kReturn ? 1 : 0; |
| 568 } | 558 } |
| 569 | 559 |
| 570 // Returns the number of operands expected by |bytecode|. | 560 // Returns the number of operands expected by |bytecode|. |
| 571 static int NumberOfOperands(Bytecode bytecode) { | 561 static int NumberOfOperands(Bytecode bytecode) { |
| 572 DCHECK(bytecode <= Bytecode::kLast); | 562 DCHECK(bytecode <= Bytecode::kLast); |
| 573 return kOperandCount[static_cast<size_t>(bytecode)]; | 563 return kOperandCount[static_cast<size_t>(bytecode)]; |
| 574 } | 564 } |
| 575 | 565 |
| 576 // Returns the i-th operand of |bytecode|. | 566 // Returns the i-th operand of |bytecode|. |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 741 static const OperandType* const kOperandTypes[]; | 731 static const OperandType* const kOperandTypes[]; |
| 742 static const OperandTypeInfo* const kOperandTypeInfos[]; | 732 static const OperandTypeInfo* const kOperandTypeInfos[]; |
| 743 static const int kOperandCount[]; | 733 static const int kOperandCount[]; |
| 744 static const int kNumberOfRegisterOperands[]; | 734 static const int kNumberOfRegisterOperands[]; |
| 745 static const AccumulatorUse kAccumulatorUse[]; | 735 static const AccumulatorUse kAccumulatorUse[]; |
| 746 static const bool kIsScalable[]; | 736 static const bool kIsScalable[]; |
| 747 static const int kBytecodeSizes[][3]; | 737 static const int kBytecodeSizes[][3]; |
| 748 static const OperandSize* const kOperandSizes[][3]; | 738 static const OperandSize* const kOperandSizes[][3]; |
| 749 }; | 739 }; |
| 750 | 740 |
| 751 // TODO(rmcilroy): Remove once we switch to MSVC 2015 which supports constexpr. | |
| 752 // See crbug.com/603131. | |
| 753 #undef CONSTEXPR | |
| 754 | |
| 755 V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, | 741 V8_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& os, |
| 756 const Bytecode& bytecode); | 742 const Bytecode& bytecode); |
| 757 | 743 |
| 758 } // namespace interpreter | 744 } // namespace interpreter |
| 759 } // namespace internal | 745 } // namespace internal |
| 760 } // namespace v8 | 746 } // namespace v8 |
| 761 | 747 |
| 762 #endif // V8_INTERPRETER_BYTECODES_H_ | 748 #endif // V8_INTERPRETER_BYTECODES_H_ |
| OLD | NEW |