[pypy-commit] pypy ppc-jit-backend: merge

hager noreply at buildbot.pypy.org
Tue Dec 20 15:38:06 CET 2011


Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r50756:4b2b09579148
Date: 2011-12-20 15:37 +0100
http://bitbucket.org/pypy/pypy/changeset/4b2b09579148/

Log:	merge

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
@@ -561,26 +561,34 @@
         self.fielddescr_tid = get_field_descr(gc_ll_descr, GCClass.HDR, 'tid')
         #
         self.jit_wb_if_flag = GCClass.JIT_WB_IF_FLAG
-        self.jit_wb_if_flag_byteofs, self.jit_wb_if_flag_singlebyte = (
+        (self.jit_wb_if_flag_byteofs,
+         self.jit_wb_if_flag_singlebyte,
+         self.jit_wb_if_flag_bitpos) = (
             self.extract_flag_byte(self.jit_wb_if_flag))
         #
         if hasattr(GCClass, 'JIT_WB_CARDS_SET'):
             self.jit_wb_cards_set = GCClass.JIT_WB_CARDS_SET
             self.jit_wb_card_page_shift = GCClass.JIT_WB_CARD_PAGE_SHIFT
-            self.jit_wb_cards_set_byteofs, self.jit_wb_cards_set_singlebyte = (
+            (self.jit_wb_cards_set_byteofs,
+             self.jit_wb_cards_set_singlebyte,
+             self.jit_wb_cards_set_bitpos) = (
                 self.extract_flag_byte(self.jit_wb_cards_set))
         else:
             self.jit_wb_cards_set = 0
 
     def extract_flag_byte(self, flag_word):
         # if convenient for the backend, we compute the info about
-        # the flag as (byte-offset, single-byte-flag).
+        # the flag as (byte-offset, single-byte-flag, bit-position-in-word).
+        # Note that flag_word == 1 << bit_position_in_word.
         import struct
         value = struct.pack("l", flag_word)
         assert value.count('\x00') == len(value) - 1    # only one byte is != 0
         i = 0
         while value[i] == '\x00': i += 1
-        return (i, struct.unpack('b', value[i])[0])
+        bitpos = 0
+        while flag_word > (1 << bitpos): bitpos += 1
+        assert flag_word == (1 << bitpos)
+        return (i, struct.unpack('b', value[i])[0], bitpos)
 
     def get_write_barrier_fn(self, cpu):
         llop1 = self.llop1
diff --git a/pypy/jit/backend/ppc/ppcgen/opassembler.py b/pypy/jit/backend/ppc/ppcgen/opassembler.py
--- a/pypy/jit/backend/ppc/ppcgen/opassembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/opassembler.py
@@ -898,22 +898,14 @@
         else:
             self.mc.ld(r.SCRATCH.value, loc_base.value, 0)
 
-        # offset to the byte we are interested in
-        byte_offset = descr.jit_wb_if_flag_byteofs
-        single_byte = descr.jit_wb_if_flag_singlebyte
-
-        # examine which bit in the byte is set
-        for i in range(8):
-            if 1 << i == single_byte:
-                n = i
-                break
+        # get the position of the bit we want to test
+        bitpos = descr.jit_wb_if_flag_bitpos
 
         if IS_PPC_32:
-            # compute the position of the bit we want to test
-            bitpos = (3 - byte_offset) * 8 + n
-                    # ^^^^^^^^^^^^^^^ due to endianess
             # put this bit to the rightmost bitposition of r0
-            self.mc.rlwinm(r.SCRATCH.value, r.SCRATCH.value, 32 - bitpos, 31, 31)
+            if bitpos > 0:
+                self.mc.rlwinm(r.SCRATCH.value, r.SCRATCH.value,
+                               32 - bitpos, 31, 31)
             # test whether this bit is set
             self.mc.cmpwi(0, r.SCRATCH.value, 1)
         else:
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
@@ -1961,6 +1961,7 @@
             jit_wb_if_flag = 4096
             jit_wb_if_flag_byteofs = struct.pack("i", 4096).index('\x10')
             jit_wb_if_flag_singlebyte = 0x10
+            jit_wb_if_flag_bitpos = 12
             def get_write_barrier_fn(self, cpu):
                 return funcbox.getint()
         #
@@ -1998,6 +1999,7 @@
             jit_wb_if_flag = 4096
             jit_wb_if_flag_byteofs = struct.pack("i", 4096).index('\x10')
             jit_wb_if_flag_singlebyte = 0x10
+            jit_wb_if_flag_bitpos = 12
             jit_wb_cards_set = 0
             def get_write_barrier_from_array_fn(self, cpu):
                 return funcbox.getint()
@@ -2044,9 +2046,11 @@
             jit_wb_if_flag = 4096
             jit_wb_if_flag_byteofs = struct.pack("i", 4096).index('\x10')
             jit_wb_if_flag_singlebyte = 0x10
+            jit_wb_if_flag_bitpos = 12
             jit_wb_cards_set = 8192
             jit_wb_cards_set_byteofs = struct.pack("i", 8192).index('\x20')
             jit_wb_cards_set_singlebyte = 0x20
+            jit_wb_cards_set_bitpos = 13
             jit_wb_card_page_shift = 7
             def get_write_barrier_from_array_fn(self, cpu):
                 return funcbox.getint()


More information about the pypy-commit mailing list