Changeset 39851 in webkit for trunk/JavaScriptCore/runtime/JSImmediate.h
- Timestamp:
- Jan 12, 2009, 8:51:16 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/runtime/JSImmediate.h
r39769 r39851 37 37 class ExecState; 38 38 class JSCell; 39 class JSFastMath; 40 class JSGlobalData; 39 41 class JSObject; 40 42 class UString; 43 44 JSValuePtr js0(); 45 JSValuePtr jsNull(); 46 JSValuePtr jsBoolean(bool b); 47 JSValuePtr jsUndefined(); 48 JSValuePtr jsImpossibleValue(); 49 JSValuePtr jsNumber(ExecState* exec, double d); 50 JSValuePtr jsNumber(ExecState*, char i); 51 JSValuePtr jsNumber(ExecState*, unsigned char i); 52 JSValuePtr jsNumber(ExecState*, short i); 53 JSValuePtr jsNumber(ExecState*, unsigned short i); 54 JSValuePtr jsNumber(ExecState* exec, int i); 55 JSValuePtr jsNumber(ExecState* exec, unsigned i); 56 JSValuePtr jsNumber(ExecState* exec, long i); 57 JSValuePtr jsNumber(ExecState* exec, unsigned long i); 58 JSValuePtr jsNumber(ExecState* exec, long long i); 59 JSValuePtr jsNumber(ExecState* exec, unsigned long long i); 60 JSValuePtr jsNumber(JSGlobalData* globalData, double d); 61 JSValuePtr jsNumber(JSGlobalData* globalData, short i); 62 JSValuePtr jsNumber(JSGlobalData* globalData, unsigned short i); 63 JSValuePtr jsNumber(JSGlobalData* globalData, int i); 64 JSValuePtr jsNumber(JSGlobalData* globalData, unsigned i); 65 JSValuePtr jsNumber(JSGlobalData* globalData, long i); 66 JSValuePtr jsNumber(JSGlobalData* globalData, unsigned long i); 67 JSValuePtr jsNumber(JSGlobalData* globalData, long long i); 68 JSValuePtr jsNumber(JSGlobalData* globalData, unsigned long long i); 41 69 42 70 /* … … 99 127 private: 100 128 friend class JIT; 101 129 friend class JSValuePtr; 130 friend class JSFastMath; 131 friend JSValuePtr js0(); 132 friend JSValuePtr jsNull(); 133 friend JSValuePtr jsBoolean(bool b); 134 friend JSValuePtr jsUndefined(); 135 friend JSValuePtr jsImpossibleValue(); 136 friend JSValuePtr jsNumber(ExecState* exec, double d); 137 friend JSValuePtr jsNumber(ExecState*, char i); 138 friend JSValuePtr jsNumber(ExecState*, unsigned char i); 139 friend JSValuePtr jsNumber(ExecState*, short i); 140 friend JSValuePtr jsNumber(ExecState*, unsigned short i); 141 friend JSValuePtr jsNumber(ExecState* exec, int i); 142 friend JSValuePtr jsNumber(ExecState* exec, unsigned i); 143 friend JSValuePtr jsNumber(ExecState* exec, long i); 144 friend JSValuePtr jsNumber(ExecState* exec, unsigned long i); 145 friend JSValuePtr jsNumber(ExecState* exec, long long i); 146 friend JSValuePtr jsNumber(ExecState* exec, unsigned long long i); 147 friend JSValuePtr jsNumber(JSGlobalData* globalData, double d); 148 friend JSValuePtr jsNumber(JSGlobalData* globalData, short i); 149 friend JSValuePtr jsNumber(JSGlobalData* globalData, unsigned short i); 150 friend JSValuePtr jsNumber(JSGlobalData* globalData, int i); 151 friend JSValuePtr jsNumber(JSGlobalData* globalData, unsigned i); 152 friend JSValuePtr jsNumber(JSGlobalData* globalData, long i); 153 friend JSValuePtr jsNumber(JSGlobalData* globalData, unsigned long i); 154 friend JSValuePtr jsNumber(JSGlobalData* globalData, long long i); 155 friend JSValuePtr jsNumber(JSGlobalData* globalData, unsigned long long i); 156 102 157 #if USE(ALTERNATE_JSIMMEDIATE) 103 158 static const intptr_t TagTypeInteger = 0xffff000000000000ll; // bottom bit set indicates integer, this dominates the following bit … … 128 183 static const int32_t signBit = 0x80000000; 129 184 130 public:131 185 static ALWAYS_INLINE bool isImmediate(JSValuePtr v) 132 186 { … … 180 234 } 181 235 182 static ALWAYS_INLINE bool isAnyImmediate(JSValuePtr v1, JSValuePtr v2, JSValuePtr v3)183 {184 return (rawValue(v1) | rawValue(v2) | rawValue(v3)) & TagMask;185 }186 187 236 static ALWAYS_INLINE bool areBothImmediate(JSValuePtr v1, JSValuePtr v2) 188 237 { … … 193 242 { 194 243 return rawValue(v1) & rawValue(v2) & TagTypeInteger; 195 }196 197 static ALWAYS_INLINE JSValuePtr andImmediateNumbers(JSValuePtr v1, JSValuePtr v2)198 {199 ASSERT(areBothImmediateNumbers(v1, v2));200 return makeValue(rawValue(v1) & rawValue(v2));201 }202 203 static ALWAYS_INLINE JSValuePtr xorImmediateNumbers(JSValuePtr v1, JSValuePtr v2)204 {205 ASSERT(areBothImmediateNumbers(v1, v2));206 return makeValue((rawValue(v1) ^ rawValue(v2)) | TagTypeInteger);207 }208 209 static ALWAYS_INLINE JSValuePtr orImmediateNumbers(JSValuePtr v1, JSValuePtr v2)210 {211 ASSERT(areBothImmediateNumbers(v1, v2));212 return makeValue(rawValue(v1) | rawValue(v2));213 }214 215 static ALWAYS_INLINE JSValuePtr rightShiftImmediateNumbers(JSValuePtr val, JSValuePtr shift)216 {217 ASSERT(areBothImmediateNumbers(val, shift));218 #if USE(ALTERNATE_JSIMMEDIATE)219 return makeValue(static_cast<intptr_t>(static_cast<uint32_t>(static_cast<int32_t>(rawValue(val)) >> ((rawValue(shift) >> IntegerPayloadShift) & 0x1f))) | TagTypeInteger);220 #else221 return makeValue((rawValue(val) >> ((rawValue(shift) >> IntegerPayloadShift) & 0x1f)) | TagTypeInteger);222 #endif223 }224 225 static ALWAYS_INLINE bool canDoFastAdditiveOperations(JSValuePtr v)226 {227 // Number is non-negative and an operation involving two of these can't overflow.228 // Checking for allowed negative numbers takes more time than it's worth on SunSpider.229 return (rawValue(v) & (TagTypeInteger + (signBit | (signBit >> 1)))) == TagTypeInteger;230 }231 232 static ALWAYS_INLINE JSValuePtr addImmediateNumbers(JSValuePtr v1, JSValuePtr v2)233 {234 ASSERT(canDoFastAdditiveOperations(v1));235 ASSERT(canDoFastAdditiveOperations(v2));236 return makeValue(rawValue(v1) + rawValue(v2) - TagTypeInteger);237 }238 239 static ALWAYS_INLINE JSValuePtr subImmediateNumbers(JSValuePtr v1, JSValuePtr v2)240 {241 ASSERT(canDoFastAdditiveOperations(v1));242 ASSERT(canDoFastAdditiveOperations(v2));243 return makeValue(rawValue(v1) - rawValue(v2) + TagTypeInteger);244 }245 246 static ALWAYS_INLINE JSValuePtr incImmediateNumber(JSValuePtr v)247 {248 ASSERT(canDoFastAdditiveOperations(v));249 return makeValue(rawValue(v) + (1 << IntegerPayloadShift));250 }251 252 static ALWAYS_INLINE JSValuePtr decImmediateNumber(JSValuePtr v)253 {254 ASSERT(canDoFastAdditiveOperations(v));255 return makeValue(rawValue(v) - (1 << IntegerPayloadShift));256 244 } 257 245 … … 484 472 } 485 473 474 inline JSValuePtr js0() 475 { 476 return JSImmediate::zeroImmediate(); 477 } 478 486 479 inline JSValuePtr jsNull() 487 480 { … … 497 490 { 498 491 return JSImmediate::undefinedImmediate(); 492 } 493 494 inline JSValuePtr jsImpossibleValue() 495 { 496 return JSImmediate::impossibleValue(); 499 497 } 500 498 … … 545 543 if (getTruncatedInt32(i)) 546 544 return i; 547 bool ok;548 return toInt32SlowCase( exec, ok);545 bool ignored; 546 return toInt32SlowCase(toNumber(exec), ignored); 549 547 } 550 548 … … 554 552 if (getTruncatedUInt32(i)) 555 553 return i; 556 bool ok;557 return toUInt32SlowCase( exec, ok);554 bool ignored; 555 return toUInt32SlowCase(toNumber(exec), ignored); 558 556 } 559 557 … … 583 581 return i; 584 582 } 585 return toInt32SlowCase( exec, ok);583 return toInt32SlowCase(toNumber(exec), ok); 586 584 } 587 585 … … 593 591 return i; 594 592 } 595 return toUInt32SlowCase(exec, ok); 596 } 593 return toUInt32SlowCase(toNumber(exec), ok); 594 } 595 596 inline bool JSValuePtr::isCell() const 597 { 598 return !JSImmediate::isImmediate(asValue()); 599 } 600 601 inline bool JSValuePtr::isInt32Fast() const 602 { 603 return JSImmediate::isNumber(asValue()); 604 } 605 606 inline int32_t JSValuePtr::getInt32Fast() const 607 { 608 ASSERT(isInt32Fast()); 609 return JSImmediate::getTruncatedInt32(asValue()); 610 } 611 612 inline bool JSValuePtr::isUInt32Fast() const 613 { 614 return JSImmediate::isPositiveNumber(asValue()); 615 } 616 617 inline uint32_t JSValuePtr::getUInt32Fast() const 618 { 619 ASSERT(isUInt32Fast()); 620 return JSImmediate::getTruncatedUInt32(asValue()); 621 } 622 623 inline JSValuePtr JSValuePtr::makeInt32Fast(int32_t i) 624 { 625 return JSImmediate::from(i); 626 } 627 628 inline bool JSValuePtr::areBothInt32Fast(JSValuePtr v1, JSValuePtr v2) 629 { 630 return JSImmediate::areBothImmediateNumbers(v1, v2); 631 } 632 633 class JSFastMath { 634 public: 635 static ALWAYS_INLINE bool canDoFastBitwiseOperations(JSValuePtr v1, JSValuePtr v2) 636 { 637 return JSImmediate::areBothImmediateNumbers(v1, v2); 638 } 639 640 static ALWAYS_INLINE JSValuePtr equal(JSValuePtr v1, JSValuePtr v2) 641 { 642 ASSERT(canDoFastBitwiseOperations(v1, v2)); 643 return jsBoolean(v1 == v2); 644 } 645 646 static ALWAYS_INLINE JSValuePtr notEqual(JSValuePtr v1, JSValuePtr v2) 647 { 648 ASSERT(canDoFastBitwiseOperations(v1, v2)); 649 return jsBoolean(v1 != v2); 650 } 651 652 static ALWAYS_INLINE JSValuePtr andImmediateNumbers(JSValuePtr v1, JSValuePtr v2) 653 { 654 ASSERT(canDoFastBitwiseOperations(v1, v2)); 655 return JSImmediate::makeValue(JSImmediate::rawValue(v1) & JSImmediate::rawValue(v2)); 656 } 657 658 static ALWAYS_INLINE JSValuePtr xorImmediateNumbers(JSValuePtr v1, JSValuePtr v2) 659 { 660 ASSERT(canDoFastBitwiseOperations(v1, v2)); 661 return JSImmediate::makeValue((JSImmediate::rawValue(v1) ^ JSImmediate::rawValue(v2)) | JSImmediate::TagTypeInteger); 662 } 663 664 static ALWAYS_INLINE JSValuePtr orImmediateNumbers(JSValuePtr v1, JSValuePtr v2) 665 { 666 ASSERT(canDoFastBitwiseOperations(v1, v2)); 667 return JSImmediate::makeValue(JSImmediate::rawValue(v1) | JSImmediate::rawValue(v2)); 668 } 669 670 static ALWAYS_INLINE bool canDoFastRshift(JSValuePtr v1, JSValuePtr v2) 671 { 672 return JSImmediate::areBothImmediateNumbers(v1, v2); 673 } 674 675 static ALWAYS_INLINE bool canDoFastUrshift(JSValuePtr v1, JSValuePtr v2) 676 { 677 return JSImmediate::areBothImmediateNumbers(v1, v2) && !JSImmediate::isNegative(v1); 678 } 679 680 static ALWAYS_INLINE JSValuePtr rightShiftImmediateNumbers(JSValuePtr val, JSValuePtr shift) 681 { 682 ASSERT(canDoFastRshift(val, shift) || canDoFastUrshift(val, shift)); 683 #if USE(ALTERNATE_JSIMMEDIATE) 684 return JSImmediate::makeValue(static_cast<intptr_t>(static_cast<uint32_t>(static_cast<int32_t>(JSImmediate::rawValue(val)) >> ((JSImmediate::rawValue(shift) >> JSImmediate::IntegerPayloadShift) & 0x1f))) | JSImmediate::TagTypeInteger); 685 #else 686 return JSImmediate::makeValue((JSImmediate::rawValue(val) >> ((JSImmediate::rawValue(shift) >> JSImmediate::IntegerPayloadShift) & 0x1f)) | JSImmediate::TagTypeInteger); 687 #endif 688 } 689 690 static ALWAYS_INLINE bool canDoFastAdditiveOperations(JSValuePtr v) 691 { 692 // Number is non-negative and an operation involving two of these can't overflow. 693 // Checking for allowed negative numbers takes more time than it's worth on SunSpider. 694 return (JSImmediate::rawValue(v) & (JSImmediate::TagTypeInteger + (JSImmediate::signBit | (JSImmediate::signBit >> 1)))) == JSImmediate::TagTypeInteger; 695 } 696 697 static ALWAYS_INLINE bool canDoFastAdditiveOperations(JSValuePtr v1, JSValuePtr v2) 698 { 699 // Number is non-negative and an operation involving two of these can't overflow. 700 // Checking for allowed negative numbers takes more time than it's worth on SunSpider. 701 return ((JSImmediate::rawValue(v1) | JSImmediate::rawValue(v2)) & (JSImmediate::TagTypeInteger + (JSImmediate::signBit | (JSImmediate::signBit >> 1)))) == JSImmediate::TagTypeInteger; 702 } 703 704 static ALWAYS_INLINE JSValuePtr addImmediateNumbers(JSValuePtr v1, JSValuePtr v2) 705 { 706 ASSERT(canDoFastAdditiveOperations(v1, v2)); 707 return JSImmediate::makeValue(JSImmediate::rawValue(v1) + JSImmediate::rawValue(v2) - JSImmediate::TagTypeInteger); 708 } 709 710 static ALWAYS_INLINE JSValuePtr subImmediateNumbers(JSValuePtr v1, JSValuePtr v2) 711 { 712 ASSERT(canDoFastAdditiveOperations(v1, v2)); 713 return JSImmediate::makeValue(JSImmediate::rawValue(v1) - JSImmediate::rawValue(v2) + JSImmediate::TagTypeInteger); 714 } 715 716 static ALWAYS_INLINE JSValuePtr incImmediateNumber(JSValuePtr v) 717 { 718 ASSERT(canDoFastAdditiveOperations(v)); 719 return JSImmediate::makeValue(JSImmediate::rawValue(v) + (1 << JSImmediate::IntegerPayloadShift)); 720 } 721 722 static ALWAYS_INLINE JSValuePtr decImmediateNumber(JSValuePtr v) 723 { 724 ASSERT(canDoFastAdditiveOperations(v)); 725 return JSImmediate::makeValue(JSImmediate::rawValue(v) - (1 << JSImmediate::IntegerPayloadShift)); 726 } 727 }; 597 728 598 729 } // namespace JSC
Note:
See TracChangeset
for help on using the changeset viewer.