Author: hager <sven.ha...@uni-duesseldorf.de> Branch: ppc-jit-backend Changeset: r51433:4c659707392a Date: 2012-01-18 11:04 +0100 http://bitbucket.org/pypy/pypy/changeset/4c659707392a/
Log: refactored allocation of boxes diff --git a/pypy/jit/backend/ppc/ppcgen/helper/regalloc.py b/pypy/jit/backend/ppc/ppcgen/helper/regalloc.py --- a/pypy/jit/backend/ppc/ppcgen/helper/regalloc.py +++ b/pypy/jit/backend/ppc/ppcgen/helper/regalloc.py @@ -1,5 +1,12 @@ from pypy.jit.metainterp.history import ConstInt from pypy.rlib.objectmodel import we_are_translated +from pypy.jit.metainterp.history import Box + + +def check_imm_box(arg, size=0xFF, allow_zero=True): + if isinstance(arg, ConstInt): + return _check_imm_arg(arg.getint(), size, allow_zero) + return False def _check_imm_arg(arg, size=0xFF, allow_zero=True): #assert not isinstance(arg, ConstInt) @@ -19,34 +26,36 @@ arg0, arg1 = boxes imm_a0 = _check_imm_arg(arg0) imm_a1 = _check_imm_arg(arg1) - l0, box = self._ensure_value_is_boxed(arg0, forbidden_vars=boxes) - boxes.append(box) + l0 = self._ensure_value_is_boxed(arg0, forbidden_vars=boxes) + if imm_a1 and not imm_a0: l1 = self.make_sure_var_in_reg(arg1, boxes) else: - l1, box = self._ensure_value_is_boxed(arg1, forbidden_vars=boxes) - boxes.append(box) - self.possibly_free_vars(boxes) + l1 = self._ensure_value_is_boxed(arg1, forbidden_vars=boxes) + + self.possibly_free_vars_for_op(op) + self.free_temp_vars() res = self.force_allocate_reg(op.result) - self.possibly_free_var(op.result) + #self.possibly_free_var(op.result) return [l0, l1, res] return f def prepare_unary_cmp(): def f(self, op): a0 = op.getarg(0) - reg, box = self._ensure_value_is_boxed(a0) - res = self.force_allocate_reg(op.result, [box]) - self.possibly_free_vars([a0, box, op.result]) + assert isinstance(a0, Box) + reg = self.make_sure_var_in_reg(a0) + self.possibly_free_vars_for_op(op) + res = self.force_allocate_reg(op.result, [a0]) return [reg, res] return f def prepare_unary_int_op(): def f(self, op): - l0, box = self._ensure_value_is_boxed(op.getarg(0)) - self.possibly_free_var(box) + l0 = self._ensure_value_is_boxed(op.getarg(0)) + self.possibly_free_vars_for_op(op) + self.free_temp_vars() res = self.force_allocate_reg(op.result) - self.possibly_free_var(op.result) return [l0, res] return f @@ -57,20 +66,17 @@ imm_b0 = _check_imm_arg(b0) imm_b1 = _check_imm_arg(b1) if not imm_b0 and imm_b1: - l0, box = self._ensure_value_is_boxed(b0) - l1 = self.make_sure_var_in_reg(b1, [b0]) - boxes.append(box) + l0 = self._ensure_value_is_boxed(b0) + l1 = self.make_sure_var_in_reg(b1, boxes) elif imm_b0 and not imm_b1: l0 = self.make_sure_var_in_reg(b0) - l1, box = self._ensure_value_is_boxed(b1, [b0]) - boxes.append(box) + l1 = self._ensure_value_is_boxed(b1, boxes) else: - l0, box = self._ensure_value_is_boxed(b0) - boxes.append(box) - l1, box = self._ensure_value_is_boxed(b1, [box]) - boxes.append(box) + l0 = self._ensure_value_is_boxed(b0) + l1 = self._ensure_value_is_boxed(b1, boxes) locs = [l0, l1] - self.possibly_free_vars(boxes) + self.possibly_free_vars_for_op(op) + self.free_temp_vars() res = self.force_allocate_reg(op.result) return locs + [res] return f @@ -80,12 +86,9 @@ boxes = list(op.getarglist()) b0, b1 = boxes - reg1, box = self._ensure_value_is_boxed(b0, forbidden_vars=boxes) - boxes.append(box) - reg2, box = self._ensure_value_is_boxed(b1, forbidden_vars=boxes) - boxes.append(box) + reg1 = self._ensure_value_is_boxed(b0, forbidden_vars=boxes) + reg2 = self._ensure_value_is_boxed(b1, forbidden_vars=boxes) - self.possibly_free_vars(boxes) self.possibly_free_vars_for_op(op) res = self.force_allocate_reg(op.result) self.possibly_free_var(op.result) diff --git a/pypy/jit/backend/ppc/ppcgen/opassembler.py b/pypy/jit/backend/ppc/ppcgen/opassembler.py --- a/pypy/jit/backend/ppc/ppcgen/opassembler.py +++ b/pypy/jit/backend/ppc/ppcgen/opassembler.py @@ -6,7 +6,7 @@ GPR_SAVE_AREA, BACKCHAIN_SIZE, MAX_REG_PARAMS) -from pypy.jit.metainterp.history import (JitCellToken, TargetToken, +from pypy.jit.metainterp.history import (JitCellToken, TargetToken, Box, AbstractFailDescr, FLOAT, INT, REF) from pypy.rlib.objectmodel import we_are_translated from pypy.jit.backend.ppc.ppcgen.helper.assembler import (count_reg_args, @@ -704,11 +704,9 @@ def _emit_copystrcontent(self, op, regalloc, is_unicode): # compute the source address - args = list(op.getarglist()) - base_loc, box = regalloc._ensure_value_is_boxed(args[0], args) - args.append(box) - ofs_loc, box = regalloc._ensure_value_is_boxed(args[2], args) - args.append(box) + args = op.getarglist() + base_loc = regalloc._ensure_value_is_boxed(args[0], args) + ofs_loc = regalloc._ensure_value_is_boxed(args[2], args) assert args[0] is not args[1] # forbidden case of aliasing regalloc.possibly_free_var(args[0]) if args[3] is not args[2] is not args[4]: # MESS MESS MESS: don't free @@ -724,41 +722,44 @@ dstaddr_box = TempPtr() dstaddr_loc = regalloc.force_allocate_reg(dstaddr_box) forbidden_vars.append(dstaddr_box) - base_loc, box = regalloc._ensure_value_is_boxed(args[1], forbidden_vars) - args.append(box) - forbidden_vars.append(box) - ofs_loc, box = regalloc._ensure_value_is_boxed(args[3], forbidden_vars) - args.append(box) + base_loc = regalloc._ensure_value_is_boxed(args[1], forbidden_vars) + ofs_loc = regalloc._ensure_value_is_boxed(args[3], forbidden_vars) assert base_loc.is_reg() assert ofs_loc.is_reg() regalloc.possibly_free_var(args[1]) if args[3] is not args[4]: # more of the MESS described above regalloc.possibly_free_var(args[3]) + regalloc.free_temp_vars() self._gen_address_inside_string(base_loc, ofs_loc, dstaddr_loc, is_unicode=is_unicode) # compute the length in bytes forbidden_vars = [srcaddr_box, dstaddr_box] - length_loc, length_box = regalloc._ensure_value_is_boxed(args[4], forbidden_vars) - args.append(length_box) + if isinstance(args[4], Box): + length_box = args[4] + length_loc = regalloc.make_sure_var_in_reg(args[4], forbidden_vars) + else: + length_box = TempInt() + length_loc = regalloc.force_allocate_reg(length_box, forbidden_vars) + imm = regalloc.convert_to_imm(args[4]) + self.load(length_loc, imm) if is_unicode: - forbidden_vars = [srcaddr_box, dstaddr_box] bytes_box = TempPtr() bytes_loc = regalloc.force_allocate_reg(bytes_box, forbidden_vars) scale = self._get_unicode_item_scale() assert length_loc.is_reg() - self.mc.li(r.r0.value, 1<<scale) + self.mc.alloc_scratch_reg(1 << scale) if IS_PPC_32: - self.mc.mullw(bytes_loc.value, r.r0.value, length_loc.value) + self.mc.mullw(bytes_loc.value, r.SCRATCH.value, length_loc.value) else: - self.mc.mulld(bytes_loc.value, r.r0.value, length_loc.value) + self.mc.mulld(bytes_loc.value, r.SCRATCH.value, length_loc.value) + self.mc.free_scratch_reg() length_box = bytes_box length_loc = bytes_loc # call memcpy() self._emit_call(NO_FORCE_INDEX, self.memcpy_addr, [dstaddr_box, srcaddr_box, length_box], regalloc) - regalloc.possibly_free_vars(args) regalloc.possibly_free_var(length_box) regalloc.possibly_free_var(dstaddr_box) regalloc.possibly_free_var(srcaddr_box) diff --git a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py --- a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py +++ b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py @@ -582,6 +582,8 @@ arglocs = regalloc.operations[opnum](regalloc, op) if arglocs is not None: self.operations[opnum](self, op, arglocs, regalloc) + if op.is_guard(): + regalloc.possibly_free_vars(op.getfailargs()) if op.result: regalloc.possibly_free_var(op.result) regalloc.possibly_free_vars_for_op(op) diff --git a/pypy/jit/backend/ppc/ppcgen/regalloc.py b/pypy/jit/backend/ppc/ppcgen/regalloc.py --- a/pypy/jit/backend/ppc/ppcgen/regalloc.py +++ b/pypy/jit/backend/ppc/ppcgen/regalloc.py @@ -4,7 +4,8 @@ from pypy.jit.backend.ppc.ppcgen.jump import (remap_frame_layout_mixed, remap_frame_layout) from pypy.jit.backend.ppc.ppcgen.locations import imm -from pypy.jit.backend.ppc.ppcgen.helper.regalloc import (_check_imm_arg, +from pypy.jit.backend.ppc.ppcgen.helper.regalloc import (_check_imm_arg, + check_imm_box, prepare_cmp_op, prepare_unary_int_op, prepare_binary_int_op, @@ -95,6 +96,22 @@ assert isinstance(c, ConstPtr) return locations.ImmLocation(rffi.cast(lltype.Signed, c.value)) + def ensure_value_is_boxed(self, thing, forbidden_vars=None): + loc = None + if isinstance(thing, Const): + if isinstance(thing, ConstPtr): + tp = REF + else: + tp = INT + loc = self.get_scratch_reg(tp, forbidden_vars=self.temp_boxes + + forbidden_vars) + immvalue = self.convert_to_imm(thing) + self.assembler.load(loc, immvalue) + else: + loc = self.make_sure_var_in_reg(thing, + forbidden_vars=forbidden_vars) + return loc + def allocate_scratch_reg(self, type=INT, selected_reg=None, forbidden_vars=None): """Allocate a scratch register, possibly spilling a managed register. This register is freed after emitting the current operation and can not @@ -279,21 +296,10 @@ return self.rm.call_result_location(v) def _ensure_value_is_boxed(self, thing, forbidden_vars=[]): - box = None - loc = None - if isinstance(thing, Const): - if isinstance(thing, ConstPtr): - box = TempPtr() - else: - box = TempInt() - loc = self.force_allocate_reg(box, forbidden_vars=forbidden_vars) - imm = self.rm.convert_to_imm(thing) - self.assembler.mc.load_imm(loc, imm.value) + if thing.type == FLOAT: + assert 0, "not implemented yet" else: - loc = self.make_sure_var_in_reg(thing, - forbidden_vars=forbidden_vars) - box = thing - return loc, box + return self.rm.ensure_value_is_boxed(thing, forbidden_vars) def get_scratch_reg(self, type, forbidden_vars=[], selected_reg=None): if type == FLOAT: @@ -309,9 +315,15 @@ if var.type == FLOAT: assert 0, "not implemented yet" else: - return self.rm.make_sure_var_in_reg(var, forbidden_vars, + return self.rm.make_sure_var_in_reg(var, forbidden_vars, selected_reg, need_lower_byte) + def convert_to_imm(self, value): + if isinstance(value, ConstInt): + return self.rm.convert_to_imm(value) + else: + assert 0, "not implemented yet" + def _sync_var(self, v): if v.type == FLOAT: assert 0, "not implemented yet" @@ -395,10 +407,8 @@ return args def prepare_guard_true(self, op): - l0, box = self._ensure_value_is_boxed(op.getarg(0)) + l0 = self._ensure_value_is_boxed(op.getarg(0)) args = self._prepare_guard(op, [l0]) - self.possibly_free_var(box) - self.possibly_free_vars(op.getfailargs()) return args prepare_guard_false = prepare_guard_true @@ -416,68 +426,51 @@ def prepare_guard_exception(self, op): boxes = list(op.getarglist()) arg0 = ConstInt(rffi.cast(lltype.Signed, op.getarg(0).getint())) - loc, box = self._ensure_value_is_boxed(arg0) - boxes.append(box) - box = TempInt() - loc1 = self.force_allocate_reg(box, boxes) - boxes.append(box) + loc = self._ensure_value_is_boxed(arg0) + loc1 = self.get_scratch_reg(INT, boxes) if op.result in self.longevity: resloc = self.force_allocate_reg(op.result, boxes) - boxes.append(op.result) + self.possibly_free_var(op.result) else: resloc = None pos_exc_value = imm(self.cpu.pos_exc_value()) pos_exception = imm(self.cpu.pos_exception()) - arglocs = self._prepare_guard(op, [loc, loc1, resloc, pos_exc_value, pos_exception]) - self.possibly_free_vars(boxes) - self.possibly_free_vars(op.getfailargs()) + arglocs = self._prepare_guard(op, + [loc, loc1, resloc, pos_exc_value, pos_exception]) return arglocs def prepare_guard_no_exception(self, op): - loc, box = self._ensure_value_is_boxed( + loc = self._ensure_value_is_boxed( ConstInt(self.cpu.pos_exception())) arglocs = self._prepare_guard(op, [loc]) - self.possibly_free_var(box) - self.possibly_free_vars(op.getfailargs()) return arglocs def prepare_guard_value(self, op): boxes = list(op.getarglist()) - b0, b1 = boxes - imm_b1 = _check_imm_arg(b1) - l0, box = self._ensure_value_is_boxed(b0, boxes) - boxes.append(box) - if not imm_b1: - l1, box = self._ensure_value_is_boxed(b1,boxes) - boxes.append(box) + a0, a1 = boxes + imm_a1 = check_imm_box(a1) + l0 = self._ensure_value_is_boxed(a0, boxes) + if not imm_a1: + l1 = self._ensure_value_is_boxed(a1, boxes) else: - l1 = self.make_sure_var_in_reg(b1) + l1 = self.make_sure_var_in_reg(a1, boxes) assert op.result is None arglocs = self._prepare_guard(op, [l0, l1]) - self.possibly_free_vars(boxes) + self.possibly_free_vars(op.getarglist()) self.possibly_free_vars(op.getfailargs()) return arglocs def prepare_guard_class(self, op): assert isinstance(op.getarg(0), Box) boxes = list(op.getarglist()) - - x, x_box = self._ensure_value_is_boxed(boxes[0], boxes) - boxes.append(x_box) - - t = TempInt() - y = self.force_allocate_reg(t, boxes) - boxes.append(t) + x = self._ensure_value_is_boxed(boxes[0], boxes) + y = self.get_scratch_reg(REF, forbidden_vars=boxes) y_val = rffi.cast(lltype.Signed, op.getarg(1).getint()) - self.assembler.mc.load_imm(y, y_val) - + self.assembler.load(y, imm(y_val)) offset = self.cpu.vtable_offset assert offset is not None - offset_loc, offset_box = self._ensure_value_is_boxed(ConstInt(offset), boxes) - boxes.append(offset_box) + offset_loc = self._ensure_value_is_boxed(ConstInt(offset), boxes) arglocs = self._prepare_guard(op, [x, y, offset_loc]) - self.possibly_free_vars(boxes) - self.possibly_free_vars(op.getfailargs()) return arglocs prepare_guard_nonnull_class = prepare_guard_class @@ -568,37 +561,32 @@ def prepare_setfield_gc(self, op): boxes = list(op.getarglist()) - b0, b1 = boxes - ofs, size, ptr = unpack_fielddescr(op.getdescr()) - base_loc, base_box = self._ensure_value_is_boxed(b0, boxes) - boxes.append(base_box) - value_loc, value_box = self._ensure_value_is_boxed(b1, boxes) - boxes.append(value_box) - c_ofs = ConstInt(ofs) - if _check_imm_arg(c_ofs): + a0, a1 = boxes + ofs, size, sign = unpack_fielddescr(op.getdescr()) + base_loc = self._ensure_value_is_boxed(a0, boxes) + value_loc = self._ensure_value_is_boxed(a1, boxes) + if _check_imm_arg(ofs): ofs_loc = imm(ofs) else: - ofs_loc, ofs_box = self._ensure_value_is_boxed(c_ofs, boxes) - boxes.append(ofs_box) - self.possibly_free_vars(boxes) + ofs_loc = self.get_scratch_reg(INT, boxes) + self.assembler.load(ofs_loc, imm(ofs)) return [value_loc, base_loc, ofs_loc, imm(size)] prepare_setfield_raw = prepare_setfield_gc def prepare_getfield_gc(self, op): a0 = op.getarg(0) - ofs, size, ptr = unpack_fielddescr(op.getdescr()) - base_loc, base_box = self._ensure_value_is_boxed(a0) - c_ofs = ConstInt(ofs) - if _check_imm_arg(c_ofs): - ofs_loc = imm(ofs) + ofs, size, sign = unpack_fielddescr(op.getdescr()) + base_loc = self._ensure_value_is_boxed(a0) + immofs = imm(ofs) + if _check_imm_arg(ofs): + ofs_loc = immofs else: - ofs_loc, ofs_box = self._ensure_value_is_boxed(c_ofs, [base_box]) - self.possibly_free_var(ofs_box) - self.possibly_free_var(a0) - self.possibly_free_var(base_box) + ofs_loc = self.get_scratch_reg(INT, [a0]) + self.assembler.load(ofs_loc, immofs) + self.possibly_free_vars_for_op(op) + self.free_temp_vars() res = self.force_allocate_reg(op.result) - self.possibly_free_var(op.result) return [base_loc, ofs_loc, res, imm(size)] prepare_getfield_raw = prepare_getfield_gc @@ -650,11 +638,10 @@ assert isinstance(arraydescr, ArrayDescr) ofs = arraydescr.lendescr.offset arg = op.getarg(0) - base_loc, base_box = self._ensure_value_is_boxed(arg) - self.possibly_free_vars([arg, base_box]) - + base_loc = self._ensure_value_is_boxed(arg) + self.possibly_free_vars_for_op(op) + self.free_temp_vars() res = self.force_allocate_reg(op.result) - self.possibly_free_var(op.result) return [res, base_loc, imm(ofs)] def prepare_setarrayitem_gc(self, op): @@ -662,17 +649,13 @@ size, ofs, _ = unpack_arraydescr(op.getdescr()) scale = get_scale(size) args = op.getarglist() - base_loc, base_box = self._ensure_value_is_boxed(a0, args) - ofs_loc, ofs_box = self._ensure_value_is_boxed(a1, args) - value_loc, value_box = self._ensure_value_is_boxed(a2, args) + base_loc = self._ensure_value_is_boxed(a0, args) + ofs_loc = self._ensure_value_is_boxed(a1, args) + scratch_loc = self.rm.get_scratch_reg(INT, [base_loc, ofs_loc]) + value_loc = self._ensure_value_is_boxed(a2, args) assert _check_imm_arg(ofs) - scratch_loc = self.rm.get_scratch_reg(INT, [base_loc, ofs_loc]) - self.possibly_free_var(base_box) - self.possibly_free_var(ofs_box) - self.possibly_free_var(value_box) - assert scratch_loc not in [base_loc, ofs_loc] - return [value_loc, base_loc, ofs_loc, - scratch_loc, imm(scale), imm(ofs)] + return [value_loc, base_loc, ofs_loc, scratch_loc, + imm(scale), imm(ofs)] prepare_setarrayitem_raw = prepare_setarrayitem_gc @@ -680,58 +663,52 @@ a0, a1 = boxes = list(op.getarglist()) size, ofs, _ = unpack_arraydescr(op.getdescr()) scale = get_scale(size) - base_loc, base_box = self._ensure_value_is_boxed(a0, boxes) - boxes.append(base_box) - ofs_loc, ofs_box = self._ensure_value_is_boxed(a1, boxes) - boxes.append(ofs_box) + base_loc = self._ensure_value_is_boxed(a0, boxes) + ofs_loc = self._ensure_value_is_boxed(a1, boxes) scratch_loc = self.rm.get_scratch_reg(INT, [base_loc, ofs_loc]) - assert scratch_loc not in [base_loc, ofs_loc] - self.possibly_free_vars(boxes) + self.possibly_free_vars_for_op(op) + self.free_temp_vars() res = self.force_allocate_reg(op.result) - self.possibly_free_var(op.result) assert _check_imm_arg(ofs) - return [res, base_loc, ofs_loc, - scratch_loc, imm(scale), imm(ofs)] + return [res, base_loc, ofs_loc, scratch_loc, + imm(scale), imm(ofs)] prepare_getarrayitem_raw = prepare_getarrayitem_gc prepare_getarrayitem_gc_pure = prepare_getarrayitem_gc def prepare_strlen(self, op): - l0, box = self._ensure_value_is_boxed(op.getarg(0)) - boxes = [box] - + args = op.getarglist() + l0 = self._ensure_value_is_boxed(op.getarg(0)) basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR, self.cpu.translate_support_code) - ofs_box = ConstInt(ofs_length) - imm_ofs = _check_imm_arg(ofs_box) + immofs = imm(ofs_length) + if _check_imm_arg(ofs_length): + l1 = immofs + else: + l1 = self.get_scratch_reg(INT, args) + self.assembler.load(l1, immofs) - if imm_ofs: - l1 = self.make_sure_var_in_reg(ofs_box, boxes) - else: - l1, box1 = self._ensure_value_is_boxed(ofs_box, boxes) - boxes.append(box1) + self.possibly_free_vars_for_op(op) + self.free_temp_vars() - self.possibly_free_vars(boxes) res = self.force_allocate_reg(op.result) self.possibly_free_var(op.result) return [l0, l1, res] def prepare_strgetitem(self, op): boxes = list(op.getarglist()) - base_loc, box = self._ensure_value_is_boxed(boxes[0]) - boxes.append(box) + base_loc = self._ensure_value_is_boxed(boxes[0]) a1 = boxes[1] - imm_a1 = _check_imm_arg(a1) + imm_a1 = check_imm_box(a1) if imm_a1: ofs_loc = self.make_sure_var_in_reg(a1, boxes) else: - ofs_loc, box = self._ensure_value_is_boxed(a1, boxes) - boxes.append(box) + ofs_loc = self._ensure_value_is_boxed(a1, boxes) - self.possibly_free_vars(boxes) + self.possibly_free_vars_for_op(op) + self.free_temp_vars() res = self.force_allocate_reg(op.result) - self.possibly_free_var(op.result) basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR, self.cpu.translate_support_code) @@ -740,18 +717,9 @@ def prepare_strsetitem(self, op): boxes = list(op.getarglist()) - - base_loc, box = self._ensure_value_is_boxed(boxes[0], boxes) - boxes.append(box) - - ofs_loc, box = self._ensure_value_is_boxed(boxes[1], boxes) - boxes.append(box) - - value_loc, box = self._ensure_value_is_boxed(boxes[2], boxes) - boxes.append(box) - - self.possibly_free_vars(boxes) - + base_loc = self._ensure_value_is_boxed(boxes[0], boxes) + ofs_loc = self._ensure_value_is_boxed(boxes[1], boxes) + value_loc = self._ensure_value_is_boxed(boxes[2], boxes) basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR, self.cpu.translate_support_code) assert itemsize == 1 @@ -761,55 +729,46 @@ prepare_copyunicodecontent = void def prepare_unicodelen(self, op): - l0, box = self._ensure_value_is_boxed(op.getarg(0)) - boxes = [box] + l0 = self._ensure_value_is_boxed(op.getarg(0)) basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.UNICODE, self.cpu.translate_support_code) - ofs_box = ConstInt(ofs_length) - imm_ofs = _check_imm_arg(ofs_box) + immofs = imm(ofs_length) + if _check_imm_arg(ofs_length): + l1 = immofs + else: + l1 = self.get_scratch_reg(INT, [op.getarg(0)]) + self.assembler.load(l1, immofs) - if imm_ofs: - l1 = imm(ofs_length) - else: - l1, box1 = self._ensure_value_is_boxed(ofs_box, boxes) - boxes.append(box1) - - self.possibly_free_vars(boxes) + self.possibly_free_vars_for_op(op) + self.free_temp_vars() res = self.force_allocate_reg(op.result) - self.possibly_free_var(op.result) return [l0, l1, res] def prepare_unicodegetitem(self, op): boxes = list(op.getarglist()) - base_loc, box = self._ensure_value_is_boxed(boxes[0], boxes) - boxes.append(box) - ofs_loc, box = self._ensure_value_is_boxed(boxes[1], boxes) - boxes.append(box) - self.possibly_free_vars(boxes) + base_loc = self._ensure_value_is_boxed(boxes[0], boxes) + ofs_loc = self._ensure_value_is_boxed(boxes[1], boxes) + self.possibly_free_vars_for_op(op) + self.free_temp_vars() res = self.force_allocate_reg(op.result) - self.possibly_free_var(op.result) basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.UNICODE, self.cpu.translate_support_code) - scale = itemsize/2 - return [res, base_loc, ofs_loc, imm(scale), imm(basesize), imm(itemsize)] + scale = itemsize / 2 + return [res, base_loc, ofs_loc, + imm(scale), imm(basesize), imm(itemsize)] def prepare_unicodesetitem(self, op): boxes = list(op.getarglist()) - base_loc, box = self._ensure_value_is_boxed(boxes[0], boxes) - boxes.append(box) - ofs_loc, box = self._ensure_value_is_boxed(boxes[1], boxes) - boxes.append(box) - value_loc, box = self._ensure_value_is_boxed(boxes[2], boxes) - boxes.append(box) - - self.possibly_free_vars(boxes) - + base_loc = self._ensure_value_is_boxed(boxes[0], boxes) + ofs_loc = self._ensure_value_is_boxed(boxes[1], boxes) + value_loc = self._ensure_value_is_boxed(boxes[2], boxes) basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.UNICODE, self.cpu.translate_support_code) - scale = itemsize/2 - return [value_loc, base_loc, ofs_loc, imm(scale), imm(basesize), imm(itemsize)] + scale = itemsize / 2 + return [value_loc, base_loc, ofs_loc, + imm(scale), imm(basesize), imm(itemsize)] def prepare_same_as(self, op): arg = op.getarg(0) @@ -817,11 +776,10 @@ if imm_arg: argloc = self.make_sure_var_in_reg(arg) else: - argloc, box = self._ensure_value_is_boxed(arg) - self.possibly_free_var(box) - + argloc = self._ensure_value_is_boxed(arg) + self.possibly_free_vars_for_op(op) + self.free_temp_vars() resloc = self.force_allocate_reg(op.result) - self.possibly_free_var(op.result) return [argloc, resloc] prepare_cast_ptr_to_int = prepare_same_as @@ -850,9 +808,8 @@ arglocs = [] argboxes = [] for i in range(N): - loc, box = self._ensure_value_is_boxed(op.getarg(i), argboxes) + loc = self._ensure_value_is_boxed(op.getarg(i), argboxes) arglocs.append(loc) - argboxes.append(box) self.rm.possibly_free_vars(argboxes) return arglocs _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit