[pypy-svn] r72403 - in pypy/trunk/pypy/jit/backend/x86: . test

fijal at codespeak.net fijal at codespeak.net
Fri Mar 19 04:38:14 CET 2010


Author: fijal
Date: Fri Mar 19 04:38:13 2010
New Revision: 72403

Modified:
   pypy/trunk/pypy/jit/backend/x86/ri386.py
   pypy/trunk/pypy/jit/backend/x86/ri386setup.py
   pypy/trunk/pypy/jit/backend/x86/test/test_ri386_auto_encoding.py
Log:
Add rel8 to JMP and Jxx. Apparently tests are happy, although I'm not 100%
sure if I did the right thing


Modified: pypy/trunk/pypy/jit/backend/x86/ri386.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/x86/ri386.py	(original)
+++ pypy/trunk/pypy/jit/backend/x86/ri386.py	Fri Mar 19 04:38:13 2010
@@ -207,12 +207,19 @@
 class MODRM8(MODRM):
     width = 1
 
-class REL32(OPERAND):
-    width = 4
+class REL(OPERAND):
     def __init__(self, absolute_target):
         self.absolute_target = absolute_target
     def assembler(self):
-        return '%d' % (self.absolute_target,)
+        return '%d' % (self.absolute_target,)    
+
+class REL32(REL):
+    width = 4
+
+class REL8(REL):
+    def assembler(self):
+        return '.+%d' % (self.absolute_target,)
+    width = 1
 
 class MISSING(OPERAND):
     def __repr__(self):
@@ -274,6 +281,7 @@
 imm8 = IMM8
 imm16 = IMM16
 rel32 = REL32
+rel8 = REL8
 
 def imm(value):
     if isinstance(value, ComputedIntSymbolic):

Modified: pypy/trunk/pypy/jit/backend/x86/ri386setup.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/x86/ri386setup.py	(original)
+++ pypy/trunk/pypy/jit/backend/x86/ri386setup.py	Fri Mar 19 04:38:13 2010
@@ -44,6 +44,7 @@
     IMM8:  [(IMM8,  None), (IMM32, None)],
 
     REL32: [(REL32, None)],
+    REL8: [(REL8, None)],
 
     MODRM:   [(MODRM,  None)],
     MODRM8:  [(MODRM8, None)],
@@ -103,16 +104,23 @@
         elif self.width == 'h':
             lines.append('builder.write(packimm16(arg%d.value))' % (self.op,))
         else:
-            raise AssertionError, "invalid width %r" % (self.width,)
+            raise ValueError("invalid width %r" % (self.width,))
         return False
 
 class relative(operand):
     def eval(self, lines, has_orbyte):
         assert not has_orbyte, "malformed bytecode"
-        assert self.width == 'i', "only REL32 supported at the moment"
-        lines.append('offset = arg%d.absolute_target - (builder.tell()+4)' % (
-            self.op,))
-        lines.append('builder.write(packimm32(offset))')
+        if self.width == 'i':
+            lines.append('offset = arg%d.absolute_target - (builder.tell()+4)'
+                         % (self.op,))
+            lines.append('builder.write(packimm32(offset))')
+        elif self.width == 'b':
+            lines.append('offset = arg%d.absolute_target - (builder.tell()+2)'
+                         % (self.op,))
+            lines.append('assert offset < 127')
+            lines.append('builder.write(packimm8(offset))')
+        else:
+            raise ValueError("Invalid width %s" % (self.width,))
         return False
 
 ##class conditioncode(operand):
@@ -329,7 +337,7 @@
 CALL.indirect = 1
 
 JMP = Instruction()
-#JMP.mode1(REL8,  ['\xEB', immediate(1,'b')])
+JMP.mode1(REL8,  ['\xEB', relative(1,'b')])
 JMP.mode1(REL32, ['\xE9', relative(1)])
 JMP.mode1(MODRM, ['\xFF', orbyte(4<<3), modrm(1)])
 JMP.indirect = 1
@@ -589,7 +597,7 @@
         instr._mode(modes, code1)
         instr.indirect = indirect
 
-#define_cond('J',   1, (REL8,),   [None,'\x70', immediate(1,'b')])
+define_cond('J',   1, (REL8,),   [None,'\x70', relative(1,'b')])
 define_cond('J',   1, (REL32,),  ['\x0F', None,'\x80', relative(1)])
 define_cond('SET', 0, (MODRM8,), ['\x0F', None,'\x90',orbyte(0<<3),modrm(1,'b')])
 define_cond('CMOV',0,(REG,MODRM),['\x0F', None,'\x40', register(1,8), modrm(2)])

Modified: pypy/trunk/pypy/jit/backend/x86/test/test_ri386_auto_encoding.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/x86/test/test_ri386_auto_encoding.py	(original)
+++ pypy/trunk/pypy/jit/backend/x86/test/test_ri386_auto_encoding.py	Fri Mar 19 04:38:13 2010
@@ -40,7 +40,7 @@
     i386.MODRM8: 1,
     i386.IMM8: 1,
     i386.IMM16: 2,
-    #i386.REL8: 1,
+    i386.REL8: 1,
     i386.REL32: 4,
 }
 
@@ -56,6 +56,10 @@
     v = [-128,-1,0,1,127] + [random.randrange(-127, 127) for i in range(COUNT1)]
     return map(i386.imm8, v)
 
+def rel8_tests():
+    v = [-1,0,1] + [random.randrange(-123, 123) for i in range(COUNT1)]
+    return map(i386.rel8, v)    
+
 def imm16_tests():
     v = [-32768,32767] + [random.randrange(-32767, -128) for i in range(COUNT1)] \
            + [random.randrange(128, 32767) for i in range(COUNT1)]
@@ -125,7 +129,7 @@
     i386.MODRM8: modrm8_tests,
     i386.IMM8: imm8_tests,
     i386.IMM16: imm16_tests,
-    #i386.REL8: imm8_tests,
+    i386.REL8: rel8_tests,
     i386.REL32: lambda: [], # XXX imm32_tests,
     }
 
@@ -148,7 +152,7 @@
         following = ""
         if instr.indirect:
             suffix = ""
-            if args[-1][0] == i386.REL32: #in (i386.REL8,i386.REL32):
+            if args[-1][0] in (i386.REL8,i386.REL32):
                 labelcount += 1
                 following = "\nL%d:" % labelcount
             elif args[-1][0] in (i386.IMM8,i386.IMM32):
@@ -160,7 +164,7 @@
         else:
             k = len(args)
         for m, extra in args[:k]:
-            assert m != i386.REL32  #not in (i386.REL8,i386.REL32)
+            assert m not in (i386.REL8,i386.REL32)
         ops = [extra.assembler() for m, extra in args]
         ops.reverse()
         op = '\x09%s%s %s%s' % (instrname, suffix, string.join(ops, ", "),
@@ -256,6 +260,9 @@
         self.op = op
         self.instrindex = self.index
 
+    def tell(self):
+        return 0
+
     def write(self, listofchars):
         data = ''.join(listofchars)
         end = self.index+len(data)



More information about the Pypy-commit mailing list