Author: David Schneider <david.schnei...@picle.org> Branch: arm-backend-2 Changeset: r49970:d61888e925b8 Date: 2011-11-29 14:01 +0100 http://bitbucket.org/pypy/pypy/changeset/d61888e925b8/
Log: refactor check_imm_arg diff --git a/pypy/jit/backend/arm/assembler.py b/pypy/jit/backend/arm/assembler.py --- a/pypy/jit/backend/arm/assembler.py +++ b/pypy/jit/backend/arm/assembler.py @@ -9,7 +9,7 @@ from pypy.jit.backend.arm.arch import WORD, FUNC_ALIGN, PC_OFFSET, N_REGISTERS_SAVED_BY_MALLOC from pypy.jit.backend.arm.codebuilder import ARMv7Builder, OverwritingBuilder from pypy.jit.backend.arm.regalloc import (Regalloc, ARMFrameManager, ARMv7RegisterMananger, - _check_imm_arg, TempInt, + check_imm_arg, TempInt, TempPtr, operations as regalloc_operations, operations_with_guard as regalloc_operations_with_guard) @@ -245,7 +245,8 @@ i += 4 if group == self.FLOAT_TYPE: value = decode64(stack, frame_depth - stack_loc*WORD) - self.fail_boxes_float.setitem(fail_index, value) + fvalue = longlong2float(value) + self.fail_boxes_float.setitem(fail_index, fvalue) continue else: value = decode32(stack, frame_depth - stack_loc*WORD) @@ -914,14 +915,14 @@ temp = r.lr else: temp = r.ip - offset = ConstInt(loc.position*WORD) - if not _check_imm_arg(offset, size=0xFFF): + offset = loc.position*WORD + if not check_imm_arg(offset, size=0xFFF): self.mc.PUSH([temp.value], cond=cond) - self.mc.gen_load_int(temp.value, -offset.value, cond=cond) + self.mc.gen_load_int(temp.value, -offset, cond=cond) self.mc.STR_rr(prev_loc.value, r.fp.value, temp.value, cond=cond) self.mc.POP([temp.value], cond=cond) else: - self.mc.STR_ri(prev_loc.value, r.fp.value, imm=-1*offset.value, cond=cond) + self.mc.STR_ri(prev_loc.value, r.fp.value, imm=-offset, cond=cond) else: assert 0, 'unsupported case' @@ -931,27 +932,27 @@ assert prev_loc.type != FLOAT, 'trying to load from an incompatible location into a core register' assert loc is not r.lr, 'lr is not supported as a target when moving from the stack' # unspill a core register - offset = ConstInt(prev_loc.position*WORD) - if not _check_imm_arg(offset, size=0xFFF): + offset = prev_loc.position*WORD + if not check_imm_arg(offset, size=0xFFF): self.mc.PUSH([r.lr.value], cond=cond) pushed = True - self.mc.gen_load_int(r.lr.value, -offset.value, cond=cond) + self.mc.gen_load_int(r.lr.value, -offset, cond=cond) self.mc.LDR_rr(loc.value, r.fp.value, r.lr.value, cond=cond) else: - self.mc.LDR_ri(loc.value, r.fp.value, imm=-offset.value, cond=cond) + self.mc.LDR_ri(loc.value, r.fp.value, imm=-offset, cond=cond) if pushed: self.mc.POP([r.lr.value], cond=cond) elif loc.is_vfp_reg(): assert prev_loc.type == FLOAT, 'trying to load from an incompatible location into a float register' # load spilled value into vfp reg - offset = ConstInt(prev_loc.position*WORD) + offset = prev_loc.position*WORD self.mc.PUSH([r.ip.value], cond=cond) pushed = True - if not _check_imm_arg(offset): - self.mc.gen_load_int(r.ip.value, offset.value, cond=cond) + if not check_imm_arg(offset): + self.mc.gen_load_int(r.ip.value, offset, cond=cond) self.mc.SUB_rr(r.ip.value, r.fp.value, r.ip.value, cond=cond) else: - self.mc.SUB_ri(r.ip.value, r.fp.value, offset.value, cond=cond) + self.mc.SUB_ri(r.ip.value, r.fp.value, offset, cond=cond) self.mc.VLDR(loc.value, r.ip.value, cond=cond) if pushed: self.mc.POP([r.ip.value], cond=cond) @@ -973,12 +974,12 @@ assert loc.type == FLOAT, 'trying to store to an incompatible location from a float register' # spill vfp register self.mc.PUSH([r.ip.value], cond=cond) - offset = ConstInt(loc.position*WORD) - if not _check_imm_arg(offset): - self.mc.gen_load_int(r.ip.value, offset.value, cond=cond) + offset = loc.position*WORD + if not check_imm_arg(offset): + self.mc.gen_load_int(r.ip.value, offset, cond=cond) self.mc.SUB_rr(r.ip.value, r.fp.value, r.ip.value, cond=cond) else: - self.mc.SUB_ri(r.ip.value, r.fp.value, offset.value, cond=cond) + self.mc.SUB_ri(r.ip.value, r.fp.value, offset, cond=cond) self.mc.VSTR(prev_loc.value, r.ip.value, cond=cond) self.mc.POP([r.ip.value], cond=cond) else: @@ -1016,17 +1017,17 @@ self.mc.POP([r.ip.value], cond=cond) elif vfp_loc.is_stack() and vfp_loc.type == FLOAT: # load spilled vfp value into two core registers - offset = ConstInt((vfp_loc.position)*WORD) - if not _check_imm_arg(offset, size=0xFFF): + offset = vfp_loc.position*WORD + if not check_imm_arg(offset, size=0xFFF): self.mc.PUSH([r.ip.value], cond=cond) - self.mc.gen_load_int(r.ip.value, -offset.value, cond=cond) + self.mc.gen_load_int(r.ip.value, -offset, cond=cond) self.mc.LDR_rr(reg1.value, r.fp.value, r.ip.value, cond=cond) self.mc.ADD_ri(r.ip.value, r.ip.value, imm=WORD, cond=cond) self.mc.LDR_rr(reg2.value, r.fp.value, r.ip.value, cond=cond) self.mc.POP([r.ip.value], cond=cond) else: - self.mc.LDR_ri(reg1.value, r.fp.value, imm=-offset.value, cond=cond) - self.mc.LDR_ri(reg2.value, r.fp.value, imm=-offset.value+WORD, cond=cond) + self.mc.LDR_ri(reg1.value, r.fp.value, imm=-offset, cond=cond) + self.mc.LDR_ri(reg2.value, r.fp.value, imm=-offset+WORD, cond=cond) else: assert 0, 'unsupported case' @@ -1038,17 +1039,17 @@ self.mc.VMOV_cr(vfp_loc.value, reg1.value, reg2.value, cond=cond) elif vfp_loc.is_stack(): # move from two core registers to a float stack location - offset = ConstInt((vfp_loc.position)*WORD) - if not _check_imm_arg(offset, size=0xFFF): + offset = vfp_loc.position*WORD + if not check_imm_arg(offset, size=0xFFF): self.mc.PUSH([r.ip.value], cond=cond) - self.mc.gen_load_int(r.ip.value, -offset.value, cond=cond) + self.mc.gen_load_int(r.ip.value, -offset, cond=cond) self.mc.STR_rr(reg1.value, r.fp.value, r.ip.value, cond=cond) self.mc.ADD_ri(r.ip.value, r.ip.value, imm=WORD, cond=cond) self.mc.STR_rr(reg2.value, r.fp.value, r.ip.value, cond=cond) self.mc.POP([r.ip.value], cond=cond) else: - self.mc.STR_ri(reg1.value, r.fp.value, imm=-offset.value, cond=cond) - self.mc.STR_ri(reg2.value, r.fp.value, imm=-offset.value+WORD, cond=cond) + self.mc.STR_ri(reg1.value, r.fp.value, imm=-offset, cond=cond) + self.mc.STR_ri(reg2.value, r.fp.value, imm=-offset+WORD, cond=cond) else: assert 0, 'unsupported case' @@ -1106,7 +1107,7 @@ self.mc.gen_load_int(r.r0.value, nursery_free_adr) self.mc.LDR_ri(r.r0.value, r.r0.value) - if _check_imm_arg(ConstInt(size)): + if check_imm_arg(size): self.mc.ADD_ri(r.r1.value, r.r0.value, size) else: self.mc.gen_load_int(r.r1.value, size) diff --git a/pypy/jit/backend/arm/helper/regalloc.py b/pypy/jit/backend/arm/helper/regalloc.py --- a/pypy/jit/backend/arm/helper/regalloc.py +++ b/pypy/jit/backend/arm/helper/regalloc.py @@ -3,26 +3,34 @@ from pypy.jit.backend.arm.codebuilder import AbstractARMv7Builder from pypy.jit.metainterp.history import ConstInt, BoxInt, Box, FLOAT from pypy.jit.metainterp.history import ConstInt +from pypy.rlib.objectmodel import we_are_translated -# XXX create a version that does not need a ConstInt -def _check_imm_arg(arg, size=0xFF, allow_zero=True): +def check_imm_arg(arg, size=0xFF, allow_zero=True): + assert not isinstance(arg, ConstInt) + if not we_are_translated(): + if not isinstance(arg, int): + import pdb; pdb.set_trace() + i = arg + if allow_zero: + lower_bound = i >= 0 + else: + lower_bound = i > 0 + return i <= size and lower_bound + +def check_imm_box(arg, size=0xFF, allow_zero=True): if isinstance(arg, ConstInt): - i = arg.getint() - if allow_zero: - lower_bound = i >= 0 - else: - lower_bound = i > 0 - return i <= size and lower_bound + return check_imm_arg(arg.getint(), size, allow_zero) return False + def prepare_op_ri(name=None, imm_size=0xFF, commutative=True, allow_zero=True): def f(self, op, fcond): assert fcond is not None a0 = op.getarg(0) a1 = op.getarg(1) boxes = list(op.getarglist()) - imm_a0 = _check_imm_arg(a0, imm_size, allow_zero=allow_zero) - imm_a1 = _check_imm_arg(a1, imm_size, allow_zero=allow_zero) + imm_a0 = check_imm_box(a0, imm_size, allow_zero=allow_zero) + imm_a1 = check_imm_box(a1, imm_size, allow_zero=allow_zero) if not imm_a0 and imm_a1: l0 = self._ensure_value_is_boxed(a0) l1 = self.make_sure_var_in_reg(a1, boxes) @@ -101,7 +109,7 @@ assert fcond is not None boxes = list(op.getarglist()) arg0, arg1 = boxes - imm_a1 = _check_imm_arg(arg1) + imm_a1 = check_imm_box(arg1) l0 = self._ensure_value_is_boxed(arg0, forbidden_vars=boxes) if imm_a1: diff --git a/pypy/jit/backend/arm/regalloc.py b/pypy/jit/backend/arm/regalloc.py --- a/pypy/jit/backend/arm/regalloc.py +++ b/pypy/jit/backend/arm/regalloc.py @@ -8,7 +8,9 @@ prepare_op_ri, prepare_cmp_op, prepare_float_op, - _check_imm_arg) + check_imm_arg, + check_imm_box + ) from pypy.jit.backend.arm.jump import remap_frame_layout_mixed from pypy.jit.backend.arm.arch import MY_COPY_OF_REGS, WORD from pypy.jit.codewriter import longlong @@ -102,7 +104,8 @@ assert type == FLOAT # for now box = TempFloat() self.temp_boxes.append(box) - return self.force_allocate_reg(box, forbidden_vars=forbidden_vars, selected_reg=selected_reg) + reg = self.force_allocate_reg(box, forbidden_vars=forbidden_vars, selected_reg=selected_reg) + return reg class ARMv7RegisterMananger(RegisterManager): @@ -135,6 +138,7 @@ else: assert isinstance(c, ConstPtr) return locations.ImmLocation(rffi.cast(lltype.Signed, c.value)) + assert 0 def ensure_value_is_boxed(self, thing, forbidden_vars=None): box = None @@ -156,7 +160,8 @@ assert type == INT or type == REF box = TempBox() self.temp_boxes.append(box) - return self.force_allocate_reg(box, forbidden_vars=forbidden_vars, selected_reg=selected_reg) + reg = self.force_allocate_reg(box, forbidden_vars=forbidden_vars, selected_reg=selected_reg) + return reg class Regalloc(object): @@ -335,8 +340,8 @@ def _prepare_op_int_add(self, op, fcond): boxes = list(op.getarglist()) a0, a1 = boxes - imm_a0 = _check_imm_arg(a0) - imm_a1 = _check_imm_arg(a1) + imm_a0 = check_imm_box(a0) + imm_a1 = check_imm_box(a1) if not imm_a0 and imm_a1: l0 = self._ensure_value_is_boxed(a0) l1 = self.make_sure_var_in_reg(a1, boxes) @@ -357,8 +362,8 @@ def _prepare_op_int_sub(self, op, fcond): a0, a1 = boxes = op.getarglist() - imm_a0 = _check_imm_arg(a0) - imm_a1 = _check_imm_arg(a1) + imm_a0 = check_imm_box(a0) + imm_a1 = check_imm_box(a1) if not imm_a0 and imm_a1: l0 = self._ensure_value_is_boxed(a0, boxes) l1 = self.make_sure_var_in_reg(a1, boxes) @@ -517,7 +522,7 @@ def prepare_op_guard_value(self, op, fcond): boxes = list(op.getarglist()) a0, a1 = boxes - imm_a1 = _check_imm_arg(a1) + 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) @@ -616,11 +621,11 @@ ofs, size, ptr = self._unpack_fielddescr(op.getdescr()) base_loc = self._ensure_value_is_boxed(a0, boxes) value_loc = self._ensure_value_is_boxed(a1, boxes) - c_ofs = ConstInt(ofs) - if _check_imm_arg(c_ofs): + if check_imm_arg(ofs): ofs_loc = imm(ofs) else: - ofs_loc = self._ensure_value_is_boxed(c_ofs, 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_op_setfield_raw = prepare_op_setfield_gc @@ -629,11 +634,12 @@ a0 = op.getarg(0) ofs, size, ptr = self._unpack_fielddescr(op.getdescr()) base_loc = self._ensure_value_is_boxed(a0) - c_ofs = ConstInt(ofs) - if _check_imm_arg(c_ofs): - ofs_loc = imm(ofs) + immofs = imm(ofs) + if check_imm_arg(ofs): + ofs_loc = immofs else: - ofs_loc = self._ensure_value_is_boxed(c_ofs) + 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) @@ -649,11 +655,12 @@ args = op.getarglist() base_loc = self._ensure_value_is_boxed(op.getarg(0), args) index_loc = self._ensure_value_is_boxed(op.getarg(1), args) - c_ofs = ConstInt(ofs) - if _check_imm_arg(c_ofs): - ofs_loc = imm(ofs) + immofs = imm(ofs) + if check_imm_arg(ofs): + ofs_loc = immofs else: - ofs_loc = self._ensure_value_is_boxed(c_ofs, args) + ofs_loc = self.get_scratch_reg(INT, args) + self.assembler.load(ofs_loc, immofs) self.possibly_free_vars_for_op(op) self.free_temp_vars() result_loc = self.force_allocate_reg(op.result) @@ -668,11 +675,12 @@ base_loc = self._ensure_value_is_boxed(op.getarg(0), args) index_loc = self._ensure_value_is_boxed(op.getarg(1), args) value_loc = self._ensure_value_is_boxed(op.getarg(2), args) - c_ofs = ConstInt(ofs) - if _check_imm_arg(c_ofs): - ofs_loc = imm(ofs) + immofs = imm(ofs) + if check_imm_arg(ofs): + ofs_loc = immofs else: - ofs_loc = self._ensure_value_is_boxed(c_ofs, op.getarglist()) + ofs_loc = self.get_scratch_reg(INT, args) + self.assembler.load(ofs_loc, immofs) return [base_loc, index_loc, value_loc, ofs_loc, imm(ofs), imm(itemsize), imm(fieldsize)] @@ -695,7 +703,7 @@ base_loc = self._ensure_value_is_boxed(a0, args) ofs_loc = self._ensure_value_is_boxed(a1, args) value_loc = self._ensure_value_is_boxed(a2, args) - assert _check_imm_arg(ConstInt(base_ofs)) + assert check_imm_arg(base_ofs) return [value_loc, base_loc, ofs_loc, imm(scale), imm(base_ofs)] prepare_op_setarrayitem_raw = prepare_op_setarrayitem_gc @@ -708,7 +716,7 @@ self.possibly_free_vars_for_op(op) self.free_temp_vars() res = self.force_allocate_reg(op.result) - assert _check_imm_arg(ConstInt(base_ofs)) + assert check_imm_arg(base_ofs) return [res, base_loc, ofs_loc, imm(scale), imm(base_ofs)] prepare_op_getarrayitem_raw = prepare_op_getarrayitem_gc @@ -719,13 +727,12 @@ 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) - - if imm_ofs: - l1 = self.make_sure_var_in_reg(ofs_box, args) + immofs = imm(ofs_length) + if check_imm_arg(ofs_length): + l1 = immofs else: - l1 = self._ensure_value_is_boxed(ofs_box, args) + l1 = self.get_scratch_reg(INT, args) + self.assembler.load(l1, immofs) self.possibly_free_vars_for_op(op) self.free_temp_vars() @@ -739,7 +746,7 @@ 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: @@ -771,13 +778,12 @@ 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) - - if imm_ofs: - l1 = imm(ofs_length) + immofs = imm(ofs_length) + if check_imm_arg(ofs_length): + l1 = immofs else: - l1 = self._ensure_value_is_boxed(ofs_box) + l1 = self.get_scratch_reg(INT, [op.getarg(0)]) + self.assembler.load(l1, immofs) self.possibly_free_vars_for_op(op) self.free_temp_vars() @@ -810,7 +816,7 @@ def prepare_op_same_as(self, op, fcond): arg = op.getarg(0) - imm_arg = _check_imm_arg(arg) + imm_arg = check_imm_box(arg) if imm_arg: argloc = self.make_sure_var_in_reg(arg) else: @@ -952,14 +958,17 @@ v = op.getarg(0) res_v = op.result boxes = [v, res_v] - itemsize_box = ConstInt(itemsize) - ofs_items_box = ConstInt(ofs_items) - if _check_imm_arg(ofs_items_box): - ofs_items_loc = self.convert_to_imm(ofs_items_box) + immofs = imm(ofs_items) + if check_imm_arg(ofs_items): + ofs_items_loc = immofs else: - ofs_items_loc = self._ensure_value_is_boxed(ofs_items_box, boxes) + ofs_items_loc = self.get_scratch_reg(INT, boxes) + self.assembler.load(ofs_items_loc, immofs) vloc = self._ensure_value_is_boxed(v, [res_v]) - size = self._ensure_value_is_boxed(itemsize_box, boxes) + + size = self.get_scratch_reg(INT, boxes) + self.assembler.load(itemsize) + self.assembler._regalloc_malloc_varsize(size, size_box, vloc, vbox, ofs_items_loc, self, res_v) base_loc = self.make_sure_var_in_reg(res_v) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit