[prev in list] [next in list] [prev in thread] [next in thread]
List: pypy-svn
Subject: [pypy-svn] r53208 - in
From: fijal () codespeak ! net
Date: 2008-03-31 17:56:19
Message-ID: 20080331175619.E0207168467 () codespeak ! net
[Download RAW message or body]
Author: fijal
Date: Mon Mar 31 19:56:16 2008
New Revision: 53208
Modified:
pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/rgenop.py
pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/test/test_operation.py
Log:
support for float comparisons + some small fixes in naming scheme
Modified: pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/rgenop.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/rgenop.py (original)
+++ pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/rgenop.py Mon Mar 31 19:56:16 2008
@@ -147,6 +147,8 @@
class FloatConst(Const):
def __init__(self, floatval):
+ # XXX we should take more care who is creating this and
+ # eventually release this buffer
# never moves and never dies
self.rawbuf = lltype.malloc(rffi.DOUBLEP.TO, 1, flavor='raw',
immortal=True)
@@ -629,12 +631,6 @@
self.push(eax)
return res
- def returnboolfloatvar(self):
- self.mc.FSTSW()
- self.mc.SAHF()
- self.mc.SETNZ(al)
- return self.returnboolvar(al)
-
def returnfloatvar(self, op):
res = FloatVar(self.stackdepth + 1)
self.pushfloat(res)
@@ -876,25 +872,25 @@
def op_float_add(self, gv_x, gv_y):
self.mc.FLDL(gv_y.operand(self))
self.mc.FLDL(gv_x.operand(self))
- self.mc.FADD()
+ self.mc.FADDP()
return self.returnfloatvar(st0)
def op_float_sub(self, gv_x, gv_y):
- self.mc.FLDL(gv_x.operand(self))
self.mc.FLDL(gv_y.operand(self))
- self.mc.FSUB()
+ self.mc.FLDL(gv_x.operand(self))
+ self.mc.FSUBP()
return self.returnfloatvar(st0)
def op_float_mul(self, gv_x, gv_y):
self.mc.FLDL(gv_x.operand(self))
self.mc.FLDL(gv_y.operand(self))
- self.mc.FMUL()
+ self.mc.FMULP()
return self.returnfloatvar(st0)
def op_float_truediv(self, gv_x, gv_y):
- self.mc.FLDL(gv_x.operand(self))
self.mc.FLDL(gv_y.operand(self))
- self.mc.FDIV()
+ self.mc.FLDL(gv_x.operand(self))
+ self.mc.FDIVP()
return self.returnfloatvar(st0)
def op_float_neg(self, gv_x):
@@ -910,7 +906,51 @@
def op_float_is_true(self, gv_x):
self.mc.FLDL(gv_x.operand(self))
self.mc.FTST()
- return self.returnboolfloatvar()
+ self.mc.FNSTSW()
+ self.mc.SAHF()
+ self.mc.SETNZ(al)
+ return self.returnboolvar(al)
+
+ def _load_float_ctword(self, gv_x, gv_y):
+ self.mc.FLDL(gv_x.operand(self))
+ self.mc.FLDL(gv_y.operand(self))
+ self.mc.FUCOMPP()
+ self.mc.FNSTSW()
+
+ @specialize.arg(3)
+ def _float_compare(self, gv_x, gv_y, immval):
+ self._load_float_ctword(gv_x, gv_y)
+ self.mc.TEST(ah, imm8(immval))
+ self.mc.SETE(al)
+ return self.returnboolvar(al)
+
+ def op_float_lt(self, gv_x, gv_y):
+ return self._float_compare(gv_x, gv_y, 69)
+
+ def op_float_le(self, gv_x, gv_y):
+ return self._float_compare(gv_x, gv_y, 5)
+
+ def op_float_eq(self, gv_x, gv_y):
+ self._load_float_ctword(gv_x, gv_y)
+ self.mc.SAHF()
+ self.mc.SETE(al)
+ self.mc.SETNP(dl)
+ self.mc.AND(edx, eax)
+ return self.returnboolvar(al)
+
+ def op_float_ne(self, gv_x, gv_y):
+ self._load_float_ctword(gv_x, gv_y)
+ self.mc.SAHF()
+ self.mc.SETNE(al)
+ self.mc.SETP(dl)
+ self.mc.OR(edx, eax)
+ return self.returnboolvar(al)
+
+ def op_float_gt(self, gv_x, gv_y):
+ return self._float_compare(gv_y, gv_x, 69)
+
+ def op_float_ge(self, gv_x, gv_y):
+ return self._float_compare(gv_y, gv_x, 5)
SIZE2SHIFT = {1: 0,
2: 1,
Modified: pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/test/test_operation.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/test/test_operation.py (original)
+++ pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/test/test_operation.py Mon Mar 31 19:56:16 2008
@@ -45,6 +45,5 @@
class TestOperation(I386TestMixin, OperationTests):
pass
-
# for the individual tests see
# ====> ../../test/operation_tests.py
_______________________________________________
pypy-svn mailing list
pypy-svn@codespeak.net
http://codespeak.net/mailman/listinfo/pypy-svn
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic