Author: Remi Meier <[email protected]>
Branch: stmgc-c8
Changeset: r82395:8c5f6193d317
Date: 2016-02-22 16:26 +0100
http://bitbucket.org/pypy/pypy/changeset/8c5f6193d317/
Log: fix several things from the merges (wip)
mostly always-enable-gil and memop-simplify related
diff --git a/rpython/jit/backend/llsupport/assembler.py
b/rpython/jit/backend/llsupport/assembler.py
--- a/rpython/jit/backend/llsupport/assembler.py
+++ b/rpython/jit/backend/llsupport/assembler.py
@@ -432,8 +432,12 @@
# 'rpy_fastgil' contains only zero or non-zero, and this is only
# called when the old value stored in 'rpy_fastgil' was non-zero
# (i.e. still locked, must wait with the regular mutex)
- from rpython.rlib import rgil
- rgil.acquire()
+ if rgc.stm_is_enabled():
+ from rpython.rlib import rstm
+ rstm.after_external_call()
+ else:
+ from rpython.rlib import rgil
+ rgil.acquire()
_REACQGIL0_FUNC = lltype.Ptr(lltype.FuncType([], lltype.Void))
_REACQGIL2_FUNC = lltype.Ptr(lltype.FuncType([rffi.CCHARP, lltype.Signed],
diff --git a/rpython/jit/backend/llsupport/gc.py
b/rpython/jit/backend/llsupport/gc.py
--- a/rpython/jit/backend/llsupport/gc.py
+++ b/rpython/jit/backend/llsupport/gc.py
@@ -499,9 +499,10 @@
def _initialize_for_tests(self):
self.layoutbuilder = None
- self.fielddescr_tid = FieldDescr("test_tid",0,8,0)
+ from rpython.jit.backend.llsupport.descr import FieldDescr
+ self.fielddescr_tid = FieldDescr("test_tid", 0, 8, 0)
if self.stm:
- self.fielddescr_stmflags = AbstractDescr()
+ self.fielddescr_stmflags = FieldDescr("test_stmflags", 4, 4, 0)
self.max_size_of_young_obj = 1000
self.GCClass = None
self.gcheaderbuilder = None
diff --git a/rpython/jit/backend/llsupport/rewrite.py
b/rpython/jit/backend/llsupport/rewrite.py
--- a/rpython/jit/backend/llsupport/rewrite.py
+++ b/rpython/jit/backend/llsupport/rewrite.py
@@ -583,7 +583,6 @@
self.gen_initialize_tid(frame, descrs.arraydescr.tid)
# we need to explicitely zero all the gc fields, because
# of the unusal malloc pattern
-
length = self.emit_getfield(ConstInt(frame_info),
descr=descrs.jfi_frame_depth, raw=True)
self.emit_setfield(frame, self.c_zero,
@@ -603,30 +602,32 @@
return self.get_box_replacement(frame)
else:
# jfi_frame_size not set in STM!
- length = ResOperation(rop.GETFIELD_RAW_I,
- [history.ConstInt(frame_info)],
- descr=descrs.jfi_frame_depth)
- self.emit_op(length)
+ length = self.emit_getfield(ConstInt(frame_info),
+ descr=descrs.jfi_frame_depth, raw=True)
+ # ofs, size, sign = unpack_fielddescr(descrs.jfi_frame_depth)
+ # if sign:
+ # size = -size
+ # args = [ConstInt(frame_info), ConstInt(0), ConstInt(1),
+ # ConstInt(ofs), ConstInt(size)]
+ # length = ResOperation(rop.GC_LOAD_INDEXED_I, args)
+ # self.emit_op(length)
frame = self.gen_malloc_nursery_varsize_frame(length)
self.gen_initialize_tid(frame, descrs.arraydescr.tid)
# we need to explicitely zero all the gc fields, because
# of the unusal malloc pattern
- extra_ops = [
- ResOperation(rop.SETFIELD_GC, [frame, self.c_zero],
- descr=descrs.jf_extra_stack_depth),
- ResOperation(rop.SETFIELD_GC, [frame, self.c_null],
- descr=descrs.jf_savedata),
- ResOperation(rop.SETFIELD_GC, [frame, self.c_null],
- descr=descrs.jf_force_descr),
- ResOperation(rop.SETFIELD_GC, [frame, self.c_null],
- descr=descrs.jf_descr),
- ResOperation(rop.SETFIELD_GC, [frame, self.c_null],
- descr=descrs.jf_guard_exc),
- ResOperation(rop.SETFIELD_GC, [frame, self.c_null],
- descr=descrs.jf_forward),
- ]
- for op in extra_ops:
- self.emit_op(op)
+ self.emit_setfield(frame, self.c_zero,
+ descr=descrs.jf_extra_stack_depth)
+ self.emit_setfield(frame, self.c_null,
+ descr=descrs.jf_savedata)
+ self.emit_setfield(frame, self.c_null,
+ descr=descrs.jf_force_descr)
+ self.emit_setfield(frame, self.c_null,
+ descr=descrs.jf_descr)
+ self.emit_setfield(frame, self.c_null,
+ descr=descrs.jf_guard_exc)
+ self.emit_setfield(frame, self.c_null,
+ descr=descrs.jf_forward)
+
self.gen_initialize_len(frame, length,
descrs.arraydescr.lendescr)
return self.get_box_replacement(frame)
diff --git a/rpython/jit/backend/llsupport/stmrewrite.py
b/rpython/jit/backend/llsupport/stmrewrite.py
--- a/rpython/jit/backend/llsupport/stmrewrite.py
+++ b/rpython/jit/backend/llsupport/stmrewrite.py
@@ -1,5 +1,6 @@
from rpython.jit.backend.llsupport.rewrite import GcRewriterAssembler
-from rpython.jit.backend.llsupport.descr import CallDescr, ArrayOrFieldDescr
+from rpython.jit.backend.llsupport.descr import (
+ CallDescr, ArrayOrFieldDescr, unpack_fielddescr)
from rpython.jit.metainterp.resoperation import ResOperation, rop
from rpython.jit.metainterp.history import ConstInt
from rpython.rlib.objectmodel import specialize
@@ -38,13 +39,14 @@
if op.is_always_pure() or op.is_guard() or op.is_ovf():
self.emit_op(op)
return
- # ---------- non-pure getfields ----------
+ # # ---------- non-pure getfields ----------
if opnum in (rop.GETARRAYITEM_GC_I, rop.GETARRAYITEM_GC_F,
rop.GETARRAYITEM_GC_R,
rop.VEC_GETARRAYITEM_GC_I, rop.VEC_GETARRAYITEM_GC_F,
rop.GETINTERIORFIELD_GC_I,
rop.GETINTERIORFIELD_GC_F, rop.GETINTERIORFIELD_GC_R):
- self.handle_getfields(op)
+ #self.handle_getfields(op)
+ self.emit_op(op)
return
# ---------- calls ----------
if op.is_call():
@@ -118,23 +120,24 @@
self.always_inevitable = False
self.read_barrier_applied.clear()
- def handle_getfields(self, op):
+ def emit_gc_load_or_indexed(self, op, ptr_box, index_box, itemsize,
factor, offset, sign, type='i'):
# XXX missing optimitations: the placement of stm_read should
# ideally be delayed for a bit longer after the getfields; if we
# group together several stm_reads then we can save one
# instruction; if delayed over a cond_call_gc_wb then we can
# omit the stm_read completely; ...
- self.emit_op(op)
- v_ptr = op.getarg(0)
- if (v_ptr not in self.read_barrier_applied and
- not self.write_barrier_applied(v_ptr)):
- op1 = ResOperation(rop.STM_READ, [v_ptr], None)
+ newop = GcRewriterAssembler.emit_gc_load_or_indexed(
+ self, op, ptr_box, index_box, itemsize, factor, offset, sign, type)
+ ptr_box = newop.getarg(0)
+ if (op and not op.is_always_pure() and ptr_box.type == 'r'
+ and ptr_box not in self.read_barrier_applied
+ and not self.write_barrier_applied(ptr_box)):
+ op1 = ResOperation(rop.STM_READ, [ptr_box], None)
+ self.read_barrier_applied[ptr_box] = None
self.emit_op(op1)
- self.read_barrier_applied[v_ptr] = None
+ return newop
- def handle_getfield_gc(self, op):
- self.emit_pending_zeros()
- self.handle_getfields(op)
+
def possibly_add_dummy_allocation(self):
# was necessary in C7 for others to commit, but in C8 it is only
@@ -167,11 +170,8 @@
# This is necessary since we merge some allocations together and
# stmgc assumes flags to be cleared.
assert self.gc_ll_descr.fielddescr_stmflags is not None
-
- op = ResOperation(rop.SETFIELD_GC,
- [v_newgcobj, self.c_zero],
- descr=self.gc_ll_descr.fielddescr_stmflags)
- self.emit_op(op)
+ self.emit_setfield(v_newgcobj, self.c_zero,
+ descr=self.gc_ll_descr.fielddescr_stmflags)
return GcRewriterAssembler.gen_initialize_tid(self, v_newgcobj, tid)
@specialize.arg(1)
diff --git a/rpython/jit/backend/llsupport/test/test_stmrewrite.py
b/rpython/jit/backend/llsupport/test/test_stmrewrite.py
--- a/rpython/jit/backend/llsupport/test/test_stmrewrite.py
+++ b/rpython/jit/backend/llsupport/test/test_stmrewrite.py
@@ -38,6 +38,8 @@
words.append('SETARRAYITEM_GC')
words.append('VEC_SETARRAYITEM_GC')
words.append('SETINTERIORFIELD_GC')
+ words += ['GC_LOAD_F', 'GC_LOAD_I', 'GC_LOAD_INDEXED_F',
'GC_LOAD_INDEXED_I',
+ 'GC_LOAD_INDEXED_R', 'GC_LOAD_R', 'GC_STORE', 'GC_STORE_INDEXED']
words.append('NEW')
words.append('NEWSTR')
words.append('NEWUNICODE')
@@ -99,13 +101,17 @@
" descr=stm_try_inevitable_descr)")
hcs = ("call_n(ConstClass(stm_hint_commit_soon),"
" descr=stm_hint_commit_soon_descr)")
-
- dummyalloc = "p999 = call_malloc_nursery(16)"
+ header_init = r"""
+ gc_store_indexed(\1, 0, 0, 1, %(stmflagsdescr.offset)s,
%(stmflagsdescr.field_size)s)
+ gc_store(\1, 0, %(\2.tid)d, %(tiddescr.field_size)s)
+ """
+ import re
+ p = re.compile(r"\$INIT\((p\d+),\s*(\w+)\)")
+ to_operations = p.sub(header_init, to_operations)
frm_operations = frm_operations.replace('$INEV', inev)
frm_operations = frm_operations.replace('$HCS', hcs)
to_operations = to_operations .replace('$INEV', inev)
to_operations = to_operations .replace('$HCS', hcs)
- to_operations = to_operations .replace('$DUMMYALLOC', dummyalloc)
for name, value in self.gc_ll_descr.__dict__.items():
if name.endswith('descr') and name[1] == '2' and len(name) == 8:
assert name not in namespace
@@ -135,7 +141,6 @@
[]
%s
call_n(123, descr=cd)
- $DUMMYALLOC
jump()
""" % ("$INEV" if inev else "",), cd=calldescr)
@@ -147,8 +152,7 @@
""", """
[p1, p2]
cond_call_gc_wb(p1, descr=wbdescr)
- setfield_gc(p1, p2, descr=tzdescr)
- $DUMMYALLOC
+ gc_store_indexed(p1, 0, p2, 1, %(tzdescr.offset)s,
%(tzdescr.field_size)s)
jump()
""")
@@ -160,8 +164,7 @@
""", """
[p1, i2]
cond_call_gc_wb(p1, descr=wbdescr)
- setfield_gc(p1, i2, descr=tzdescr)
- $DUMMYALLOC
+ gc_store_indexed(p1, 0, i2, 1, %(tzdescr.offset)s,
%(tzdescr.field_size)s)
jump()
""")
@@ -175,8 +178,7 @@
""", """
[p1, p2]
cond_call_gc_wb(ConstPtr(t), descr=wbdescr)
- setfield_gc(ConstPtr(t), p2, descr=tzdescr)
- $DUMMYALLOC
+ gc_store_indexed(ConstPtr(t), 0, p2, 1, %(tzdescr.offset)s,
%(tzdescr.field_size)s)
jump()
""", t=NULL)
@@ -187,9 +189,8 @@
jump()
""", """
[p1]
- p2 = getfield_gc_r(p1, descr=tzdescr)
stm_read(p1)
- $DUMMYALLOC
+ p2 = gc_load_indexed_r(p1, 0, 1, %(tzdescr.field_size)s,
%(tzdescr.field_size)s)
jump()
""")
@@ -203,13 +204,12 @@
jump()
""", """
[p1, p2]
- p3 = getfield_gc_r(p1, descr=tzdescr)
stm_read(p1)
- p4 = getfield_gc_r(p1, descr=tzdescr)
- p5 = getfield_gc_r(p2, descr=tzdescr)
+ p3 = gc_load_indexed_r(p1, 0, 1, %(tzdescr.field_size)s,
%(tzdescr.field_size)s)
+ p4 = gc_load_indexed_r(p1, 0, 1, %(tzdescr.field_size)s,
%(tzdescr.field_size)s)
stm_read(p2)
- p6 = getfield_gc_r(p1, descr=tzdescr)
- $DUMMYALLOC
+ p5 = gc_load_indexed_r(p2, 0, 1, %(tzdescr.field_size)s,
%(tzdescr.field_size)s)
+ p6 = gc_load_indexed_r(p1, 0, 1, %(tzdescr.field_size)s,
%(tzdescr.field_size)s)
jump()
""")
@@ -222,10 +222,9 @@
""", """
[p1, i2]
cond_call_gc_wb(p1, descr=wbdescr)
- setfield_gc(p1, i2, descr=tydescr)
- p3 = getfield_gc_r(p1, descr=tzdescr)
- $DUMMYALLOC
- jump(p3)
+ gc_store(p1, 0, i2, %(tydescr.field_size)s)
+ p3 = gc_load_indexed_r(p1, 0, 1, %(tzdescr.field_size)s,
%(tzdescr.field_size)s)
+ jump(p3)
""")
def test_mixed_case(self):
@@ -239,12 +238,11 @@
jump()
""", """
[p0, p1, p2]
- p3 = getfield_gc_r(p1, descr=tzdescr)
stm_read(p1)
+ p3 = gc_load_indexed_r(p1, 0, 1, %(tzdescr.field_size)s,
%(tzdescr.field_size)s)
cond_call_gc_wb(p2, descr=wbdescr)
- setfield_gc(p2, p0, descr=tzdescr)
- p4 = getfield_gc_r(p1, descr=tzdescr)
- $DUMMYALLOC
+ gc_store_indexed(p2, 0, p0, 1, %(tzdescr.offset)s,
%(tzdescr.field_size)s)
+ p4 = gc_load_indexed_r(p1, 0, 1, %(tzdescr.field_size)s,
%(tzdescr.field_size)s)
jump()
""", t=NULL)
@@ -258,13 +256,12 @@
""", """
[p1, p3]
cond_call_gc_wb(p3, descr=wbdescr)
- setfield_gc(p3, p1, descr=tzdescr)
+ gc_store_indexed(p3, 0, p1, 1, %(tzdescr.offset)s,
%(tzdescr.field_size)s)
p2 = call_malloc_nursery(%(tdescr.size)d)
- setfield_gc(p2, 0, descr=stmflagsdescr)
- setfield_gc(p2, %(tdescr.tid)d, descr=tiddescr)
+ $INIT(p2,tdescr)
cond_call_gc_wb(p3, descr=wbdescr)
- setfield_gc(p3, p1, descr=tzdescr)
- zero_ptr_field(p2, %(tdescr.gc_fielddescrs[0].offset)s)
+ gc_store_indexed(p3, 0, p1, 1, %(tzdescr.offset)s,
%(tzdescr.field_size)s)
+ gc_store(p2, %(tdescr.gc_fielddescrs[0].offset)s, 0,
%(tdescr.gc_fielddescrs[0].field_size)s)
jump(p2)
""")
@@ -277,13 +274,12 @@
jump(p2)
""", """
[p1]
- p2 = getfield_gc_r(p1, descr=tzdescr)
stm_read(p1)
+ p2 = gc_load_indexed_r(p1, 0, 1, %(tzdescr.field_size)s,
%(tzdescr.field_size)s)
p3 = call_malloc_nursery(%(tdescr.size)d)
- setfield_gc(p3, 0, descr=stmflagsdescr)
- setfield_gc(p3, %(tdescr.tid)d, descr=tiddescr)
- zero_ptr_field(p3, %(tdescr.gc_fielddescrs[0].offset)s)
- p4 = getfield_gc_r(p1, descr=tzdescr)
+ $INIT(p3,tdescr)
+ gc_store(p3, %(tdescr.gc_fielddescrs[0].offset)s, 0,
%(tdescr.gc_fielddescrs[0].field_size)s)
+ p4 = gc_load_indexed_r(p1, 0, 1, %(tzdescr.field_size)s,
%(tzdescr.field_size)s)
jump(p2)
""")
@@ -296,9 +292,8 @@
""", """
[p1]
p2 = call_malloc_nursery(%(tdescr.size)d)
- setfield_gc(p2, 0, descr=stmflagsdescr)
- setfield_gc(p2, %(tdescr.tid)d, descr=tiddescr)
- setfield_gc(p2, p1, descr=tzdescr)
+ $INIT(p2,tdescr)
+ gc_store_indexed(p2, 0, p1, 1, %(tzdescr.offset)s,
%(tzdescr.field_size)s)
jump(p2)
""")
@@ -311,10 +306,9 @@
""", """
[]
p2 = call_malloc_nursery(%(tdescr.size)d)
- setfield_gc(p2, 0, descr=stmflagsdescr)
- setfield_gc(p2, %(tdescr.tid)d, descr=tiddescr)
- zero_ptr_field(p2, %(tdescr.gc_fielddescrs[0].offset)s)
- p1 = getfield_gc_r(p2, descr=tzdescr)
+ $INIT(p2,tdescr)
+ gc_store(p2, %(tdescr.gc_fielddescrs[0].offset)s, 0,
%(tdescr.gc_fielddescrs[0].field_size)s)
+ p1 = gc_load_indexed_r(p2, 0, 1, %(tzdescr.field_size)s,
%(tzdescr.field_size)s)
jump(p1)
""")
@@ -327,10 +321,9 @@
""", """
[p1, p2, p3, p4]
cond_call_gc_wb(p1, descr=wbdescr)
- setfield_gc(p1, p2, descr=tzdescr)
+ gc_store_indexed(p1, 0, p2, 1, %(tzdescr.offset)s,
%(tzdescr.field_size)s)
cond_call_gc_wb(p3, descr=wbdescr)
- setfield_gc(p3, p4, descr=tzdescr)
- $DUMMYALLOC
+ gc_store_indexed(p3, 0, p4, 1, %(tzdescr.offset)s,
%(tzdescr.field_size)s)
jump()
""")
@@ -343,9 +336,8 @@
""", """
[p1, p2, i3]
cond_call_gc_wb(p1, descr=wbdescr)
- setfield_gc(p1, p2, descr=tzdescr)
- setfield_gc(p1, i3, descr=tydescr)
- $DUMMYALLOC
+ gc_store_indexed(p1, 0, p2, 1, %(tzdescr.offset)s,
%(tzdescr.field_size)s)
+ gc_store(p1, 0, i3, %(tydescr.field_size)s)
jump()
""")
@@ -359,11 +351,10 @@
""", """
[p1, p2, i3]
cond_call_gc_wb(p1, descr=wbdescr)
- setfield_gc(p1, p2, descr=tzdescr)
+ gc_store_indexed(p1, 0, p2, 1, %(tzdescr.offset)s,
%(tzdescr.field_size)s)
label(p1, i3)
cond_call_gc_wb(p1, descr=wbdescr)
- setfield_gc(p1, i3, descr=tydescr)
- $DUMMYALLOC
+ gc_store(p1, 0, i3, %(tydescr.field_size)s)
jump(p1)
""")
@@ -375,7 +366,6 @@
jump()
""", """
[i1, i2]
- $DUMMYALLOC
jump()
""")
@@ -397,10 +387,8 @@
testcase = """
[i1, i2, p1, p2, f1]
%s
- $DUMMYALLOC
finish()
""" % op
- self.check_rewrite(testcase.replace('$DUMMYALLOC', ''), testcase)
def test_rewrite_getfield_gc_const(self):
TP = lltype.GcArray(lltype.Signed)
@@ -411,9 +399,8 @@
jump(p2)
""", """
[p1]
- p2 = getfield_gc_r(ConstPtr(t), descr=tzdescr)
stm_read(ConstPtr(t))
- $DUMMYALLOC
+ p2 = gc_load_indexed_r(ConstPtr(t), 0, 1, %(tzdescr.field_size)s,
%(tzdescr.field_size)s)
jump(p2)
""", t=NULL)
@@ -424,9 +411,8 @@
jump(i3)
""", """
[p1, i2]
- i3 = getarrayitem_gc_i(p1, i2, descr=adescr)
stm_read(p1)
- $DUMMYALLOC
+ i3 = gc_load_indexed_i(p1, i2, %(adescr.itemsize)s,
%(adescr.basesize)s, -%(adescr.itemsize)s)
jump(i3)
""")
@@ -437,9 +423,8 @@
jump(i3)
""", """
[p1, i2]
- i3 = getinteriorfield_gc_i(p1, i2, descr=intzdescr)
stm_read(p1)
- $DUMMYALLOC
+ i3 =
gc_load_indexed_i(p1,i2,%(itxdescr.fielddescr.field_size)d,%(itxdescr.arraydescr.basesize
+ itxdescr.fielddescr.offset)d,%(itxdescr.fielddescr.field_size)d)
jump(i3)
""")
@@ -451,11 +436,10 @@
jump(p2, i2)
""", """
[p1]
- p2 = getfield_gc_r(p1, descr=tzdescr)
stm_read(p1)
- i2 = getfield_gc_i(p2, descr=tydescr)
+ p2 = gc_load_indexed_r(p1, 0, 1, %(tzdescr.field_size)s,
%(tzdescr.field_size)s)
stm_read(p2)
- $DUMMYALLOC
+ i2 = gc_load_i(p2, 0, -%(tydescr.field_size)s)
jump(p2, i2)
""")
@@ -470,12 +454,11 @@
jump(p1)
""", """
[p1]
- i1 = getfield_gc_i(p1, descr=tydescr)
stm_read(p1)
+ i1 = gc_load_i(p1, 0, -%(tydescr.field_size)s)
i2 = int_add(i1, 1)
cond_call_gc_wb(p1, descr=wbdescr)
- setfield_gc(p1, i2, descr=tydescr)
- $DUMMYALLOC
+ gc_store(p1, 0, i2, %(tydescr.field_size)s)
jump(p1)
""")
@@ -497,12 +480,11 @@
jump(p2)
""", """
[p1]
- p2 = getfield_gc_r(p1, descr=tzdescr)
stm_read(p1)
+ p2 = gc_load_indexed_r(p1, 0, 1, %(tzdescr.field_size)s,
%(tzdescr.field_size)s)
call_n(p2, descr=calldescr1)
cond_call_gc_wb(p1, descr=wbdescr)
- setfield_gc(p1, 5, descr=tydescr)
- $DUMMYALLOC
+ gc_store(p1, 0, 5, %(tydescr.field_size)s)
jump(p2)
""", calldescr1=calldescr1)
@@ -516,10 +498,9 @@
""", """
[i1, i2]
$INEV
- i3 = getfield_raw_i(i1, descr=tydescr)
+ i3 = gc_load_i(i1, 0, -%(tydescr.field_size)s)
keepalive(i3)
- i4 = getfield_raw_i(i2, descr=tydescr)
- $DUMMYALLOC
+ i4 = gc_load_i(i2, 0, -%(tydescr.field_size)s)
jump(i3, i4)
""")
@@ -527,33 +508,31 @@
c1 = GcCache(False)
F = lltype.Struct('F', ('x', lltype.Signed),
hints={'stm_dont_track_raw_accesses': True})
- fdescr = get_field_descr(c1, F, 'x')
+ fadescr = get_field_descr(c1, F, 'x')
self.check_rewrite("""
[i1]
- i2 = getfield_raw_i(i1, descr=fdescr)
+ i2 = getfield_raw_i(i1, descr=fadescr)
jump(i2)
""", """
[i1]
- i2 = getfield_raw_i(i1, descr=fdescr)
- $DUMMYALLOC
+ i2 = gc_load_i(i1, 0, -%(fasize)d)
jump(i2)
- """, fdescr=fdescr)
+ """, fadescr=fadescr, fasize=fadescr.field_size)
def test_setfield_raw_stm_dont_track_raw_accesses(self):
c1 = GcCache(False)
F = lltype.Struct('F', ('x', lltype.Signed),
hints={'stm_dont_track_raw_accesses': True})
- fdescr = get_field_descr(c1, F, 'x')
+ fadescr = get_field_descr(c1, F, 'x')
self.check_rewrite("""
[i1]
- setfield_raw(i1, 42, descr=fdescr)
+ setfield_raw(i1, 42, descr=fadescr)
jump(i1)
""", """
[i1]
- setfield_raw(i1, 42, descr=fdescr)
- $DUMMYALLOC
+ gc_store(i1, 0, 42, %(fadescr.field_size)s)
jump(i1)
- """, fdescr=fdescr)
+ """, fadescr=fadescr)
def test_getarrayitem_raw_stm_dont_track_raw_accesses(self):
c1 = GcCache(False)
@@ -567,8 +546,7 @@
jump(i2)
""", """
[i1]
- i2 = getarrayitem_raw_i(i1, 5, descr=aadescr)
- $DUMMYALLOC
+ i2 = gc_load_indexed_i(i1, 5, %(aadescr.itemsize)s,
%(aadescr.basesize)s, -%(aadescr.itemsize)s)
jump(i2)
""", aadescr=aadescr)
@@ -583,8 +561,7 @@
jump(i1)
""", """
[i1]
- setarrayitem_raw(i1, 5, 42, descr=aadescr)
- $DUMMYALLOC
+ gc_store_indexed(i1, 5, 42, %(aadescr.itemsize)s,
%(aadescr.basesize)s, %(aadescr.itemsize)s)
jump(i1)
""", aadescr=aadescr)
@@ -598,11 +575,10 @@
""", """
[i1, i2]
$INEV
- i3 = getfield_raw_i(i1, descr=tydescr)
+ i3 = gc_load_i(i1, 0, -%(tydescr.field_size)d)
label(i1, i2, i3)
$INEV
- i4 = getfield_raw_i(i2, descr=tydescr)
- $DUMMYALLOC
+ i4 = gc_load_i(i2, 0, -%(tydescr.field_size)d)
jump(i3, i4)
""")
@@ -615,9 +591,8 @@
""", """
[i1, i2]
$INEV
- i3 = getarrayitem_raw_i(i1, 5, descr=adescr)
- i4 = getarrayitem_raw_i(i2, i3, descr=adescr)
- $DUMMYALLOC
+ i3 = gc_load_indexed_i(i1, 5, %(adescr.itemsize)s,
%(adescr.basesize)s, -%(adescr.itemsize)s)
+ i4 = gc_load_indexed_i(i2, i3, %(adescr.itemsize)s,
%(adescr.basesize)s, -%(adescr.itemsize)s)
jump(i3, i4)
""")
@@ -630,10 +605,9 @@
""", """
[p1, i1, p2, p3, i3, p4]
cond_call_gc_wb_array(p1, i1, descr=wbdescr)
- setarrayitem_gc(p1, i1, p2, descr=adescr)
+ gc_store_indexed(p1, i1, p2, %(adescr.itemsize)s,
%(adescr.basesize)s, %(adescr.itemsize)s)
cond_call_gc_wb_array(p3, i3, descr=wbdescr)
- setarrayitem_gc(p3, i3, p4, descr=adescr)
- $DUMMYALLOC
+ gc_store_indexed(p3, i3, p4, %(adescr.itemsize)s,
%(adescr.basesize)s, %(adescr.itemsize)s)
jump()
""")
@@ -647,11 +621,10 @@
""", """
[p1, p2, i2, p3, i3]
cond_call_gc_wb_array(p1, i2, descr=wbdescr)
- setarrayitem_gc(p1, i2, p2, descr=adescr)
+ gc_store_indexed(p1, i2, p2, %(adescr.itemsize)s,
%(adescr.basesize)s, %(adescr.itemsize)s)
i4 = force_token()
cond_call_gc_wb_array(p1, i3, descr=wbdescr)
- setarrayitem_gc(p1, i3, p3, descr=adescr)
- $DUMMYALLOC
+ gc_store_indexed(p1, i3, p3, %(adescr.itemsize)s,
%(adescr.basesize)s, %(adescr.itemsize)s)
jump()
""")
@@ -665,11 +638,10 @@
""", """
[p1, p2, i2, p3, i3]
cond_call_gc_wb_array(p1, i2, descr=wbdescr)
- setinteriorfield_gc(p1, i2, p2, descr=intzdescr)
+
gc_store_indexed(p1,i2,p2,%(intzdescr.fielddescr.field_size)d,%(intzdescr.arraydescr.basesize+intzdescr.fielddescr.offset)d,%(intzdescr.fielddescr.field_size)d)
i4 = force_token()
cond_call_gc_wb_array(p1, i3, descr=wbdescr)
- setinteriorfield_gc(p1, i3, p3, descr=intzdescr)
- $DUMMYALLOC
+
gc_store_indexed(p1,i3,p3,%(intzdescr.fielddescr.field_size)d,%(intzdescr.arraydescr.basesize+intzdescr.fielddescr.offset)d,%(intzdescr.fielddescr.field_size)d)
jump()
""")
@@ -682,9 +654,8 @@
""", """
[p1, i2, i3]
cond_call_gc_wb(p1, descr=wbdescr)
- strsetitem(p1, i2, i3)
- unicodesetitem(p1, i2, i3)
- $DUMMYALLOC
+ gc_store_indexed(p1,i2,i3,1,%(strdescr.basesize)d,1)
+
gc_store_indexed(p1,i2,i3,%(unicodedescr.itemsize)d,%(unicodedescr.basesize)d,%(unicodedescr.itemsize)d)
jump()
""")
@@ -698,11 +669,11 @@
""", """
[i2, i3]
p1 = call_malloc_nursery_varsize(1, 1, i3, descr=strdescr)
- setfield_gc(p1, i3, descr=strlendescr)
- setfield_gc(p1, 0, descr=strhashdescr)
+ gc_store_indexed(p1, 0, i3, 1, %(strlendescr.offset)s,
%(strlendescr.field_size)s)
+ gc_store(p1, 0, 0, %(strhashdescr.field_size)s)
cond_call_gc_wb(p1, descr=wbdescr)
- strsetitem(p1, i2, i3)
- unicodesetitem(p1, i2, i3)
+ gc_store_indexed(p1,i2,i3,1,%(strdescr.basesize)d,1)
+
gc_store_indexed(p1,i2,i3,%(unicodedescr.itemsize)d,%(unicodedescr.basesize)d,%(unicodedescr.itemsize)d)
jump()
""")
@@ -714,9 +685,8 @@
jump()
""", """
[p1, i2, i3]
- i4=strgetitem(p1, i2)
- i5=unicodegetitem(p1, i2)
- $DUMMYALLOC
+ i4 = gc_load_indexed_i(p1,i2,1,%(strdescr.basesize)d,1)
+ i5 =
gc_load_indexed_i(p1,i2,%(unicodedescr.itemsize)d,%(unicodedescr.basesize)d,%(unicodedescr.itemsize)d)
jump()
""")
@@ -733,21 +703,20 @@
jump(i2, p7, i1)
""", """
[i2, p7, p1]
- i1 = getfield_gc_i(p1, descr=tydescr)
stm_read(p1)
+ i1 = gc_load_i(p1, 0, -%(tydescr.field_size)s)
cond_call_gc_wb(p7, descr=wbdescr)
- setfield_gc(p7, 10, descr=tydescr)
+ gc_store(p7, 0, 10, %(tydescr.field_size)s)
$HCS
cond_call_gc_wb(p7, descr=wbdescr)
- setfield_gc(p7, 20, descr=tydescr)
+ gc_store(p7, 0, 20, %(tydescr.field_size)s)
- i3 = getfield_gc_i(p1, descr=tydescr) # noptr
stm_read(p1)
+ i3 = gc_load_i(p1, 0, -%(tydescr.field_size)s)
- $DUMMYALLOC
jump(i2, p7, i1)
""", calldescr2=calldescr2)
@@ -766,14 +735,13 @@
""", """
[i1, i2, i3, p7]
cond_call_gc_wb(p7, descr=wbdescr)
- setfield_gc(p7, 10, descr=tydescr)
+ gc_store(p7, 0, 10, %(tydescr.field_size)s)
call_release_gil_n(123, descr=calldescr2)
guard_not_forced() []
cond_call_gc_wb(p7, descr=wbdescr)
- setfield_gc(p7, 20, descr=tydescr)
+ gc_store(p7, 0, 20, %(tydescr.field_size)s)
- $DUMMYALLOC
jump(i2, p7)
""", calldescr2=calldescr2)
@@ -781,12 +749,14 @@
T = rffi.CArrayPtr(rffi.TIME_T)
calldescr2 = get_call_descr(self.gc_ll_descr, [T], rffi.TIME_T)
oplist = [
- "setfield_raw(i1, i2, descr=tydescr)",
- "setarrayitem_raw(i1, i2, i3, descr=adescr)",
+ ("setfield_raw(i1, i2, descr=tydescr)",
+ "gc_store(i1, 0, i2, %(tydescr.field_size)s)"),
+ ("setarrayitem_raw(i1, i2, i3, descr=adescr)",
+ "gc_store_indexed(i1, i2, i3, %(adescr.itemsize)s,
%(adescr.basesize)s, %(adescr.itemsize)s)"),
#"setinteriorfield_raw(i1, i2, i3, descr=intzdescr)", -- no such op
- "escape_n(i1)", # a generic unknown operation
+ ("escape_n(i1)","escape_n(i1)"), # a generic unknown operation
]
- for op in oplist:
+ for op, rop in oplist:
self.check_rewrite("""
[i1, i2, i3, p7]
setfield_gc(p7, 10, descr=tydescr)
@@ -796,15 +766,14 @@
""" % op, """
[i1, i2, i3, p7]
cond_call_gc_wb(p7, descr=wbdescr)
- setfield_gc(p7, 10, descr=tydescr)
+ gc_store(p7, 0, 10, %%(tydescr.field_size)s)
$INEV
%s
cond_call_gc_wb(p7, descr=wbdescr)
- setfield_gc(p7, 20, descr=tydescr)
+ gc_store(p7, 0, 20, %%(tydescr.field_size)s)
- $DUMMYALLOC
jump(i2, p7)
- """ % op, calldescr2=calldescr2)
+ """ % rop, calldescr2=calldescr2)
def test_copystrcontent_new(self):
self.check_rewrite("""
@@ -815,8 +784,8 @@
""", """
[p1, i1, i2, i3]
p2 = call_malloc_nursery_varsize(1, 1, i3, descr=strdescr)
- setfield_gc(p2, i3, descr=strlendescr)
- setfield_gc(p2, 0, descr=strhashdescr)
+ gc_store_indexed(p2, 0, i3, 1, %(strlendescr.offset)s,
%(strlendescr.field_size)s)
+ gc_store(p2, 0, 0, %(strhashdescr.field_size)s)
cond_call_gc_wb(p2, descr=wbdescr)
copystrcontent(p1, p2, i1, i2, i3)
jump()
@@ -831,7 +800,6 @@
[p1, p2, i1, i2, i3]
cond_call_gc_wb(p2, descr=wbdescr)
copystrcontent(p1, p2, i1, i2, i3)
- $DUMMYALLOC
jump()
""")
@@ -853,7 +821,6 @@
setfield_gc(p1, 10, descr=tydescr)
%s
setfield_gc(p1, 20, descr=tydescr)
- $DUMMYALLOC
jump(p1)
""" % op)
@@ -882,14 +849,13 @@
""" % (op, guard), """
[p1]
cond_call_gc_wb(p1, descr=wbdescr)
- setfield_gc(p1, 10, descr=tydescr)
+ gc_store(p1, 0, 10, %%(tydescr.field_size)s)
%s
%s
%s
cond_call_gc_wb(p1, descr=wbdescr)
- setfield_gc(p1, 20, descr=tydescr)
+ gc_store(p1, 0, 20, %%(tydescr.field_size)s)
- $DUMMYALLOC
jump(p1)
""" % (op, guard, tr_break), calldescr2=calldescr2)
@@ -900,22 +866,23 @@
guard_not_forced()[]
""", """
[i0, f0]
- i1 = getfield_raw_i(ConstClass(frame_info), descr=jfi_frame_depth)
+ i1 = gc_load_indexed_i(ConstClass(frame_info), 0, 1, 1,
%(jfi_frame_depth.field_size)s)
p1 = call_malloc_nursery_varsize_frame(i1)
- setfield_gc(p1, 0, descr=stmflagsdescr)
- setfield_gc(p1, 0, descr=tiddescr)
+ gc_store_indexed(p1, 0, 0, 1, %(stmflagsdescr.offset)s,
%(stmflagsdescr.field_size)s)
+ gc_store(p1, 0, 0, %(tiddescr.field_size)s)
- setfield_gc(p1, 0, descr=jf_extra_stack_depth)
- setfield_gc(p1, NULL, descr=jf_savedata)
- setfield_gc(p1, NULL, descr=jf_force_descr)
- setfield_gc(p1, NULL, descr=jf_descr)
- setfield_gc(p1, NULL, descr=jf_guard_exc)
- setfield_gc(p1, NULL, descr=jf_forward)
+ gc_store_indexed(p1, 0, 0, 1, 1, %(jf_extra_stack_depth.field_size)s)
+ gc_store_indexed(p1, 0, NULL, 1, 1, %(jf_savedata.field_size)s)
+ gc_store_indexed(p1, 0, NULL, 1, 1, %(jf_force_descr.field_size)s)
+ gc_store_indexed(p1, 0, NULL, 1, 1, %(jf_descr.field_size)s)
+ gc_store_indexed(p1, 0, NULL, 1, 1, %(jf_guard_exc.field_size)s)
+ gc_store_indexed(p1, 0, NULL, 1, 1, %(jf_forward.field_size)s)
- setfield_gc(p1, i1, descr=framelendescr)
- setfield_gc(p1, ConstClass(frame_info), descr=jf_frame_info)
- setarrayitem_gc(p1, 0, i0, descr=signedframedescr)
- setarrayitem_gc(p1, 1, f0, descr=floatframedescr)
+ gc_store(p1, 0, i1, %(framelendescr.field_size)s)
+ gc_store_indexed(p1, 0, ConstClass(frame_info), 1, 1,
%(jf_frame_info.field_size)s)
+ gc_store_indexed(p1, 0, i0, 8, 3, 8)
+ gc_store_indexed(p1, 1, f0, 8, 5, 8)
+
i3 = call_assembler_i(p1, descr=casmdescr)
guard_not_forced() []
@@ -934,32 +901,32 @@
setfield_gc(p1, p3, descr=tzdescr)
""", """
[i0, f0, p1]
- p2 = getfield_gc_r(p1, descr=tzdescr)
stm_read(p1)
+ p2 = gc_load_indexed_r(p1, 0, 1, %(tzdescr.field_size)s,
%(tzdescr.field_size)s)
cond_call_gc_wb(p1, descr=wbdescr)
- setfield_gc(p1, p2, descr=tzdescr)
+ gc_store_indexed(p1, 0, p2, 1, %(tzdescr.offset)s,
%(tzdescr.field_size)s)
- i1 = getfield_raw_i(ConstClass(frame_info), descr=jfi_frame_depth)
+ i1 = gc_load_indexed_i(ConstClass(frame_info), 0, 1, 1,
%(jfi_frame_depth.field_size)s)
p5 = call_malloc_nursery_varsize_frame(i1)
- setfield_gc(p5, 0, descr=stmflagsdescr)
- setfield_gc(p5, 0, descr=tiddescr)
- setfield_gc(p5, 0, descr=jf_extra_stack_depth)
- setfield_gc(p5, NULL, descr=jf_savedata)
- setfield_gc(p5, NULL, descr=jf_force_descr)
- setfield_gc(p5, NULL, descr=jf_descr)
- setfield_gc(p5, NULL, descr=jf_guard_exc)
- setfield_gc(p5, NULL, descr=jf_forward)
- setfield_gc(p5, i1, descr=framelendescr)
- setfield_gc(p5, ConstClass(frame_info), descr=jf_frame_info)
- setarrayitem_gc(p5, 0, i0, descr=signedframedescr)
- setarrayitem_gc(p5, 1, f0, descr=floatframedescr)
+ gc_store_indexed(p5, 0, 0, 1, %(stmflagsdescr.offset)s,
%(stmflagsdescr.field_size)s)
+ gc_store(p5, 0, 0, %(tiddescr.field_size)s)
+ gc_store_indexed(p5, 0, 0, 1, 1, %(jf_extra_stack_depth.field_size)s)
+ gc_store_indexed(p5, 0, NULL, 1, 1, %(jf_savedata.field_size)s)
+ gc_store_indexed(p5, 0, NULL, 1, 1, %(jf_force_descr.field_size)s)
+ gc_store_indexed(p5, 0, NULL, 1, 1, %(jf_descr.field_size)s)
+ gc_store_indexed(p5, 0, NULL, 1, 1, %(jf_guard_exc.field_size)s)
+ gc_store_indexed(p5, 0, NULL, 1, 1, %(jf_forward.field_size)s)
+ gc_store(p5, 0, i1, %(framelendescr.field_size)s)
+ gc_store_indexed(p5, 0, ConstClass(frame_info), 1, 1,
%(jf_frame_info.field_size)s)
+ gc_store_indexed(p5, 0, i0, 8, 3, 8)
+ gc_store_indexed(p5, 1, f0, 8, 5, 8)
i3 = call_assembler_i(p5, descr=casmdescr)
guard_not_forced() []
- p3 = getfield_gc_r(p1, descr=tzdescr)
stm_read(p1)
+ p3 = gc_load_indexed_r(p1, 0, 1, %(tzdescr.field_size)s,
%(tzdescr.field_size)s)
cond_call_gc_wb(p1, descr=wbdescr)
- setfield_gc(p1, p3, descr=tzdescr)
+ gc_store_indexed(p1, 0, p3, 1, %(tzdescr.offset)s,
%(tzdescr.field_size)s)
""")
def test_ptr_eq_null(self):
@@ -988,7 +955,6 @@
""", """
[p1, p2]
i1 = instance_ptr_eq(p1, p2)
- $DUMMYALLOC
jump(i1)
""")
@@ -1020,8 +986,7 @@
""", """
[p1]
p0 = call_malloc_nursery(%(sdescr.size)d)
- setfield_gc(p0, 0, descr=stmflagsdescr)
- setfield_gc(p0, 1234, descr=tiddescr)
+ $INIT(p0,sdescr)
jump()
""")
@@ -1036,15 +1001,12 @@
[]
p0 = call_malloc_nursery( \
%(sdescr.size + tdescr.size + sdescr.size)d)
- setfield_gc(p0, 0, descr=stmflagsdescr)
- setfield_gc(p0, 1234, descr=tiddescr)
+ $INIT(p0,sdescr)
p1 = nursery_ptr_increment(p0, %(sdescr.size)d)
- setfield_gc(p1, 0, descr=stmflagsdescr)
- setfield_gc(p1, 5678, descr=tiddescr)
+ $INIT(p1,tdescr)
p2 = nursery_ptr_increment(p1, %(tdescr.size)d)
- setfield_gc(p2, 0, descr=stmflagsdescr)
- setfield_gc(p2, 1234, descr=tiddescr)
- zero_ptr_field(p1, %(tdescr.gc_fielddescrs[0].offset)s)
+ $INIT(p2,sdescr)
+ gc_store(p1, %(tdescr.gc_fielddescrs[0].offset)s, 0,
%(tdescr.gc_fielddescrs[0].field_size)s)
jump()
""")
@@ -1057,9 +1019,8 @@
[]
p0 = call_malloc_nursery( \
%(adescr.basesize + 10 * adescr.itemsize)d)
- setfield_gc(p0, 0, descr=stmflagsdescr)
- setfield_gc(p0, 4321, descr=tiddescr)
- setfield_gc(p0, 10, descr=alendescr)
+ $INIT(p0,adescr)
+ gc_store(p0, 0, 10, %(alendescr.field_size)s)
jump()
""")
@@ -1074,12 +1035,10 @@
p0 = call_malloc_nursery( \
%(sdescr.size + \
adescr.basesize + 10 * adescr.itemsize)d)
- setfield_gc(p0, 0, descr=stmflagsdescr)
- setfield_gc(p0, 1234, descr=tiddescr)
+ $INIT(p0,sdescr)
p1 = nursery_ptr_increment(p0, %(sdescr.size)d)
- setfield_gc(p1, 0, descr=stmflagsdescr)
- setfield_gc(p1, 4321, descr=tiddescr)
- setfield_gc(p1, 10, descr=alendescr)
+ $INIT(p1,adescr)
+ gc_store(p1, 0, 10, %(alendescr.field_size)s)
jump()
""")
@@ -1091,9 +1050,8 @@
""", """
[]
p0 = call_malloc_nursery(%(bdescr.basesize + 8)d)
- setfield_gc(p0, 0, descr=stmflagsdescr)
- setfield_gc(p0, 8765, descr=tiddescr)
- setfield_gc(p0, 6, descr=blendescr)
+ $INIT(p0,bdescr)
+ gc_store(p0, 0, 6, %(blendescr.field_size)s)
jump()
""")
@@ -1108,21 +1066,17 @@
""", """
[]
p0 = call_malloc_nursery(%(4 * (bdescr.basesize + 8))d)
- setfield_gc(p0, 0, descr=stmflagsdescr)
- setfield_gc(p0, 8765, descr=tiddescr)
- setfield_gc(p0, 5, descr=blendescr)
+ $INIT(p0,bdescr)
+ gc_store(p0, 0, 5, %(blendescr.field_size)s)
p1 = nursery_ptr_increment(p0, %(bdescr.basesize + 8)d)
- setfield_gc(p1, 0, descr=stmflagsdescr)
- setfield_gc(p1, 8765, descr=tiddescr)
- setfield_gc(p1, 5, descr=blendescr)
+ $INIT(p1,bdescr)
+ gc_store(p1, 0, 5, %(blendescr.field_size)s)
p2 = nursery_ptr_increment(p1, %(bdescr.basesize + 8)d)
- setfield_gc(p2, 0, descr=stmflagsdescr)
- setfield_gc(p2, 8765, descr=tiddescr)
- setfield_gc(p2, 5, descr=blendescr)
+ $INIT(p2,bdescr)
+ gc_store(p2, 0, 5, %(blendescr.field_size)s)
p3 = nursery_ptr_increment(p2, %(bdescr.basesize + 8)d)
- setfield_gc(p3, 0, descr=stmflagsdescr)
- setfield_gc(p3, 8765, descr=tiddescr)
- setfield_gc(p3, 5, descr=blendescr)
+ $INIT(p3,bdescr)
+ gc_store(p3, 0, 5, %(blendescr.field_size)s)
jump()
""")
@@ -1135,11 +1089,9 @@
""", """
[]
p0 = call_malloc_nursery(%(4*WORD)d)
- setfield_gc(p0, 0, descr=stmflagsdescr)
- setfield_gc(p0, 9000, descr=tiddescr)
+ $INIT(p0,edescr)
p1 = nursery_ptr_increment(p0, %(2*WORD)d)
- setfield_gc(p1, 0, descr=stmflagsdescr)
- setfield_gc(p1, 9000, descr=tiddescr)
+ $INIT(p1,edescr)
jump()
""")
@@ -1151,8 +1103,7 @@
""", """
[i0]
p0 = call_malloc_nursery_varsize(0, 1, i0, descr=bdescr)
- setfield_gc(p0, i0, descr=blendescr)
-
+ gc_store(p0, 0, i0, %(blendescr.field_size)s)
jump(i0)
""")
@@ -1164,8 +1115,8 @@
""", """
[i0]
p0 = call_malloc_nursery_varsize(1, 1, i0, descr=strdescr)
- setfield_gc(p0, i0, descr=strlendescr)
- setfield_gc(p0, 0, descr=strhashdescr)
+ gc_store_indexed(p0, 0, i0, 1, %(strlendescr.offset)s,
%(strlendescr.field_size)s)
+ gc_store(p0, 0, 0, %(strhashdescr.field_size)s)
jump(i0)
""")
@@ -1219,18 +1170,15 @@
[]
p0 = call_malloc_nursery( \
%(2 * (bdescr.basesize + 104))d)
- setfield_gc(p0, 0, descr=stmflagsdescr)
- setfield_gc(p0, 8765, descr=tiddescr)
- setfield_gc(p0, 101, descr=blendescr)
+ $INIT(p0,bdescr)
+ gc_store(p0, 0, 101, %(blendescr.field_size)s)
p1 = nursery_ptr_increment(p0, %(bdescr.basesize + 104)d)
- setfield_gc(p1, 0, descr=stmflagsdescr)
- setfield_gc(p1, 8765, descr=tiddescr)
- setfield_gc(p1, 102, descr=blendescr)
+ $INIT(p1,bdescr)
+ gc_store(p1, 0, 102, %(blendescr.field_size)s)
p2 = call_malloc_nursery( \
%(bdescr.basesize + 104)d)
- setfield_gc(p2, 0, descr=stmflagsdescr)
- setfield_gc(p2, 8765, descr=tiddescr)
- setfield_gc(p2, 103, descr=blendescr)
+ $INIT(p2,bdescr)
+ gc_store(p2, 0, 103, %(blendescr.field_size)s)
""")
def test_rewrite_assembler_huge_size(self):
@@ -1255,9 +1203,8 @@
""", """
[p1]
p0 = call_malloc_nursery(104) # rounded up
- setfield_gc(p0, 0, descr=stmflagsdescr)
- setfield_gc(p0, 9315, descr=tiddescr)
- setfield_gc(p0, ConstClass(o_vtable), descr=vtable_descr)
+ $INIT(p0,o_descr)
+ gc_store(p0, 0, ConstClass(o_vtable), %(vtable_descr.field_size)s)
""")
def test_new_with_vtable_too_big(self):
@@ -1269,7 +1216,7 @@
[p1]
p0 = call_malloc_gc(ConstClass(malloc_big_fixedsize), 104, 9315, \
descr=malloc_big_fixedsize_descr)
- setfield_gc(p0, ConstClass(o_vtable), descr=vtable_descr)
+ gc_store(p0, 0, ConstClass(o_vtable), %(vtable_descr.field_size)s)
""")
def test_rewrite_assembler_newstr_newunicode(self):
@@ -1285,26 +1232,24 @@
p0 = call_malloc_nursery( \
%(strdescr.basesize + 16 * strdescr.itemsize + \
unicodedescr.basesize + 10 * unicodedescr.itemsize)d)
- setfield_gc(p0, 0, descr=stmflagsdescr)
- setfield_gc(p0, %(strdescr.tid)d, descr=tiddescr)
- setfield_gc(p0, 14, descr=strlendescr)
- setfield_gc(p0, 0, descr=strhashdescr)
+ $INIT(p0,unicodedescr)
+ gc_store_indexed(p0, 0, 14, 1, %(strlendescr.offset)s,
%(strlendescr.field_size)s)
+ gc_store(p0, 0, 0, %(strhashdescr.field_size)s)
p1 = nursery_ptr_increment(p0, %(strdescr.basesize + 16 *
strdescr.itemsize)d)
- setfield_gc(p1, 0, descr=stmflagsdescr)
- setfield_gc(p1, %(unicodedescr.tid)d, descr=tiddescr)
- setfield_gc(p1, 10, descr=unicodelendescr)
- setfield_gc(p1, 0, descr=unicodehashdescr)
+ $INIT(p1, unicodedescr)
+ gc_store_indexed(p1, 0, 10, 1, %(unicodelendescr.offset)s,
%(strlendescr.field_size)s)
+ gc_store(p1, 0, 0, %(unicodehashdescr.field_size)s)
p2 = call_malloc_nursery_varsize(2, 4, i2, \
descr=unicodedescr)
- setfield_gc(p2, i2, descr=unicodelendescr)
- setfield_gc(p2, 0, descr=unicodehashdescr)
+ gc_store_indexed(p2, 0, i2, 1, %(unicodelendescr.offset)s,
%(strlendescr.field_size)s)
+ gc_store(p2, 0, 0, %(unicodehashdescr.field_size)s)
p3 = call_malloc_nursery_varsize(1, 1, i2, \
descr=strdescr)
- setfield_gc(p3, i2, descr=strlendescr)
- setfield_gc(p3, 0, descr=strhashdescr)
+ gc_store_indexed(p3, 0, i2, 1, %(strlendescr.offset)s,
%(strlendescr.field_size)s)
+ gc_store(p3, 0, 0, %(strhashdescr.field_size)s)
jump()
""")
@@ -1319,13 +1264,12 @@
[i2, p3]
p1 = call_malloc_nursery( \
%(cdescr.basesize + 5 * cdescr.itemsize)d)
- setfield_gc(p1, 0, descr=stmflagsdescr)
- setfield_gc(p1, 8111, descr=tiddescr)
- setfield_gc(p1, 5, descr=clendescr)
+ $INIT(p1,cdescr)
+ gc_store(p1, 0, 5, %(clendescr.field_size)s)
zero_array(p1, 0, 5, descr=cdescr)
label(p1, i2, p3)
cond_call_gc_wb_array(p1, i2, descr=wbdescr)
- setarrayitem_gc(p1, i2, p3, descr=cdescr)
+ gc_store_indexed(p1, i2, p3, %(cdescr.itemsize)s,
%(cdescr.basesize)s, %(cdescr.itemsize)s)
""")
def test_transaction_break_makes_size_unknown(self):
@@ -1348,22 +1292,20 @@
[i0, f0]
p0 = call_malloc_nursery( \
%(2 * (bdescr.basesize + 8))d)
- setfield_gc(p0, 0, descr=stmflagsdescr)
- setfield_gc(p0, 8765, descr=tiddescr)
- setfield_gc(p0, 5, descr=blendescr)
+ $INIT(p0, bdescr)
+ gc_store(p0, 0, 5, %(blendescr.field_size)s)
+
p1 = nursery_ptr_increment(p0, %(bdescr.basesize + 8)d)
- setfield_gc(p1, 0, descr=stmflagsdescr)
- setfield_gc(p1, 8765, descr=tiddescr)
- setfield_gc(p1, 5, descr=blendescr)
+ $INIT(p1, bdescr)
+ gc_store(p1, 0, 5, %(blendescr.field_size)s)
call_may_force_n(12345, descr=calldescr2) # stm_transaction_break
guard_not_forced() []
p2 = call_malloc_nursery( \
%(bdescr.basesize + 8)d)
- setfield_gc(p2, 0, descr=stmflagsdescr)
- setfield_gc(p2, 8765, descr=tiddescr)
- setfield_gc(p2, 5, descr=blendescr)
+ $INIT(p2, bdescr)
+ gc_store(p2, 0, 5, %(blendescr.field_size)s)
""", calldescr2=calldescr2)
@@ -1396,11 +1338,10 @@
jump(p2)
""" % d, """
[p1, p3, i1, p4]
- p2 = getfield_gc%(pure)s_r(p1, descr=uxdescr)
%(comment)s stm_read(p1)
- i4 = getarrayitem_gc%(pure)s_i(p4, i1, descr=vdescr)
+ p2 = gc_load_r(p1, 0, -%%(uxdescr.field_size)s)
%(comment)s stm_read(p4)
- $DUMMYALLOC
+ i4 = gc_load_indexed_i(p4, i1, %%(vdescr.itemsize)s,
%%(vdescr.basesize)s, %%(vdescr.itemsize)s)
jump(p2)
""" % d, uxdescr=uxdescr, vdescr=vdescr)
@@ -1411,7 +1352,8 @@
""", """
[p1, p2]
cond_call_gc_wb(p1, descr=wbdescr) {50}
- setfield_gc(p1, p2, descr=tzdescr) {50}
+ gc_store_indexed(p1, 0, p2, 1, %(tzdescr.offset)s,
%(tzdescr.field_size)s) {50}
+ #setfield_gc(p1, p2, descr=tzdescr) {50}
""")
def test_stm_location_2(self):
@@ -1421,7 +1363,7 @@
""", """
[i1]
$INEV {52}
- i3 = getfield_raw_i(i1, descr=tydescr) {52}
+ i3 = gc_load_i(i1, 0, -%(tydescr.field_size)d) {52}
""")
def test_stm_location_3(self):
@@ -1431,20 +1373,20 @@
guard_not_forced() [] {55}
""", """
[i0, f0]
- i1 = getfield_raw_i(ConstClass(frame_info), descr=jfi_frame_depth) {54}
+ i1 = gc_load_indexed_i(ConstClass(frame_info), 0, 1, 1,
%(jfi_frame_depth.field_size)s) {54}
p1 = call_malloc_nursery_varsize_frame(i1) {54}
- setfield_gc(p1, 0, descr=stmflagsdescr)
- setfield_gc(p1, 0, descr=tiddescr) {54}
- setfield_gc(p1, 0, descr=jf_extra_stack_depth)
- setfield_gc(p1, NULL, descr=jf_savedata)
- setfield_gc(p1, NULL, descr=jf_force_descr)
- setfield_gc(p1, NULL, descr=jf_descr)
- setfield_gc(p1, NULL, descr=jf_guard_exc)
- setfield_gc(p1, NULL, descr=jf_forward)
- setfield_gc(p1, i1, descr=framelendescr) {54}
- setfield_gc(p1, ConstClass(frame_info), descr=jf_frame_info) {54}
- setarrayitem_gc(p1, 0, i0, descr=signedframedescr) {54}
- setarrayitem_gc(p1, 1, f0, descr=floatframedescr) {54}
+ gc_store_indexed(p1, 0, 0, 1, %(stmflagsdescr.offset)s,
%(stmflagsdescr.field_size)s) {54}
+ gc_store(p1, 0, 0, %(tiddescr.field_size)s) {54}
+ gc_store_indexed(p1, 0, 0, 1, 1, %(jf_extra_stack_depth.field_size)s)
{54}
+ gc_store_indexed(p1, 0, NULL, 1, 1, %(jf_savedata.field_size)s) {54}
+ gc_store_indexed(p1, 0, NULL, 1, 1, %(jf_force_descr.field_size)s) {54}
+ gc_store_indexed(p1, 0, NULL, 1, 1, %(jf_descr.field_size)s) {54}
+ gc_store_indexed(p1, 0, NULL, 1, 1, %(jf_guard_exc.field_size)s) {54}
+ gc_store_indexed(p1, 0, NULL, 1, 1, %(jf_forward.field_size)s) {54}
+ gc_store(p1, 0, i1, %(framelendescr.field_size)s) {54}
+ gc_store_indexed(p1, 0, ConstClass(frame_info), 1, 1,
%(jf_frame_info.field_size)s) {54}
+ gc_store_indexed(p1, 0, i0, 8, 3, 8) {54}
+ gc_store_indexed(p1, 1, f0, 8, 5, 8) {54}
i3 = call_assembler_i(p1, descr=casmdescr) {54}
guard_not_forced() [] {55}
""")
@@ -1459,7 +1401,7 @@
[p1, i2, p3]
i3 = int_add(i2, 5) {81}
cond_call_gc_wb_array(p1, i3, descr=wbdescr) {81}
- setarrayitem_gc(p1, i3, p3, descr=cdescr) {81}
+ gc_store_indexed(p1, i3, p3, %(cdescr.itemsize)s,
%(cdescr.basesize)s, %(cdescr.itemsize)s) {81}
""")
def test_stm_should_break_transaction_no_malloc(self):
@@ -1470,7 +1412,6 @@
""", """
[]
i1 = stm_should_break_transaction()
- $DUMMYALLOC
jump(i1)
""")
@@ -1483,10 +1424,9 @@
""", """
[]
p2 = call_malloc_nursery(%(tdescr.size)d)
- setfield_gc(p2, 0, descr=stmflagsdescr)
- setfield_gc(p2, %(tdescr.tid)d, descr=tiddescr)
+ $INIT(p2,tdescr)
i1 = stm_should_break_transaction()
- zero_ptr_field(p2, %(tdescr.gc_fielddescrs[0].offset)s)
+ gc_store(p2, %(tdescr.gc_fielddescrs[0].offset)s, 0,
%(tdescr.gc_fielddescrs[0].field_size)s)
jump(i1)
""")
@@ -1500,7 +1440,6 @@
[]
i1 = stm_should_break_transaction()
i2 = stm_should_break_transaction()
- $DUMMYALLOC
jump(i1, i2)
""")
@@ -1514,12 +1453,10 @@
""", """
[]
p2 = call_malloc_nursery(%(tdescr.size)d)
- setfield_gc(p2, 0, descr=stmflagsdescr)
- setfield_gc(p2, %(tdescr.tid)d, descr=tiddescr)
- zero_ptr_field(p2, %(tdescr.gc_fielddescrs[0].offset)s)
+ $INIT(p2, tdescr)
+ gc_store(p2, %(tdescr.gc_fielddescrs[0].offset)s, 0,
%(tdescr.gc_fielddescrs[0].field_size)s)
label()
i1 = stm_should_break_transaction()
- $DUMMYALLOC
jump(i1)
""")
@@ -1533,7 +1470,6 @@
[]
$INEV
escape_n()
- $DUMMYALLOC
guard_not_forced_2() []
finish()
""")
@@ -1546,9 +1482,8 @@
""", """
[]
p2 = call_malloc_nursery(%(tdescr.size)d)
- setfield_gc(p2, 0, descr=stmflagsdescr)
- setfield_gc(p2, %(tdescr.tid)d, descr=tiddescr)
- zero_ptr_field(p2, %(tdescr.gc_fielddescrs[0].offset)s)
+ $INIT(p2,tdescr)
+ gc_store(p2, %(tdescr.gc_fielddescrs[0].offset)s, 0,
%(tdescr.gc_fielddescrs[0].field_size)s)
$INEV
escape_n()
""")
diff --git a/rpython/jit/backend/x86/assembler.py
b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -1760,9 +1760,13 @@
genop_getfield_raw_i = _genop_getfield_raw
genop_getfield_raw_f = _genop_getfield_raw
- def _genop_gc_load(self, op, arglocs, resloc, segment):
+ def _genop_gc_load(self, op, arglocs, resloc):
base_loc, ofs_loc, size_loc, sign_loc = arglocs
assert isinstance(size_loc, ImmedLoc)
+ if op.getarg(0).type == 'r':
+ segment = self.SEGMENT_GC
+ else:
+ segment = self.SEGMENT_NO
src_addr = addr_add(segment, base_loc, ofs_loc, 0, 0)
self.load_from_mem(resloc, src_addr, size_loc, sign_loc)
@@ -1770,10 +1774,14 @@
genop_gc_load_r = _genop_gc_load
genop_gc_load_f = _genop_gc_load
- def _genop_gc_load_indexed(self, op, arglocs, resloc, segment):
+ def _genop_gc_load_indexed(self, op, arglocs, resloc):
base_loc, ofs_loc, scale_loc, offset_loc, size_loc, sign_loc = arglocs
assert isinstance(scale_loc, ImmedLoc)
scale = get_scale(scale_loc.value)
+ if op.getarg(0).type == 'r':
+ segment = self.SEGMENT_GC
+ else:
+ segment = self.SEGMENT_NO
src_addr = addr_add(segment, base_loc, ofs_loc, offset_loc.value,
scale)
self.load_from_mem(resloc, src_addr, size_loc, sign_loc)
@@ -1835,17 +1843,25 @@
base_loc, = arglocs
self.mc.INC(mem(self.SEGMENT_NO, base_loc, 0))
- def genop_discard_gc_store(self, op, arglocs, segment):
+ def genop_discard_gc_store(self, op, arglocs):
base_loc, ofs_loc, value_loc, size_loc = arglocs
assert isinstance(size_loc, ImmedLoc)
scale = get_scale(size_loc.value)
+ if op.getarg(0).type == 'r':
+ segment = self.SEGMENT_GC
+ else:
+ segment = self.SEGMENT_NO
dest_addr = AddressLoc(segment, base_loc, ofs_loc, 0, 0)
self.save_into_mem(dest_addr, value_loc, size_loc)
- def genop_discard_gc_store_indexed(self, op, arglocs, segment):
+ def genop_discard_gc_store_indexed(self, op, arglocs):
base_loc, ofs_loc, value_loc, factor_loc, offset_loc, size_loc =
arglocs
assert isinstance(size_loc, ImmedLoc)
scale = get_scale(factor_loc.value)
+ if op.getarg(0).type == 'r':
+ segment = self.SEGMENT_GC
+ else:
+ segment = self.SEGMENT_NO
dest_addr = AddressLoc(segment, base_loc, ofs_loc, scale,
offset_loc.value)
self.save_into_mem(dest_addr, value_loc, size_loc)
diff --git a/rpython/jit/backend/x86/regalloc.py
b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -1059,34 +1059,8 @@
need_lower_byte = True
else:
need_lower_byte = False
- box_base, box_index, box_value = args
- base_loc = self.rm.make_sure_var_in_reg(box_base, args)
- index_loc = self.rm.make_sure_var_in_reg(box_index, args)
- value_loc = self.make_sure_var_in_reg(box_value, args,
- need_lower_byte=need_lower_byte)
- # If 'index_loc' is not an immediate, then we need a 'temp_loc' that
- # is a register whose value will be destroyed. It's fine to destroy
- # the same register as 'index_loc', but not the other ones.
- if not isinstance(index_loc, ImmedLoc):
- # ...that is, except in a corner case where 'index_loc' would be
- # in the same register as 'value_loc'...
- tempvar = TempVar()
- temp_loc = self.rm.force_allocate_reg(tempvar, [box_base,
- box_value])
- self.rm.possibly_free_var(tempvar)
- else:
- temp_loc = None
- self.rm.possibly_free_var(box_index)
- self.rm.possibly_free_var(box_base)
- self.possibly_free_var(box_value)
- self.perform_discard(op, [base_loc, ofs, itemsize, fieldsize,
- index_loc, temp_loc, value_loc])
-
- consider_setinteriorfield_raw = consider_setinteriorfield_gc
-
- def consider_strsetitem(self, op):
- args = op.getarglist()
- base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args)
+ value_loc = self.make_sure_var_in_reg(op.getarg(2), args,
+ need_lower_byte=need_lower_byte)
ofs_loc = self.rm.make_sure_var_in_reg(op.getarg(1), args)
self.perform_discard(op, [base_loc, ofs_loc, value_loc,
imm(itemsize)])
@@ -1127,6 +1101,8 @@
assert isinstance(size_box, ConstInt)
size = size_box.value
size_loc = imm(abs(size))
+ segment = op.getarg(3)
+ assert isinstance(segment, int)
if size < 0:
sign_loc = imm1
else:
diff --git a/rpython/rlib/rstm.py b/rpython/rlib/rstm.py
--- a/rpython/rlib/rstm.py
+++ b/rpython/rlib/rstm.py
@@ -153,13 +153,6 @@
leave_callback_call._dont_reach_me_in_del_ = True
leave_callback_call._transaction_break_ = True
-def register_invoke_around_extcall():
- """Initialize the STM system.
- Called automatically by rthread.start_new_thread()."""
- from rpython.rlib.objectmodel import invoke_around_extcall
- invoke_around_extcall(before_external_call, after_external_call,
- enter_callback_call, leave_callback_call)
-
@specialize.argtype(1)
def push_marker(odd_num, object):
llop.stm_push_marker(lltype.Void, odd_num, object)
diff --git a/rpython/rlib/rthread.py b/rpython/rlib/rthread.py
--- a/rpython/rlib/rthread.py
+++ b/rpython/rlib/rthread.py
@@ -79,14 +79,12 @@
@specialize.arg(0)
def ll_start_new_thread(func):
- from rpython.rlib import rgil
_check_thread_enabled()
if rgc.stm_is_enabled():
- from rpython.rlib.rstm import (register_invoke_around_extcall,
- set_transaction_length)
- register_invoke_around_extcall()
+ from rpython.rlib.rstm import set_transaction_length
set_transaction_length(1.0)
else:
+ from rpython.rlib import rgil
rgil.allocate()
# ^^^ convenience: any RPython program which uses explicitly
# rthread.start_new_thread() will initialize the GIL at that
diff --git a/rpython/rtyper/lltypesystem/rffi.py
b/rpython/rtyper/lltypesystem/rffi.py
--- a/rpython/rtyper/lltypesystem/rffi.py
+++ b/rpython/rtyper/lltypesystem/rffi.py
@@ -178,9 +178,13 @@
argnames = ', '.join(['a%d' % i for i in range(len(args))])
source = py.code.Source("""
- from rpython.rlib import rgil
+ from rpython.rlib import rgil, rgc
def call_external_function(%(argnames)s):
- rgil.release()
+ if rgc.stm_is_enabled():
+ from rpython.rlib import rstm
+ rstm.before_external_call()
+ else:
+ rgil.release()
# NB. it is essential that no exception checking occurs here!
if %(save_err)d:
from rpython.rlib import rposix
@@ -189,7 +193,11 @@
if %(save_err)d:
from rpython.rlib import rposix
rposix._errno_after(%(save_err)d)
- rgil.acquire()
+ if rgc.stm_is_enabled():
+ from rpython.rlib import rstm
+ rstm.after_external_call()
+ else:
+ rgil.acquire()
return res
""" % locals())
miniglobals = {'funcptr': funcptr,
@@ -346,7 +354,8 @@
rjbuf = llmemory.NULL
if rgil is not None:
if rgc.stm_is_enabled():
- token = aroundstate.enter_callback(rjbuf)
+ from rpython.rlib import rstm
+ token = rstm.enter_callback_call(rjbuf)
else:
rgil.acquire()
# from now on we hold the GIL
@@ -363,9 +372,10 @@
traceback.print_exc()
result = errorcode
stackcounter.stacks_counter -= 1
- if aroundstate is not None:
+ if rgil is not None:
if rgc.stm_is_enabled():
- aroundstate.leave_callback(rjbuf, token)
+ from rpython.rlib import rstm
+ rstm.leave_callback_call(rjbuf, token)
else:
rgil.release()
# here we don't hold the GIL any more. As in the wrapper() produced
diff --git a/rpython/translator/stm/test/targetjit1.py
b/rpython/translator/stm/test/targetjit1.py
--- a/rpython/translator/stm/test/targetjit1.py
+++ b/rpython/translator/stm/test/targetjit1.py
@@ -1,5 +1,4 @@
from rpython.rlib import jit, rstm, rthread
-from rpython.rlib.objectmodel import invoke_around_extcall
class Global(object):
@@ -119,8 +118,6 @@
def setup_threads():
#space.threadlocals.setup_threads(space)
bootstrapper.setup()
- invoke_around_extcall(rstm.before_external_call, rstm.after_external_call,
- rstm.enter_callback_call, rstm.leave_callback_call)
def start_thread(args):
bootstrapper.acquire(args)
diff --git a/rpython/translator/stm/test/test_readbarrier.py
b/rpython/translator/stm/test/test_readbarrier.py
--- a/rpython/translator/stm/test/test_readbarrier.py
+++ b/rpython/translator/stm/test/test_readbarrier.py
@@ -1,6 +1,5 @@
from rpython.rlib.objectmodel import stm_ignored
from rpython.translator.stm.test.transform_support import BaseTestTransform
-from rpython.rlib.rstm import register_invoke_around_extcall
from rpython.rtyper.lltypesystem import lltype, rffi
from rpython.rtyper.lltypesystem.lloperation import llop
@@ -120,7 +119,6 @@
def test_call_external_release_gil(self):
X = lltype.GcStruct('X', ('foo', lltype.Signed))
def f1(p):
- register_invoke_around_extcall()
x1 = p.foo
external_release_gil()
x2 = p.foo
@@ -134,7 +132,6 @@
def test_call_external_any_gcobj(self):
X = lltype.GcStruct('X', ('foo', lltype.Signed))
def f1(p):
- register_invoke_around_extcall()
x1 = p.foo
external_any_gcobj()
x2 = p.foo
@@ -148,7 +145,6 @@
def test_call_external_safest(self):
X = lltype.GcStruct('X', ('foo', lltype.Signed))
def f1(p):
- register_invoke_around_extcall()
x1 = p.foo
external_safest()
x2 = p.foo
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit