[pypy-svn] r78268 - pypy/branch/arm-backend/pypy/jit/backend/arm
david at codespeak.net
david at codespeak.net
Mon Oct 25 16:47:23 CEST 2010
Author: david
Date: Mon Oct 25 16:47:22 2010
New Revision: 78268
Modified:
pypy/branch/arm-backend/pypy/jit/backend/arm/assembler.py
pypy/branch/arm-backend/pypy/jit/backend/arm/regalloc.py
Log:
(david, arigo) Encode and decode args and registers for jumps and bridges
Modified: pypy/branch/arm-backend/pypy/jit/backend/arm/assembler.py
==============================================================================
--- pypy/branch/arm-backend/pypy/jit/backend/arm/assembler.py (original)
+++ pypy/branch/arm-backend/pypy/jit/backend/arm/assembler.py Mon Oct 25 16:47:22 2010
@@ -123,19 +123,15 @@
def gen_func_prolog(self):
self.mc.PUSH(r.callee_saved_registers)
- def gen_bootstrap_code(self, inputargs, regalloc):
- for i in range(len(inputargs)):
- reg = regalloc.try_allocate_reg(inputargs[i])
- addr = self.fail_boxes_int.get_addr_for_num(i)
- self.mc.gen_load_int(reg, addr)
- self.mc.LDR_ri(reg, reg)
-
- def gen_bridge_bootstrap_code(self, inputargs, regalloc):
+ def gen_bootstrap_code(self, inputargs, regalloc, looptoken):
+ regs = []
for i in range(len(inputargs)):
reg = regalloc.try_allocate_reg(inputargs[i])
addr = self.fail_boxes_int.get_addr_for_num(i)
self.mc.gen_load_int(reg, addr)
self.mc.LDR_ri(reg, reg)
+ regs.append(reg)
+ looptoken._arm_arglocs = regs
# cpu interface
def assemble_loop(self, inputargs, operations, looptoken):
@@ -143,7 +139,7 @@
regalloc = ARMRegisterManager(longevity, assembler=self.mc)
loop_start=self.mc.curraddr()
self.gen_func_prolog()
- self.gen_bootstrap_code(inputargs, regalloc)
+ self.gen_bootstrap_code(inputargs, regalloc, looptoken)
loop_head=self.mc.curraddr()
looptoken._arm_bootstrap_code = loop_start
looptoken._arm_loop_code = loop_head
@@ -158,11 +154,13 @@
print 'Done assembling'
def assemble_bridge(self, faildescr, inputargs, operations):
- # XXX need to restore args here
+ enc = rffi.cast(rffi.CCHARP, faildescr._failure_recovery_code)
longevity = compute_vars_longevity(inputargs, operations)
regalloc = ARMRegisterManager(longevity, assembler=self.mc)
+
+ regalloc.update_bindings(enc, inputargs)
bridge_head = self.mc.curraddr()
- self.gen_bridge_bootstrap_code(inputargs, regalloc)
+
fcond = c.AL
for op in operations:
opnum = op.getopnum()
@@ -188,14 +186,13 @@
# Resoperations
-
def emit_op_jump(self, op, regalloc, fcond):
tmp = Box()
tmpreg = regalloc.try_allocate_reg(tmp)
- inputargs = op.getdescr()._temp_inputargs
+ registers = op.getdescr()._arm_arglocs
for i in range(op.numargs()):
reg = regalloc.try_allocate_reg(op.getarg(i))
- inpreg = regalloc.try_allocate_reg(inputargs[i])
+ inpreg = registers[i]
# XXX only if every value is in a register
self.mc.MOV_rr(inpreg, reg)
loop_code = op.getdescr()._arm_loop_code
@@ -226,9 +223,9 @@
assert fcond == c.GT
descr = op.getdescr()
assert isinstance(descr, BasicFailDescr)
+ descr._arm_guard_code = self.mc.curraddr()
memaddr = self._gen_path_to_exit_path(op, op.getfailargs(), regalloc, fcond)
descr._failure_recovery_code = memaddr
- descr._arm_guard_code = self.mc.curraddr()
descr._arm_guard_cond = fcond
return c.AL
Modified: pypy/branch/arm-backend/pypy/jit/backend/arm/regalloc.py
==============================================================================
--- pypy/branch/arm-backend/pypy/jit/backend/arm/regalloc.py (original)
+++ pypy/branch/arm-backend/pypy/jit/backend/arm/regalloc.py Mon Oct 25 16:47:22 2010
@@ -11,6 +11,10 @@
def __init__(self, longevity, frame_manager=None, assembler=None):
RegisterManager.__init__(self, longevity, frame_manager, assembler)
+ def update_bindings(self, enc, inputargs):
+ for i in range(len(inputargs)):
+ self.try_allocate_reg(inputargs[i], ord(enc[i]))
+
class ARMFrameManager(FrameManager):
@staticmethod
def frame_pos(loc, type):
More information about the Pypy-commit
mailing list