[pypy-commit] pypy arm-backed-float: correct alignemnt calculation when loading arguments from registers at a call entry point. Also make sure not to overwrite parts of float arguments when moving the arguments to the corresponding locations.
bivab
noreply at buildbot.pypy.org
Thu May 26 14:00:29 CEST 2011
Author: David Schneider <david.schneider at picle.org>
Branch: arm-backed-float
Changeset: r44506:ec1072ed7587
Date: 2011-05-26 14:11 +0200
http://bitbucket.org/pypy/pypy/changeset/ec1072ed7587/
Log: correct alignemnt calculation when loading arguments from registers
at a call entry point. Also make sure not to overwrite parts of
float arguments when moving the arguments to the corresponding
locations.
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
@@ -7,6 +7,7 @@
from pypy.jit.backend.arm.codebuilder import ARMv7Builder, OverwritingBuilder
from pypy.jit.backend.arm.regalloc import (Regalloc, ARMFrameManager, ARMv7RegisterMananger,
_check_imm_arg, TempInt, TempPtr)
+from pypy.jit.backend.arm.jump import remap_frame_layout
from pypy.jit.backend.llsupport.regalloc import compute_vars_longevity, TempBox
from pypy.jit.backend.llsupport.asmmemmgr import MachineDataBlockWrapper
from pypy.jit.backend.model import CompiledLoopToken
@@ -174,13 +175,13 @@
i += 4
elif res == self.STACK_LOC:
stack_loc = self.decode32(enc, i+1)
+ i += 4
if group == self.FLOAT_TYPE:
value = self.decode64(stack, frame_depth - stack_loc*WORD)
self.fail_boxes_float.setitem(fail_index, value)
continue
else:
value = self.decode32(stack, frame_depth - stack_loc*WORD)
- i += 4
else: # REG_LOC
reg = ord(enc[i])
if group == self.FLOAT_TYPE:
@@ -470,19 +471,40 @@
reg_args = count_reg_args(inputargs)
stack_locs = len(inputargs) - reg_args
+
selected_reg = 0
+ count = 0
+ float_args = []
+ nonfloat_args = []
+ nonfloat_regs = []
+ # load reg args
for i in range(reg_args):
arg = inputargs[i]
+ if arg.type == FLOAT and count % 2 != 0:
+ selected_reg += 1
+ count = 0
+ reg = r.all_regs[selected_reg]
+
if arg.type == FLOAT:
- loc = floatlocs[i]
+ float_args.append((reg, floatlocs[i]))
else:
- loc = nonfloatlocs[i]
- self.mov_loc_loc(r.all_regs[selected_reg], loc)
- if inputargs[i].type == FLOAT:
+ nonfloat_args.append(reg)
+ nonfloat_regs.append(nonfloatlocs[i])
+ count += 1
+
+ if arg.type == FLOAT:
selected_reg += 2
else:
selected_reg += 1
+ # move float arguments to vfp regsiters
+ for loc, reg in float_args:
+ self.mov_loc_loc(loc, reg)
+
+ # remap values stored in core registers
+ remap_frame_layout(self, nonfloat_args, nonfloat_regs, r.ip)
+
+ # load values passed on the stack to the corresponding locations
stack_position = len(r.callee_saved_registers)*WORD + \
len(r.callee_saved_vfp_registers)*2*WORD + \
N_REGISTERS_SAVED_BY_MALLOC * WORD + \
@@ -712,6 +734,7 @@
mc.CMP_rr(r.fp.value, r.sp.value)
mc.MOV_rr(r.pc.value, r.pc.value, cond=c.GE)
mc.BKPT()
+
def _ensure_result_bit_extension(self, resloc, size, signed):
if size == 4:
return
More information about the pypy-commit
mailing list