sourcepawn/jit/x86/jit_x86.cpp
changeset 3979 bdad6d9c8351
parent 3977 fca2b54741ca
child 3982 be7835a7c28f
     1.1 --- a/sourcepawn/jit/x86/jit_x86.cpp	Thu Aug 08 20:21:37 2013 -0700
     1.2 +++ b/sourcepawn/jit/x86/jit_x86.cpp	Thu Aug 08 20:26:36 2013 -0700
     1.3 @@ -983,10 +983,15 @@
     1.4        break;
     1.5  
     1.6      case OP_FLOAT:
     1.7 -      __ fild32(Operand(edi, 0));
     1.8 -      __ subl(esp, 4);
     1.9 -      __ fstp32(Operand(esp, 0));
    1.10 -      __ pop(pri);
    1.11 +      if (MacroAssemblerX86::Features().sse2) {
    1.12 +        __ cvtsi2ss(xmm0, Operand(edi, 0));
    1.13 +        __ movd(pri, xmm0);
    1.14 +      } else {
    1.15 +        __ fild32(Operand(edi, 0));
    1.16 +        __ subl(esp, 4);
    1.17 +        __ fstp32(Operand(esp, 0));
    1.18 +        __ pop(pri);
    1.19 +      }
    1.20        __ addl(stk, 4);
    1.21        break;
    1.22  
    1.23 @@ -994,34 +999,52 @@
    1.24      case OP_FLOATSUB:
    1.25      case OP_FLOATMUL:
    1.26      case OP_FLOATDIV:
    1.27 -      __ subl(esp, 4);
    1.28 -      __ fld32(Operand(edi, 0));
    1.29 +      if (MacroAssemblerX86::Features().sse2) {
    1.30 +        __ movss(xmm0, Operand(stk, 0));
    1.31 +        if (op == OP_FLOATADD)
    1.32 +          __ addss(xmm0, Operand(stk, 4));
    1.33 +        else if (op == OP_FLOATSUB)
    1.34 +          __ subss(xmm0, Operand(stk, 4));
    1.35 +        else if (op == OP_FLOATMUL)
    1.36 +          __ mulss(xmm0, Operand(stk, 4));
    1.37 +        else if (op == OP_FLOATDIV)
    1.38 +          __ divss(xmm0, Operand(stk, 4));
    1.39 +        __ movd(pri, xmm0);
    1.40 +      } else {
    1.41 +        __ subl(esp, 4);
    1.42 +        __ fld32(Operand(stk, 0));
    1.43  
    1.44 -      if (op == OP_FLOATADD)
    1.45 -        __ fadd32(Operand(edi, 4));
    1.46 -      else if (op == OP_FLOATSUB)
    1.47 -        __ fsub32(Operand(edi, 4));
    1.48 -      else if (op == OP_FLOATMUL)
    1.49 -        __ fmul32(Operand(edi, 4));
    1.50 -      else if (op == OP_FLOATDIV)
    1.51 -        __ fdiv32(Operand(edi, 4));
    1.52 +        if (op == OP_FLOATADD)
    1.53 +          __ fadd32(Operand(stk, 4));
    1.54 +        else if (op == OP_FLOATSUB)
    1.55 +          __ fsub32(Operand(stk, 4));
    1.56 +        else if (op == OP_FLOATMUL)
    1.57 +          __ fmul32(Operand(stk, 4));
    1.58 +        else if (op == OP_FLOATDIV)
    1.59 +          __ fdiv32(Operand(stk, 4));
    1.60  
    1.61 -      __ fstp32(Operand(esp, 0));
    1.62 -      __ pop(pri);
    1.63 +        __ fstp32(Operand(esp, 0));
    1.64 +        __ pop(pri);
    1.65 +      }
    1.66        __ addl(stk, 8);
    1.67        break;
    1.68  
    1.69      case OP_RND_TO_NEAREST:
    1.70      {
    1.71 -      static float kRoundToNearest = 0.5f;
    1.72 -      // From http://wurstcaptures.untergrund.net/assembler_tricks.html#fastfloorf
    1.73 -      __ fld32(Operand(edi, 0));
    1.74 -      __ fadd32(st0, st0);
    1.75 -      __ fadd32(Operand(ExternalAddress(&kRoundToNearest)));
    1.76 -      __ subl(esp, 4);
    1.77 -      __ fistp32(Operand(esp, 0));
    1.78 -      __ pop(pri);
    1.79 -      __ sarl(pri, 1);
    1.80 +      if (MacroAssemblerX86::Features().sse) {
    1.81 +        // Assume no one is touching MXCSR.
    1.82 +        __ cvtss2si(pri, Operand(stk, 0));
    1.83 +      } else {
    1.84 +        static float kRoundToNearest = 0.5f;
    1.85 +        // From http://wurstcaptures.untergrund.net/assembler_tricks.html#fastfloorf
    1.86 +        __ fld32(Operand(stk, 0));
    1.87 +        __ fadd32(st0, st0);
    1.88 +        __ fadd32(Operand(ExternalAddress(&kRoundToNearest)));
    1.89 +        __ subl(esp, 4);
    1.90 +        __ fistp32(Operand(esp, 0));
    1.91 +        __ pop(pri);
    1.92 +        __ sarl(pri, 1);
    1.93 +      }
    1.94        __ addl(stk, 4);
    1.95        break;
    1.96      }
    1.97 @@ -1030,7 +1053,7 @@
    1.98      {
    1.99        static float kRoundToCeil = -0.5f;
   1.100        // From http://wurstcaptures.untergrund.net/assembler_tricks.html#fastfloorf
   1.101 -      __ fld32(Operand(edi, 0));
   1.102 +      __ fld32(Operand(stk, 0));
   1.103        __ fadd32(st0, st0);
   1.104        __ fsubr32(Operand(ExternalAddress(&kRoundToCeil)));
   1.105        __ subl(esp, 4);
   1.106 @@ -1043,15 +1066,19 @@
   1.107      }
   1.108  
   1.109      case OP_RND_TO_ZERO:
   1.110 -      __ fld32(Operand(edi, 0));
   1.111 -      __ subl(esp, 8);
   1.112 -      __ fstcw(Operand(esp, 4));
   1.113 -      __ movl(Operand(esp, 0), 0xfff);
   1.114 -      __ fldcw(Operand(esp, 0));
   1.115 -      __ fistp32(Operand(esp, 0));
   1.116 -      __ pop(pri);
   1.117 -      __ fldcw(Operand(esp, 0));
   1.118 -      __ addl(esp, 4);
   1.119 +      if (MacroAssemblerX86::Features().sse) {
   1.120 +        __ cvttss2si(pri, Operand(stk, 0));
   1.121 +      } else {
   1.122 +        __ fld32(Operand(stk, 0));
   1.123 +        __ subl(esp, 8);
   1.124 +        __ fstcw(Operand(esp, 4));
   1.125 +        __ movl(Operand(esp, 0), 0xfff);
   1.126 +        __ fldcw(Operand(esp, 0));
   1.127 +        __ fistp32(Operand(esp, 0));
   1.128 +        __ pop(pri);
   1.129 +        __ fldcw(Operand(esp, 0));
   1.130 +        __ addl(esp, 4);
   1.131 +      }
   1.132        __ addl(stk, 4);
   1.133        break;
   1.134  
   1.135 @@ -1071,10 +1098,15 @@
   1.136      case OP_FLOATCMP:
   1.137      {
   1.138        Label bl, ab, done;
   1.139 -      __ fld32(Operand(edi, 0));
   1.140 -      __ fld32(Operand(edi, 4));
   1.141 -      __ fucomip(st1);
   1.142 -      __ fstp(st0);
   1.143 +      if (MacroAssemblerX86::Features().sse) {
   1.144 +        __ movss(xmm0, Operand(stk, 4));
   1.145 +        __ ucomiss(xmm0, Operand(stk, 0));
   1.146 +      } else {
   1.147 +        __ fld32(Operand(stk, 0));
   1.148 +        __ fld32(Operand(stk, 4));
   1.149 +        __ fucomip(st1);
   1.150 +        __ fstp(st0);
   1.151 +      }
   1.152        __ j(above, &ab);
   1.153        __ j(below, &bl);
   1.154        __ xorl(pri, pri);
   1.155 @@ -1869,6 +1901,14 @@
   1.156    if (!m_pJitGenArray)
   1.157      return false;
   1.158  
   1.159 +  MacroAssemblerX86 masm;
   1.160 +  MacroAssemblerX86::GenerateFeatureDetection(masm);
   1.161 +  void *code = LinkCode(masm);
   1.162 +  if (!code)
   1.163 +    return false;
   1.164 +  MacroAssemblerX86::RunFeatureDetection(code);
   1.165 +  KE_FreeCode(g_pCodeCache, code);
   1.166 +
   1.167    return true;
   1.168  }
   1.169