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