Changeset 208450 in webkit
- Timestamp:
- Nov 9, 2016 11:10:42 AM (7 years ago)
- Location:
- trunk
- Files:
-
- 3 added
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r208448 r208450 1 2016-11-07 Yusuke Suzuki <utatane.tea@gmail.com> 2 3 [JSC] The implementation of 8 bit operation in MacroAssembler should care about uint8_t / int8_t 4 https://bugs.webkit.org/show_bug.cgi?id=164432 5 6 Reviewed by Michael Saboff. 7 8 Use ownerDocument. Once DOMJIT for ownerDocument is landed, this will use branch8. 9 10 * js/dom/domjit-accessor-owner-document-type-check-expected.txt: Added. 11 * js/dom/domjit-accessor-owner-document-type-check.html: Added. 12 1 13 2016-11-08 Antoine Quint <graouts@apple.com> 2 14 -
trunk/Source/JavaScriptCore/ChangeLog
r208427 r208450 1 2016-11-07 Yusuke Suzuki <utatane.tea@gmail.com> 2 3 [JSC] The implementation of 8 bit operation in MacroAssembler should care about uint8_t / int8_t 4 https://bugs.webkit.org/show_bug.cgi?id=164432 5 6 Reviewed by Michael Saboff. 7 8 Except for X86, our supported MacroAssemblers do not have native 8bit instructions. 9 It means that all the 8bit instructions are converted to 32bit operations by using 10 scratch registers. For example, ARM64 branch8 implementation is the following. 11 12 Jump branch8(RelationCondition cord, Address left, TrustedImm32 right) 13 { 14 TrustedImm32 right8(static_cast<int8_t>(right.m_value)); 15 load8(left, getCachedMemoryTempRegisterIDAndInvalidate()); 16 return branch32(cone, memoryTempRegister, right8); 17 } 18 19 The problem is that we exclusively use zero-extended load instruction (load8). Even 20 for signed RelationConditions, we do not perform sign extension. It makes signed 21 operations with negative numbers incorrect! Consider the |left| address holds `-1` 22 in int8_t form. However load8 will load it as 255 into 32bit register. On the other hand, 23 |right| will be sign extended. If you pass 0 as |right| and LessThan condition, this 24 branch8 should jump based on the answer of `-1 < 0`. But the current MacroAssembler 25 performs `255 < 0` in int32_t context and returns the incorrect result. 26 27 We should follow the x86 model. So we should select the appropriate load operation and masking 28 operation based on the RelationCondition. This patch introduces mask8OnCondition and load8OnCondition. 29 And we use them in 8bit operations including branch8, branchTest8, compare8, and test8. 30 31 We intentionally do not change anything on x86 assembler since it has the native signed 8bit operations. 32 33 * JavaScriptCore.xcodeproj/project.pbxproj: 34 * assembler/AbstractMacroAssembler.h: 35 * assembler/MacroAssembler.h: 36 (JSC::MacroAssembler::isSigned): 37 (JSC::MacroAssembler::isUnsigned): 38 (JSC::MacroAssembler::branchTest8): 39 * assembler/MacroAssemblerARM.h: 40 (JSC::MacroAssemblerARM::branch8): 41 (JSC::MacroAssemblerARM::branchTest8): 42 (JSC::MacroAssemblerARM::compare8): 43 (JSC::MacroAssemblerARM::test8): 44 * assembler/MacroAssemblerARM64.h: 45 (JSC::MacroAssemblerARM64::load8SignedExtendTo32): 46 (JSC::MacroAssemblerARM64::branch8): 47 (JSC::MacroAssemblerARM64::branchTest8): 48 (JSC::MacroAssemblerARM64::compare8): 49 (JSC::MacroAssemblerARM64::test8): 50 * assembler/MacroAssemblerARMv7.h: 51 (JSC::MacroAssemblerARMv7::branch8): 52 (JSC::MacroAssemblerARMv7::branchTest8): 53 (JSC::MacroAssemblerARMv7::compare8): 54 (JSC::MacroAssemblerARMv7::test8): 55 * assembler/MacroAssemblerHelpers.h: Added. 56 (JSC::MacroAssemblerHelpers::isSigned): 57 (JSC::MacroAssemblerHelpers::isUnsigned): 58 (JSC::MacroAssemblerHelpers::mask8OnCondition): 59 (JSC::MacroAssemblerHelpers::load8OnCondition): 60 * assembler/MacroAssemblerMIPS.h: 61 (JSC::MacroAssemblerMIPS::branch8): 62 (JSC::MacroAssemblerMIPS::compare8): 63 (JSC::MacroAssemblerMIPS::branchTest8): 64 (JSC::MacroAssemblerMIPS::test8): 65 * assembler/MacroAssemblerSH4.h: 66 (JSC::MacroAssemblerSH4::branchTest8): 67 (JSC::MacroAssemblerSH4::branch8): 68 (JSC::MacroAssemblerSH4::compare8): 69 (JSC::MacroAssemblerSH4::test8): 70 * assembler/MacroAssemblerX86_64.h: 71 (JSC::MacroAssemblerX86_64::branch8): 72 1 73 2016-11-08 Geoffrey Garen <ggaren@apple.com> 2 74 -
trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r208401 r208450 2198 2198 E328DAEA1D38D005001A2529 /* BytecodeRewriter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E3D264291D38C042000BE174 /* BytecodeRewriter.cpp */; }; 2199 2199 E328DAEB1D38D005001A2529 /* BytecodeRewriter.h in Headers */ = {isa = PBXBuildFile; fileRef = E3D2642A1D38C042000BE174 /* BytecodeRewriter.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2200 E32AB2441DCD75F400D7533A /* MacroAssemblerHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = E380A76B1DCD7195000F89E6 /* MacroAssemblerHelpers.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2200 2201 E32FF1EA1DA7571C00A8BF21 /* DOMJITSlowPathCalls.h in Headers */ = {isa = PBXBuildFile; fileRef = E3CB1E241DA7540A00FA1E56 /* DOMJITSlowPathCalls.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2201 2202 E33637A51B63220200EE0840 /* ReflectObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E33637A31B63220200EE0840 /* ReflectObject.cpp */; }; … … 4666 4667 E37AD83A1DA4928000F3D412 /* DOMJITPatchpointParams.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMJITPatchpointParams.h; sourceTree = "<group>"; }; 4667 4668 E37AD83B1DA4928000F3D412 /* DOMJITReg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMJITReg.h; sourceTree = "<group>"; }; 4669 E380A76B1DCD7195000F89E6 /* MacroAssemblerHelpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MacroAssemblerHelpers.h; sourceTree = "<group>"; }; 4668 4670 E3963CEC1B73F75000EB4CE5 /* NodesAnalyzeModule.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NodesAnalyzeModule.cpp; sourceTree = "<group>"; }; 4669 4671 E39D9D841D39000600667282 /* InterpreterInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InterpreterInlines.h; sourceTree = "<group>"; }; … … 7065 7067 0F6DB7EB1D617D0F00CDBF8E /* MacroAssemblerCodeRef.cpp */, 7066 7068 863B23DF0FC60E6200703AA4 /* MacroAssemblerCodeRef.h */, 7069 E380A76B1DCD7195000F89E6 /* MacroAssemblerHelpers.h */, 7067 7070 86C568DE11A213EE0007F7F0 /* MacroAssemblerMIPS.h */, 7068 7071 FE68C6351B90DDD90042BCB3 /* MacroAssemblerPrinter.cpp */, … … 8049 8052 0F235BEE17178E7300690C7F /* DFGOSRExitPreparation.h in Headers */, 8050 8053 0F6237981AE45CA700D402EA /* DFGPhantomInsertionPhase.h in Headers */, 8054 E32AB2441DCD75F400D7533A /* MacroAssemblerHelpers.h in Headers */, 8051 8055 0FFFC95C14EF90AF00C72532 /* DFGPhase.h in Headers */, 8052 8056 0F2B9CEB19D0BA7D00B1D1B5 /* DFGPhiChildren.h in Headers */, -
trunk/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h
r207475 r208450 32 32 #include "CodeLocation.h" 33 33 #include "MacroAssemblerCodeRef.h" 34 #include "MacroAssemblerHelpers.h" 34 35 #include "Options.h" 35 36 #include <wtf/CryptographicallyRandomNumber.h> -
trunk/Source/JavaScriptCore/assembler/MacroAssembler.h
r207039 r208450 66 66 #endif 67 67 68 #include "MacroAssemblerHelpers.h" 69 68 70 namespace JSC { 69 71 … … 141 143 142 144 // Utilities used by the DFG JIT. 143 #if ENABLE(DFG_JIT)144 145 using MacroAssemblerBase::invert; 145 146 … … 234 235 } 235 236 236 // True if this:237 // branch8(cond, value, value)238 // Is the same as this:239 // branch32(cond, signExt8(value), signExt8(value))240 237 static bool isSigned(RelationalCondition cond) 241 238 { 242 switch (cond) { 243 case Equal: 244 case NotEqual: 245 case GreaterThan: 246 case GreaterThanOrEqual: 247 case LessThan: 248 case LessThanOrEqual: 249 return true; 250 default: 251 return false; 252 } 253 } 254 255 // True if this: 256 // branch8(cond, value, value) 257 // Is the same as this: 258 // branch32(cond, zeroExt8(value), zeroExt8(value)) 239 return MacroAssemblerHelpers::isSigned<MacroAssembler>(cond); 240 } 241 259 242 static bool isUnsigned(RelationalCondition cond) 260 243 { 261 switch (cond) { 262 case Equal: 263 case NotEqual: 264 case Above: 265 case AboveOrEqual: 266 case Below: 267 case BelowOrEqual: 268 return true; 269 default: 270 return false; 271 } 272 } 273 #endif 244 return MacroAssemblerHelpers::isUnsigned<MacroAssembler>(cond); 245 } 246 247 static bool isSigned(ResultCondition cond) 248 { 249 return MacroAssemblerHelpers::isSigned<MacroAssembler>(cond); 250 } 251 252 static bool isUnsigned(ResultCondition cond) 253 { 254 return MacroAssemblerHelpers::isUnsigned<MacroAssembler>(cond); 255 } 274 256 275 257 // Platform agnostic convenience functions, … … 798 780 Jump branchTest8(ResultCondition cond, ExtendedAddress address, TrustedImm32 mask = TrustedImm32(-1)) 799 781 { 800 TrustedImm32 mask8(static_cast<int8_t>(mask.m_value)); 801 return MacroAssemblerBase::branchTest8(cond, Address(address.base, address.offset), mask8); 782 return MacroAssemblerBase::branchTest8(cond, Address(address.base, address.offset), mask); 802 783 } 803 784 -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM.h
r206525 r208450 633 633 Jump branch8(RelationalCondition cond, Address left, TrustedImm32 right) 634 634 { 635 TrustedImm32 right8 (static_cast<int8_t>(right.m_value));636 load8(left, ARMRegisters::S1);635 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 636 MacroAssemblerHelpers::load8OnCondition(*this, cond, left, ARMRegisters::S1); 637 637 return branch32(cond, ARMRegisters::S1, right8); 638 638 } … … 640 640 Jump branch8(RelationalCondition cond, BaseIndex left, TrustedImm32 right) 641 641 { 642 TrustedImm32 right8 (static_cast<int8_t>(right.m_value));643 load8(left, ARMRegisters::S1);642 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 643 MacroAssemblerHelpers::load8OnCondition(*this, cond, left, ARMRegisters::S1); 644 644 return branch32(cond, ARMRegisters::S1, right8); 645 645 } … … 647 647 Jump branch8(RelationalCondition cond, AbsoluteAddress left, TrustedImm32 right) 648 648 { 649 TrustedImm32 right8 (static_cast<int8_t>(right.m_value));649 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 650 650 move(TrustedImmPtr(left.m_ptr), ARMRegisters::S1); 651 load8(Address(ARMRegisters::S1), ARMRegisters::S1);651 MacroAssemblerHelpers::load8OnCondition(*this, cond, Address(ARMRegisters::S1), ARMRegisters::S1); 652 652 return branch32(cond, ARMRegisters::S1, right8); 653 653 } … … 703 703 Jump branchTest8(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) 704 704 { 705 TrustedImm32 mask8 (static_cast<int8_t>(mask.m_value));706 load8(address, ARMRegisters::S1);705 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 706 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, ARMRegisters::S1); 707 707 return branchTest32(cond, ARMRegisters::S1, mask8); 708 708 } … … 710 710 Jump branchTest8(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1)) 711 711 { 712 TrustedImm32 mask8 (static_cast<int8_t>(mask.m_value));713 load8(address, ARMRegisters::S1);712 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 713 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, ARMRegisters::S1); 714 714 return branchTest32(cond, ARMRegisters::S1, mask8); 715 715 } … … 717 717 Jump branchTest8(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1)) 718 718 { 719 TrustedImm32 mask8 (static_cast<int8_t>(mask.m_value));719 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 720 720 move(TrustedImmPtr(address.m_ptr), ARMRegisters::S1); 721 load8(Address(ARMRegisters::S1), ARMRegisters::S1);721 MacroAssemblerHelpers::load8OnCondition(*this, cond, Address(ARMRegisters::S1), ARMRegisters::S1); 722 722 return branchTest32(cond, ARMRegisters::S1, mask8); 723 723 } … … 986 986 void compare8(RelationalCondition cond, Address left, TrustedImm32 right, RegisterID dest) 987 987 { 988 TrustedImm32 right8 (static_cast<int8_t>(right.m_value));989 load8(left, ARMRegisters::S1);988 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 989 MacroAssemblerHelpers::load8OnCondition(*this, cond, left, ARMRegisters::S1); 990 990 compare32(cond, ARMRegisters::S1, right8, dest); 991 991 } … … 1009 1009 void test8(ResultCondition cond, Address address, TrustedImm32 mask, RegisterID dest) 1010 1010 { 1011 TrustedImm32 mask8 (static_cast<int8_t>(mask.m_value));1012 load8(address, ARMRegisters::S1);1011 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 1012 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, ARMRegisters::S1); 1013 1013 test32(cond, ARMRegisters::S1, mask8, dest); 1014 1014 } -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h
r206539 r208450 1201 1201 } 1202 1202 1203 void load8SignedExtendTo32(const void* address, RegisterID dest) 1204 { 1205 moveToCachedReg(TrustedImmPtr(address), cachedMemoryTempRegister()); 1206 m_assembler.ldrsb<32>(dest, memoryTempRegister, ARM64Registers::zr); 1207 if (dest == memoryTempRegister) 1208 cachedMemoryTempRegister().invalidate(); 1209 } 1210 1203 1211 void zeroExtend8To32(RegisterID src, RegisterID dest) 1204 1212 { … … 2425 2433 Jump branch8(RelationalCondition cond, Address left, TrustedImm32 right) 2426 2434 { 2427 TrustedImm32 right8 (static_cast<int8_t>(right.m_value));2428 load8(left, getCachedMemoryTempRegisterIDAndInvalidate());2435 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 2436 MacroAssemblerHelpers::load8OnCondition(*this, cond, left, getCachedMemoryTempRegisterIDAndInvalidate()); 2429 2437 return branch32(cond, memoryTempRegister, right8); 2430 2438 } … … 2432 2440 Jump branch8(RelationalCondition cond, BaseIndex left, TrustedImm32 right) 2433 2441 { 2434 TrustedImm32 right8 (static_cast<int8_t>(right.m_value));2435 load8(left, getCachedMemoryTempRegisterIDAndInvalidate());2442 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 2443 MacroAssemblerHelpers::load8OnCondition(*this, cond, left, getCachedMemoryTempRegisterIDAndInvalidate()); 2436 2444 return branch32(cond, memoryTempRegister, right8); 2437 2445 } … … 2439 2447 Jump branch8(RelationalCondition cond, AbsoluteAddress left, TrustedImm32 right) 2440 2448 { 2441 TrustedImm32 right8 (static_cast<int8_t>(right.m_value));2442 load8(left.m_ptr, getCachedMemoryTempRegisterIDAndInvalidate());2449 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 2450 MacroAssemblerHelpers::load8OnCondition(*this, cond, left.m_ptr, getCachedMemoryTempRegisterIDAndInvalidate()); 2443 2451 return branch32(cond, memoryTempRegister, right8); 2444 2452 } … … 2584 2592 Jump branchTest8(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) 2585 2593 { 2586 TrustedImm32 mask8 (static_cast<int8_t>(mask.m_value));2587 load8(address, getCachedDataTempRegisterIDAndInvalidate());2594 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 2595 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, getCachedDataTempRegisterIDAndInvalidate()); 2588 2596 return branchTest32(cond, dataTempRegister, mask8); 2589 2597 } … … 2591 2599 Jump branchTest8(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1)) 2592 2600 { 2593 TrustedImm32 mask8 (static_cast<int8_t>(mask.m_value));2594 load8(address.m_ptr, getCachedDataTempRegisterIDAndInvalidate());2601 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 2602 MacroAssemblerHelpers::load8OnCondition(*this, cond, address.m_ptr, getCachedDataTempRegisterIDAndInvalidate()); 2595 2603 return branchTest32(cond, dataTempRegister, mask8); 2596 2604 } … … 2598 2606 Jump branchTest8(ResultCondition cond, ExtendedAddress address, TrustedImm32 mask = TrustedImm32(-1)) 2599 2607 { 2600 TrustedImm32 mask8 (static_cast<int8_t>(mask.m_value));2608 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 2601 2609 move(TrustedImmPtr(reinterpret_cast<void*>(address.offset)), getCachedDataTempRegisterIDAndInvalidate()); 2602 m_assembler.ldrb(dataTempRegister, address.base, dataTempRegister); 2610 2611 if (MacroAssemblerHelpers::isUnsigned<MacroAssemblerARM64>(cond)) 2612 m_assembler.ldrb(dataTempRegister, address.base, dataTempRegister); 2613 else 2614 m_assembler.ldrsb<32>(dataTempRegister, address.base, dataTempRegister); 2615 2603 2616 return branchTest32(cond, dataTempRegister, mask8); 2604 2617 } … … 2606 2619 Jump branchTest8(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1)) 2607 2620 { 2608 TrustedImm32 mask8 (static_cast<int8_t>(mask.m_value));2609 load8(address, getCachedDataTempRegisterIDAndInvalidate());2621 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 2622 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, getCachedDataTempRegisterIDAndInvalidate()); 2610 2623 return branchTest32(cond, dataTempRegister, mask8); 2611 2624 } … … 3024 3037 void compare8(RelationalCondition cond, Address left, TrustedImm32 right, RegisterID dest) 3025 3038 { 3026 TrustedImm32 right8 (static_cast<int8_t>(right.m_value));3027 load8(left, getCachedMemoryTempRegisterIDAndInvalidate());3039 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 3040 MacroAssemblerHelpers::load8OnCondition(*this, cond, left, getCachedMemoryTempRegisterIDAndInvalidate()); 3028 3041 move(right8, getCachedDataTempRegisterIDAndInvalidate()); 3029 3042 compare32(cond, memoryTempRegister, dataTempRegister, dest); … … 3050 3063 void test8(ResultCondition cond, Address address, TrustedImm32 mask, RegisterID dest) 3051 3064 { 3052 TrustedImm32 mask8 (static_cast<int8_t>(mask.m_value));3053 load8(address, getCachedMemoryTempRegisterIDAndInvalidate());3065 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 3066 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, getCachedMemoryTempRegisterIDAndInvalidate()); 3054 3067 test32(cond, memoryTempRegister, mask8, dest); 3055 3068 } -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h
r206525 r208450 1491 1491 Jump branch8(RelationalCondition cond, RegisterID left, TrustedImm32 right) 1492 1492 { 1493 TrustedImm32 right8 (static_cast<int8_t>(right.m_value));1493 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 1494 1494 compare32AndSetFlags(left, right8); 1495 1495 return Jump(makeBranch(cond)); … … 1499 1499 { 1500 1500 // use addressTempRegister incase the branch8 we call uses dataTempRegister. :-/ 1501 TrustedImm32 right8 (static_cast<int8_t>(right.m_value));1502 load8(left, addressTempRegister);1501 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 1502 MacroAssemblerHelpers::load8OnCondition(*this, cond, left, addressTempRegister); 1503 1503 return branch8(cond, addressTempRegister, right8); 1504 1504 } … … 1507 1507 { 1508 1508 // use addressTempRegister incase the branch32 we call uses dataTempRegister. :-/ 1509 TrustedImm32 right8 (static_cast<int8_t>(right.m_value));1510 load8(left, addressTempRegister);1509 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 1510 MacroAssemblerHelpers::load8OnCondition(*this, cond, left, addressTempRegister); 1511 1511 return branch32(cond, addressTempRegister, right8); 1512 1512 } … … 1515 1515 { 1516 1516 // Use addressTempRegister instead of dataTempRegister, since branch32 uses dataTempRegister. 1517 TrustedImm32 right8 (static_cast<int8_t>(right.m_value));1517 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 1518 1518 move(TrustedImmPtr(address.m_ptr), addressTempRegister); 1519 load8(Address(addressTempRegister), addressTempRegister);1519 MacroAssemblerHelpers::load8OnCondition(*this, cond, Address(addressTempRegister), addressTempRegister); 1520 1520 return branch32(cond, addressTempRegister, right8); 1521 1521 } … … 1552 1552 { 1553 1553 // use addressTempRegister incase the branchTest8 we call uses dataTempRegister. :-/ 1554 TrustedImm32 mask8 (static_cast<int8_t>(mask.m_value));1555 load8(address, addressTempRegister);1554 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 1555 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, addressTempRegister); 1556 1556 return branchTest32(cond, addressTempRegister, mask8); 1557 1557 } … … 1560 1560 { 1561 1561 // use addressTempRegister incase the branchTest8 we call uses dataTempRegister. :-/ 1562 TrustedImm32 mask8 (static_cast<int8_t>(mask.m_value));1563 load8(address, addressTempRegister);1562 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 1563 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, addressTempRegister); 1564 1564 return branchTest32(cond, addressTempRegister, mask8); 1565 1565 } … … 1568 1568 { 1569 1569 // use addressTempRegister incase the branchTest8 we call uses dataTempRegister. :-/ 1570 TrustedImm32 mask8 (static_cast<int8_t>(mask.m_value));1570 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 1571 1571 move(TrustedImmPtr(address.m_ptr), addressTempRegister); 1572 load8(Address(addressTempRegister), addressTempRegister);1572 MacroAssemblerHelpers::load8OnCondition(*this, cond, Address(addressTempRegister), addressTempRegister); 1573 1573 return branchTest32(cond, addressTempRegister, mask8); 1574 1574 } … … 1798 1798 void compare8(RelationalCondition cond, Address left, TrustedImm32 right, RegisterID dest) 1799 1799 { 1800 TrustedImm32 right8 (static_cast<int8_t>(right.m_value));1801 load8(left, addressTempRegister);1800 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 1801 MacroAssemblerHelpers::load8OnCondition(*this, cond, left, addressTempRegister); 1802 1802 compare32(cond, addressTempRegister, right8, dest); 1803 1803 } … … 1826 1826 void test8(ResultCondition cond, Address address, TrustedImm32 mask, RegisterID dest) 1827 1827 { 1828 TrustedImm32 mask8 (static_cast<int8_t>(mask.m_value));1829 load8(address, dataTempRegister);1828 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 1829 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, dataTempRegister); 1830 1830 test32(dataTempRegister, mask8); 1831 1831 m_assembler.it(armV7Condition(cond), false); -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
r206525 r208450 1446 1446 Jump branch8(RelationalCondition cond, Address left, TrustedImm32 right) 1447 1447 { 1448 TrustedImm32 right8 (static_cast<int8_t>(right.m_value));1449 load8(left, dataTempRegister);1448 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 1449 MacroAssemblerHelpers::load8OnCondition(*this, cond, left, dataTempRegister); 1450 1450 move(right8, immTempRegister); 1451 1451 return branch32(cond, dataTempRegister, immTempRegister); … … 1454 1454 Jump branch8(RelationalCondition cond, AbsoluteAddress left, TrustedImm32 right) 1455 1455 { 1456 TrustedImm32 right8 (static_cast<int8_t>(right.m_value));1457 load8(left, dataTempRegister);1456 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 1457 MacroAssemblerHelpers::load8OnCondition(*this, cond, left, dataTempRegister); 1458 1458 move(right8, immTempRegister); 1459 1459 return branch32(cond, dataTempRegister, immTempRegister); … … 1462 1462 void compare8(RelationalCondition cond, Address left, TrustedImm32 right, RegisterID dest) 1463 1463 { 1464 TrustedImm32 right8 (static_cast<int8_t>(right.m_value));1465 load8(left, dataTempRegister);1464 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 1465 MacroAssemblerHelpers::load8OnCondition(*this, cond, left, dataTempRegister); 1466 1466 move(right8, immTempRegister); 1467 1467 compare32(cond, dataTempRegister, immTempRegister, dest); … … 1470 1470 Jump branch8(RelationalCondition cond, BaseIndex left, TrustedImm32 right) 1471 1471 { 1472 TrustedImm32 right8 (static_cast<int8_t>(right.m_value));1473 load8(left, dataTempRegister);1472 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 1473 MacroAssemblerHelpers::load8OnCondition(*this, cond, left, dataTempRegister); 1474 1474 // Be careful that the previous load8() uses immTempRegister. 1475 1475 // So, we need to put move() after load8(). … … 1629 1629 Jump branchTest8(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1)) 1630 1630 { 1631 TrustedImm32 mask8 (static_cast<int8_t>(mask.m_value));1632 load8(address, dataTempRegister);1631 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 1632 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, dataTempRegister); 1633 1633 return branchTest32(cond, dataTempRegister, mask8); 1634 1634 } … … 1636 1636 Jump branchTest8(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) 1637 1637 { 1638 TrustedImm32 mask8 (static_cast<int8_t>(mask.m_value));1639 load8(address, dataTempRegister);1638 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 1639 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, dataTempRegister); 1640 1640 return branchTest32(cond, dataTempRegister, mask8); 1641 1641 } … … 1643 1643 Jump branchTest8(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1)) 1644 1644 { 1645 TrustedImm32 mask8 (static_cast<int8_t>(mask.m_value));1645 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 1646 1646 move(TrustedImmPtr(address.m_ptr), dataTempRegister); 1647 load8(Address(dataTempRegister), dataTempRegister);1647 MacroAssemblerHelpers::load8OnCondition(*this, cond, Address(dataTempRegister), dataTempRegister); 1648 1648 return branchTest32(cond, dataTempRegister, mask8); 1649 1649 } … … 2219 2219 { 2220 2220 ASSERT((cond == Zero) || (cond == NonZero)); 2221 TrustedImm32 mask8 (static_cast<int8_t>(mask.m_value));2222 load8(address, dataTempRegister);2223 if ( mask8.m_value == -1&& !m_fixedWidth) {2221 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 2222 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, dataTempRegister); 2223 if ((mask8.m_value & 0xff) == 0xff && !m_fixedWidth) { 2224 2224 if (cond == Zero) 2225 2225 m_assembler.sltiu(dest, dataTempRegister, 1); -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerSH4.h
r206525 r208450 1606 1606 Jump branchTest8(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1)) 1607 1607 { 1608 TrustedImm32 mask8 (static_cast<int8_t>(mask.m_value));1608 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 1609 1609 RegisterID addressTempRegister = claimScratch(); 1610 load8(address, addressTempRegister);1610 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, addressTempRegister); 1611 1611 Jump jmp = branchTest32(cond, addressTempRegister, mask8); 1612 1612 releaseScratch(addressTempRegister); … … 1616 1616 Jump branchTest8(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1)) 1617 1617 { 1618 TrustedImm32 mask8 (static_cast<int8_t>(mask.m_value));1618 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 1619 1619 RegisterID addressTempRegister = claimScratch(); 1620 load8(address, addressTempRegister);1620 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, addressTempRegister); 1621 1621 Jump jmp = branchTest32(cond, addressTempRegister, mask8); 1622 1622 releaseScratch(addressTempRegister); … … 1626 1626 Jump branchTest8(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1)) 1627 1627 { 1628 TrustedImm32 mask8 (static_cast<int8_t>(mask.m_value));1628 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 1629 1629 RegisterID addressTempRegister = claimScratch(); 1630 1630 move(TrustedImmPtr(address.m_ptr), addressTempRegister); 1631 load8(Address(addressTempRegister), addressTempRegister);1631 MacroAssemblerHelpers::load8OnCondition(*this, cond, Address(addressTempRegister), addressTempRegister); 1632 1632 Jump jmp = branchTest32(cond, addressTempRegister, mask8); 1633 1633 releaseScratch(addressTempRegister); … … 1647 1647 Jump branch8(RelationalCondition cond, Address left, TrustedImm32 right) 1648 1648 { 1649 TrustedImm32 right8 (static_cast<int8_t>(right.m_value));1649 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 1650 1650 RegisterID addressTempRegister = claimScratch(); 1651 load8(left, addressTempRegister);1651 MacroAssemblerHelpers::load8OnCondition(*this, cond, left, addressTempRegister); 1652 1652 Jump jmp = branch32(cond, addressTempRegister, right8); 1653 1653 releaseScratch(addressTempRegister); … … 1657 1657 Jump branch8(RelationalCondition cond, AbsoluteAddress left, TrustedImm32 right) 1658 1658 { 1659 TrustedImm32 right8 (static_cast<int8_t>(right.m_value));1659 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 1660 1660 RegisterID addressTempRegister = claimScratch(); 1661 load8(left, addressTempRegister);1661 MacroAssemblerHelpers::load8OnCondition(*this, cond, left, addressTempRegister); 1662 1662 Jump jmp = branch32(cond, addressTempRegister, right8); 1663 1663 releaseScratch(addressTempRegister); … … 1667 1667 void compare8(RelationalCondition cond, Address left, TrustedImm32 right, RegisterID dest) 1668 1668 { 1669 TrustedImm32 right8 (static_cast<int8_t>(right.m_value));1669 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 1670 1670 RegisterID addressTempRegister = claimScratch(); 1671 load8(left, addressTempRegister);1671 MacroAssemblerHelpers::load8OnCondition(*this, cond, left, addressTempRegister); 1672 1672 compare32(cond, addressTempRegister, right8, dest); 1673 1673 releaseScratch(addressTempRegister); … … 1842 1842 ASSERT((cond == Zero) || (cond == NonZero)); 1843 1843 1844 TrustedImm32 mask8 (static_cast<int8_t>(mask.m_value));1845 1846 load8(address, dest);1847 if ( mask8.m_value == -1)1844 TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask); 1845 1846 MacroAssemblerHelpers::load8OnCondition(*this, cond, address, dest); 1847 if ((mask8.m_value & 0xff) == 0xff) 1848 1848 compare32(0, dest, static_cast<RelationalCondition>(cond)); 1849 1849 else … … 1966 1966 Jump branch8(RelationalCondition cond, BaseIndex left, TrustedImm32 right) 1967 1967 { 1968 TrustedImm32 right8 (static_cast<int8_t>(right.m_value));1968 TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right); 1969 1969 RegisterID lefttmp = claimScratch(); 1970 1970 1971 1971 loadEffectiveAddress(left, lefttmp); 1972 1972 1973 load8(lefttmp, lefttmp);1973 MacroAssemblerHelpers::load8OnCondition(*this, cond, lefttmp, lefttmp); 1974 1974 RegisterID righttmp = claimScratch(); 1975 1975 m_assembler.loadConstant(right8.m_value, righttmp); -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h
r206555 r208450 1221 1221 Jump branch8(RelationalCondition cond, AbsoluteAddress left, TrustedImm32 right) 1222 1222 { 1223 TrustedImm32 right8(static_cast<int8_t>(right.m_value));1224 1223 MacroAssemblerX86Common::move(TrustedImmPtr(left.m_ptr), scratchRegister()); 1225 return MacroAssemblerX86Common::branch8(cond, Address(scratchRegister()), right 8);1224 return MacroAssemblerX86Common::branch8(cond, Address(scratchRegister()), right); 1226 1225 } 1227 1226
Note: See TracChangeset
for help on using the changeset viewer.