[pypy-commit] pypy remove-globals-in-jit: Fix, progress.

arigo noreply at buildbot.pypy.org
Thu Nov 15 21:46:04 CET 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: remove-globals-in-jit
Changeset: r58932:f33c664093a8
Date: 2012-11-15 21:40 +0100
http://bitbucket.org/pypy/pypy/changeset/f33c664093a8/

Log:	Fix, progress.

diff --git a/pypy/jit/backend/llsupport/gc.py b/pypy/jit/backend/llsupport/gc.py
--- a/pypy/jit/backend/llsupport/gc.py
+++ b/pypy/jit/backend/llsupport/gc.py
@@ -112,12 +112,22 @@
 
     @specialize.memo()
     def getframedescrs(self, cpu):
-        return (
-            cpu.arraydescrof(jitframe.DEADFRAME),
-            cpu.interiorfielddescrof(jitframe.DEADFRAME, 'int', 'jf_values'),
-            cpu.interiorfielddescrof(jitframe.DEADFRAME, 'ref', 'jf_values'),
-            cpu.interiorfielddescrof(jitframe.DEADFRAME, 'float', 'jf_values'),
-            cpu.fielddescrof(jitframe.DEADFRAME, 'jf_descr'))
+        descrs = JitFrameDescrs()
+        descrs.arraydescr = cpu.arraydescrof(jitframe.DEADFRAME)
+        descrs.as_int = cpu.interiorfielddescrof(jitframe.DEADFRAME,
+                                                 'int', 'jf_values')
+        descrs.as_ref = cpu.interiorfielddescrof(jitframe.DEADFRAME,
+                                                 'ref', 'jf_values')
+        descrs.as_float = cpu.interiorfielddescrof(jitframe.DEADFRAME,
+                                                   'float', 'jf_values')
+        descrs.jf_descr = cpu.fielddescrof(jitframe.DEADFRAME, 'jf_descr')
+        descrs.jf_guard_exc = cpu.fielddescrof(jitframe.DEADFRAME,
+                                               'jf_guard_exc')
+        return descrs
+
+class JitFrameDescrs:
+    def _freeze_(self):
+        return True
 
 # ____________________________________________________________
 
diff --git a/pypy/jit/backend/llsupport/rewrite.py b/pypy/jit/backend/llsupport/rewrite.py
--- a/pypy/jit/backend/llsupport/rewrite.py
+++ b/pypy/jit/backend/llsupport/rewrite.py
@@ -350,12 +350,11 @@
         v_deadframe = BoxPtr()
         args_boxes = finish_op.getarglist()     # may contain Consts too
         #
-        arraydescr, int_descr, ref_descr, float_descr, jf_descr = (
-            self.gc_ll_descr.getframedescrs(self.cpu))
+        descrs = self.gc_ll_descr.getframedescrs(self.cpu)
         #
         op = ResOperation(rop.NEW_ARRAY,
                           [ConstInt(len(args_boxes))], v_deadframe,
-                          descr=arraydescr)
+                          descr=descrs.arraydescr)
         self.handle_malloc_operation(op)
         #
         for i in range(len(args_boxes)):
@@ -363,9 +362,9 @@
             # deadframe object.  Ignore write barriers because it's a
             # recent object.
             box = args_boxes[i]
-            if box.type == history.INT: descr = int_descr
-            elif box.type == history.REF: descr = ref_descr
-            elif box.type == history.FLOAT: descr = float_descr
+            if box.type == history.INT: descr = descrs.as_int
+            elif box.type == history.REF: descr = descrs.as_ref
+            elif box.type == history.FLOAT: descr = descrs.as_float
             else: assert 0, "bad box type?"
             op = ResOperation(rop.SETINTERIORFIELD_GC,
                               [v_deadframe, ConstInt(i), box], None,
@@ -376,7 +375,7 @@
         gcref_descr = finish_op.getdescr().hide(self.cpu)
         op = ResOperation(rop.SETFIELD_GC,
                           [v_deadframe, ConstPtr(gcref_descr)], None,
-                          descr=jf_descr)
+                          descr=descrs.jf_descr)
         self.newops.append(op)
         #
         op = ResOperation(rop.FINISH, [v_deadframe], None)
diff --git a/pypy/jit/backend/test/runner_test.py b/pypy/jit/backend/test/runner_test.py
--- a/pypy/jit/backend/test/runner_test.py
+++ b/pypy/jit/backend/test/runner_test.py
@@ -2847,7 +2847,8 @@
             x = self.cpu.get_latest_value_float(deadframe, 0)
             assert longlong.getrealfloat(x) == 1.2 + 3.2
             called.append(self.cpu.get_latest_descr(deadframe))
-            return longlong.getfloatstorage(13.5)
+            print '!' * 30 + 'assembler_helper'
+            return 13.5
 
         FUNCPTR = lltype.Ptr(lltype.FuncType([llmemory.GCREF, llmemory.GCREF],
                                              lltype.Float))
@@ -2902,10 +2903,10 @@
             othertoken = JitCellToken()
             self.cpu.compile_loop(loop.inputargs, loop.operations, othertoken)
             args = [longlong.getfloatstorage(1.2),
-                    longlong.getfloatstorage(3.2)]
+                    longlong.getfloatstorage(4.2)]
             deadframe = self.cpu.execute_token(othertoken, *args)
             x = self.cpu.get_latest_value_float(deadframe, 0)
-            assert longlong.getrealfloat(x) == 1.2 + 3.2
+            assert longlong.getrealfloat(x) == 1.2 + 4.2
             assert not called
         finally:
             del self.cpu.done_with_this_frame_float_v
diff --git a/pypy/jit/backend/x86/assembler.py b/pypy/jit/backend/x86/assembler.py
--- a/pypy/jit/backend/x86/assembler.py
+++ b/pypy/jit/backend/x86/assembler.py
@@ -2145,9 +2145,9 @@
 
         if exc:
             # save ebx into 'jf_guard_exc'
-            offset, size = symbolic.get_field_token(
-                jitframe.DEADFRAME, 'jf_guard_exc',
-                self.cpu.translate_support_code)
+            from pypy.jit.backend.llsupport.descr import unpack_fielddescr
+            descrs = self.cpu.gc_ll_descr.getframedescrs(self.cpu)
+            offset, size, _ = unpack_fielddescr(descrs.jf_guard_exc)
             mc.MOV_mr((eax.value, offset), ebx.value)
 
         # now we return from the complete frame, which starts from
@@ -2392,7 +2392,15 @@
                 value = self.cpu.done_with_this_frame_float_v
             else:
                 raise AssertionError(kind)
-        self.mc.CMP_ri(eax.value, value)
+
+        from pypy.jit.backend.llsupport.descr import unpack_fielddescr
+        from pypy.jit.backend.llsupport.descr import unpack_interiorfielddescr
+        descrs = self.cpu.gc_ll_descr.getframedescrs(self.cpu)
+        _offset, _size, _ = unpack_fielddescr(descrs.jf_descr)
+        fail_descr = self.cpu.get_fail_descr_from_number(value)
+        value = fail_descr.hide(self.cpu)
+        value = rffi.cast(lltype.Signed, value)       # XXX assumes non-moving
+        self.mc.CMP_mi((eax.value, _offset), value)
         # patched later
         self.mc.J_il8(rx86.Conditions['E'], 0) # goto B if we get 'done_with_this_frame'
         je_location = self.mc.get_relative_pos()
@@ -2420,29 +2428,23 @@
             fielddescr = jd.vable_token_descr
             assert isinstance(fielddescr, FieldDescr)
             ofs = fielddescr.offset
-            self.mc.MOV(eax, arglocs[1])
-            self.mc.MOV_mi((eax.value, ofs), 0)
+            self.mc.MOV(edx, arglocs[1])
+            self.mc.MOV_mi((edx.value, ofs), 0)
             # in the line above, TOKEN_NONE = 0
         #
         if op.result is not None:
-            # load the return value from fail_boxes_xxx[0]
+            # load the return value from the dead frame's value index 0
+            # (use descrs.as_int here, which is valid too for descrs.as_ref)
+            t = unpack_interiorfielddescr(descrs.as_int)
+            load_from = (eax.value, t[0])
             kind = op.result.type
             if kind == FLOAT:
-                xmmtmp = xmm0
-                adr = self.fail_boxes_float.get_addr_for_num(0)
-                self.mc.MOVSD(xmmtmp, heap(adr))
-                self.mc.MOVSD(result_loc, xmmtmp)
+                self.mc.MOVSD_xm(xmm0.value, load_from)
+                if result_loc is not xmm0:
+                    self.mc.MOVSD(result_loc, xmm0)
             else:
                 assert result_loc is eax
-                if kind == INT:
-                    adr = self.fail_boxes_int.get_addr_for_num(0)
-                    self.mc.MOV(eax, heap(adr))
-                elif kind == REF:
-                    adr = self.fail_boxes_ptr.get_addr_for_num(0)
-                    self.mc.MOV(eax, heap(adr))
-                    self.mc.MOV(heap(adr), imm0)
-                else:
-                    raise AssertionError(kind)
+                self.mc.MOV_rm(eax.value, load_from)
         #
         # Here we join Path A and Path B again
         offset = self.mc.get_relative_pos() - jmp_location


More information about the pypy-commit mailing list