[pypy-svn] r68149 - in pypy/branch/remove-ri386-multimethod/pypy/jit/backend/x86: . test

arigo at codespeak.net arigo at codespeak.net
Sun Oct 4 22:15:01 CEST 2009


Author: arigo
Date: Sun Oct  4 22:15:00 2009
New Revision: 68149

Modified:
   pypy/branch/remove-ri386-multimethod/pypy/jit/backend/x86/rx86.py
   pypy/branch/remove-ri386-multimethod/pypy/jit/backend/x86/test/test_rx86_32_auto_encoding.py
   pypy/branch/remove-ri386-multimethod/pypy/jit/backend/x86/test/test_rx86_64_auto_encoding.py
Log:
Test and fix for "movq $imm64, reg".


Modified: pypy/branch/remove-ri386-multimethod/pypy/jit/backend/x86/rx86.py
==============================================================================
--- pypy/branch/remove-ri386-multimethod/pypy/jit/backend/x86/rx86.py	(original)
+++ pypy/branch/remove-ri386-multimethod/pypy/jit/backend/x86/rx86.py	Sun Oct  4 22:15:00 2009
@@ -103,6 +103,7 @@
         mc.writechar(chr(0x40 | orbyte | ebp))
         mc.writeimm8(offset)
     else:
+        assert fits_in_32bits(offset)
         mc.writechar(chr(0x80 | orbyte | ebp))
         mc.writeimm32(offset)
     return 0
@@ -118,6 +119,7 @@
     # * 'offset' is stored as bytes 1-4 of the result;
     # * 'reg1' is stored as byte 5 of the result.
     assert reg != esp and reg != ebp
+    assert fits_in_32bits(offset)
     return (r_ulonglong(reg) << 32) | r_ulonglong(rffi.r_uint(offset))
 
 def encode_mem_reg_plus_const(mc, reg1_offset, _, orbyte):
@@ -128,8 +130,8 @@
     # 64-bits special cases for reg1 == r12 or r13
     # (which look like esp or ebp after being truncated to 3 bits)
     if mc.WORD == 8:
-        if reg1 == esp:
-            SIB = (esp<<3) | esp
+        if reg1 == esp:             # forces an SIB byte:
+            SIB = (esp<<3) | esp    #   use [r12+(no index)+offset]
         elif reg1 == ebp:
             no_offset = False
     # end of 64-bits special cases
@@ -304,6 +306,7 @@
         self.writechar(chr((imm >> 16) & 0xFF))
         self.writechar(chr((imm >> 24) & 0xFF))
 
+    MOV_ri = insn(rex_w, register(1), '\xB8', immediate(2, 'q'))
     #MOV_si = insn(rex_w, '\xC7', orbyte(0<<3), stack(1), immediate(2))
     MOV_rr = insn(rex_w, '\x89', register(2,8), register(1), '\xC0')
     MOV_sr = insn(rex_w, '\x89', register(2,8), stack(1))
@@ -338,12 +341,16 @@
 class X86_32_CodeBuilder(AbstractX86CodeBuilder):
     WORD = 4
 
-    MOV_ri = insn(register(1), '\xB8', immediate(2))
-
 
 class X86_64_CodeBuilder(AbstractX86CodeBuilder):
     WORD = 8
 
+    def writeimm64(self, imm):
+        self.writeimm32(intmask(rffi.cast(rffi.INT, imm)))
+        self.writeimm32(imm >> 32)
+
+    # MOV_ri from the parent class is not wrong, but add a better encoding
+    # for the common case where the immediate bits in 32 bits
     _MOV_ri32 = insn(rex_w, '\xC7', register(1), '\xC0', immediate(2, 'i'))
     _MOV_ri64 = insn(rex_w, register(1), '\xB8', immediate(2, 'q'))
 

Modified: pypy/branch/remove-ri386-multimethod/pypy/jit/backend/x86/test/test_rx86_32_auto_encoding.py
==============================================================================
--- pypy/branch/remove-ri386-multimethod/pypy/jit/backend/x86/test/test_rx86_32_auto_encoding.py	(original)
+++ pypy/branch/remove-ri386-multimethod/pypy/jit/backend/x86/test/test_rx86_32_auto_encoding.py	Sun Oct  4 22:15:00 2009
@@ -35,11 +35,10 @@
 # ____________________________________________________________
 
 COUNT1 = 15
-COUNT2 = 25
 suffixes = {0:'', 1:'b', 2:'w', 4:'l', 8:'q'}
 
 
-class TestRx86_32:
+class TestRx86_32(object):
     WORD = 4
     TESTDIR = 'rx86_32'
     X86_CodeBuilder = rx86.X86_32_CodeBuilder

Modified: pypy/branch/remove-ri386-multimethod/pypy/jit/backend/x86/test/test_rx86_64_auto_encoding.py
==============================================================================
--- pypy/branch/remove-ri386-multimethod/pypy/jit/backend/x86/test/test_rx86_64_auto_encoding.py	(original)
+++ pypy/branch/remove-ri386-multimethod/pypy/jit/backend/x86/test/test_rx86_64_auto_encoding.py	Sun Oct  4 22:15:00 2009
@@ -1,3 +1,4 @@
+import random
 from pypy.jit.backend.x86 import rx86
 from pypy.jit.backend.x86.test import test_rx86_32_auto_encoding
 
@@ -12,3 +13,20 @@
     NONSPECREGS = [rx86.eax, rx86.ecx, rx86.edx, rx86.ebx, rx86.esi, rx86.edi,
                    rx86.r8,  rx86.r9,  rx86.r10, rx86.r11,
                    rx86.r12, rx86.r13, rx86.r14, rx86.r15]
+
+    def imm64_tests(self):
+        v = [-0x80000001, 0x80000000,
+             -0x8000000000000000, 0x7FFFFFFFFFFFFFFF]
+        for i in range(test_rx86_32_auto_encoding.COUNT1):
+            x = ((random.randrange(-32768,32768)<<48) |
+                 (random.randrange(0,65536)<<32) |
+                 (random.randrange(0,65536)<<16) |
+                 (random.randrange(0,65536)<<0))
+            if not rx86.fits_in_32bits(x):
+                v.append(x)
+        return v + self._old_imm32_tests()
+
+    def test_extra_MOV_ri64(self):
+        self._old_imm32_tests = self.imm32_tests
+        self.imm32_tests = self.imm64_tests      # patch on 'self'
+        self.complete_test('MOV_ri')



More information about the Pypy-commit mailing list