[pypy-svn] r74650 - in pypy/branch/x86-64-jit-backend/pypy/jit/backend/x86: . test

jcreigh at codespeak.net jcreigh at codespeak.net
Fri May 21 21:25:56 CEST 2010


Author: jcreigh
Date: Fri May 21 21:25:54 2010
New Revision: 74650

Modified:
   pypy/branch/x86-64-jit-backend/pypy/jit/backend/x86/rx86.py
   pypy/branch/x86-64-jit-backend/pypy/jit/backend/x86/test/test_rx86.py
Log:
fix issues causing rx86 test failures

Modified: pypy/branch/x86-64-jit-backend/pypy/jit/backend/x86/rx86.py
==============================================================================
--- pypy/branch/x86-64-jit-backend/pypy/jit/backend/x86/rx86.py	(original)
+++ pypy/branch/x86-64-jit-backend/pypy/jit/backend/x86/rx86.py	Fri May 21 21:25:54 2010
@@ -377,8 +377,17 @@
 
     IMUL_rr = insn(rex_w, '\x0F\xAF', register(1, 8), register(2), '\xC0')
     IMUL_rb = insn(rex_w, '\x0F\xAF', register(1, 8), stack_bp(2))
-    # XXX: There are more efficient encodings of small immediates
-    IMUL_rri = insn(rex_w, '\x69', register(1, 8), register(2), '\xC0', immediate(3))
+    # 8-bit immediate
+    _IMUL_rri8 = insn(rex_w, '\x6B', register(1, 8), register(2), '\xC0', immediate(3, 'b'))
+    # 32-bit immediate
+    _IMUL_rri32 = insn(rex_w, '\x69', register(1, 8), register(2), '\xC0', immediate(3))
+
+    def IMUL_rri(self, reg1, reg2, immed):
+        if single_byte(immed):
+            self._IMUL_rri8(reg1, reg2, immed)
+        else:
+            assert fits_in_32bits(immed)
+            self._IMUL_rri32(reg1, reg2, immed)
 
     def IMUL_ri(self, reg, immed):
         return self.IMUL_rri(reg, reg, immed)
@@ -405,7 +414,8 @@
     J_il = insn('\x0F', immediate(1,'o'), '\x80', relative(2))
     SET_ir = insn('\x0F', immediate(1,'o'),'\x90', register(2), '\xC0')
 
-    CDQ = insn(rex_w, '\x99')
+    # The 64-bit version of this, CQO, is defined in X86_64_CodeBuilder
+    CDQ = insn(rex_nw, '\x99')
 
     # ------------------------------ SSE2 ------------------------------
 
@@ -462,6 +472,8 @@
         self.writechar(chr((imm >> 48) & 0xFF))
         self.writechar(chr((imm >> 56) & 0xFF))
 
+    CQO = insn(rex_w, '\x99')
+
     # MOV_ri from the parent class is not wrong, but here is a better encoding
     # for the common case where the immediate fits in 32 bits
     _MOV_ri32 = insn(rex_w, '\xC7', register(1), '\xC0', immediate(2, 'i'))

Modified: pypy/branch/x86-64-jit-backend/pypy/jit/backend/x86/test/test_rx86.py
==============================================================================
--- pypy/branch/x86-64-jit-backend/pypy/jit/backend/x86/test/test_rx86.py	(original)
+++ pypy/branch/x86-64-jit-backend/pypy/jit/backend/x86/test/test_rx86.py	Fri May 21 21:25:54 2010
@@ -142,6 +142,10 @@
     s.IMUL_rri(ebx, ecx, 0x01234567)
     assert s.getvalue() == '\x69\xD9\x67\x45\x23\x01'
 
+    s = CodeBuilder32()
+    s.IMUL_rri(ebx, ecx, 0x2A)
+    assert s.getvalue() == '\x6B\xD9\x2A'
+
 class CodeBuilder64(CodeBuilderMixin, X86_64_CodeBuilder):
     pass
 



More information about the Pypy-commit mailing list