[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