Changeset 42978 in webkit for trunk/JavaScriptCore/jit/JITArithmetic.cpp
- Timestamp:
- Apr 28, 2009, 6:24:00 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/jit/JITArithmetic.cpp
r42969 r42978 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 SSE252 }53 54 #else55 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 set66 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 #else81 flags = 0;82 #endif83 present = (flags & SSE2FeatureBit) != 0;84 }85 bool present;86 };87 static SSE2Check check;88 return check.present;89 }90 91 #endif92 93 47 namespace JSC { 94 48 … … 149 103 } else { 150 104 emitGetVirtualRegisters(op1, regT0, op2, regT2); 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); 105 emitJumpSlowCaseIfNotImmediateInteger(regT0); 170 106 emitJumpSlowCaseIfNotImmediateInteger(regT2); 171 107 emitFastArithImmToInt(regT2); … … 188 124 emitPutVirtualRegister(result); 189 125 } 190 void JIT::compileFastArithSlow_op_rshift(unsigned result, unsigned op1, unsigned op2, Vector<SlowCaseEntry>::iterator& iter)126 void JIT::compileFastArithSlow_op_rshift(unsigned result, unsigned, unsigned op2, Vector<SlowCaseEntry>::iterator& iter) 191 127 { 192 128 linkSlowCase(iter); … … 194 130 emitPutJITStubArgFromVirtualRegister(op2, 2, regT2); 195 131 else { 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); 132 linkSlowCase(iter); 206 133 emitPutJITStubArg(regT2, 2); 207 134 } … … 673 600 typedef X86Assembler::XMMRegisterID XMMRegisterID; 674 601 602 #if PLATFORM(MAC) 603 604 static inline bool isSSE2Present() 605 { 606 return true; // All X86 Macs are guaranteed to support at least SSE2 607 } 608 609 #else 610 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 set 621 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 #else 636 flags = 0; 637 #endif 638 present = (flags & SSE2FeatureBit) != 0; 639 } 640 bool present; 641 }; 642 static SSE2Check check; 643 return check.present; 644 } 645 646 #endif 675 647 676 648 void JIT::compileBinaryArithOp(OpcodeID opcodeID, unsigned dst, unsigned src1, unsigned src2, OperandTypes types)
Note:
See TracChangeset
for help on using the changeset viewer.