[pypy-svn] r36595 - in pypy/dist/pypy/jit/codegen: ppc ppc/test test
mwh at codespeak.net
mwh at codespeak.net
Fri Jan 12 17:54:48 CET 2007
Author: mwh
Date: Fri Jan 12 17:54:47 2007
New Revision: 36595
Modified:
pypy/dist/pypy/jit/codegen/ppc/instruction.py
pypy/dist/pypy/jit/codegen/ppc/rgenop.py
pypy/dist/pypy/jit/codegen/ppc/test/test_rgenop.py
pypy/dist/pypy/jit/codegen/test/rgenop_tests.py
Log:
(niko, mwh)
So cmp2info_flipped was mostly wrong. Fix that, and another bug that only
caused doing some work over and over again, and add a skipped test to do with
passing variables in the condition register across basic blocks which fails.
Modified: pypy/dist/pypy/jit/codegen/ppc/instruction.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/ppc/instruction.py (original)
+++ pypy/dist/pypy/jit/codegen/ppc/instruction.py Fri Jan 12 17:54:47 2007
@@ -257,6 +257,7 @@
self.arg_reg = allocator.loc_of(self.reg_args[0])
def emit(self, asm):
+ #print "CMPWI", asm.mc.tell()
asm.cmpwi(self.result_reg.number, self.arg_reg.number, self.imm.value)
class CMPWLI(CMPW):
Modified: pypy/dist/pypy/jit/codegen/ppc/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/ppc/rgenop.py (original)
+++ pypy/dist/pypy/jit/codegen/ppc/rgenop.py Fri Jan 12 17:54:47 2007
@@ -454,12 +454,16 @@
if self.final_jump_addr != 0:
mc = self.rgenop.open_mc()
target = mc.tell()
- self.asm.mc = self.rgenop.ExistingCodeBlock(self.final_jump_addr, self.final_jump_addr+8)
+ self.asm.mc = self.rgenop.ExistingCodeBlock(
+ self.final_jump_addr, self.final_jump_addr+8)
self.asm.load_word(rSCRATCH, target)
self.asm.mc = mc
+ self.final_jump_addr = 0
+ self.closed = False
return self
else:
self._open()
+ self.closed = False
self.maybe_patch_start_here()
return self
@@ -475,6 +479,7 @@
self.initial_var2loc = self.allocate_and_emit(args_gv).var2loc
self.insns = []
self.final_jump_addr = self.asm.mc.tell()
+ self.closed = True
self.asm.nop()
self.asm.nop()
self.asm.mtctr(rSCRATCH)
@@ -666,10 +671,10 @@
cmp2info_flipped = {
# bit-in-crf negated
- 'gt': ( 1, 1 ),
- 'lt': ( 0, 1 ),
- 'le': ( 1, 0 ),
- 'ge': ( 0, 0 ),
+ 'gt': ( 0, 0 ),
+ 'lt': ( 1, 0 ),
+ 'le': ( 0, 1 ),
+ 'ge': ( 1, 1 ),
'eq': ( 2, 0 ),
'ne': ( 2, 1 ),
}
Modified: pypy/dist/pypy/jit/codegen/ppc/test/test_rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/ppc/test/test_rgenop.py (original)
+++ pypy/dist/pypy/jit/codegen/ppc/test/test_rgenop.py Fri Jan 12 17:54:47 2007
@@ -1,7 +1,7 @@
import py
from pypy.jit.codegen.ppc.rgenop import RPPCGenOp
from pypy.rpython.lltypesystem import lltype
-from pypy.jit.codegen.test.rgenop_tests import AbstractRGenOpTests, FUNC2
+from pypy.jit.codegen.test.rgenop_tests import AbstractRGenOpTests, FUNC, FUNC2
from ctypes import cast, c_int, c_void_p, CFUNCTYPE
from pypy.jit.codegen.ppc import instruction as insn
@@ -58,6 +58,53 @@
res = fnptr(2, 1)
assert res == 100101
+ def test_flipped_cmpwi(self):
+ # return
+ # 1>x + 10*(1<x) + 100*(1>=x) + 1000*(1<=x) + 10000*(1==x) + 100000*(1!=x)
+ rgenop = self.RGenOp()
+ signed_kind = rgenop.kindToken(lltype.Signed)
+ sigtoken = rgenop.sigToken(FUNC)
+ builder, gv_callable, [gv_x] = rgenop.newgraph(sigtoken,
+ "multicmp")
+ gv_one = rgenop.genconst(1)
+
+ gv_gt = builder.genop2("int_gt", gv_one, gv_x)
+ gv_lt = builder.genop2("int_lt", gv_one, gv_x)
+ gv_ge = builder.genop2("int_ge", gv_one, gv_x)
+ gv_le = builder.genop2("int_le", gv_one, gv_x)
+ gv_eq = builder.genop2("int_eq", gv_one, gv_x)
+ gv_ne = builder.genop2("int_ne", gv_one, gv_x)
+
+ gv_gt2 = gv_gt
+ gv_lt2 = builder.genop2("int_mul", rgenop.genconst(10), gv_lt)
+ gv_ge2 = builder.genop2("int_mul", rgenop.genconst(100), gv_ge)
+ gv_le2 = builder.genop2("int_mul", rgenop.genconst(1000), gv_le)
+ gv_eq2 = builder.genop2("int_mul", rgenop.genconst(10000), gv_eq)
+ gv_ne2 = builder.genop2("int_mul", rgenop.genconst(100000), gv_ne)
+
+ gv_r0 = gv_gt
+ gv_r1 = builder.genop2("int_add", gv_r0, gv_lt2)
+ gv_r2 = builder.genop2("int_add", gv_r1, gv_ge2)
+ gv_r3 = builder.genop2("int_add", gv_r2, gv_le2)
+ gv_r4 = builder.genop2("int_add", gv_r3, gv_eq2)
+ gv_r5 = builder.genop2("int_add", gv_r4, gv_ne2)
+
+ builder.finish_and_return(sigtoken, gv_r5)
+ builder.end()
+ fnptr = cast(c_void_p(gv_callable.value), CFUNCTYPE(c_int))
+
+ res = fnptr(0)
+ assert res == 100101
+
+ res = fnptr(1)
+ assert res == 11100
+
+ res = fnptr(2)
+ assert res == 101010
+
+ def test_longwinded_and_direct(self):
+ py.test.skip("failing right now")
+
class TestRPPCGenopNoRegs(TestRPPCGenop):
RGenOp = FewRegisters
Modified: pypy/dist/pypy/jit/codegen/test/rgenop_tests.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/test/rgenop_tests.py (original)
+++ pypy/dist/pypy/jit/codegen/test/rgenop_tests.py Fri Jan 12 17:54:47 2007
@@ -366,7 +366,44 @@
keepalive_until_here(rgenop) # to keep the code blocks alive
return res
return runner
-
+
+def make_longwinded_and(rgenop):
+ # def f(y): return 2 <= y <= 4
+ # but more like this:
+ # def f(y)
+ # x = 2 <= y
+ # if x:
+ # x = y <= 4
+ # if x:
+ # return 1
+ # else:
+ # return 0
+
+ signed_kind = rgenop.kindToken(lltype.Signed)
+ sigtoken = rgenop.sigToken(FUNC)
+ builder, gv_f, [gv_y] = rgenop.newgraph(sigtoken, "abs")
+
+ gv_x = builder.genop2("int_le", rgenop.genconst(2), gv_y)
+
+ false_builder = builder.jump_if_false(gv_x, [gv_x])
+
+ gv_x2 = builder.genop2("int_le", gv_y, rgenop.genconst(4))
+
+ args_gv = [gv_x2]
+ label = builder.enter_next_block([signed_kind], args_gv)
+ [gv_x2] = args_gv
+
+ return_false_builder = builder.jump_if_false(gv_x2, [])
+
+ builder.finish_and_return(sigtoken, rgenop.genconst(1))
+
+ false_builder.start_writing()
+ false_builder.finish_and_goto([gv_x], label)
+
+ return_false_builder.start_writing()
+ return_false_builder.finish_and_return(sigtoken, rgenop.genconst(0))
+
+ return gv_f
class AbstractRGenOpTests(test_boehm.AbstractGCTestClass):
RGenOp = None
@@ -566,3 +603,23 @@
assert res == 2
res = fn(-72)
assert res == 72
+
+ def test_longwinded_and_direct(self):
+ rgenop = self.RGenOp()
+ gv_fn = make_longwinded_and(rgenop)
+ fnptr = self.cast(gv_fn, 1)
+
+ res = fnptr(1)
+ assert res == 0
+
+ res = fnptr(2)
+ assert res == 1
+
+ res = fnptr(3)
+ assert res == 1
+
+ res = fnptr(4)
+ assert res == 1
+
+ res = fnptr(5)
+ assert res == 0
More information about the Pypy-commit
mailing list