[pypy-svn] r32106 - in pypy/dist/pypy/jit/codegen/i386: . test

arigo at codespeak.net arigo at codespeak.net
Sat Sep 9 14:10:24 CEST 2006


Author: arigo
Date: Sat Sep  9 14:10:23 2006
New Revision: 32106

Modified:
   pypy/dist/pypy/jit/codegen/i386/ri386genop.py
   pypy/dist/pypy/jit/codegen/i386/test/test_operation.py
Log:
Some more operations.  All "simple" operations listed in the lloperation
table are implemented.



Modified: pypy/dist/pypy/jit/codegen/i386/ri386genop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/i386/ri386genop.py	(original)
+++ pypy/dist/pypy/jit/codegen/i386/ri386genop.py	Sat Sep  9 14:10:23 2006
@@ -29,6 +29,9 @@
     def operand(self, builder):
         return builder.stack_access(self.stackpos)
 
+    def nonimmoperand(self, builder, tmpregister):
+        return self.operand(builder)
+
     def __repr__(self):
         return 'var@%d' % (self.stackpos,)
 
@@ -66,6 +69,10 @@
     def operand(self, builder):
         return imm(self.value)
 
+    def nonimmoperand(self, builder, tmpregister):
+        builder.mc.MOV(tmpregister, self.operand(builder))
+        return tmpregister
+
     @specialize.arg(1)
     def revealconst(self, T):
         if isinstance(T, lltype.Ptr):
@@ -96,6 +103,10 @@
     def operand(self, builder):
         return imm(llmemory.cast_adr_to_int(self.addr))
 
+    def nonimmoperand(self, builder, tmpregister):
+        builder.mc.MOV(tmpregister, self.operand(builder))
+        return tmpregister
+
     @specialize.arg(1)
     def revealconst(self, T):
         if T is llmemory.Address:
@@ -246,6 +257,9 @@
         else:
             return gv_x
 
+    def genop_debug_pdb(self):    # may take an args_gv later
+        self.mc.BREAKPOINT()
+
     def enter_next_block(self, kinds, args_gv):
         arg_positions = []
         seen = {}
@@ -323,10 +337,15 @@
     def op_int_floordiv(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.CDQ()
-        self.mc.MOV(ecx, gv_y.operand(self))
-        self.mc.IDIV(ecx)
+        self.mc.IDIV(gv_y.nonimmoperand(self, ecx))
         return self.returnvar(eax)
 
+    def op_int_mod(self, gv_x, gv_y):
+        self.mc.MOV(eax, gv_x.operand(self))
+        self.mc.CDQ()
+        self.mc.IDIV(gv_y.nonimmoperand(self, ecx))
+        return self.returnvar(edx)
+
     def op_int_and(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.AND(eax, gv_y.operand(self))
@@ -389,6 +408,16 @@
         self.mc.NEG(eax)
         return self.returnvar(eax)
 
+    def op_int_abs(self, gv_x):
+        self.mc.MOV(eax, gv_x.operand(self))
+        # ABS-computing code from Psyco, found by exhaustive search
+        # on *all* short sequences of operations :-)
+        self.mc.ADD(eax, eax)
+        self.mc.SBB(eax, gv_x.operand(self))
+        self.mc.SBB(edx, edx)
+        self.mc.XOR(eax, edx)
+        return self.returnvar(eax)
+
     def op_int_invert(self, gv_x):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.NOT(eax)
@@ -403,6 +432,72 @@
     def op_int_rshift(self, gv_x, gv_y):
         self.mc.MOV(eax, gv_x.operand(self))
         self.mc.MOV(ecx, gv_y.operand(self))
+        self.mc.SAR(eax, cl)
+        return self.returnvar(eax)
+
+    op_uint_is_true = op_int_is_true
+    op_uint_neg     = op_int_neg
+    op_uint_abs     = identity
+    op_uint_invert  = op_int_invert
+    op_uint_add     = op_int_add
+    op_uint_sub     = op_int_sub
+
+    def op_uint_mul(self, gv_x, gv_y):
+        self.mc.MOV(eax, gv_x.operand(self))
+        self.mc.MUL(gv_y.nonimmoperand(self, edx))
+        return self.returnvar(eax)
+
+    def op_uint_floordiv(self, gv_x, gv_y):
+        self.mc.MOV(eax, gv_x.operand(self))
+        self.mc.XOR(edx, edx)
+        self.mc.DIV(gv_y.nonimmoperand(self, ecx))
+        return self.returnvar(eax)
+
+    def op_uint_mod(self, gv_x, gv_y):
+        self.mc.MOV(eax, gv_x.operand(self))
+        self.mc.XOR(edx, edx)
+        self.mc.DIV(gv_y.nonimmoperand(self, ecx))
+        return self.returnvar(edx)
+
+    def op_uint_lt(self, gv_x, gv_y):
+        self.mc.MOV(eax, gv_x.operand(self))
+        self.mc.CMP(eax, gv_y.operand(self))
+        self.mc.SETB(al)
+        self.mc.MOVZX(eax, al)
+        return self.returnvar(eax)
+
+    def op_uint_le(self, gv_x, gv_y):
+        self.mc.MOV(eax, gv_x.operand(self))
+        self.mc.CMP(eax, gv_y.operand(self))
+        self.mc.SETBE(al)
+        self.mc.MOVZX(eax, al)
+        return self.returnvar(eax)
+
+    op_uint_eq = op_int_eq
+    op_uint_ne = op_int_ne
+
+    def op_uint_gt(self, gv_x, gv_y):
+        self.mc.MOV(eax, gv_x.operand(self))
+        self.mc.CMP(eax, gv_y.operand(self))
+        self.mc.SETA(al)
+        self.mc.MOVZX(eax, al)
+        return self.returnvar(eax)
+
+    def op_uint_ge(self, gv_x, gv_y):
+        self.mc.MOV(eax, gv_x.operand(self))
+        self.mc.CMP(eax, gv_y.operand(self))
+        self.mc.SETAE(al)
+        self.mc.MOVZX(eax, al)
+        return self.returnvar(eax)
+
+    op_uint_and    = op_int_and
+    op_uint_or     = op_int_or
+    op_uint_xor    = op_int_xor
+    op_uint_lshift = op_int_lshift
+
+    def op_uint_rshift(self, gv_x, gv_y):
+        self.mc.MOV(eax, gv_x.operand(self))
+        self.mc.MOV(ecx, gv_y.operand(self))
         self.mc.SHR(eax, cl)
         return self.returnvar(eax)
 
@@ -418,11 +513,31 @@
         self.mc.MOVZX(eax, al)
         return self.returnvar(eax)
 
-    op_cast_char_to_int = identity
+    op_cast_bool_to_uint   = op_cast_bool_to_int
+
+    op_cast_char_to_int    = identity
     op_cast_unichar_to_int = identity
+    op_cast_int_to_char    = identity
+    op_cast_int_to_unichar = identity
+    op_cast_int_to_uint    = identity
+    op_cast_uint_to_int    = identity
+    op_cast_ptr_to_int     = identity
+    op_cast_int_to_ptr     = identity
+
+    op_char_lt = op_int_lt
+    op_char_le = op_int_le
+    op_char_eq = op_int_eq
+    op_char_ne = op_int_ne
+    op_char_gt = op_int_gt
+    op_char_ge = op_int_ge
+
+    op_unichar_eq = op_int_eq
+    op_unichar_ne = op_int_ne
 
     op_ptr_nonzero = op_int_is_true
     op_ptr_iszero  = op_bool_not        # for now
+    op_ptr_eq      = op_int_eq
+    op_ptr_ne      = op_int_ne
 
 
 SIZE2SHIFT = {1: 0,

Modified: pypy/dist/pypy/jit/codegen/i386/test/test_operation.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/i386/test/test_operation.py	(original)
+++ pypy/dist/pypy/jit/codegen/i386/test/test_operation.py	Sat Sep  9 14:10:23 2006
@@ -56,6 +56,7 @@
                    lambda x, y: x - y,
                    lambda x, y: x * y,
                    lambda x, y: x // y,
+                   lambda x, y: x % y,
                    lambda x, y: x << y,
                    lambda x, y: x >> y,
                    lambda x, y: x ^ y,
@@ -63,9 +64,12 @@
                    lambda x, y: x | y,
                    lambda x, y: -y,
                    lambda x, y: ~y,
+                   lambda x, y: abs(y),
+                   lambda x, y: abs(-x),
                    ]:
             fp = self.rgen(fn, [int, int])
             assert fp(40, 2) == fn(40, 2)
+            assert fp(25, 3) == fn(25, 3)
 
     def test_comparison(self):
         for fn in [lambda x, y: int(x <  y),
@@ -73,7 +77,7 @@
                    lambda x, y: int(x == y),
                    lambda x, y: int(x != y),
                    lambda x, y: int(x >  y),
-                   lambda x, y: int(x >= y)
+                   lambda x, y: int(x >= y),
                    ]:
             fp = self.rgen(fn, [int, int])
             assert fp(12, 11) == fn(12, 11)
@@ -89,6 +93,46 @@
             assert fp(-12, -12) == fn(-12, -12)
             assert fp(-12, -13) == fn(-12, -13)
 
+    def test_char_comparison(self):
+        for fn in [lambda x, y: int(chr(x) <  chr(y)),
+                   lambda x, y: int(chr(x) <= chr(y)),
+                   lambda x, y: int(chr(x) == chr(y)),
+                   lambda x, y: int(chr(x) != chr(y)),
+                   lambda x, y: int(chr(x) >  chr(y)),
+                   lambda x, y: int(chr(x) >= chr(y)),
+                   ]:
+            fp = self.rgen(fn, [int, int])
+            assert fp(12, 11) == fn(12, 11)
+            assert fp(12, 12) == fn(12, 12)
+            assert fp(12, 13) == fn(12, 13)
+            assert fp(182, 11) == fn(182, 11)
+            assert fp(182, 12) == fn(182, 12)
+            assert fp(182, 13) == fn(182, 13)
+            assert fp(12, 181) == fn(12, 181)
+            assert fp(12, 182) == fn(12, 182)
+            assert fp(12, 183) == fn(12, 183)
+            assert fp(182, 181) == fn(182, 181)
+            assert fp(182, 182) == fn(182, 182)
+            assert fp(182, 183) == fn(182, 183)
+
+    def test_unichar_comparison(self):
+        for fn in [lambda x, y: int(unichr(x) == unichr(y)),
+                   lambda x, y: int(unichr(x) != unichr(y)),
+                   ]:
+            fp = self.rgen(fn, [int, int])
+            assert fp(12, 11) == fn(12, 11)
+            assert fp(12, 12) == fn(12, 12)
+            assert fp(12, 13) == fn(12, 13)
+            assert fp(53182, 11) == fn(53182, 11)
+            assert fp(53182, 12) == fn(53182, 12)
+            assert fp(53182, 13) == fn(53182, 13)
+            assert fp(12, 53181) == fn(12, 53181)
+            assert fp(12, 53182) == fn(12, 53182)
+            assert fp(12, 53183) == fn(12, 53183)
+            assert fp(53182, 53181) == fn(53182, 53181)
+            assert fp(53182, 53182) == fn(53182, 53182)
+            assert fp(53182, 53183) == fn(53182, 53183)
+
     def test_char_array(self):
         A = lltype.GcArray(lltype.Char)
         def fn(n):



More information about the Pypy-commit mailing list