[pypy-svn] r53276 - in pypy/branch/jit-hotpath/pypy/jit/codegen/ia32: . test

fijal at codespeak.net fijal at codespeak.net
Thu Apr 3 08:46:36 CEST 2008


Author: fijal
Date: Thu Apr  3 08:46:36 2008
New Revision: 53276

Modified:
   pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/rgenop.py
   pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/test/test_rgenop.py
Log:
Overflow support


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	Thu Apr  3 08:46:36 2008
@@ -295,6 +295,22 @@
         targetbuilder._open()
         return targetbuilder
 
+def _create_ovf_one_version(opname, flag):
+    def op_ovf(self, gv_x):
+        gv = getattr(self, opname)(gv_x)
+        getattr(self.mc, 'SET' + flag)(al)
+        return gv, self.returnboolvar(al)
+    op_ovf.func_name = opname + '_ovf'
+    return op_ovf
+
+def _create_ovf_two_version(opname, flag):
+    def op_ovf(self, gv_x, gv_y):
+        gv = getattr(self, opname)(gv_x, gv_y)
+        getattr(self.mc, 'SET' + flag)(al)
+        return gv, self.returnboolvar(al)
+    op_ovf.func_name = opname + '_ovf'
+    return op_ovf
+
 class Builder(GenBuilder):
 
     def __init__(self, rgenop, stackdepth):
@@ -426,6 +442,11 @@
         genmethod = getattr(self, 'op_' + opname)
         return genmethod(gv_arg1, gv_arg2)
 
+    @specialize.arg(1)
+    def genraisingop1(self, opname, gv_arg):
+        genmethod = getattr(self, 'op_' + opname)
+        return genmethod(gv_arg)
+
     def genop_getfield(self, (offset, fieldsize), gv_ptr):
         self.mc.MOV(edx, gv_ptr.operand(self))
         if fieldsize == WORD:
@@ -693,22 +714,22 @@
         self.mc.ADD(eax, gv_y.operand(self))
         return self.returnintvar(eax)
 
-    def op_int_add_ovf(self, gv_x, gv_y):
-        self.mc.MOV(eax, gv_x.operand(self))
-        self.mc.ADD(eax, gv_y.operand(self))
-        self.mc.SETO(dl)
-        return self.returnintvar(eax), self.returnboolvar(dl)
+    op_int_add_ovf = _create_ovf_two_version('op_int_add', 'O')
 
     def op_int_sub(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.SUB(eax, gv_y.operand(self))
         return self.returnintvar(eax)
 
+    op_int_sub_ovf = _create_ovf_two_version('op_int_sub', 'O')
+
     def op_int_mul(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.IMUL(eax, gv_y.operand(self))
         return self.returnintvar(eax)
 
+    op_int_mul_ovf = _create_ovf_two_version('op_int_mul', 'O')
+
     def op_int_floordiv(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.CDQ()
@@ -777,7 +798,10 @@
         self.mc.NEG(eax)
         return self.returnintvar(eax)
 
+    op_int_neg_ovf = _create_ovf_one_version('op_int_neg', 'O')
+
     def op_int_abs(self, gv_x):
+        # XXX cannot we employ fp unit to do that for us? :)
         self.mc.MOV(eax, gv_x.operand(self))
         # ABS-computing code from Psyco, found by exhaustive search
         # on *all* short sequences of operations :-)
@@ -787,6 +811,8 @@
         self.mc.XOR(eax, edx)
         return self.returnintvar(eax)
 
+    op_int_abs_ovf = _create_ovf_one_version('op_int_abs', 'L')
+
     def op_int_invert(self, gv_x):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.NOT(eax)

Modified: pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/test/test_rgenop.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/test/test_rgenop.py	(original)
+++ pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/test/test_rgenop.py	Thu Apr  3 08:46:36 2008
@@ -21,10 +21,6 @@
     test_read_frame_place_direct = skipped
     test_frame_vars_like_the_frontend_direct = skipped
 
-    # overflow
-    test_ovfcheck1_direct = skipped
-    test_ovfcheck2_direct = skipped
-
     # lltype.Address in function arguments
     test_demo_f1_direct = skipped
 


More information about the pypy-svn mailing list