[pypy-svn] r68055 - pypy/branch/floats-via-sse2/pypy/jit/backend/x86
fijal at codespeak.net
fijal at codespeak.net
Wed Sep 30 21:37:41 CEST 2009
Author: fijal
Date: Wed Sep 30 21:37:39 2009
New Revision: 68055
Modified:
pypy/branch/floats-via-sse2/pypy/jit/backend/x86/assembler.py
pypy/branch/floats-via-sse2/pypy/jit/backend/x86/regalloc.py
pypy/branch/floats-via-sse2/pypy/jit/backend/x86/ri386setup.py
Log:
float_abs & float_int_is_true, magic thx to gcc
Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/x86/assembler.py (original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/x86/assembler.py Wed Sep 30 21:37:39 2009
@@ -419,6 +419,18 @@
def genop_float_neg(self, op, arglocs, resloc):
self.mc.XORPD(arglocs[0], arglocs[1])
+ def genop_float_abs(self, op, arglocs, resloc):
+ self.mc.ANDPD(arglocs[0], arglocs[1])
+
+ def genop_float_is_true(self, op, arglocs, resloc):
+ loc0, loc1, loc2 = arglocs
+ self.mc.XORPD(loc0, loc0)
+ self.mc.UCOMISD(loc1, loc0)
+ self.mc.SETNE(lower_byte(resloc))
+ self.mc.SETP(lower_byte(loc2))
+ self.mc.OR(resloc, loc2)
+ self.mc.MOVZX(resloc, lower_byte(resloc))
+
def genop_bool_not(self, op, arglocs, resloc):
self.mc.XOR(arglocs[0], imm8(1))
Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/x86/regalloc.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/x86/regalloc.py (original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/x86/regalloc.py Wed Sep 30 21:37:39 2009
@@ -53,9 +53,11 @@
BASE_CONSTANT_SIZE = 1000
# cheat cheat cheat....
-# XXX why not -0.0? People tell me it's platform-dependent
+# why not -0.0? People tell me it's platform-dependent
+# nan is not portable
import struct
NEG_ZERO, = struct.unpack('d', struct.pack('ll', 0, -2147483648))
+NAN, = struct.unpack('d', struct.pack('ll', -1, 2147483647))
class X86XMMRegisterManager(RegisterManager):
@@ -73,7 +75,8 @@
RegisterManager.__init__(self, *args, **kwds)
self.constant_arrays = [self.new_const_array()]
self.constant_arrays[-1][0] = NEG_ZERO
- self.constant_array_counter = 1
+ self.constant_arrays[-1][1] = NAN
+ self.constant_array_counter = 2
def convert_to_imm(self, c):
if self.constant_array_counter >= BASE_CONSTANT_SIZE:
@@ -518,6 +521,28 @@
self.xrm.possibly_free_var(op.args[0])
def consider_float_abs(self, op, ignored):
+ loc0 = self.xrm.force_result_in_reg(op.result, op.args[0])
+ constloc = self.xrm.get_addr_of_const_float(0, 1)
+ tmpbox = TempBox()
+ loc1 = self.xrm.force_allocate_reg(tmpbox, op.args)
+ self.assembler.regalloc_mov(constloc, loc1)
+ self.Perform(op, [loc0, loc1], loc0)
+ self.xrm.possibly_free_var(tmpbox)
+ self.xrm.possibly_free_var(op.args[0])
+
+ def consider_float_is_true(self, op, ignored):
+ tmpbox0 = TempBox()
+ tmpbox1 = TempBox()
+ loc0 = self.xrm.force_allocate_reg(tmpbox0)
+ loc1 = self.xrm.loc(op.args[0])
+ loc2 = self.rm.force_allocate_reg(tmpbox1, need_lower_byte=True)
+ loc3 = self.rm.force_allocate_reg(op.result, need_lower_byte=True)
+ self.Perform(op, [loc0, loc1, loc2], loc3)
+ self.rm.possibly_free_var(tmpbox1)
+ self.xrm.possibly_free_var(op.args[0])
+ self.xrm.possibly_free_var(tmpbox0)
+
+ def consider_cast_float_to_int(self, op, ignored):
xxx
def _call(self, op, arglocs, force_store=[]):
Modified: pypy/branch/floats-via-sse2/pypy/jit/backend/x86/ri386setup.py
==============================================================================
--- pypy/branch/floats-via-sse2/pypy/jit/backend/x86/ri386setup.py (original)
+++ pypy/branch/floats-via-sse2/pypy/jit/backend/x86/ri386setup.py Wed Sep 30 21:37:39 2009
@@ -530,6 +530,10 @@
XORPD = Instruction()
XORPD.mode2(XMMREG, XMMREG, ['\x66\x0f\x57', register(1, 8), register(2),
+ '\xC0'])
+
+ANDPD = Instruction()
+ANDPD.mode2(XMMREG, XMMREG, ['\x66\x0F\x54', register(1, 8), register(2),
'\xC0'])
# ------------------------------ end of SSE2 -----------------------------
More information about the Pypy-commit
mailing list