Author: David Schneider <david.schnei...@picle.org> Branch: arm-backend-2 Changeset: r51166:5e9aadf0b867 Date: 2012-01-04 15:57 +0100 http://bitbucket.org/pypy/pypy/changeset/5e9aadf0b867/
Log: modify stack_locations store position and the offset to the FP. Get rid of the special case for the first slot in the spilling area currently used for the FORCE_TOKEN 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 @@ -680,9 +680,7 @@ OverwritingBuilder.size_of_gen_load_int + WORD) # Note: the frame_depth is one less than the value stored in the frame # manager - if frame_depth == 1: - return - n = (frame_depth - 1) * WORD + n = frame_depth * WORD # ensure the sp is 8 byte aligned when patching it if n % 8 != 0: @@ -840,7 +838,7 @@ temp = r.lr else: temp = r.ip - offset = loc.position * WORD + offset = loc.value if not check_imm_arg(offset, size=0xFFF): self.mc.PUSH([temp.value], cond=cond) self.mc.gen_load_int(temp.value, -offset, cond=cond) @@ -861,7 +859,7 @@ assert loc is not r.lr, 'lr is not supported as a target \ when moving from the stack' # unspill a core register - offset = prev_loc.position * WORD + offset = prev_loc.value if not check_imm_arg(offset, size=0xFFF): self.mc.PUSH([r.lr.value], cond=cond) pushed = True @@ -875,7 +873,7 @@ assert prev_loc.type == FLOAT, 'trying to load from an \ incompatible location into a float register' # load spilled value into vfp reg - offset = prev_loc.position * WORD + offset = prev_loc.value self.mc.PUSH([r.ip.value], cond=cond) pushed = True if not check_imm_arg(offset): @@ -905,7 +903,7 @@ incompatible location from a float register' # spill vfp register self.mc.PUSH([r.ip.value], cond=cond) - offset = loc.position * WORD + offset = loc.value 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) @@ -948,7 +946,7 @@ 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 = vfp_loc.position * WORD + offset = vfp_loc.value 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, cond=cond) @@ -971,7 +969,7 @@ 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 = vfp_loc.position * WORD + offset = vfp_loc.value 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, cond=cond) diff --git a/pypy/jit/backend/arm/locations.py b/pypy/jit/backend/arm/locations.py --- a/pypy/jit/backend/arm/locations.py +++ b/pypy/jit/backend/arm/locations.py @@ -1,5 +1,5 @@ from pypy.jit.metainterp.history import INT, FLOAT -from pypy.jit.backend.arm.arch import WORD +from pypy.jit.backend.arm.arch import WORD, DOUBLE_WORD class AssemblerLocation(object): @@ -110,9 +110,13 @@ class StackLocation(AssemblerLocation): _immutable_ = True - def __init__(self, position, num_words=1, type=INT): + def __init__(self, position, fp_offset, type=INT): + if type == FLOAT: + self.width = DOUBLE_WORD + else: + self.width = WORD self.position = position - self.width = num_words * WORD + self.value = fp_offset self.type = type def __repr__(self): 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 @@ -54,26 +54,28 @@ return "<TempFloat at %s>" % (id(self),) +def get_fp_offset(i): + if i >= 0: + # Take the FORCE_TOKEN into account + return (1 + i) * WORD + else: + return i * WORD + + class ARMFrameManager(FrameManager): def __init__(self): FrameManager.__init__(self) - self.used = [True] # keep first slot free + #self.used = [True] # keep first slot free # XXX refactor frame to avoid this issue of keeping the first slot # reserved @staticmethod - def frame_pos(loc, type): - num_words = ARMFrameManager.frame_size(type) - if type == FLOAT: - if loc > 0: - # Make sure that loc is an even value - # the frame layout requires loc to be even if it is a spilled - # value!! - assert (loc & 1) == 0 - return locations.StackLocation(loc + 1, - num_words=num_words, type=type) - return locations.StackLocation(loc, num_words=num_words, type=type) + def frame_pos(i, box_type): + if box_type == FLOAT: + return locations.StackLocation(i, get_fp_offset(i + 1), box_type) + else: + return locations.StackLocation(i, get_fp_offset(i), box_type) @staticmethod def frame_size(type): @@ -84,10 +86,7 @@ @staticmethod def get_loc_index(loc): assert loc.is_stack() - if loc.type == FLOAT: - return loc.position - 1 - else: - return loc.position + return loc.position def void(self, op, fcond): @@ -721,7 +720,6 @@ else: src_locations2.append(src_loc) dst_locations2.append(dst_loc) - remap_frame_layout_mixed(self.assembler, src_locations1, dst_locations1, tmploc, src_locations2, dst_locations2, vfptmploc) @@ -960,6 +958,7 @@ if (isinstance(v, BoxPtr) and self.rm.stays_alive(v)): assert val.is_stack() gcrootmap.add_frame_offset(shape, val.position * -WORD) + gcrootmap.add_frame_offset(shape, -val.value) for v, reg in self.rm.reg_bindings.items(): if reg is r.r0: continue _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit