Ignore:
Timestamp:
Apr 28, 2009, 3:22:35 PM (16 years ago)
Author:
[email protected]
Message:

Improve performance of right shifts of large or otherwise floating point values.

Reviewed by Geoff Garen.

Add logic to the codegen for right shift to avoid jumping to a helper function
when shifting a small floating point value.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/jit/JITArithmetic.cpp

    r41275 r42969  
    4545using namespace std;
    4646
     47#if PLATFORM(MAC)
     48
     49static inline bool isSSE2Present()
     50{
     51    return true; // All X86 Macs are guaranteed to support at least SSE2
     52}
     53
     54#else
     55
     56static 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
    4793namespace JSC {
    4894
     
    103149    } else {
    104150        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);
    106170        emitJumpSlowCaseIfNotImmediateInteger(regT2);
    107171        emitFastArithImmToInt(regT2);
     
    124188    emitPutVirtualRegister(result);
    125189}
    126 void JIT::compileFastArithSlow_op_rshift(unsigned result, unsigned, unsigned op2, Vector<SlowCaseEntry>::iterator& iter)
     190void JIT::compileFastArithSlow_op_rshift(unsigned result, unsigned op1, unsigned op2, Vector<SlowCaseEntry>::iterator& iter)
    127191{
    128192    linkSlowCase(iter);
     
    130194        emitPutJITStubArgFromVirtualRegister(op2, 2, regT2);
    131195    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);
    133206        emitPutJITStubArg(regT2, 2);
    134207    }
     
    600673typedef X86Assembler::XMMRegisterID XMMRegisterID;
    601674
    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
    647675
    648676void JIT::compileBinaryArithOp(OpcodeID opcodeID, unsigned dst, unsigned src1, unsigned src2, OperandTypes types)
Note: See TracChangeset for help on using the changeset viewer.