Changeset 47530 in webkit for trunk/JavaScriptCore/jit
- Timestamp:
- Aug 19, 2009, 5:02:24 PM (16 years ago)
- Location:
- trunk/JavaScriptCore/jit
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/jit/JIT.h
r47412 r47530 192 192 // however the code will still function correctly. 193 193 #if PLATFORM(X86_64) 194 static const RegisterID returnValueRegister = X86 ::eax;195 static const RegisterID cachedResultRegister = X86 ::eax;196 static const RegisterID firstArgumentRegister = X86 ::edi;197 198 static const RegisterID timeoutCheckRegister = X86 ::r12;199 static const RegisterID callFrameRegister = X86 ::r13;200 static const RegisterID tagTypeNumberRegister = X86 ::r14;201 static const RegisterID tagMaskRegister = X86 ::r15;202 203 static const RegisterID regT0 = X86 ::eax;204 static const RegisterID regT1 = X86 ::edx;205 static const RegisterID regT2 = X86 ::ecx;206 static const RegisterID regT3 = X86 ::ebx;207 208 static const FPRegisterID fpRegT0 = X86 ::xmm0;209 static const FPRegisterID fpRegT1 = X86 ::xmm1;210 static const FPRegisterID fpRegT2 = X86 ::xmm2;194 static const RegisterID returnValueRegister = X86Registers::eax; 195 static const RegisterID cachedResultRegister = X86Registers::eax; 196 static const RegisterID firstArgumentRegister = X86Registers::edi; 197 198 static const RegisterID timeoutCheckRegister = X86Registers::r12; 199 static const RegisterID callFrameRegister = X86Registers::r13; 200 static const RegisterID tagTypeNumberRegister = X86Registers::r14; 201 static const RegisterID tagMaskRegister = X86Registers::r15; 202 203 static const RegisterID regT0 = X86Registers::eax; 204 static const RegisterID regT1 = X86Registers::edx; 205 static const RegisterID regT2 = X86Registers::ecx; 206 static const RegisterID regT3 = X86Registers::ebx; 207 208 static const FPRegisterID fpRegT0 = X86Registers::xmm0; 209 static const FPRegisterID fpRegT1 = X86Registers::xmm1; 210 static const FPRegisterID fpRegT2 = X86Registers::xmm2; 211 211 #elif PLATFORM(X86) 212 static const RegisterID returnValueRegister = X86 ::eax;213 static const RegisterID cachedResultRegister = X86 ::eax;212 static const RegisterID returnValueRegister = X86Registers::eax; 213 static const RegisterID cachedResultRegister = X86Registers::eax; 214 214 // On x86 we always use fastcall conventions = but on 215 215 // OS X if might make more sense to just use regparm. 216 static const RegisterID firstArgumentRegister = X86 ::ecx;217 218 static const RegisterID timeoutCheckRegister = X86 ::esi;219 static const RegisterID callFrameRegister = X86 ::edi;220 221 static const RegisterID regT0 = X86 ::eax;222 static const RegisterID regT1 = X86 ::edx;223 static const RegisterID regT2 = X86 ::ecx;224 static const RegisterID regT3 = X86 ::ebx;225 226 static const FPRegisterID fpRegT0 = X86 ::xmm0;227 static const FPRegisterID fpRegT1 = X86 ::xmm1;228 static const FPRegisterID fpRegT2 = X86 ::xmm2;216 static const RegisterID firstArgumentRegister = X86Registers::ecx; 217 218 static const RegisterID timeoutCheckRegister = X86Registers::esi; 219 static const RegisterID callFrameRegister = X86Registers::edi; 220 221 static const RegisterID regT0 = X86Registers::eax; 222 static const RegisterID regT1 = X86Registers::edx; 223 static const RegisterID regT2 = X86Registers::ecx; 224 static const RegisterID regT3 = X86Registers::ebx; 225 226 static const FPRegisterID fpRegT0 = X86Registers::xmm0; 227 static const FPRegisterID fpRegT1 = X86Registers::xmm1; 228 static const FPRegisterID fpRegT2 = X86Registers::xmm2; 229 229 #elif PLATFORM_ARM_ARCH(7) 230 static const RegisterID returnValueRegister = ARM ::r0;231 static const RegisterID cachedResultRegister = ARM ::r0;232 static const RegisterID firstArgumentRegister = ARM ::r0;233 234 static const RegisterID regT0 = ARM ::r0;235 static const RegisterID regT1 = ARM ::r1;236 static const RegisterID regT2 = ARM ::r2;237 static const RegisterID regT3 = ARM ::r4;238 239 static const RegisterID callFrameRegister = ARM ::r5;240 static const RegisterID timeoutCheckRegister = ARM ::r6;241 242 static const FPRegisterID fpRegT0 = ARM ::d0;243 static const FPRegisterID fpRegT1 = ARM ::d1;244 static const FPRegisterID fpRegT2 = ARM ::d2;230 static const RegisterID returnValueRegister = ARMRegisters::r0; 231 static const RegisterID cachedResultRegister = ARMRegisters::r0; 232 static const RegisterID firstArgumentRegister = ARMRegisters::r0; 233 234 static const RegisterID regT0 = ARMRegisters::r0; 235 static const RegisterID regT1 = ARMRegisters::r1; 236 static const RegisterID regT2 = ARMRegisters::r2; 237 static const RegisterID regT3 = ARMRegisters::r4; 238 239 static const RegisterID callFrameRegister = ARMRegisters::r5; 240 static const RegisterID timeoutCheckRegister = ARMRegisters::r6; 241 242 static const FPRegisterID fpRegT0 = ARMRegisters::d0; 243 static const FPRegisterID fpRegT1 = ARMRegisters::d1; 244 static const FPRegisterID fpRegT2 = ARMRegisters::d2; 245 245 #elif PLATFORM(ARM) 246 static const RegisterID returnValueRegister = ARM ::r0;247 static const RegisterID cachedResultRegister = ARM ::r0;248 static const RegisterID firstArgumentRegister = ARM ::r0;249 250 static const RegisterID timeoutCheckRegister = ARM ::r5;251 static const RegisterID callFrameRegister = ARM ::r4;252 static const RegisterID ctiReturnRegister = ARM ::r6;253 254 static const RegisterID regT0 = ARM ::r0;255 static const RegisterID regT1 = ARM ::r1;256 static const RegisterID regT2 = ARM ::r2;246 static const RegisterID returnValueRegister = ARMRegisters::r0; 247 static const RegisterID cachedResultRegister = ARMRegisters::r0; 248 static const RegisterID firstArgumentRegister = ARMRegisters::r0; 249 250 static const RegisterID timeoutCheckRegister = ARMRegisters::r5; 251 static const RegisterID callFrameRegister = ARMRegisters::r4; 252 static const RegisterID ctiReturnRegister = ARMRegisters::r6; 253 254 static const RegisterID regT0 = ARMRegisters::r0; 255 static const RegisterID regT1 = ARMRegisters::r1; 256 static const RegisterID regT2 = ARMRegisters::r2; 257 257 // Callee preserved 258 static const RegisterID regT3 = ARM ::r7;259 260 static const RegisterID regS0 = ARM ::S0;258 static const RegisterID regT3 = ARMRegisters::r7; 259 260 static const RegisterID regS0 = ARMRegisters::S0; 261 261 // Callee preserved 262 static const RegisterID regS1 = ARM ::S1;263 264 static const RegisterID regStackPtr = ARM ::sp;265 static const RegisterID regLink = ARM ::lr;266 267 static const FPRegisterID fpRegT0 = ARM ::d0;268 static const FPRegisterID fpRegT1 = ARM ::d1;269 static const FPRegisterID fpRegT2 = ARM ::d2;262 static const RegisterID regS1 = ARMRegisters::S1; 263 264 static const RegisterID regStackPtr = ARMRegisters::sp; 265 static const RegisterID regLink = ARMRegisters::lr; 266 267 static const FPRegisterID fpRegT0 = ARMRegisters::d0; 268 static const FPRegisterID fpRegT1 = ARMRegisters::d1; 269 static const FPRegisterID fpRegT2 = ARMRegisters::d2; 270 270 #else 271 271 #error "JIT not supported on this platform." -
trunk/JavaScriptCore/jit/JITArithmetic.cpp
r46598 r47530 1054 1054 1055 1055 if (isOperandConstantImmediateInt(op2) && getConstantOperand(op2).asInt32() != 0) { 1056 emitLoad(op1, X86 ::edx, X86::eax);1057 move(Imm32(getConstantOperand(op2).asInt32()), X86 ::ecx);1058 addSlowCase(branch32(NotEqual, X86 ::edx, Imm32(JSValue::Int32Tag)));1056 emitLoad(op1, X86Registers::edx, X86Registers::eax); 1057 move(Imm32(getConstantOperand(op2).asInt32()), X86Registers::ecx); 1058 addSlowCase(branch32(NotEqual, X86Registers::edx, Imm32(JSValue::Int32Tag))); 1059 1059 if (getConstantOperand(op2).asInt32() == -1) 1060 addSlowCase(branch32(Equal, X86 ::eax, Imm32(0x80000000))); // -2147483648 / -1 => EXC_ARITHMETIC1060 addSlowCase(branch32(Equal, X86Registers::eax, Imm32(0x80000000))); // -2147483648 / -1 => EXC_ARITHMETIC 1061 1061 } else { 1062 emitLoad2(op1, X86 ::edx, X86::eax, op2, X86::ebx, X86::ecx);1063 addSlowCase(branch32(NotEqual, X86 ::edx, Imm32(JSValue::Int32Tag)));1064 addSlowCase(branch32(NotEqual, X86 ::ebx, Imm32(JSValue::Int32Tag)));1065 1066 addSlowCase(branch32(Equal, X86 ::eax, Imm32(0x80000000))); // -2147483648 / -1 => EXC_ARITHMETIC1067 addSlowCase(branch32(Equal, X86 ::ecx, Imm32(0))); // divide by 01068 } 1069 1070 move(X86 ::eax, X86::ebx); // Save dividend payload, in case of 0.1062 emitLoad2(op1, X86Registers::edx, X86Registers::eax, op2, X86Registers::ebx, X86Registers::ecx); 1063 addSlowCase(branch32(NotEqual, X86Registers::edx, Imm32(JSValue::Int32Tag))); 1064 addSlowCase(branch32(NotEqual, X86Registers::ebx, Imm32(JSValue::Int32Tag))); 1065 1066 addSlowCase(branch32(Equal, X86Registers::eax, Imm32(0x80000000))); // -2147483648 / -1 => EXC_ARITHMETIC 1067 addSlowCase(branch32(Equal, X86Registers::ecx, Imm32(0))); // divide by 0 1068 } 1069 1070 move(X86Registers::eax, X86Registers::ebx); // Save dividend payload, in case of 0. 1071 1071 m_assembler.cdq(); 1072 m_assembler.idivl_r(X86 ::ecx);1072 m_assembler.idivl_r(X86Registers::ecx); 1073 1073 1074 1074 // If the remainder is zero and the dividend is negative, the result is -0. 1075 Jump storeResult1 = branchTest32(NonZero, X86 ::edx);1076 Jump storeResult2 = branchTest32(Zero, X86 ::ebx, Imm32(0x80000000)); // not negative1075 Jump storeResult1 = branchTest32(NonZero, X86Registers::edx); 1076 Jump storeResult2 = branchTest32(Zero, X86Registers::ebx, Imm32(0x80000000)); // not negative 1077 1077 emitStore(dst, jsNumber(m_globalData, -0.0)); 1078 1078 Jump end = jump(); … … 1080 1080 storeResult1.link(this); 1081 1081 storeResult2.link(this); 1082 emitStoreInt32(dst, X86 ::edx, (op1 == dst || op2 == dst));1082 emitStoreInt32(dst, X86Registers::edx, (op1 == dst || op2 == dst)); 1083 1083 end.link(this); 1084 1084 } … … 1848 1848 unsigned op2 = currentInstruction[3].u.operand; 1849 1849 1850 emitGetVirtualRegisters(op1, X86 ::eax, op2, X86::ecx);1851 emitJumpSlowCaseIfNotImmediateInteger(X86 ::eax);1852 emitJumpSlowCaseIfNotImmediateInteger(X86 ::ecx);1853 #if USE(JSVALUE64) 1854 addSlowCase(branchPtr(Equal, X86 ::ecx, ImmPtr(JSValue::encode(jsNumber(m_globalData, 0)))));1850 emitGetVirtualRegisters(op1, X86Registers::eax, op2, X86Registers::ecx); 1851 emitJumpSlowCaseIfNotImmediateInteger(X86Registers::eax); 1852 emitJumpSlowCaseIfNotImmediateInteger(X86Registers::ecx); 1853 #if USE(JSVALUE64) 1854 addSlowCase(branchPtr(Equal, X86Registers::ecx, ImmPtr(JSValue::encode(jsNumber(m_globalData, 0))))); 1855 1855 m_assembler.cdq(); 1856 m_assembler.idivl_r(X86 ::ecx);1857 #else 1858 emitFastArithDeTagImmediate(X86 ::eax);1859 addSlowCase(emitFastArithDeTagImmediateJumpIfZero(X86 ::ecx));1856 m_assembler.idivl_r(X86Registers::ecx); 1857 #else 1858 emitFastArithDeTagImmediate(X86Registers::eax); 1859 addSlowCase(emitFastArithDeTagImmediateJumpIfZero(X86Registers::ecx)); 1860 1860 m_assembler.cdq(); 1861 m_assembler.idivl_r(X86 ::ecx);1862 signExtend32ToPtr(X86 ::edx, X86::edx);1863 #endif 1864 emitFastArithReTagImmediate(X86 ::edx, X86::eax);1861 m_assembler.idivl_r(X86Registers::ecx); 1862 signExtend32ToPtr(X86Registers::edx, X86Registers::edx); 1863 #endif 1864 emitFastArithReTagImmediate(X86Registers::edx, X86Registers::eax); 1865 1865 emitPutVirtualRegister(result); 1866 1866 } … … 1878 1878 Jump notImm2 = getSlowCase(iter); 1879 1879 linkSlowCase(iter); 1880 emitFastArithReTagImmediate(X86 ::eax, X86::eax);1881 emitFastArithReTagImmediate(X86 ::ecx, X86::ecx);1880 emitFastArithReTagImmediate(X86Registers::eax, X86Registers::eax); 1881 emitFastArithReTagImmediate(X86Registers::ecx, X86Registers::ecx); 1882 1882 notImm1.link(this); 1883 1883 notImm2.link(this); 1884 1884 #endif 1885 1885 JITStubCall stubCall(this, cti_op_mod); 1886 stubCall.addArgument(X86 ::eax);1887 stubCall.addArgument(X86 ::ecx);1886 stubCall.addArgument(X86Registers::eax); 1887 stubCall.addArgument(X86Registers::ecx); 1888 1888 stubCall.call(result); 1889 1889 } -
trunk/JavaScriptCore/jit/JITInlineMethods.h
r47186 r47530 184 184 poke(callFrameRegister, OBJECT_OFFSETOF(struct JITStackFrame, callFrame) / sizeof (void*)); 185 185 #if PLATFORM(ARM) && !PLATFORM_ARM_ARCH(7) 186 move(ctiReturnRegister, ARM ::lr);186 move(ctiReturnRegister, ARMRegisters::lr); 187 187 #endif 188 188 } … … 276 276 ALWAYS_INLINE void JIT::sampleInstruction(Instruction* instruction, bool inHostFunction) 277 277 { 278 move(ImmPtr(m_interpreter->sampler()->sampleSlot()), X86 ::ecx);279 storePtr(ImmPtr(m_interpreter->sampler()->encodeSample(instruction, inHostFunction)), X86 ::ecx);278 move(ImmPtr(m_interpreter->sampler()->sampleSlot()), X86Registers::ecx); 279 storePtr(ImmPtr(m_interpreter->sampler()->encodeSample(instruction, inHostFunction)), X86Registers::ecx); 280 280 } 281 281 #else … … 291 291 ALWAYS_INLINE void JIT::sampleCodeBlock(CodeBlock* codeBlock) 292 292 { 293 move(ImmPtr(m_interpreter->sampler()->codeBlockSlot()), X86 ::ecx);294 storePtr(ImmPtr(codeBlock), X86 ::ecx);293 move(ImmPtr(m_interpreter->sampler()->codeBlockSlot()), X86Registers::ecx); 294 storePtr(ImmPtr(codeBlock), X86Registers::ecx); 295 295 } 296 296 #else -
trunk/JavaScriptCore/jit/JITOpcodes.cpp
r47412 r47530 238 238 #if COMPILER(MSVC) || PLATFORM(LINUX) 239 239 // ArgList is passed by reference so is stackPointerRegister + 4 * sizeof(Register) 240 addPtr(Imm32(OBJECT_OFFSETOF(NativeCallFrameStructure, result)), stackPointerRegister, X86 ::ecx);240 addPtr(Imm32(OBJECT_OFFSETOF(NativeCallFrameStructure, result)), stackPointerRegister, X86Registers::ecx); 241 241 242 242 // Plant callee 243 emitGetFromCallFrameHeaderPtr(RegisterFile::Callee, X86 ::eax);244 storePtr(X86 ::eax, Address(stackPointerRegister, OBJECT_OFFSETOF(NativeCallFrameStructure, callee)));243 emitGetFromCallFrameHeaderPtr(RegisterFile::Callee, X86Registers::eax); 244 storePtr(X86Registers::eax, Address(stackPointerRegister, OBJECT_OFFSETOF(NativeCallFrameStructure, callee))); 245 245 246 246 // Plant callframe 247 move(callFrameRegister, X86 ::edx);248 249 call(Address(X86 ::eax, OBJECT_OFFSETOF(JSFunction, m_data)));247 move(callFrameRegister, X86Registers::edx); 248 249 call(Address(X86Registers::eax, OBJECT_OFFSETOF(JSFunction, m_data))); 250 250 251 251 // JSValue is a non-POD type, so eax points to it 252 emitLoad(0, regT1, regT0, X86 ::eax);252 emitLoad(0, regT1, regT0, X86Registers::eax); 253 253 #else 254 emitGetFromCallFrameHeaderPtr(RegisterFile::Callee, X86 ::edx); // callee255 move(callFrameRegister, X86 ::ecx); // callFrame256 call(Address(X86 ::edx, OBJECT_OFFSETOF(JSFunction, m_data)));254 emitGetFromCallFrameHeaderPtr(RegisterFile::Callee, X86Registers::edx); // callee 255 move(callFrameRegister, X86Registers::ecx); // callFrame 256 call(Address(X86Registers::edx, OBJECT_OFFSETOF(JSFunction, m_data))); 257 257 #endif 258 258 … … 1576 1576 1577 1577 #if PLATFORM(X86_64) 1578 emitGetFromCallFrameHeader32(RegisterFile::ArgumentCount, X86 ::ecx);1578 emitGetFromCallFrameHeader32(RegisterFile::ArgumentCount, X86Registers::ecx); 1579 1579 1580 1580 // Allocate stack space for our arglist … … 1583 1583 1584 1584 // Set up arguments 1585 subPtr(Imm32(1), X86 ::ecx); // Don't include 'this' in argcount1585 subPtr(Imm32(1), X86Registers::ecx); // Don't include 'this' in argcount 1586 1586 1587 1587 // Push argcount 1588 storePtr(X86 ::ecx, Address(stackPointerRegister, OBJECT_OFFSETOF(ArgList, m_argCount)));1588 storePtr(X86Registers::ecx, Address(stackPointerRegister, OBJECT_OFFSETOF(ArgList, m_argCount))); 1589 1589 1590 1590 // Calculate the start of the callframe header, and store in edx 1591 addPtr(Imm32(-RegisterFile::CallFrameHeaderSize * (int32_t)sizeof(Register)), callFrameRegister, X86 ::edx);1591 addPtr(Imm32(-RegisterFile::CallFrameHeaderSize * (int32_t)sizeof(Register)), callFrameRegister, X86Registers::edx); 1592 1592 1593 1593 // Calculate start of arguments as callframe header - sizeof(Register) * argcount (ecx) 1594 mul32(Imm32(sizeof(Register)), X86 ::ecx, X86::ecx);1595 subPtr(X86 ::ecx, X86::edx);1594 mul32(Imm32(sizeof(Register)), X86Registers::ecx, X86Registers::ecx); 1595 subPtr(X86Registers::ecx, X86Registers::edx); 1596 1596 1597 1597 // push pointer to arguments 1598 storePtr(X86 ::edx, Address(stackPointerRegister, OBJECT_OFFSETOF(ArgList, m_args)));1598 storePtr(X86Registers::edx, Address(stackPointerRegister, OBJECT_OFFSETOF(ArgList, m_args))); 1599 1599 1600 1600 // ArgList is passed by reference so is stackPointerRegister 1601 move(stackPointerRegister, X86 ::ecx);1601 move(stackPointerRegister, X86Registers::ecx); 1602 1602 1603 1603 // edx currently points to the first argument, edx-sizeof(Register) points to 'this' 1604 loadPtr(Address(X86 ::edx, -(int32_t)sizeof(Register)), X86::edx);1605 1606 emitGetFromCallFrameHeaderPtr(RegisterFile::Callee, X86 ::esi);1607 1608 move(callFrameRegister, X86 ::edi);1609 1610 call(Address(X86 ::esi, OBJECT_OFFSETOF(JSFunction, m_data)));1604 loadPtr(Address(X86Registers::edx, -(int32_t)sizeof(Register)), X86Registers::edx); 1605 1606 emitGetFromCallFrameHeaderPtr(RegisterFile::Callee, X86Registers::esi); 1607 1608 move(callFrameRegister, X86Registers::edi); 1609 1610 call(Address(X86Registers::esi, OBJECT_OFFSETOF(JSFunction, m_data))); 1611 1611 1612 1612 addPtr(Imm32(sizeof(ArgList)), stackPointerRegister); … … 1677 1677 #if COMPILER(MSVC) || PLATFORM(LINUX) 1678 1678 // ArgList is passed by reference so is stackPointerRegister + 4 * sizeof(Register) 1679 addPtr(Imm32(OBJECT_OFFSETOF(NativeCallFrameStructure, result)), stackPointerRegister, X86 ::ecx);1679 addPtr(Imm32(OBJECT_OFFSETOF(NativeCallFrameStructure, result)), stackPointerRegister, X86Registers::ecx); 1680 1680 1681 1681 // Plant callee 1682 emitGetFromCallFrameHeaderPtr(RegisterFile::Callee, X86 ::eax);1683 storePtr(X86 ::eax, Address(stackPointerRegister, OBJECT_OFFSETOF(NativeCallFrameStructure, callee)));1682 emitGetFromCallFrameHeaderPtr(RegisterFile::Callee, X86Registers::eax); 1683 storePtr(X86Registers::eax, Address(stackPointerRegister, OBJECT_OFFSETOF(NativeCallFrameStructure, callee))); 1684 1684 1685 1685 // Plant callframe 1686 move(callFrameRegister, X86 ::edx);1687 1688 call(Address(X86 ::eax, OBJECT_OFFSETOF(JSFunction, m_data)));1686 move(callFrameRegister, X86Registers::edx); 1687 1688 call(Address(X86Registers::eax, OBJECT_OFFSETOF(JSFunction, m_data))); 1689 1689 1690 1690 // JSValue is a non-POD type 1691 loadPtr(Address(X86 ::eax), X86::eax);1691 loadPtr(Address(X86Registers::eax), X86Registers::eax); 1692 1692 #else 1693 1693 // Plant callee 1694 emitGetFromCallFrameHeaderPtr(RegisterFile::Callee, X86 ::edx);1694 emitGetFromCallFrameHeaderPtr(RegisterFile::Callee, X86Registers::edx); 1695 1695 1696 1696 // Plant callframe 1697 move(callFrameRegister, X86 ::ecx);1698 call(Address(X86 ::edx, OBJECT_OFFSETOF(JSFunction, m_data)));1697 move(callFrameRegister, X86Registers::ecx); 1698 call(Address(X86Registers::edx, OBJECT_OFFSETOF(JSFunction, m_data))); 1699 1699 #endif 1700 1700 … … 1737 1737 1738 1738 // Setup arg4: This is a plain hack 1739 move(stackPointerRegister, ARM ::S0);1740 1741 move(ctiReturnRegister, ARM ::lr);1739 move(stackPointerRegister, ARMRegisters::S0); 1740 1741 move(ctiReturnRegister, ARMRegisters::lr); 1742 1742 call(Address(regT1, OBJECT_OFFSETOF(JSFunction, m_data))); 1743 1743
Note:
See TracChangeset
for help on using the changeset viewer.