[pypy-commit] pypy ffi-backend: (fijal, arigo)
arigo
noreply at buildbot.pypy.org
Sun Jun 24 21:30:32 CEST 2012
Author: Armin Rigo <arigo at tunes.org>
Branch: ffi-backend
Changeset: r55810:d6ba51cd8e29
Date: 2012-06-24 20:44 +0200
http://bitbucket.org/pypy/pypy/changeset/d6ba51cd8e29/
Log: (fijal, arigo) Pass the first test
(test_rawmem.py,test_raw_storage_int). A bit of garbage-collection
on the sources, but really just starting, here.
diff --git a/pypy/jit/backend/llgraph/llimpl.py b/pypy/jit/backend/llgraph/llimpl.py
--- a/pypy/jit/backend/llgraph/llimpl.py
+++ b/pypy/jit/backend/llgraph/llimpl.py
@@ -823,9 +823,7 @@
op_getfield_gc_pure = op_getfield_gc
def op_getfield_raw(self, fielddescr, struct):
- if fielddescr.arg_types == 'dynamic': # abuse of .arg_types
- return do_getfield_raw_dynamic(struct, fielddescr)
- elif fielddescr.typeinfo == REF:
+ if fielddescr.typeinfo == REF:
return do_getfield_raw_ptr(struct, fielddescr.ofs)
elif fielddescr.typeinfo == INT:
return do_getfield_raw_int(struct, fielddescr.ofs)
@@ -836,6 +834,26 @@
op_getfield_raw_pure = op_getfield_raw
+ def op_raw_store(self, arraydescr, addr, offset, value):
+ if arraydescr.typeinfo == REF:
+ xxx
+ elif arraydescr.typeinfo == INT:
+ do_raw_store_int(addr, offset, arraydescr.ofs, value)
+ elif arraydescr.typeinfo == FLOAT:
+ xxx
+ else:
+ raise NotImplementedError
+
+ def op_raw_load(self, arraydescr, addr, offset):
+ if arraydescr.typeinfo == REF:
+ xxx
+ elif arraydescr.typeinfo == INT:
+ return do_raw_load_int(addr, offset, arraydescr.ofs)
+ elif arraydescr.typeinfo == FLOAT:
+ xxx
+ else:
+ raise NotImplementedError
+
def op_new(self, size):
return do_new(size.ofs)
@@ -1515,18 +1533,18 @@
else:
return libffi._struct_getfield(lltype.Signed, addr, ofs)
-def do_raw_load_int(struct, offset, size):
- assert isinstance(size, llmemory.ItemOffset) and size.repeat == 1
+def do_raw_load_int(struct, offset, descrofs):
+ TYPE = symbolic.Size2Type[descrofs]
ll_p = rffi.cast(rffi.CCHARP, struct)
- ll_p = rffi.cast(rffi.CArrayPtr(size.TYPE), rffi.ptradd(ll_p, offset))
+ ll_p = rffi.cast(lltype.Ptr(TYPE), rffi.ptradd(ll_p, offset))
value = ll_p[0]
return rffi.cast(lltype.Signed, value)
-def do_raw_store_int(struct, offset, size, value):
- assert isinstance(size, llmemory.ItemOffset) and size.repeat == 1
+def do_raw_store_int(struct, offset, descrofs, value):
+ TYPE = symbolic.Size2Type[descrofs]
ll_p = rffi.cast(rffi.CCHARP, struct)
- ll_p = rffi.cast(rffi.CArrayPtr(size.TYPE), rffi.ptradd(ll_p, offset))
- ll_p[0] = rffi.cast(size.TYPE, value)
+ ll_p = rffi.cast(lltype.Ptr(TYPE), rffi.ptradd(ll_p, offset))
+ ll_p[0] = rffi.cast(TYPE.OF, value)
def do_new(size):
TYPE = symbolic.Size2Type[size]
diff --git a/pypy/jit/backend/llgraph/runner.py b/pypy/jit/backend/llgraph/runner.py
--- a/pypy/jit/backend/llgraph/runner.py
+++ b/pypy/jit/backend/llgraph/runner.py
@@ -482,10 +482,12 @@
return llimpl.do_setinteriorfield_gc_float(array, index, descr.ofs,
value)
- def bh_raw_store_i(self, struct, offset, size, newvalue):
- return llimpl.do_raw_store_int(struct, offset, size, newvalue)
- def bh_raw_load_i(self, struct, offset, size):
- return llimpl.do_raw_load_int(struct, offset, size)
+ def bh_raw_store_i(self, struct, offset, descr, newvalue):
+ assert isinstance(descr, Descr)
+ return llimpl.do_raw_store_int(struct, offset, descr.ofs, newvalue)
+ def bh_raw_load_i(self, struct, offset, descr):
+ assert isinstance(descr, Descr)
+ return llimpl.do_raw_load_int(struct, offset, descr.ofs)
def bh_new(self, sizedescr):
assert isinstance(sizedescr, Descr)
diff --git a/pypy/jit/backend/llgraph/symbolic.py b/pypy/jit/backend/llgraph/symbolic.py
--- a/pypy/jit/backend/llgraph/symbolic.py
+++ b/pypy/jit/backend/llgraph/symbolic.py
@@ -1,8 +1,7 @@
-import ctypes
from pypy.rpython.lltypesystem import lltype, rffi, rclass
-Size2Type = [None]
+Size2Type = [None] * 100
Type2Size = {}
def get_size(TYPE):
@@ -14,7 +13,7 @@
Type2Size[TYPE] = size
return size
-TokenToField = [None]
+TokenToField = [None] * 100
FieldToToken = {}
def get_field_token(STRUCT, fieldname):
@@ -26,21 +25,3 @@
FieldToToken[STRUCT, fieldname] = token
return token
get_field_token(rclass.OBJECT, 'typeptr') # force the index 1 for this
-
-def get_array_token(T):
- # T can be an array or a var-sized structure
- if isinstance(T, lltype.Struct):
- assert T._arrayfld is not None, "%r is not variable-sized" % (T,)
- cstruct = ll2ctypes.get_ctypes_type(T)
- cfield = getattr(cstruct, T._arrayfld)
- before_array_part = cfield.offset
- T = getattr(T, T._arrayfld)
- else:
- before_array_part = 0
- carray = ll2ctypes.get_ctypes_type(T)
- assert carray.length.size == 4
- ofs_length = before_array_part + carray.length.offset
- basesize = before_array_part + carray.items.offset
- carrayitem = ll2ctypes.get_ctypes_type(T.OF)
- itemsize = ctypes.sizeof(carrayitem)
- return basesize, itemsize, ofs_length
diff --git a/pypy/jit/codewriter/jtransform.py b/pypy/jit/codewriter/jtransform.py
--- a/pypy/jit/codewriter/jtransform.py
+++ b/pypy/jit/codewriter/jtransform.py
@@ -856,17 +856,17 @@
def rewrite_op_raw_store(self, op):
T = op.args[2].concretetype
kind = getkind(T)[0]
- c_size = Constant(llmemory.sizeof(T), lltype.Signed)
+ descr = self.cpu.arraydescrof(rffi.CArray(T))
return SpaceOperation('raw_store_%s' % kind,
- [op.args[0], op.args[1], c_size, op.args[2]],
+ [op.args[0], op.args[1], descr, op.args[2]],
None)
def rewrite_op_raw_load(self, op):
T = op.result.concretetype
kind = getkind(T)[0]
- c_size = Constant(llmemory.sizeof(T), lltype.Signed)
+ descr = self.cpu.arraydescrof(rffi.CArray(T))
return SpaceOperation('raw_load_%s' % kind,
- [op.args[0], op.args[1], c_size], op.result)
+ [op.args[0], op.args[1], descr], op.result)
def _rewrite_equality(self, op, opname):
arg0, arg1 = op.args
diff --git a/pypy/jit/codewriter/test/test_jtransform.py b/pypy/jit/codewriter/test/test_jtransform.py
--- a/pypy/jit/codewriter/test/test_jtransform.py
+++ b/pypy/jit/codewriter/test/test_jtransform.py
@@ -867,7 +867,7 @@
assert op1.opname == 'raw_store_i'
assert op1.args[0] == v_storage
assert op1.args[1] == v_index
- assert op1.args[2].value == rffi.sizeof(lltype.Signed)
+ assert op1.args[2] == ('arraydescr', rffi.CArray(lltype.Signed))
assert op1.args[3] == v_item
def test_raw_load():
@@ -879,7 +879,7 @@
assert op1.opname == 'raw_load_i'
assert op1.args[0] == v_storage
assert op1.args[1] == v_index
- assert op1.args[2].value == rffi.sizeof(lltype.Signed)
+ assert op1.args[2] == ('arraydescr', rffi.CArray(lltype.Signed))
assert op1.result == v_res
def test_promote_1():
diff --git a/pypy/jit/metainterp/blackhole.py b/pypy/jit/metainterp/blackhole.py
--- a/pypy/jit/metainterp/blackhole.py
+++ b/pypy/jit/metainterp/blackhole.py
@@ -1269,13 +1269,13 @@
def bhimpl_setfield_raw_f(cpu, struct, fielddescr, newvalue):
cpu.bh_setfield_raw_f(struct, fielddescr, newvalue)
- @arguments("cpu", "i", "i", "i", "i")
- def bhimpl_raw_store_i(cpu, struct, offset, size, newvalue):
- cpu.bh_raw_store_i(struct, offset, size, newvalue)
+ @arguments("cpu", "i", "i", "d", "i")
+ def bhimpl_raw_store_i(cpu, addr, offset, arraydescr, newvalue):
+ cpu.bh_raw_store_i(addr, offset, arraydescr, newvalue)
- @arguments("cpu", "i", "i", "i", returns="i")
- def bhimpl_raw_load_i(cpu, struct, offset, size):
- return cpu.bh_raw_load_i(struct, offset, size)
+ @arguments("cpu", "i", "i", "d", returns="i")
+ def bhimpl_raw_load_i(cpu, addr, offset, arraydescr):
+ return cpu.bh_raw_load_i(addr, offset, arraydescr)
@arguments("r", "d", "d")
def bhimpl_record_quasiimmut_field(struct, fielddescr, mutatefielddescr):
diff --git a/pypy/jit/metainterp/executor.py b/pypy/jit/metainterp/executor.py
--- a/pypy/jit/metainterp/executor.py
+++ b/pypy/jit/metainterp/executor.py
@@ -180,6 +180,26 @@
else:
cpu.bh_setfield_raw_i(struct, fielddescr, itembox.getint())
+def do_raw_store(cpu, _, addrbox, offsetbox, valuebox, arraydescr):
+ addr = addrbox.getint()
+ offset = offsetbox.getint()
+ if arraydescr.is_array_of_pointers():
+ xxx
+ elif arraydescr.is_array_of_floats():
+ xxx
+ else:
+ cpu.bh_raw_store_i(addr, offset, arraydescr, valuebox.getint())
+
+def do_raw_load(cpu, _, addrbox, offsetbox, arraydescr):
+ addr = addrbox.getint()
+ offset = offsetbox.getint()
+ if arraydescr.is_array_of_pointers():
+ xxx
+ elif arraydescr.is_array_of_floats():
+ xxx
+ else:
+ return BoxInt(cpu.bh_raw_load_i(addr, offset, arraydescr))
+
def exec_new_with_vtable(cpu, clsbox):
from pypy.jit.codewriter import heaptracker
vtable = clsbox.getint()
@@ -343,8 +363,6 @@
rop.DEBUG_MERGE_POINT,
rop.JIT_DEBUG,
rop.SETARRAYITEM_RAW,
- rop.GETINTERIORFIELD_RAW,
- rop.SETINTERIORFIELD_RAW,
rop.CALL_RELEASE_GIL,
rop.QUASIIMMUT_FIELD,
rop.CALL_MALLOC_GC,
diff --git a/pypy/jit/metainterp/optimizeopt/heap.py b/pypy/jit/metainterp/optimizeopt/heap.py
--- a/pypy/jit/metainterp/optimizeopt/heap.py
+++ b/pypy/jit/metainterp/optimizeopt/heap.py
@@ -250,7 +250,7 @@
opnum == rop.SETFIELD_RAW or # no effect on GC struct/array
opnum == rop.SETARRAYITEM_GC or # handled specially
opnum == rop.SETARRAYITEM_RAW or # no effect on GC struct
- opnum == rop.SETINTERIORFIELD_RAW or # no effect on GC struct
+ opnum == rop.RAW_STORE or # no effect on GC struct
opnum == rop.STRSETITEM or # no effect on GC struct/array
opnum == rop.UNICODESETITEM or # no effect on GC struct/array
opnum == rop.DEBUG_MERGE_POINT or # no effect whatsoever
diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py
--- a/pypy/jit/metainterp/pyjitpl.py
+++ b/pypy/jit/metainterp/pyjitpl.py
@@ -649,6 +649,18 @@
opimpl_setfield_raw_r = _opimpl_setfield_raw_any
opimpl_setfield_raw_f = _opimpl_setfield_raw_any
+ @arguments("box", "box", "descr", "box")
+ def _opimpl_raw_store(self, addrbox, offsetbox, arraydescr, valuebox):
+ self.execute_with_descr(rop.RAW_STORE, arraydescr,
+ addrbox, offsetbox, valuebox)
+ opimpl_raw_store_i = _opimpl_raw_store
+
+ @arguments("box", "box", "descr")
+ def _opimpl_raw_load(self, addrbox, offsetbox, arraydescr):
+ return self.execute_with_descr(rop.RAW_LOAD, arraydescr,
+ addrbox, offsetbox)
+ opimpl_raw_load_i = _opimpl_raw_load
+
@arguments("box", "descr", "descr", "orgpc")
def opimpl_record_quasiimmut_field(self, box, fielddescr,
mutatefielddescr, orgpc):
diff --git a/pypy/jit/metainterp/resoperation.py b/pypy/jit/metainterp/resoperation.py
--- a/pypy/jit/metainterp/resoperation.py
+++ b/pypy/jit/metainterp/resoperation.py
@@ -471,7 +471,7 @@
'GETARRAYITEM_GC/2d',
'GETARRAYITEM_RAW/2d',
'GETINTERIORFIELD_GC/2d',
- 'GETINTERIORFIELD_RAW/2d',
+ 'RAW_LOAD/2d',
'GETFIELD_GC/1d',
'GETFIELD_RAW/1d',
'_MALLOC_FIRST',
@@ -490,7 +490,7 @@
'SETARRAYITEM_GC/3d',
'SETARRAYITEM_RAW/3d',
'SETINTERIORFIELD_GC/3d',
- 'SETINTERIORFIELD_RAW/3d',
+ 'RAW_STORE/3d',
'SETFIELD_GC/2d',
'SETFIELD_RAW/2d',
'STRSETITEM/3',
diff --git a/pypy/jit/metainterp/test/test_rawmem.py b/pypy/jit/metainterp/test/test_rawmem.py
--- a/pypy/jit/metainterp/test/test_rawmem.py
+++ b/pypy/jit/metainterp/test/test_rawmem.py
@@ -32,7 +32,7 @@
self.check_operations_history({'call': 2, 'guard_no_exception': 1,
'finish': 1})
- def test_raw_storage(self):
+ def test_raw_storage_int(self):
def f():
p = alloc_raw_storage(15)
raw_storage_setitem(p, 3, 24)
@@ -42,4 +42,5 @@
res = self.interp_operations(f, [])
assert res == 24
self.check_operations_history({'call': 2, 'guard_no_exception': 1,
+ 'raw_store': 1, 'raw_load': 1,
'finish': 1})
More information about the pypy-commit
mailing list