[pypy-svn] r76731 - pypy/branch/asmgcc-64/pypy/jit/backend/x86

jcreigh at codespeak.net jcreigh at codespeak.net
Wed Aug 25 18:44:01 CEST 2010


Author: jcreigh
Date: Wed Aug 25 18:43:59 2010
New Revision: 76731

Modified:
   pypy/branch/asmgcc-64/pypy/jit/backend/x86/assembler.py
   pypy/branch/asmgcc-64/pypy/jit/backend/x86/rx86.py
Log:
fix bug that was causing guard_class to always fail on 64-bit

Modified: pypy/branch/asmgcc-64/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/branch/asmgcc-64/pypy/jit/backend/x86/assembler.py	(original)
+++ pypy/branch/asmgcc-64/pypy/jit/backend/x86/assembler.py	Wed Aug 25 18:43:59 2010
@@ -1251,8 +1251,12 @@
             sizeof_ti = rffi.sizeof(GCData.TYPE_INFO)
             type_info_group = llop.gc_get_type_info_group(llmemory.Address)
             type_info_group = rffi.cast(lltype.Signed, type_info_group)
-            expected_typeid = (classptr - sizeof_ti - type_info_group) >> 2
-            self.mc.CMP16(mem(locs[0], 0), ImmedLoc(expected_typeid))
+            expected_typeid = classptr - sizeof_ti - type_info_group
+            if IS_X86_32:
+                expected_typeid >>= 2
+                self.mc.CMP16(mem(locs[0], 0), ImmedLoc(expected_typeid))
+            elif IS_X86_64:
+                self.mc.CMP32_mi((locs[0].value, 0), expected_typeid)
 
     def genop_guard_guard_class(self, ign_1, guard_op, guard_token, locs, ign_2):
         self.mc.ensure_bytes_available(256)

Modified: pypy/branch/asmgcc-64/pypy/jit/backend/x86/rx86.py
==============================================================================
--- pypy/branch/asmgcc-64/pypy/jit/backend/x86/rx86.py	(original)
+++ pypy/branch/asmgcc-64/pypy/jit/backend/x86/rx86.py	Wed Aug 25 18:43:59 2010
@@ -462,6 +462,8 @@
     CMP_ji = select_8_or_32_bit_immed(CMP_ji8, CMP_ji32)
     CMP_rj = insn(rex_w, '\x3B', register(1, 8), '\x05', immediate(2))
 
+    CMP32_mi = insn(rex_nw, '\x81', orbyte(7<<3), mem_reg_plus_const(1), immediate(2))
+
     AND8_rr = insn(rex_w, '\x20', byte_register(1), byte_register(2,8), '\xC0')
 
     OR8_rr = insn(rex_w, '\x08', byte_register(1), byte_register(2,8), '\xC0')



More information about the Pypy-commit mailing list