Changeset 42969 in webkit for trunk/JavaScriptCore/jit/JITArithmetic.cpp
- Timestamp:
- Apr 28, 2009, 3:22:35 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/jit/JITArithmetic.cpp
r41275 r42969 45 45 using namespace std; 46 46 47 #if PLATFORM(MAC) 48 49 static inline bool isSSE2Present() 50 { 51 return true; // All X86 Macs are guaranteed to support at least SSE2 52 } 53 54 #else 55 56 static bool isSSE2Present() 57 { 58 static const int SSE2FeatureBit = 1 << 26; 59 struct SSE2Check { 60 SSE2Check() 61 { 62 int flags; 63 #if COMPILER(MSVC) 64 _asm { 65 mov eax, 1 // cpuid function 1 gives us the standard feature set 66 cpuid; 67 mov flags, edx; 68 } 69 #elif COMPILER(GCC) 70 asm ( 71 "movl $0x1, %%eax;" 72 "pushl %%ebx;" 73 "cpuid;" 74 "popl %%ebx;" 75 "movl %%edx, %0;" 76 : "=g" (flags) 77 : 78 : "%eax", "%ecx", "%edx" 79 ); 80 #else 81 flags = 0; 82 #endif 83 present = (flags & SSE2FeatureBit) != 0; 84 } 85 bool present; 86 }; 87 static SSE2Check check; 88 return check.present; 89 } 90 91 #endif 92 47 93 namespace JSC { 48 94 … … 103 149 } else { 104 150 emitGetVirtualRegisters(op1, regT0, op2, regT2); 105 emitJumpSlowCaseIfNotImmediateInteger(regT0); 151 if (isSSE2Present()) { 152 Jump lhsIsInt = emitJumpIfImmediateInteger(regT0); 153 #if USE(ALTERNATE_JSIMMEDIATE) 154 addSlowCase(emitJumpIfNotImmediateNumber(regT0)); 155 m_assembler.movq_rr(regT0, X86::xmm0); 156 #else 157 emitJumpSlowCaseIfNotJSCell(regT0, op1); 158 Structure* numberStructure = m_globalData->numberStructure.get(); 159 __ cmpl_im(reinterpret_cast<uintptr_t>(numberStructure), FIELD_OFFSET(JSCell, m_structure), regT0); 160 addSlowCase(__ jne()); 161 __ movsd_mr(FIELD_OFFSET(JSNumberCell, m_value), regT0, X86::xmm0); 162 #endif 163 __ cvttsd2si_rr(X86::xmm0, regT0); 164 addSlowCase(branch32(Equal, regT0, Imm32(0x80000000))); 165 add32(regT0, regT0); 166 addSlowCase(__ jo()); 167 lhsIsInt.link(this); 168 } else 169 emitJumpSlowCaseIfNotImmediateInteger(regT0); 106 170 emitJumpSlowCaseIfNotImmediateInteger(regT2); 107 171 emitFastArithImmToInt(regT2); … … 124 188 emitPutVirtualRegister(result); 125 189 } 126 void JIT::compileFastArithSlow_op_rshift(unsigned result, unsigned , unsigned op2, Vector<SlowCaseEntry>::iterator& iter)190 void JIT::compileFastArithSlow_op_rshift(unsigned result, unsigned op1, unsigned op2, Vector<SlowCaseEntry>::iterator& iter) 127 191 { 128 192 linkSlowCase(iter); … … 130 194 emitPutJITStubArgFromVirtualRegister(op2, 2, regT2); 131 195 else { 132 linkSlowCase(iter); 196 if (isSSE2Present()) { 197 linkSlowCase(iter); 198 linkSlowCase(iter); 199 linkSlowCase(iter); 200 #if !USE(ALTERNATE_JSIMMEDIATE) 201 linkSlowCase(iter); 202 #endif 203 emitGetVirtualRegister(op1, regT0); 204 } else 205 linkSlowCase(iter); 133 206 emitPutJITStubArg(regT2, 2); 134 207 } … … 600 673 typedef X86Assembler::XMMRegisterID XMMRegisterID; 601 674 602 #if PLATFORM(MAC)603 604 static inline bool isSSE2Present()605 {606 return true; // All X86 Macs are guaranteed to support at least SSE2607 }608 609 #else610 611 static bool isSSE2Present()612 {613 static const int SSE2FeatureBit = 1 << 26;614 struct SSE2Check {615 SSE2Check()616 {617 int flags;618 #if COMPILER(MSVC)619 _asm {620 mov eax, 1 // cpuid function 1 gives us the standard feature set621 cpuid;622 mov flags, edx;623 }624 #elif COMPILER(GCC)625 asm (626 "movl $0x1, %%eax;"627 "pushl %%ebx;"628 "cpuid;"629 "popl %%ebx;"630 "movl %%edx, %0;"631 : "=g" (flags)632 :633 : "%eax", "%ecx", "%edx"634 );635 #else636 flags = 0;637 #endif638 present = (flags & SSE2FeatureBit) != 0;639 }640 bool present;641 };642 static SSE2Check check;643 return check.present;644 }645 646 #endif647 675 648 676 void JIT::compileBinaryArithOp(OpcodeID opcodeID, unsigned dst, unsigned src1, unsigned src2, OperandTypes types)
Note:
See TracChangeset
for help on using the changeset viewer.