Changeset 58469 in webkit
- Timestamp:
- Apr 28, 2010 8:57:16 PM (14 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 19 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r58461 r58469 1 2010-04-28 Oliver Hunt <oliver@apple.com> 2 3 Reviewed by Gavin Barraclough. 4 5 Add fast paths for Math.pow and Math.sqrt 6 https://bugs.webkit.org/show_bug.cgi?id=38294 7 8 Add specialized thunks for Math.pow and Math.sqrt. 9 This requires adding a sqrtDouble function to the MacroAssembler 10 and sqrtsd to the x86 assembler. 11 12 Math.pow is slightly more complicated, in that we have 13 to implement exponentiation ourselves rather than relying 14 on hardware support. The inline exponentiation is restricted 15 to positive integer exponents on a numeric base. Exponentiation 16 is finally performed through the "Exponentiation by Squaring" 17 algorithm. 18 19 * assembler/AbstractMacroAssembler.h: 20 (JSC::AbstractMacroAssembler::ImmPtr::ImmPtr): 21 * assembler/MacroAssemblerARM.h: 22 (JSC::MacroAssemblerARM::supportsFloatingPointSqrt): 23 (JSC::MacroAssemblerARM::loadDouble): 24 (JSC::MacroAssemblerARM::sqrtDouble): 25 * assembler/MacroAssemblerARMv7.h: 26 (JSC::MacroAssemblerARMv7::supportsFloatingPointSqrt): 27 (JSC::MacroAssemblerARMv7::sqrtDouble): 28 * assembler/MacroAssemblerX86.h: 29 (JSC::MacroAssemblerX86::loadDouble): 30 (JSC::MacroAssemblerX86::supportsFloatingPointSqrt): 31 * assembler/MacroAssemblerX86Common.h: 32 (JSC::MacroAssemblerX86Common::sqrtDouble): 33 * assembler/MacroAssemblerX86_64.h: 34 (JSC::MacroAssemblerX86_64::loadDouble): 35 (JSC::MacroAssemblerX86_64::supportsFloatingPointSqrt): 36 * assembler/X86Assembler.h: 37 (JSC::X86Assembler::): 38 (JSC::X86Assembler::movsd_mr): 39 (JSC::X86Assembler::sqrtsd_rr): 40 (JSC::X86Assembler::X86InstructionFormatter::twoByteOp): 41 (JSC::X86Assembler::X86InstructionFormatter::memoryModRM): 42 * create_hash_table: 43 * jit/JIT.h: 44 * jit/JITInlineMethods.h: 45 * jit/JITOpcodes.cpp: 46 * jit/JITStubs.h: 47 (JSC::JITThunks::ctiNativeCallThunk): 48 * jit/JSInterfaceJIT.h: 49 (JSC::JSInterfaceJIT::emitLoadDouble): 50 (JSC::JSInterfaceJIT::emitJumpIfImmediateNumber): 51 (JSC::JSInterfaceJIT::emitJumpIfNotImmediateNumber): 52 (JSC::JSInterfaceJIT::emitLoadInt32): 53 * jit/SpecializedThunkJIT.h: 54 (JSC::SpecializedThunkJIT::loadDoubleArgument): 55 (JSC::SpecializedThunkJIT::loadInt32Argument): 56 (JSC::SpecializedThunkJIT::returnJSValue): 57 (JSC::SpecializedThunkJIT::returnDouble): 58 (JSC::SpecializedThunkJIT::finalize): 59 * jit/ThunkGenerators.cpp: 60 (JSC::sqrtThunkGenerator): 61 (JSC::powThunkGenerator): 62 * jit/ThunkGenerators.h: 63 * runtime/Executable.h: 64 (JSC::NativeExecutable::NativeExecutable): 65 * runtime/JSFunction.cpp: 66 (JSC::JSFunction::JSFunction): 67 1 68 2010-04-28 Mike Thole <mthole@apple.com> 2 69 -
trunk/JavaScriptCore/assembler/AbstractMacroAssembler.h
r57925 r58469 161 161 // from pointers used as absolute addresses to memory operations 162 162 struct ImmPtr { 163 explicit ImmPtr( void* value)163 explicit ImmPtr(const void* value) 164 164 : m_value(value) 165 165 { … … 171 171 } 172 172 173 void* m_value;173 const void* m_value; 174 174 }; 175 175 -
trunk/JavaScriptCore/assembler/MacroAssemblerARM.h
r58091 r58469 752 752 } 753 753 754 bool supportsFloatingPointSqrt() const 755 { 756 return false; 757 } 758 754 759 void loadDouble(ImplicitAddress address, FPRegisterID dest) 755 760 { … … 757 762 } 758 763 759 void loadDouble( void* address, FPRegisterID dest)764 void loadDouble(const void* address, FPRegisterID dest) 760 765 { 761 766 m_assembler.ldr_un_imm(ARMRegisters::S0, (ARMWord)address); … … 811 816 loadDouble(src, ARMRegisters::SD0); 812 817 mulDouble(ARMRegisters::SD0, dest); 818 } 819 820 void sqrtDouble(FPRegisterID, FPRegisterID) 821 { 822 ASSERT_NOT_REACHED(); 813 823 } 814 824 -
trunk/JavaScriptCore/assembler/MacroAssemblerARMv7.h
r55834 r58469 495 495 bool supportsFloatingPointTruncate() const { return false; } 496 496 497 bool supportsFloatingPointSqrt() const 498 { 499 return false; 500 } 501 497 502 void loadDouble(ImplicitAddress address, FPRegisterID dest) 498 503 { … … 556 561 loadDouble(src, fpTempRegister); 557 562 mulDouble(fpTempRegister, dest); 563 } 564 565 void sqrtDouble(FPRegisterID, FPRegisterID) 566 { 567 ASSERT_NOT_REACHED(); 558 568 } 559 569 -
trunk/JavaScriptCore/assembler/MacroAssemblerX86.h
r55633 r58469 88 88 } 89 89 90 void loadDouble( void* address, FPRegisterID dest)90 void loadDouble(const void* address, FPRegisterID dest) 91 91 { 92 92 ASSERT(isSSE2Present()); … … 173 173 // See comment on MacroAssemblerARMv7::supportsFloatingPointTruncate() 174 174 bool supportsFloatingPointTruncate() const { return m_isSSE2Present; } 175 bool supportsFloatingPointSqrt() const { return m_isSSE2Present; } 175 176 176 177 private: -
trunk/JavaScriptCore/assembler/MacroAssemblerX86Common.h
r57925 r58469 302 302 } 303 303 304 void sqrtDouble(FPRegisterID src, FPRegisterID dst) 305 { 306 m_assembler.sqrtsd_rr(src, dst); 307 } 304 308 305 309 // Memory access operations: -
trunk/JavaScriptCore/assembler/MacroAssemblerX86_64.h
r57925 r58469 87 87 } 88 88 89 void loadDouble( void* address, FPRegisterID dest)89 void loadDouble(const void* address, FPRegisterID dest) 90 90 { 91 91 move(ImmPtr(address), scratchRegister); … … 428 428 // See comment on MacroAssemblerARMv7::supportsFloatingPointTruncate() 429 429 bool supportsFloatingPointTruncate() const { return true; } 430 bool supportsFloatingPointSqrt() const { return true; } 430 431 431 432 private: -
trunk/JavaScriptCore/assembler/X86Assembler.h
r57925 r58469 168 168 OP2_SUBSD_VsdWsd = 0x5C, 169 169 OP2_DIVSD_VsdWsd = 0x5E, 170 OP2_SQRTSD_VsdWsd = 0x51, 170 171 OP2_XORPD_VpdWpd = 0x57, 171 172 OP2_MOVD_VdEd = 0x6E, … … 1394 1395 1395 1396 #if !CPU(X86_64) 1396 void movsd_mr( void* address, XMMRegisterID dst)1397 void movsd_mr(const void* address, XMMRegisterID dst) 1397 1398 { 1398 1399 m_formatter.prefix(PRE_SSE_F2); … … 1460 1461 m_formatter.prefix(PRE_SSE_66); 1461 1462 m_formatter.twoByteOp(OP2_XORPD_VpdWpd, (RegisterID)dst, (RegisterID)src); 1463 } 1464 1465 void sqrtsd_rr(XMMRegisterID src, XMMRegisterID dst) 1466 { 1467 m_formatter.prefix(PRE_SSE_F2); 1468 m_formatter.twoByteOp(OP2_SQRTSD_VsdWsd, (RegisterID)dst, (RegisterID)src); 1462 1469 } 1463 1470 … … 1747 1754 1748 1755 #if !CPU(X86_64) 1749 void twoByteOp(TwoByteOpcodeID opcode, int reg, void* address)1756 void twoByteOp(TwoByteOpcodeID opcode, int reg, const void* address) 1750 1757 { 1751 1758 m_buffer.ensureSpace(maxInstructionSize); … … 2058 2065 2059 2066 #if !CPU(X86_64) 2060 void memoryModRM(int reg, void* address)2067 void memoryModRM(int reg, const void* address) 2061 2068 { 2062 2069 // noBase + ModRmMemoryNoDisp means noBase + ModRmMemoryDisp32! -
trunk/JavaScriptCore/create_hash_table
r58317 r58469 279 279 $thunkGenerator = "charAtThunkGenerator"; 280 280 } 281 if ($key eq "sqrt") { 282 $thunkGenerator = "sqrtThunkGenerator"; 283 } 284 if ($key eq "pow") { 285 $thunkGenerator = "powThunkGenerator"; 286 } 281 287 print " { \"$key\", $attrs[$i], (intptr_t)" . $castStr . "($firstValue), (intptr_t)$secondValue THUNK_GENERATOR($thunkGenerator) },\n"; 282 288 $i++; -
trunk/JavaScriptCore/jit/JIT.h
r58283 r58469 425 425 void emitJumpSlowCaseIfNotJSCell(RegisterID, int VReg); 426 426 #if USE(JSVALUE64) 427 JIT::Jump emitJumpIfImmediateNumber(RegisterID);428 JIT::Jump emitJumpIfNotImmediateNumber(RegisterID);429 427 #else 430 428 JIT::Jump emitJumpIfImmediateNumber(RegisterID reg) -
trunk/JavaScriptCore/jit/JITInlineMethods.h
r58283 r58469 723 723 724 724 #if USE(JSVALUE64) 725 ALWAYS_INLINE JIT::Jump JIT::emitJumpIfImmediateNumber(RegisterID reg)726 {727 return branchTestPtr(NonZero, reg, tagTypeNumberRegister);728 }729 ALWAYS_INLINE JIT::Jump JIT::emitJumpIfNotImmediateNumber(RegisterID reg)730 {731 return branchTestPtr(Zero, reg, tagTypeNumberRegister);732 }733 725 734 726 inline void JIT::emitLoadDouble(unsigned index, FPRegisterID value) -
trunk/JavaScriptCore/jit/JITOpcodes.cpp
r57955 r58469 401 401 402 402 trampolines->ctiVirtualCall = trampolineAt(finalCode, virtualCallBegin); 403 trampolines->ctiNativeCallThunk = trampolineAt(finalCode, nativeCallThunk);403 trampolines->ctiNativeCallThunk = adoptRef(new NativeExecutable(JITCode(JITCode::HostFunction(trampolineAt(finalCode, nativeCallThunk))))); 404 404 #if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) 405 405 trampolines->ctiStringLengthTrampoline = trampolineAt(finalCode, stringLengthBegin); … … 1938 1938 trampolines->ctiVirtualCallLink = trampolineAt(finalCode, virtualCallLinkBegin); 1939 1939 trampolines->ctiVirtualCall = trampolineAt(finalCode, virtualCallBegin); 1940 trampolines->ctiNativeCallThunk = trampolineAt(finalCode, nativeCallThunk);1940 trampolines->ctiNativeCallThunk = adoptRef(new NativeExecutable(JITCode(JITCode::HostFunction(trampolineAt(finalCode, nativeCallThunk))))); 1941 1941 #if ENABLE(JIT_OPTIMIZE_MOD) 1942 1942 trampolines->ctiSoftModulo = trampolineAt(finalCode, softModBegin); -
trunk/JavaScriptCore/jit/JITStubs.h
r58286 r58469 80 80 MacroAssemblerCodePtr ctiVirtualCallLink; 81 81 MacroAssemblerCodePtr ctiVirtualCall; 82 MacroAssemblerCodePtrctiNativeCallThunk;82 RefPtr<NativeExecutable> ctiNativeCallThunk; 83 83 MacroAssemblerCodePtr ctiSoftModulo; 84 84 }; … … 276 276 MacroAssemblerCodePtr ctiVirtualCallLink() { return m_trampolineStructure.ctiVirtualCallLink; } 277 277 MacroAssemblerCodePtr ctiVirtualCall() { return m_trampolineStructure.ctiVirtualCall; } 278 MacroAssemblerCodePtr ctiNativeCallThunk() { return m_trampolineStructure.ctiNativeCallThunk; }278 NativeExecutable* ctiNativeCallThunk() { return m_trampolineStructure.ctiNativeCallThunk.get(); } 279 279 MacroAssemblerCodePtr ctiSoftModulo() { return m_trampolineStructure.ctiSoftModulo; } 280 280 -
trunk/JavaScriptCore/jit/JSInterfaceJIT.h
r58283 r58469 69 69 static const FPRegisterID fpRegT1 = X86Registers::xmm1; 70 70 static const FPRegisterID fpRegT2 = X86Registers::xmm2; 71 static const FPRegisterID fpRegT3 = X86Registers::xmm3; 71 72 #elif CPU(X86) 72 73 static const RegisterID returnValueRegister = X86Registers::eax; … … 87 88 static const FPRegisterID fpRegT1 = X86Registers::xmm1; 88 89 static const FPRegisterID fpRegT2 = X86Registers::xmm2; 90 static const FPRegisterID fpRegT3 = X86Registers::xmm3; 89 91 #elif CPU(ARM_THUMB2) 90 92 static const RegisterID returnValueRegister = ARMRegisters::r0; … … 103 105 static const FPRegisterID fpRegT1 = ARMRegisters::d1; 104 106 static const FPRegisterID fpRegT2 = ARMRegisters::d2; 107 static const FPRegisterID fpRegT3 = ARMRegisters::d3; 105 108 #elif CPU(ARM_TRADITIONAL) 106 109 static const RegisterID returnValueRegister = ARMRegisters::r0; … … 127 130 static const FPRegisterID fpRegT1 = ARMRegisters::d1; 128 131 static const FPRegisterID fpRegT2 = ARMRegisters::d2; 132 static const FPRegisterID fpRegT3 = ARMRegisters::d3; 129 133 #elif CPU(MIPS) 130 134 static const RegisterID returnValueRegister = MIPSRegisters::v0; … … 149 153 static const FPRegisterID fpRegT1 = MIPSRegisters::f6; 150 154 static const FPRegisterID fpRegT2 = MIPSRegisters::f8; 155 static const FPRegisterID fpRegT2 = MIPSRegisters::f10; 151 156 #else 152 157 #error "JIT not supported on this platform." … … 155 160 inline Jump emitLoadJSCell(unsigned virtualRegisterIndex, RegisterID payload); 156 161 inline Jump emitLoadInt32(unsigned virtualRegisterIndex, RegisterID dst); 162 inline Jump emitLoadDouble(unsigned virtualRegisterIndex, FPRegisterID dst, RegisterID scratch); 157 163 158 164 #if USE(JSVALUE32_64) … … 160 166 inline Address tagFor(unsigned index, RegisterID base = callFrameRegister); 161 167 #endif 168 169 #if USE(JSVALUE32) || USE(JSVALUE64) 170 Jump emitJumpIfImmediateNumber(RegisterID reg); 171 Jump emitJumpIfNotImmediateNumber(RegisterID reg); 172 #endif 173 162 174 inline Address payloadFor(unsigned index, RegisterID base = callFrameRegister); 163 175 inline Address addressFor(unsigned index, RegisterID base = callFrameRegister); 164 176 }; 165 177 166 178 #if USE(JSVALUE32_64) 167 179 inline JSInterfaceJIT::Jump JSInterfaceJIT::emitLoadJSCell(unsigned virtualRegisterIndex, RegisterID payload) … … 191 203 return Address(base, (index * sizeof(Register)) + OBJECT_OFFSETOF(JSValue, u.asBits.payload)); 192 204 } 205 206 inline JSInterfaceJIT::Jump JSInterfaceJIT::emitLoadDouble(unsigned virtualRegisterIndex, FPRegisterID dst, RegisterID scratch) 207 { 208 loadPtr(tagFor(virtualRegisterIndex), scratch); 209 Jump isDouble = branch32(Below, scratch, Imm32(JSValue::LowestTag)); 210 Jump notInt = branch32(NotEqual, scratch, Imm32(JSValue::Int32Tag)); 211 loadPtr(payloadFor(virtualRegisterIndex), scratch); 212 convertInt32ToDouble(scratch, dst); 213 Jump done = jump(); 214 isDouble.link(this); 215 loadDouble(addressFor(virtualRegisterIndex), dst); 216 done.link(this); 217 return notInt; 218 } 193 219 #endif 194 220 195 221 #if USE(JSVALUE64) 222 ALWAYS_INLINE JSInterfaceJIT::Jump JSInterfaceJIT::emitJumpIfImmediateNumber(RegisterID reg) 223 { 224 return branchTestPtr(NonZero, reg, tagTypeNumberRegister); 225 } 226 ALWAYS_INLINE JSInterfaceJIT::Jump JSInterfaceJIT::emitJumpIfNotImmediateNumber(RegisterID reg) 227 { 228 return branchTestPtr(Zero, reg, tagTypeNumberRegister); 229 } 196 230 inline JSInterfaceJIT::Jump JSInterfaceJIT::emitLoadJSCell(unsigned virtualRegisterIndex, RegisterID dst) 197 231 { … … 207 241 return result; 208 242 } 243 244 inline JSInterfaceJIT::Jump JSInterfaceJIT::emitLoadDouble(unsigned virtualRegisterIndex, FPRegisterID dst, RegisterID scratch) 245 { 246 loadPtr(addressFor(virtualRegisterIndex), scratch); 247 Jump notNumber = emitJumpIfNotImmediateNumber(scratch); 248 Jump notInt = branchPtr(Below, scratch, tagTypeNumberRegister); 249 convertInt32ToDouble(scratch, dst); 250 Jump done = jump(); 251 notInt.link(this); 252 addPtr(tagTypeNumberRegister, scratch); 253 movePtrToDouble(scratch, dst); 254 done.link(this); 255 return notNumber; 256 } 257 209 258 #endif 210 259 … … 222 271 rshift32(Imm32(JSImmediate::IntegerPayloadShift), dst); 223 272 return result; 224 } 273 } 274 275 inline JSInterfaceJIT::Jump JSInterfaceJIT::emitLoadDouble(unsigned, FPRegisterID, RegisterID) 276 { 277 ASSERT_NOT_REACHED(); 278 return jump(); 279 } 225 280 #endif 226 281 -
trunk/JavaScriptCore/jit/SpecializedThunkJIT.h
r58317 r58469 47 47 } 48 48 49 void loadDoubleArgument(int argument, FPRegisterID dst, RegisterID scratch) 50 { 51 unsigned src = argumentToVirtualRegister(argument); 52 m_failures.append(emitLoadDouble(src, dst, scratch)); 53 } 54 49 55 void loadCellArgument(int argument, RegisterID dst) 50 56 { … … 60 66 } 61 67 68 void loadInt32Argument(int argument, RegisterID dst, Jump& failTarget) 69 { 70 unsigned src = argumentToVirtualRegister(argument); 71 failTarget = emitLoadInt32(src, dst); 72 } 73 62 74 void loadInt32Argument(int argument, RegisterID dst) 63 75 { 64 unsigned src = argumentToVirtualRegister(argument); 65 m_failures.append(emitLoadInt32(src, dst)); 76 Jump conversionFailed; 77 loadInt32Argument(argument, dst, conversionFailed); 78 m_failures.append(conversionFailed); 66 79 } 67 80 … … 70 83 m_failures.append(failure); 71 84 } 85 86 void returnJSValue(RegisterID src) 87 { 88 if (src != regT0) 89 move(src, regT0); 90 loadPtr(Address(callFrameRegister, RegisterFile::CallerFrame * (int)sizeof(Register)), callFrameRegister); 91 ret(); 92 } 72 93 94 void returnDouble(FPRegisterID src) 95 { 96 #if USE(JSVALUE64) 97 moveDoubleToPtr(src, regT0); 98 subPtr(tagTypeNumberRegister, regT0); 99 #elif USE(JSVALUE32_64) 100 storeDouble(src, Address(stackPointerRegister, -(int)sizeof(double))); 101 loadPtr(Address(stackPointerRegister, OBJECT_OFFSETOF(JSValue, u.asBits.tag) - sizeof(double)), regT1); 102 loadPtr(Address(stackPointerRegister, OBJECT_OFFSETOF(JSValue, u.asBits.payload) - sizeof(double)), regT0); 103 #else 104 UNUSED_PARAM(src); 105 ASSERT_NOT_REACHED(); 106 m_failures.append(jump()); 107 #endif 108 loadPtr(Address(callFrameRegister, RegisterFile::CallerFrame * (int)sizeof(Register)), callFrameRegister); 109 ret(); 110 } 111 73 112 void returnInt32(RegisterID src) 74 113 { … … 92 131 { 93 132 LinkBuffer patchBuffer(this, m_pool.get()); 94 patchBuffer.link(m_failures, CodeLocationLabel(m_globalData->jitStubs.ctiNativeCallThunk() ));133 patchBuffer.link(m_failures, CodeLocationLabel(m_globalData->jitStubs.ctiNativeCallThunk()->generatedJITCode().addressForCall())); 95 134 return adoptRef(new NativeExecutable(patchBuffer.finalizeCode())); 96 135 } … … 115 154 #endif 116 155 } 117 156 118 157 void tagReturnAsJSCell() 119 158 { -
trunk/JavaScriptCore/jit/ThunkGenerators.cpp
r58317 r58469 95 95 } 96 96 97 PassRefPtr<NativeExecutable> sqrtThunkGenerator(JSGlobalData* globalData, ExecutablePool* pool) 98 { 99 #if USE(JSVALUE64) || USE(JSVALUE32_64) 100 SpecializedThunkJIT jit(1, globalData, pool); 101 if (!jit.supportsFloatingPointSqrt()) 102 return globalData->jitStubs.ctiNativeCallThunk(); 103 104 jit.loadDoubleArgument(0, SpecializedThunkJIT::fpRegT0, SpecializedThunkJIT::regT0); 105 jit.sqrtDouble(SpecializedThunkJIT::fpRegT0, SpecializedThunkJIT::fpRegT0); 106 jit.returnDouble(SpecializedThunkJIT::fpRegT0); 107 return jit.finalize(); 108 #else 109 UNUSED_PARAM(pool); 110 return globalData->jitStubs.ctiNativeCallThunk(); 111 #endif 112 } 113 114 static const double oneConstant = 1.0; 115 static const double negativeHalfConstant = -0.5; 116 117 PassRefPtr<NativeExecutable> powThunkGenerator(JSGlobalData* globalData, ExecutablePool* pool) 118 { 119 #if USE(JSVALUE64) || USE(JSVALUE32_64) 120 SpecializedThunkJIT jit(2, globalData, pool); 121 if (!jit.supportsFloatingPoint()) 122 return globalData->jitStubs.ctiNativeCallThunk(); 123 124 jit.loadDouble(&oneConstant, SpecializedThunkJIT::fpRegT1); 125 jit.loadDoubleArgument(0, SpecializedThunkJIT::fpRegT0, SpecializedThunkJIT::regT0); 126 MacroAssembler::Jump nonIntExponent; 127 jit.loadInt32Argument(1, SpecializedThunkJIT::regT0, nonIntExponent); 128 jit.appendFailure(jit.branch32(MacroAssembler::LessThan, SpecializedThunkJIT::regT0, MacroAssembler::Imm32(0))); 129 130 MacroAssembler::Jump exponentIsZero = jit.branchTest32(MacroAssembler::Zero, SpecializedThunkJIT::regT0); 131 MacroAssembler::Label startLoop(jit.label()); 132 133 MacroAssembler::Jump exponentIsEven = jit.branchTest32(MacroAssembler::Zero, SpecializedThunkJIT::regT0, MacroAssembler::Imm32(1)); 134 jit.mulDouble(SpecializedThunkJIT::fpRegT0, SpecializedThunkJIT::fpRegT1); 135 exponentIsEven.link(&jit); 136 jit.mulDouble(SpecializedThunkJIT::fpRegT0, SpecializedThunkJIT::fpRegT0); 137 jit.rshift32(MacroAssembler::Imm32(1), SpecializedThunkJIT::regT0); 138 jit.branchTest32(MacroAssembler::NonZero, SpecializedThunkJIT::regT0).linkTo(startLoop, &jit); 139 140 exponentIsZero.link(&jit); 141 jit.returnDouble(SpecializedThunkJIT::fpRegT1); 142 143 if (jit.supportsFloatingPointSqrt()) { 144 nonIntExponent.link(&jit); 145 jit.loadDouble(&negativeHalfConstant, SpecializedThunkJIT::fpRegT3); 146 jit.loadDoubleArgument(1, SpecializedThunkJIT::fpRegT2, SpecializedThunkJIT::regT0); 147 jit.appendFailure(jit.branchDouble(MacroAssembler::DoubleLessThanOrEqual, SpecializedThunkJIT::fpRegT0, SpecializedThunkJIT::fpRegT1)); 148 jit.appendFailure(jit.branchDouble(MacroAssembler::DoubleNotEqual, SpecializedThunkJIT::fpRegT2, SpecializedThunkJIT::fpRegT3)); 149 jit.sqrtDouble(SpecializedThunkJIT::fpRegT0, SpecializedThunkJIT::fpRegT0); 150 jit.divDouble(SpecializedThunkJIT::fpRegT0, SpecializedThunkJIT::fpRegT1); 151 jit.returnDouble(SpecializedThunkJIT::fpRegT1); 152 } else 153 jit.appendFailure(nonIntExponent); 154 155 return jit.finalize(); 156 #else 157 UNUSED_PARAM(pool); 158 return globalData->jitStubs.ctiNativeCallThunk(); 159 #endif 160 } 161 97 162 } 98 163 -
trunk/JavaScriptCore/jit/ThunkGenerators.h
r58317 r58469 39 39 PassRefPtr<NativeExecutable> charAtThunkGenerator(JSGlobalData*, ExecutablePool*); 40 40 PassRefPtr<NativeExecutable> fromCharCodeThunkGenerator(JSGlobalData*, ExecutablePool*); 41 PassRefPtr<NativeExecutable> sqrtThunkGenerator(JSGlobalData*, ExecutablePool*); 42 PassRefPtr<NativeExecutable> powThunkGenerator(JSGlobalData*, ExecutablePool*); 41 43 } 42 44 #endif -
trunk/JavaScriptCore/runtime/Executable.h
r58286 r58469 86 86 : ExecutableBase(NUM_PARAMETERS_IS_HOST) 87 87 { 88 m_jitCode = JITCode(JITCode::HostFunction(exec->globalData().jitStubs.ctiNativeCallThunk()));88 m_jitCode = exec->globalData().jitStubs.ctiNativeCallThunk()->m_jitCode; 89 89 } 90 90 NativeExecutable(JITCode thunk) -
trunk/JavaScriptCore/runtime/JSFunction.cpp
r58286 r58469 77 77 : Base(&exec->globalData(), structure, name) 78 78 #if ENABLE(JIT) 79 , m_executable( adoptRef(new NativeExecutable(exec)))79 , m_executable(exec->globalData().jitStubs.ctiNativeCallThunk()) 80 80 #endif 81 81 {
Note: See TracChangeset
for help on using the changeset viewer.