Author: Maciej Fijalkowski <[email protected]>
Branch: inline-dict-ops
Changeset: r45287:7ed3b28dad4a
Date: 2011-07-03 00:31 +0200
http://bitbucket.org/pypy/pypy/changeset/7ed3b28dad4a/
Log: x86 support for {get,set}interiorfield
diff --git a/pypy/jit/backend/llsupport/descr.py
b/pypy/jit/backend/llsupport/descr.py
--- a/pypy/jit/backend/llsupport/descr.py
+++ b/pypy/jit/backend/llsupport/descr.py
@@ -139,6 +139,13 @@
cachedict[fieldname] = fielddescr
return fielddescr
+# ____________________________________________________________
+# InteriorFieldDescr
+
+class InteriorFieldDescr(AbstractDescr):
+ def __init__(self, arraydescr, fielddescr):
+ self.arraydescr = arraydescr
+ self.fielddescr = fielddescr
# ____________________________________________________________
# ArrayDescrs
diff --git a/pypy/jit/backend/llsupport/llmodel.py
b/pypy/jit/backend/llsupport/llmodel.py
--- a/pypy/jit/backend/llsupport/llmodel.py
+++ b/pypy/jit/backend/llsupport/llmodel.py
@@ -8,12 +8,10 @@
from pypy.jit.backend.model import AbstractCPU
from pypy.jit.backend.llsupport import symbolic
from pypy.jit.backend.llsupport.symbolic import WORD, unroll_basic_sizes
-from pypy.jit.backend.llsupport.descr import get_size_descr
-from pypy.jit.backend.llsupport.descr import get_field_descr, BaseFieldDescr
-from pypy.jit.backend.llsupport.descr import get_array_descr, BaseArrayDescr
-from pypy.jit.backend.llsupport.descr import get_call_descr
-from pypy.jit.backend.llsupport.descr import BaseIntCallDescr, GcPtrCallDescr
-from pypy.jit.backend.llsupport.descr import FloatCallDescr, VoidCallDescr
+from pypy.jit.backend.llsupport.descr import (get_size_descr,
+ get_field_descr, BaseFieldDescr, get_array_descr, BaseArrayDescr,
+ get_call_descr, BaseIntCallDescr, GcPtrCallDescr, FloatCallDescr,
+ VoidCallDescr, InteriorFieldDescr)
from pypy.jit.backend.llsupport.asmmemmgr import AsmMemoryManager
@@ -237,6 +235,11 @@
def arraydescrof(self, A):
return get_array_descr(self.gc_ll_descr, A)
+ def interiorfielddescrof(self, A, fieldname):
+ arraydescr = get_array_descr(self.gc_ll_descr, A)
+ fielddescr = get_field_descr(self.gc_ll_descr, A.OF, fieldname)
+ return InteriorFieldDescr(arraydescr, fielddescr)
+
def unpack_arraydescr(self, arraydescr):
assert isinstance(arraydescr, BaseArrayDescr)
return arraydescr.get_base_size(self.translate_support_code)
diff --git a/pypy/jit/backend/llsupport/regalloc.py
b/pypy/jit/backend/llsupport/regalloc.py
--- a/pypy/jit/backend/llsupport/regalloc.py
+++ b/pypy/jit/backend/llsupport/regalloc.py
@@ -278,7 +278,6 @@
self.reg_bindings[to_v] = reg
def _move_variable_away(self, v, prev_loc):
- reg = None
if self.free_regs:
loc = self.free_regs.pop()
self.reg_bindings[v] = loc
diff --git a/pypy/jit/backend/x86/assembler.py
b/pypy/jit/backend/x86/assembler.py
--- a/pypy/jit/backend/x86/assembler.py
+++ b/pypy/jit/backend/x86/assembler.py
@@ -1,7 +1,7 @@
import sys, os
from pypy.jit.backend.llsupport import symbolic
from pypy.jit.backend.llsupport.asmmemmgr import MachineDataBlockWrapper
-from pypy.jit.metainterp.history import Const, Box, BoxInt, BoxPtr, BoxFloat
+from pypy.jit.metainterp.history import Const, Box, BoxInt, ConstInt
from pypy.jit.metainterp.history import (AbstractFailDescr, INT, REF, FLOAT,
LoopToken)
from pypy.rpython.lltypesystem import lltype, rffi, rstr, llmemory
@@ -35,7 +35,6 @@
have_debug_prints)
from pypy.rlib import rgc
from pypy.jit.backend.x86.jump import remap_frame_layout
-from pypy.jit.metainterp.history import ConstInt, BoxInt
from pypy.jit.codewriter.effectinfo import EffectInfo
from pypy.jit.codewriter import longlong
@@ -661,8 +660,8 @@
# Also, make sure this is consistent with FRAME_FIXED_SIZE.
self.mc.PUSH_r(ebp.value)
self.mc.MOV_rr(ebp.value, esp.value)
- for regloc in self.cpu.CALLEE_SAVE_REGISTERS:
- self.mc.PUSH_r(regloc.value)
+ for loc in self.cpu.CALLEE_SAVE_REGISTERS:
+ self.mc.PUSH_r(loc.value)
gcrootmap = self.cpu.gc_ll_descr.gcrootmap
if gcrootmap and gcrootmap.is_shadow_stack:
@@ -1473,12 +1472,25 @@
genop_getarrayitem_gc_pure = genop_getarrayitem_gc
genop_getarrayitem_raw = genop_getarrayitem_gc
+ def genop_getinteriorfield_gc(self, op, arglocs, resloc):
+ base_loc, ofs_loc, itemsize_loc, fieldsize_loc, index_loc, sign_loc =
arglocs
+ self.mc.IMUL(index_loc, itemsize_loc)
+ src_addr = AddressLoc(base_loc, index_loc, 0, ofs_loc.value)
+ self.load_from_mem(resloc, src_addr, fieldsize_loc, sign_loc)
+
+
def genop_discard_setfield_gc(self, op, arglocs):
base_loc, ofs_loc, size_loc, value_loc = arglocs
assert isinstance(size_loc, ImmedLoc)
dest_addr = AddressLoc(base_loc, ofs_loc)
self.save_into_mem(dest_addr, value_loc, size_loc)
+ def genop_discard_setinteriorfield_gc(self, op, arglocs):
+ base_loc, ofs_loc, itemsize_loc, fieldsize_loc, index_loc, value_loc =
arglocs
+ self.mc.IMUL(index_loc, itemsize_loc)
+ dest_addr = AddressLoc(base_loc, index_loc, 0, ofs_loc.value)
+ self.save_into_mem(dest_addr, value_loc, fieldsize_loc)
+
def genop_discard_setarrayitem_gc(self, op, arglocs):
base_loc, ofs_loc, value_loc, size_loc, baseofs = arglocs
assert isinstance(baseofs, ImmedLoc)
diff --git a/pypy/jit/backend/x86/regalloc.py b/pypy/jit/backend/x86/regalloc.py
--- a/pypy/jit/backend/x86/regalloc.py
+++ b/pypy/jit/backend/x86/regalloc.py
@@ -7,7 +7,7 @@
ResOperation, BoxPtr, ConstFloat,
BoxFloat, LoopToken, INT, REF, FLOAT)
from pypy.jit.backend.x86.regloc import *
-from pypy.rpython.lltypesystem import lltype, ll2ctypes, rffi, rstr
+from pypy.rpython.lltypesystem import lltype, rffi, rstr
from pypy.rlib.objectmodel import we_are_translated
from pypy.rlib import rgc
from pypy.jit.backend.llsupport import symbolic
@@ -17,11 +17,12 @@
from pypy.jit.metainterp.resoperation import rop
from pypy.jit.backend.llsupport.descr import BaseFieldDescr, BaseArrayDescr
from pypy.jit.backend.llsupport.descr import BaseCallDescr, BaseSizeDescr
+from pypy.jit.backend.llsupport.descr import InteriorFieldDescr
from pypy.jit.backend.llsupport.regalloc import FrameManager, RegisterManager,\
TempBox
from pypy.jit.backend.x86.arch import WORD, FRAME_FIXED_SIZE
from pypy.jit.backend.x86.arch import IS_X86_32, IS_X86_64, MY_COPY_OF_REGS
-from pypy.rlib.rarithmetic import r_longlong, r_uint
+from pypy.rlib.rarithmetic import r_longlong
class X86RegisterManager(RegisterManager):
@@ -800,7 +801,7 @@
save_all_regs = guard_not_forced_op is not None
self.xrm.before_call(force_store, save_all_regs=save_all_regs)
if not save_all_regs:
- gcrootmap = gc_ll_descr = self.assembler.cpu.gc_ll_descr.gcrootmap
+ gcrootmap = self.assembler.cpu.gc_ll_descr.gcrootmap
if gcrootmap and gcrootmap.is_shadow_stack:
save_all_regs = 2
self.rm.before_call(force_store, save_all_regs=save_all_regs)
@@ -1057,6 +1058,16 @@
sign = fielddescr.is_field_signed()
return imm(ofs), imm(size), ptr, sign
+ def _unpack_interiorfielddescr(self, descr):
+ assert isinstance(descr, InteriorFieldDescr)
+ arraydescr = descr.arraydescr
+ ofs = arraydescr.get_base_size(self.translate_support_code)
+ itemsize = arraydescr.get_item_size(self.translate_support_code)
+ fieldsize =
descr.fielddescr.get_field_size(self.translate_support_code)
+ sign = descr.fielddescr.is_field_signed()
+ ofs += descr.fielddescr.offset
+ return imm(ofs), imm(itemsize), imm(fieldsize), sign
+
def consider_setfield_gc(self, op):
ofs_loc, size_loc, _, _ = self._unpack_fielddescr(op.getdescr())
assert isinstance(size_loc, ImmedLoc)
@@ -1073,6 +1084,19 @@
consider_setfield_raw = consider_setfield_gc
+ def consider_setinteriorfield_gc(self, op):
+ t = self._unpack_interiorfielddescr(op.getdescr())
+ ofs, itemsize, fieldsize, _ = t
+ args = op.getarglist()
+ base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args)
+ index_loc = self.rm.force_result_in_reg(op.getarg(1), op.getarg(1),
+ args)
+ # we're free to modify index now
+ value_loc = self.make_sure_var_in_reg(op.getarg(2), args)
+ self.possibly_free_vars(args)
+ self.PerformDiscard(op, [base_loc, ofs, itemsize, fieldsize,
+ index_loc, value_loc])
+
def consider_strsetitem(self, op):
args = op.getarglist()
base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args)
@@ -1134,6 +1158,22 @@
consider_getarrayitem_raw = consider_getarrayitem_gc
consider_getarrayitem_gc_pure = consider_getarrayitem_gc
+ def consider_getinteriorfield_gc(self, op):
+ t = self._unpack_interiorfielddescr(op.getdescr())
+ ofs, itemsize, fieldsize, sign = t
+ if sign:
+ sign_loc = imm1
+ else:
+ sign_loc = imm0
+ args = op.getarglist()
+ base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args)
+ index_loc = self.rm.force_result_in_reg(op.getarg(1), op.getarg(1),
+ args)
+ self.possibly_free_vars(args)
+ result_loc = self.force_allocate_reg(op.result)
+ self.Perform(op, [base_loc, ofs, itemsize, fieldsize,
+ index_loc, sign_loc], result_loc)
+
def consider_int_is_true(self, op, guard_op):
# doesn't need arg to be in a register
argloc = self.loc(op.getarg(0))
@@ -1239,7 +1279,6 @@
self.rm.possibly_free_var(srcaddr_box)
def _gen_address_inside_string(self, baseloc, ofsloc, resloc, is_unicode):
- cpu = self.assembler.cpu
if is_unicode:
ofs_items, _, _ = symbolic.get_array_token(rstr.UNICODE,
self.translate_support_code)
@@ -1298,7 +1337,7 @@
tmpreg = X86RegisterManager.all_regs[0]
tmploc = self.rm.force_allocate_reg(box, selected_reg=tmpreg)
xmmtmp = X86XMMRegisterManager.all_regs[0]
- xmmtmploc = self.xrm.force_allocate_reg(box1, selected_reg=xmmtmp)
+ self.xrm.force_allocate_reg(box1, selected_reg=xmmtmp)
# Part about non-floats
# XXX we don't need a copy, we only just the original list
src_locations1 = [self.loc(op.getarg(i)) for i in range(op.numargs())
@@ -1366,7 +1405,7 @@
return lambda self, op: fn(self, op, None)
def is_comparison_or_ovf_op(opnum):
- from pypy.jit.metainterp.resoperation import opclasses, AbstractResOp
+ from pypy.jit.metainterp.resoperation import opclasses
cls = opclasses[opnum]
# hack hack: in theory they are instance method, but they don't use
# any instance field, we can use a fake object
diff --git a/pypy/jit/backend/x86/test/test_del.py
b/pypy/jit/backend/x86/test/test_del.py
--- a/pypy/jit/backend/x86/test/test_del.py
+++ b/pypy/jit/backend/x86/test/test_del.py
@@ -1,5 +1,4 @@
-import py
from pypy.jit.backend.x86.test.test_basic import Jit386Mixin
from pypy.jit.metainterp.test.test_del import DelTests
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit