[pypy-svn] r31852 - in pypy/dist/pypy/jit/codegen: i386 i386/test llgraph
arigo at codespeak.net
arigo at codespeak.net
Wed Aug 30 21:14:29 CEST 2006
Author: arigo
Date: Wed Aug 30 21:14:28 2006
New Revision: 31852
Modified:
pypy/dist/pypy/jit/codegen/i386/ri386genop.py
pypy/dist/pypy/jit/codegen/i386/test/test_genc_vlist.py
pypy/dist/pypy/jit/codegen/i386/test/test_interp_vlist.py
pypy/dist/pypy/jit/codegen/llgraph/llimpl.py
Log:
(pedronis, arigo)
VList tests pass! With the help of some form of genop("direct_call").
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 Wed Aug 30 21:14:28 2006
@@ -82,10 +82,10 @@
-class FnPtrConst(IntConst):
- def __init__(self, value, mc):
- self.value = value
- self.mc = mc # to keep it alive
+##class FnPtrConst(IntConst):
+## def __init__(self, value, mc):
+## self.value = value
+## self.mc = mc # to keep it alive
class AddrConst(GenConst):
@@ -102,6 +102,8 @@
return self.addr
elif isinstance(T, lltype.Ptr):
return llmemory.cast_adr_to_ptr(self.addr, T)
+ elif T is lltype.Signed:
+ return llmemory.cast_adr_to_int(self.addr)
else:
assert 0, "XXX not implemented"
@@ -157,10 +159,13 @@
def stack_access(self, stackpos):
return mem(esp, WORD * (self.stackdepth-1 - stackpos))
- def push(self, reg):
- self.mc.PUSH(reg)
- res = Var(self.stackdepth)
+ def push(self, op):
+ self.mc.PUSH(op)
self.stackdepth += 1
+
+ def returnvar(self, op):
+ res = Var(self.stackdepth)
+ self.push(op)
return res
def op_int_is_true(self, (gv_x,), gv_RESTYPE):
@@ -172,98 +177,98 @@
return IntConst(gv_x.value + gv_y.value)
self.mc.MOV(eax, gv_x.operand(self))
self.mc.ADD(eax, gv_y.operand(self))
- return self.push(eax)
+ return self.returnvar(eax)
def op_int_sub(self, (gv_x, gv_y), gv_RESTYPE):
self.mc.MOV(eax, gv_x.operand(self))
self.mc.SUB(eax, gv_y.operand(self))
- return self.push(eax)
+ return self.returnvar(eax)
def op_int_mul(self, (gv_x, gv_y), gv_RESTYPE):
self.mc.MOV(eax, gv_x.operand(self))
self.mc.IMUL(eax, gv_y.operand(self))
- return self.push(eax)
+ return self.returnvar(eax)
def op_int_floordiv(self, (gv_x, gv_y), gv_RESTYPE):
self.mc.MOV(eax, gv_x.operand(self))
self.mc.CDQ()
self.mc.MOV(ecx, gv_y.operand(self))
self.mc.IDIV(ecx)
- return self.push(eax)
+ return self.returnvar(eax)
def op_int_and(self, (gv_x, gv_y), gv_RESTYPE):
self.mc.MOV(eax, gv_x.operand(self))
self.mc.AND(eax, gv_y.operand(self))
- return self.push(eax)
+ return self.returnvar(eax)
def op_int_or(self, (gv_x, gv_y), gv_RESTYPE):
self.mc.MOV(eax, gv_x.operand(self))
self.mc.OR(eax, gv_y.operand(self))
- return self.push(eax)
+ return self.returnvar(eax)
def op_int_xor(self, (gv_x, gv_y), gv_RESTYPE):
self.mc.MOV(eax, gv_x.operand(self))
self.mc.XOR(eax, gv_y.operand(self))
- return self.push(eax)
+ return self.returnvar(eax)
def op_int_lt(self, (gv_x, gv_y), gv_RESTYPE):
self.mc.MOV(eax, gv_x.operand(self))
self.mc.CMP(eax, gv_y.operand(self))
self.mc.SETL(al)
self.mc.MOVZX(eax, al)
- return self.push(eax)
+ return self.returnvar(eax)
def op_int_le(self, (gv_x, gv_y), gv_RESTYPE):
self.mc.MOV(eax, gv_x.operand(self))
self.mc.CMP(eax, gv_y.operand(self))
self.mc.SETLE(al)
self.mc.MOVZX(eax, al)
- return self.push(eax)
+ return self.returnvar(eax)
def op_int_eq(self, (gv_x, gv_y), gv_RESTYPE):
self.mc.MOV(eax, gv_x.operand(self))
self.mc.CMP(eax, gv_y.operand(self))
self.mc.SETE(al)
self.mc.MOVZX(eax, al)
- return self.push(eax)
+ return self.returnvar(eax)
def op_int_ne(self, (gv_x, gv_y), gv_RESTYPE):
self.mc.MOV(eax, gv_x.operand(self))
self.mc.CMP(eax, gv_y.operand(self))
self.mc.SETNE(al)
self.mc.MOVZX(eax, al)
- return self.push(eax)
+ return self.returnvar(eax)
def op_int_gt(self, (gv_x, gv_y), gv_RESTYPE):
self.mc.MOV(eax, gv_x.operand(self))
self.mc.CMP(eax, gv_y.operand(self))
self.mc.SETG(al)
self.mc.MOVZX(eax, al)
- return self.push(eax)
+ return self.returnvar(eax)
def op_int_ge(self, (gv_x, gv_y), gv_RESTYPE):
self.mc.MOV(eax, gv_x.operand(self))
self.mc.CMP(eax, gv_y.operand(self))
self.mc.SETGE(al)
self.mc.MOVZX(eax, al)
- return self.push(eax)
+ return self.returnvar(eax)
def op_int_neg(self, (gv_x,), gv_RESTYPE):
self.mc.MOV(eax, gv_x.operand(self))
self.mc.NEG(eax)
- return self.push(eax)
+ return self.returnvar(eax)
def op_int_lshift(self, (gv_x, gv_y), gv_RESTYPE):
self.mc.MOV(eax, gv_x.operand(self))
self.mc.MOV(ecx, gv_y.operand(self))
self.mc.SHL(eax, cl)
- return self.push(eax)
+ return self.returnvar(eax)
def op_int_rshift(self, (gv_x, gv_y), gv_RESTYPE):
self.mc.MOV(eax, gv_x.operand(self))
self.mc.MOV(ecx, gv_y.operand(self))
self.mc.SHR(eax, cl)
- return self.push(eax)
+ return self.returnvar(eax)
def op_bool_not(self, (gv_x,), gv_RESTYPE):
if isinstance(gv_x, IntConst):
@@ -271,23 +276,22 @@
self.mc.CMP(gv_x.operand(self), imm8(0))
self.mc.SETE(al)
self.mc.MOVZX(eax, al)
- return self.push(eax)
+ return self.returnvar(eax)
def op_cast_pointer(self, (gv_x,), gv_RESTYPE):
return gv_x
def emit_malloc_fixedsize(self, size):
# XXX boehm only, no atomic/non atomic distinction for now
- self.mc.PUSH(imm(size))
+ self.mc.push(imm(size))
gc_malloc_ptr = llhelper(GC_MALLOC, gc_malloc)
self.mc.CALL(rel32(lltype.cast_ptr_to_int(gc_malloc_ptr)))
- self.stackdepth += 1 # maybe?
- return self.push(eax)
+ return self.returnvar(eax)
def emit_getfield(self, gv_ptr, offset):
# XXX only for int fields
self.mc.MOV(edx, gv_ptr.operand(self))
- return self.push(mem(edx, offset))
+ return self.returnvar(mem(edx, offset))
def emit_setfield(self, gv_ptr, offset, gv_value):
# XXX only for ints for now.
@@ -298,7 +302,7 @@
def emit_getsubstruct(self, gv_ptr, offset):
self.mc.MOV(edx, gv_ptr.operand(self))
self.mc.LEA(eax, mem(edx, offset))
- return self.push(eax)
+ return self.returnvar(eax)
def emit_getarrayitem(self, gv_ptr, arraytoken, gv_index):
# XXX! only works for GcArray(Signed) for now!!
@@ -313,14 +317,14 @@
else:
self.mc.IMUL(ecx, gv_index.operand(self), imm(itemoffset))
op = memSIB(edx, ecx, 0, startoffset)
- return self.push(op)
+ return self.returnvar(op)
def op_getarraysize(self, (gv_ptr,), gv_RESTYPE):
# XXX! only works for GcArray(Signed) for now!!
A = DUMMY_A
lengthoffset, startoffset, itemoffset = self.rgenop.arrayToken(A)
self.mc.MOV(edx, gv_ptr.operand(self))
- return self.push(mem(edx, lengthoffset))
+ return self.returnvar(mem(edx, lengthoffset))
def op_setarrayitem(self, (gv_ptr, gv_index, gv_value), gv_RESTYPE):
# XXX! only works for GcArray(Signed) for now!!
@@ -339,6 +343,18 @@
op = memSIB(edx, ecx, 0, startoffset)
self.mc.MOV(op, eax)
+ def op_direct_call(self, args_gv, result_kind):
+ for i in range(len(args_gv)-1, 0, -1):
+ gv_arg = args_gv[i]
+ if gv_arg is not None:
+ self.push(gv_arg.operand(self))
+ gv_fnptr = args_gv[0]
+ target = gv_fnptr.revealconst(lltype.Signed)
+ self.mc.CALL(rel32(target))
+ # XXX only for int return_kind
+ return self.returnvar(eax)
+
+
DUMMY_A = lltype.GcArray(lltype.Signed)
SIZE2SHIFT = {1: 0,
2: 1,
@@ -509,5 +525,4 @@
prologue.mc.PUSH(operand)
prologue.mc.JMP(rel32(block.startaddr))
self.close_mc(prologue.mc)
- return FnPtrConst(prologue.startaddr, prologue.mc)
-
+ return IntConst(prologue.startaddr)
Modified: pypy/dist/pypy/jit/codegen/i386/test/test_genc_vlist.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/i386/test/test_genc_vlist.py (original)
+++ pypy/dist/pypy/jit/codegen/i386/test/test_genc_vlist.py Wed Aug 30 21:14:28 2006
@@ -2,7 +2,6 @@
from pypy.jit.timeshifter.test import test_vlist
from pypy.jit.codegen.i386.test.test_genc_ts import I386TimeshiftingTestMixin
-py.test.skip("in-progress")
class TestVList(I386TimeshiftingTestMixin,
test_vlist.TestVList):
Modified: pypy/dist/pypy/jit/codegen/i386/test/test_interp_vlist.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/i386/test/test_interp_vlist.py (original)
+++ pypy/dist/pypy/jit/codegen/i386/test/test_interp_vlist.py Wed Aug 30 21:14:28 2006
@@ -2,7 +2,6 @@
from pypy.jit.timeshifter.test import test_vlist
from pypy.jit.codegen.i386.test.test_interp_ts import I386LLInterpTimeshiftingTestMixin
-py.test.skip("in-progress")
class TestVList(I386LLInterpTimeshiftingTestMixin,
test_vlist.TestVList):
Modified: pypy/dist/pypy/jit/codegen/llgraph/llimpl.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/llgraph/llimpl.py (original)
+++ pypy/dist/pypy/jit/codegen/llgraph/llimpl.py Wed Aug 30 21:14:28 2006
@@ -41,14 +41,26 @@
return to_opaque_object(v)
def _inputvars(vars):
+ newvars = []
if not isinstance(vars, list):
n = vars.ll_length()
vars = vars.ll_items()
- vars = [fishllattr(vars[i], 'v', vars[i]) for i in range(n)]
+ for i in range(n):
+ v = vars[i]
+ if not v:
+ v = dummy_placeholder
+ else:
+ v = fishllattr(v, 'v', v)
+ newvars.append(v)
else:
- vars = [getattr(llvar, 'v', llvar) for llvar in vars]
+ for v in vars:
+ if not v:
+ v = dummy_placeholder
+ else:
+ v = getattr(v, 'v', v)
+ newvars.append(v)
res = []
- for v1 in vars:
+ for v1 in newvars:
v = from_opaque_object(v1)
assert isinstance(v, (flowmodel.Constant, flowmodel.Variable))
res.append(v)
@@ -255,6 +267,8 @@
nulllink = lltype.nullptr(LINK.TO)
gv_Void = constTYPE(lltype.Void)
+dummy_placeholder = placeholder("dummy")
+
# helpers
def setannotation(func, annotation, specialize_as_constant=False):
More information about the Pypy-commit
mailing list