[pypy-svn] r79271 - pypy/branch/arm-backend/pypy/jit/backend/arm

david at codespeak.net david at codespeak.net
Fri Nov 19 13:26:25 CET 2010


Author: david
Date: Fri Nov 19 13:26:23 2010
New Revision: 79271

Modified:
   pypy/branch/arm-backend/pypy/jit/backend/arm/assembler.py
   pypy/branch/arm-backend/pypy/jit/backend/arm/regalloc.py
Log:
Fix decoding of frame and location information when building a bridge

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	Fri Nov 19 13:26:23 2010
@@ -56,6 +56,8 @@
         regs = rffi.cast(rffi.CCHARP, frame_loc - (frame_depth + len(r.all_regs))*WORD)
         i = 3
         fail_index = -1
+        if self.debug:
+            import pdb; pdb.set_trace()
         while(True):
             i += 1
             fail_index += 1
@@ -94,8 +96,10 @@
         self.fail_boxes_count = fail_index
         return descr
 
-    def update_bridge_bindings(self, enc, inputargs, regalloc):
+    def decode_inputargs_and_frame_depth(self, enc, inputargs, regalloc):
+        locs = []
         # first word contains frame depth
+        frame_depth = self.decode32(enc, 0) + 1
         j = 4
         for i in range(len(inputargs)):
             res = enc[j]
@@ -113,12 +117,14 @@
                 assert 0, 'fail'
             elif res == '\xFC': # stack location
                 stack_loc = self.decode32(enc, j+1)
-                loc = regalloc.make_sure_var_in_reg(inputargs[i])
-                self.mc.LDR_ri(loc.value, r.fp.value, -stack_loc)
+                loc = regalloc.frame_manager.frame_pos(stack_loc, INT)
                 j += 4
             else: # reg location
-                regalloc.force_allocate_reg(inputargs[i], selected_reg=r.all_regs[ord(res)])
+                loc = r.all_regs[ord(res)]
             j += 1
+            locs.append(loc)
+        return frame_depth, locs
+
     def decode32(self, mem, index):
         highval = ord(mem[index+3])
         if highval >= 128:
@@ -283,6 +289,7 @@
 
     # cpu interface
     def assemble_loop(self, inputargs, operations, looptoken):
+        self.debug = False
         longevity = compute_vars_longevity(inputargs, operations)
         regalloc = ARMRegisterManager(longevity, assembler=self, frame_manager=ARMFrameManager())
         self.align()
@@ -374,12 +381,14 @@
         return False
 
     def assemble_bridge(self, faildescr, inputargs, operations):
+        self.debug = False
         enc = rffi.cast(rffi.CCHARP, faildescr._failure_recovery_code)
         longevity = compute_vars_longevity(inputargs, operations)
         regalloc = ARMRegisterManager(longevity, assembler=self, frame_manager=ARMFrameManager())
 
         bridge_head = self.mc.curraddr()
-        self.update_bridge_bindings(enc, inputargs, regalloc)
+        frame_depth, locs = self.decode_inputargs_and_frame_depth(enc, inputargs, regalloc)
+        regalloc.update_bindings(locs, frame_depth, inputargs)
 
         print 'Bridge', inputargs, operations
         self._walk_operations(operations, regalloc)

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	Fri Nov 19 13:26:23 2010
@@ -23,6 +23,28 @@
     def call_result_location(self, v):
         return r.r0
 
+    def update_bindings(self, locs, frame_depth, inputargs):
+        used = {}
+        i = 0
+        self.frame_manager.frame_depth = frame_depth
+        for loc in locs:
+            arg = inputargs[i]
+            i += 1
+            if loc.is_reg():
+                self.reg_bindings[arg] = loc
+            else:
+                self.frame_manager.frame_bindings[arg] = loc
+            used[loc] = None
+
+        # XXX combine with x86 code and move to llsupport
+        self.free_regs = []
+        for reg in self.all_regs:
+            if reg not in used:
+                self.free_regs.append(reg)
+        # note: we need to make a copy of inputargs because possibly_free_vars
+        # is also used on op args, which is a non-resizable list
+        self.possibly_free_vars(list(inputargs))
+
 class ARMFrameManager(FrameManager):
     def __init__(self):
         FrameManager.__init__(self)



More information about the Pypy-commit mailing list