[pypy-svn] r53363 - pypy/branch/jit-hotpath/pypy/jit/codegen/ia32
fijal at codespeak.net
fijal at codespeak.net
Fri Apr 4 22:52:46 CEST 2008
Author: fijal
Date: Fri Apr 4 22:52:45 2008
New Revision: 53363
Added:
pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/objmodel.py (contents, props changed)
Modified:
pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/rgenop.py
Log:
Split rgenop into two files, it looks nicer IMO
Added: pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/objmodel.py
==============================================================================
--- (empty file)
+++ pypy/branch/jit-hotpath/pypy/jit/codegen/ia32/objmodel.py Fri Apr 4 22:52:45 2008
@@ -0,0 +1,271 @@
+
+from pypy.jit.codegen.model import GenVar, GenConst, CodeGenSwitch
+from pypy.rpython.lltypesystem import lltype, rffi, llmemory
+from pypy.rlib.unroll import unrolling_iterable
+from pypy.rlib.objectmodel import specialize
+from pypy.jit.codegen.i386.ri386 import *
+
+WORD = 4
+
+class Var(GenVar):
+ token = 'x'
+ # XXX hack for annotator
+ stackpos = 0
+
+ def __init__(self, stackpos):
+ # 'stackpos' is an index relative to the pushed arguments
+ # (where N is the number of arguments of the function
+ # and B is a small integer for stack alignment purposes):
+ #
+ # B + 0 = last arg
+ # = ...
+ # B +N-1 = 1st arg
+ # B + N = return address
+ # B +N+1 = local var
+ # B +N+2 = ...
+ # ... <--- esp+4
+ # local var <--- esp
+ #
+ self.stackpos = stackpos
+
+ def nonimmoperand(self, builder, tmpregister):
+ return self.operand(builder)
+
+ def operand(self, builder):
+ raise NotImplementedError
+
+ def movetonewaddr(self, builder, arg):
+ raise NotImplementedError
+
+ def __repr__(self):
+ return self.token + 'var@%d' % (self.stackpos,)
+
+ repr = __repr__
+
+class IntVar(Var):
+ ll_type = lltype.Signed
+ token = 'i'
+ SIZE = 1
+
+ def operand(self, builder):
+ return builder.stack_access(self.stackpos)
+
+ def newvar(self, builder):
+ return builder.returnintvar(self.operand(builder))
+
+ def movetonewaddr(self, builder, arg):
+ dstop = builder.itemaddr(arg)
+ builder.mc.MOV(eax, self.operand(builder))
+ builder.mc.MOV(dstop, eax)
+
+class AddressVar(IntVar):
+ ll_type = llmemory.Address
+ token = 'a'
+ SIZE = 1
+
+class BoolVar(Var):
+ # represents a boolean as an integer which *must* be exactly 0 or 1
+ def operand(self, builder):
+ return builder.stack_access(self.stackpos)
+
+ def newvar(self, builder):
+ return builder.returnboolvar(self.operand(builder))
+
+ def movetonewaddr(self, builder, arg):
+ dstop = builder.itemaddr(arg)
+ builder.mc.MOV(eax, self.operand(builder))
+ builder.mc.MOV(destop, al)
+
+ ll_type = lltype.Bool
+ token = 'b'
+ SIZE = 1
+
+class FloatVar(Var):
+ def operand(self, builder):
+ return builder.stack_access64(self.stackpos)
+
+ def newvar(self, builder):
+ raise NotImplementedError("This requires moving around float mem")
+ return builder.returnfloatvar(self.operand(builder))
+
+ def movetonewaddr(self, builder, arg):
+ dstop1 = builder.itemaddr(arg)
+ dstop2 = builder.itemaddr(arg, WORD)
+ builder.mc.MOV(eax, builder.stack_access(self.stackpos))
+ builder.mc.MOV(dstop1, eax)
+ builder.mc.MOV(eax, builder.stack_access(self.stackpos - 1))
+ builder.mc.MOV(dstop2, eax)
+
+ ll_type = lltype.Float
+ token = 'f'
+ SIZE = 2
+
+LL_TO_GENVAR = {}
+TOKEN_TO_GENVAR = {}
+TOKEN_TO_SIZE = {}
+for value in [IntVar, FloatVar, BoolVar, AddressVar]:
+ assert hasattr(value, 'll_type')
+ LL_TO_GENVAR[value.ll_type] = value.token
+ TOKEN_TO_GENVAR[value.token] = value
+ TOKEN_TO_SIZE[value.token] = value.SIZE
+LL_TO_GENVAR[lltype.Unsigned] = 'i'
+LL_TO_GENVAR[lltype.Char] = 'i'
+# we might want to have different value for chare
+# but I see no point now
+LL_TO_GENVAR[lltype.Void] = 'v'
+
+UNROLLING_TOKEN_TO_GENVAR = unrolling_iterable(TOKEN_TO_GENVAR.items())
+
+def token_to_genvar(i, arg):
+ for tok, value in UNROLLING_TOKEN_TO_GENVAR:
+ if tok == i:
+ return value(arg)
+
+##class Const(GenConst):
+
+## def revealconst(self, TYPE):
+## if isinstance(self, IntConst):
+## self.revealconst_int(TYPE)
+## elif isinstance(self, PtrConst):
+## self.revealconst_ptr(TYPE)
+
+## if isinstance(TYPE, lltype.Ptr):
+## if isinstance(self, PtrConst):
+## return self.revealconst_ptr(TYPE)
+## el
+## return self.revealconst_ptr(TYPE)
+## elif TYPE is lltype.Float:
+## assert isinstance(self, DoubleConst)
+## return self.revealconst_double()
+## else:
+## assert isinstance(TYPE, lltype.Primitive)
+## assert TYPE is not lltype.Void, "cannot make red boxes of voids"
+## assert isinstance(self, IntConst)
+## return self.revealconst_primitive(TYPE)
+## return self.value
+## revealconst._annspecialcase_ = 'specialize:arg(1)'
+
+
+class Const(GenConst):
+
+ def __init__(self, value):
+ self.value = value
+
+ 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):
+ return lltype.cast_int_to_ptr(T, self.value)
+ elif T is llmemory.Address:
+ return llmemory.cast_int_to_adr(self.value)
+ else:
+ return lltype.cast_primitive(T, self.value)
+
+ def __repr__(self):
+ "NOT_RPYTHON"
+ try:
+ return "const=%s" % (imm(self.value).assembler(),)
+ except TypeError: # from Symbolics
+ return "const=%r" % (self.value,)
+
+ def movetonewaddr(self, builder, addr):
+ raise NotImplementedError
+
+ def repr(self):
+ return "const=$%s" % (self.value,)
+
+class IntConst(Const):
+ SIZE = 1
+
+ def newvar(self, builder):
+ return builder.returnintvar(self.operand(builder))
+
+ def movetonewaddr(self, builder, arg):
+ dstop = builder.itemaddr(arg)
+ builder.mc.MOV(dstop, self.operand(builder))
+
+class FloatConst(Const):
+ SIZE = 2
+ # XXX hack for annotator
+ rawbuf = lltype.nullptr(rffi.DOUBLEP.TO)
+
+ def __init__(self, floatval):
+ # XXX we should take more care who is creating this and
+ # eventually release this buffer
+ # never moves and never dies
+ self.rawbuf = lltype.malloc(rffi.DOUBLEP.TO, 1, flavor='raw',
+ immortal=True)
+ self.rawbuf[0] = floatval
+
+ def newvar(self, builder):
+ return builder.newfloatfrommem(None, None, 0,
+ rffi.cast(rffi.INT, self.rawbuf))
+
+ def operand(self, builder):
+ return heap64(rffi.cast(rffi.INT, self.rawbuf))
+
+ def movetonewaddr(self, builder, arg):
+ dstop1 = builder.itemaddr(arg)
+ dstop2 = builder.itemaddr(arg, WORD)
+ builder.mc.MOV(dstop1, imm(rffi.cast(rffi.INTP, self.rawbuf)[0]))
+ builder.mc.MOV(dstop2, imm(rffi.cast(rffi.INTP, self.rawbuf)[1]))
+
+ def repr(self):
+ return "const=$%s" % (self.rawbuf[0],)
+
+ __repr__ = repr
+
+class BoolConst(Const):
+ SIZE = 1
+
+ def operand(self, builder):
+ return imm8(self.value)
+
+ def newvar(self, builder):
+ return builder.returnboolvar(self.operand(builder))
+
+ def movetonewaddr(self, builder, arg):
+ dstop = builder.itemaddr(arg)
+ builder.mc.MOV(dstop, self.operand(builder))
+
+##class FnPtrConst(IntConst):
+## def __init__(self, value, mc):
+## self.value = value
+## self.mc = mc # to keep it alive
+
+
+class AddrConst(IntConst):
+ SIZE = 1
+
+ def __init__(self, addr):
+ self.addr = addr
+
+ def operand(self, builder):
+ return imm(llmemory.cast_adr_to_int(self.addr))
+
+ def newvar(self, builder):
+ return builder.returnintvar(self.operand(builder))
+
+ @specialize.arg(1)
+ def revealconst(self, T):
+ if T is llmemory.Address:
+ 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"
+
+ def __repr__(self):
+ "NOT_RPYTHON"
+ return "const=%r" % (self.addr,)
+
+ def repr(self):
+ return "const=<0x%x>" % (llmemory.cast_adr_to_int(self.addr),)
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 Fri Apr 4 22:52:45 2008
@@ -1,16 +1,16 @@
import sys, py, os
from pypy.rlib.objectmodel import specialize
-from pypy.rpython.lltypesystem import lltype, llmemory
+from pypy.rpython.lltypesystem import lltype, llmemory, rffi
from pypy.jit.codegen.i386.ri386 import *
from pypy.jit.codegen.i386.codebuf import CodeBlockOverflow
from pypy.jit.codegen.model import AbstractRGenOp, GenLabel, GenBuilder
from pypy.jit.codegen.model import GenVar, GenConst, CodeGenSwitch
from pypy.rlib import objectmodel
-from pypy.rlib.unroll import unrolling_iterable
from pypy.rpython.annlowlevel import llhelper
-from pypy.rpython.lltypesystem import rffi
+from pypy.jit.codegen.ia32.objmodel import IntVar, FloatVar, Var,\
+ BoolVar, IntConst, AddrConst, BoolConst, FloatConst,\
+ LL_TO_GENVAR, TOKEN_TO_SIZE, token_to_genvar, WORD
-WORD = 4
DEBUG_CALL_ALIGN = True
if sys.platform == 'darwin':
CALL_ALIGN = 4
@@ -39,269 +39,6 @@
p = cast(c_void_p(addr), POINTER(c_int))
p[0] = value
-class Var(GenVar):
- token = 'x'
- # XXX hack for annotator
- stackpos = 0
-
- def __init__(self, stackpos):
- # 'stackpos' is an index relative to the pushed arguments
- # (where N is the number of arguments of the function
- # and B is a small integer for stack alignment purposes):
- #
- # B + 0 = last arg
- # = ...
- # B +N-1 = 1st arg
- # B + N = return address
- # B +N+1 = local var
- # B +N+2 = ...
- # ... <--- esp+4
- # local var <--- esp
- #
- self.stackpos = stackpos
-
- def nonimmoperand(self, builder, tmpregister):
- return self.operand(builder)
-
- def operand(self, builder):
- raise NotImplementedError
-
- def movetonewaddr(self, builder, arg):
- raise NotImplementedError
-
- def __repr__(self):
- return self.token + 'var@%d' % (self.stackpos,)
-
- repr = __repr__
-
-class IntVar(Var):
- ll_type = lltype.Signed
- token = 'i'
- SIZE = 1
-
- def operand(self, builder):
- return builder.stack_access(self.stackpos)
-
- def newvar(self, builder):
- return builder.returnintvar(self.operand(builder))
-
- def movetonewaddr(self, builder, arg):
- dstop = builder.itemaddr(arg)
- builder.mc.MOV(eax, self.operand(builder))
- builder.mc.MOV(dstop, eax)
-
-class AddressVar(IntVar):
- ll_type = llmemory.Address
- token = 'a'
- SIZE = 1
-
-class BoolVar(Var):
- # represents a boolean as an integer which *must* be exactly 0 or 1
- def operand(self, builder):
- return builder.stack_access(self.stackpos)
-
- def newvar(self, builder):
- return builder.returnboolvar(self.operand(builder))
-
- def movetonewaddr(self, builder, arg):
- dstop = builder.itemaddr(arg)
- builder.mc.MOV(eax, self.operand(builder))
- builder.mc.MOV(destop, al)
-
- ll_type = lltype.Bool
- token = 'b'
- SIZE = 1
-
-class FloatVar(Var):
- def operand(self, builder):
- return builder.stack_access64(self.stackpos)
-
- def newvar(self, builder):
- raise NotImplementedError("This requires moving around float mem")
- return builder.returnfloatvar(self.operand(builder))
-
- def movetonewaddr(self, builder, arg):
- dstop1 = builder.itemaddr(arg)
- dstop2 = builder.itemaddr(arg, WORD)
- builder.mc.MOV(eax, builder.stack_access(self.stackpos))
- builder.mc.MOV(dstop1, eax)
- builder.mc.MOV(eax, builder.stack_access(self.stackpos - 1))
- builder.mc.MOV(dstop2, eax)
-
- ll_type = lltype.Float
- token = 'f'
- SIZE = 2
-
-LL_TO_GENVAR = {}
-TOKEN_TO_GENVAR = {}
-TOKEN_TO_SIZE = {}
-for value in [IntVar, FloatVar, BoolVar, AddressVar]:
- assert hasattr(value, 'll_type')
- LL_TO_GENVAR[value.ll_type] = value.token
- TOKEN_TO_GENVAR[value.token] = value
- TOKEN_TO_SIZE[value.token] = value.SIZE
-LL_TO_GENVAR[lltype.Unsigned] = 'i'
-LL_TO_GENVAR[lltype.Char] = 'i'
-# we might want to have different value for chare
-# but I see no point now
-LL_TO_GENVAR[lltype.Void] = 'v'
-
-UNROLLING_TOKEN_TO_GENVAR = unrolling_iterable(TOKEN_TO_GENVAR.items())
-
-def token_to_genvar(i, arg):
- for tok, value in UNROLLING_TOKEN_TO_GENVAR:
- if tok == i:
- return value(arg)
-
-##class Const(GenConst):
-
-## def revealconst(self, TYPE):
-## if isinstance(self, IntConst):
-## self.revealconst_int(TYPE)
-## elif isinstance(self, PtrConst):
-## self.revealconst_ptr(TYPE)
-
-## if isinstance(TYPE, lltype.Ptr):
-## if isinstance(self, PtrConst):
-## return self.revealconst_ptr(TYPE)
-## el
-## return self.revealconst_ptr(TYPE)
-## elif TYPE is lltype.Float:
-## assert isinstance(self, DoubleConst)
-## return self.revealconst_double()
-## else:
-## assert isinstance(TYPE, lltype.Primitive)
-## assert TYPE is not lltype.Void, "cannot make red boxes of voids"
-## assert isinstance(self, IntConst)
-## return self.revealconst_primitive(TYPE)
-## return self.value
-## revealconst._annspecialcase_ = 'specialize:arg(1)'
-
-
-class Const(GenConst):
-
- def __init__(self, value):
- self.value = value
-
- 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):
- return lltype.cast_int_to_ptr(T, self.value)
- elif T is llmemory.Address:
- return llmemory.cast_int_to_adr(self.value)
- else:
- return lltype.cast_primitive(T, self.value)
-
- def __repr__(self):
- "NOT_RPYTHON"
- try:
- return "const=%s" % (imm(self.value).assembler(),)
- except TypeError: # from Symbolics
- return "const=%r" % (self.value,)
-
- def movetonewaddr(self, builder, addr):
- raise NotImplementedError
-
- def repr(self):
- return "const=$%s" % (self.value,)
-
-class IntConst(Const):
- SIZE = 1
-
- def newvar(self, builder):
- return builder.returnintvar(self.operand(builder))
-
- def movetonewaddr(self, builder, arg):
- dstop = builder.itemaddr(arg)
- builder.mc.MOV(dstop, self.operand(builder))
-
-class FloatConst(Const):
- SIZE = 2
- # XXX hack for annotator
- rawbuf = lltype.nullptr(rffi.DOUBLEP.TO)
-
- def __init__(self, floatval):
- # XXX we should take more care who is creating this and
- # eventually release this buffer
- # never moves and never dies
- self.rawbuf = lltype.malloc(rffi.DOUBLEP.TO, 1, flavor='raw',
- immortal=True)
- self.rawbuf[0] = floatval
-
- def newvar(self, builder):
- return builder.newfloatfrommem(None, None, 0,
- rffi.cast(rffi.INT, self.rawbuf))
-
- def operand(self, builder):
- return heap64(rffi.cast(rffi.INT, self.rawbuf))
-
- def movetonewaddr(self, builder, arg):
- dstop1 = builder.itemaddr(arg)
- dstop2 = builder.itemaddr(arg, WORD)
- builder.mc.MOV(dstop1, imm(rffi.cast(rffi.INTP, self.rawbuf)[0]))
- builder.mc.MOV(dstop2, imm(rffi.cast(rffi.INTP, self.rawbuf)[1]))
-
- def repr(self):
- return "const=$%s" % (self.rawbuf[0],)
-
- __repr__ = repr
-
-class BoolConst(Const):
- SIZE = 1
-
- def operand(self, builder):
- return imm8(self.value)
-
- def newvar(self, builder):
- return builder.returnboolvar(self.operand(builder))
-
- def movetonewaddr(self, builder, arg):
- dstop = builder.itemaddr(arg)
- builder.mc.MOV(dstop, self.operand(builder))
-
-##class FnPtrConst(IntConst):
-## def __init__(self, value, mc):
-## self.value = value
-## self.mc = mc # to keep it alive
-
-
-class AddrConst(IntConst):
- SIZE = 1
-
- def __init__(self, addr):
- self.addr = addr
-
- def operand(self, builder):
- return imm(llmemory.cast_adr_to_int(self.addr))
-
- def newvar(self, builder):
- return builder.returnintvar(self.operand(builder))
-
- @specialize.arg(1)
- def revealconst(self, T):
- if T is llmemory.Address:
- 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"
-
- def __repr__(self):
- "NOT_RPYTHON"
- return "const=%r" % (self.addr,)
-
- def repr(self):
- return "const=<0x%x>" % (llmemory.cast_adr_to_int(self.addr),)
-
class Label(GenLabel):
More information about the Pypy-commit
mailing list