[pypy-commit] pypy stmgc-c7: Adapt the auto-encoding tests to generate %fs and %gs as well

arigo noreply at buildbot.pypy.org
Sun Mar 23 14:33:52 CET 2014


Author: Armin Rigo <arigo at tunes.org>
Branch: stmgc-c7
Changeset: r70197:3ffbce87ab7b
Date: 2014-03-23 14:33 +0100
http://bitbucket.org/pypy/pypy/changeset/3ffbce87ab7b/

Log:	Adapt the auto-encoding tests to generate %fs and %gs as well

diff --git a/rpython/jit/backend/x86/test/test_rx86.py b/rpython/jit/backend/x86/test/test_rx86.py
--- a/rpython/jit/backend/x86/test/test_rx86.py
+++ b/rpython/jit/backend/x86/test/test_rx86.py
@@ -254,3 +254,10 @@
     s = CodeBuilder64()
     s.MOVSD_xj(xmm2, (SEGMENT_NO, 0x01234567))
     assert s.getvalue() == '\xF2\x0F\x10\x14\x25\x67\x45\x23\x01'
+
+def test_mov8_jr():
+    py.test.skip("currently this is a rare case that generates an extra "
+                 "rex prefix \x40, which doesn't hurt")
+    s = CodeBuilder64()
+    s.MOV8_jr((SEGMENT_GS, 51), ebx | BYTE_REG_FLAG)
+    assert s.getvalue() == '\x65\x88\x1C\x25\x33\x00\x00\x00'
diff --git a/rpython/jit/backend/x86/test/test_rx86_32_auto_encoding.py b/rpython/jit/backend/x86/test/test_rx86_32_auto_encoding.py
--- a/rpython/jit/backend/x86/test/test_rx86_32_auto_encoding.py
+++ b/rpython/jit/backend/x86/test/test_rx86_32_auto_encoding.py
@@ -22,7 +22,10 @@
     def writechar(self, char):
         if char != self.expected[self.index:self.index+1]:
             if (char == self.accept_unnecessary_prefix
-                and self.index == self.instrindex):
+                and (self.index == self.instrindex or
+                     (self.index == self.instrindex+1 and
+                      self.expected[self.instrindex] in (rx86.SEGMENT_FS,
+                                                         rx86.SEGMENT_GS)))):
                 return    # ignore the extra character '\x40'
             print self.op
             print "\x09from rx86.py:", hexdump(self.expected[self.instrindex:self.index] + char)+"..."
@@ -63,6 +66,14 @@
                    rx86.R.esi, rx86.R.edi]
     accept_unnecessary_prefix = None
     methname = '?'
+    prevseg = rx86.SEGMENT_NO
+    SEGMAP = {rx86.SEGMENT_NO: rx86.SEGMENT_FS,
+              rx86.SEGMENT_FS: rx86.SEGMENT_GS,
+              rx86.SEGMENT_GS: rx86.SEGMENT_NO}
+
+    def getseg(self):
+        self.prevseg = seg = self.SEGMAP[self.prevseg]
+        return seg
 
     def reg_tests(self):
         return self.REGS
@@ -73,28 +84,31 @@
     def xmm_reg_tests(self):
         return self.reg_tests()
 
-    def stack_bp_tests(self, count=COUNT1):
+    def _all_numbers(self, count):
         return ([0, 4, -4, 124, 128, -128, -132] +
                 [random.randrange(-0x20000000, 0x20000000) * 4
                  for i in range(count)])
 
-    def stack_sp_tests(self, count=COUNT1):
+    def stack_bp_tests(self):
+        return [(self.getseg(), x) for x in self._all_numbers(COUNT1)]
+
+    def stack_sp_tests(self):
         return ([0, 4, 124, 128] +
                 [random.randrange(0, 0x20000000) * 4
-                 for i in range(count)])
+                 for i in range(COUNT1)])
 
     def memory_tests(self):
-        return [(reg, ofs)
+        return [(self.getseg(), reg, ofs)
                     for reg in self.NONSPECREGS
-                    for ofs in self.stack_bp_tests(5)
+                    for ofs in self._all_numbers(5)
                 ]
 
     def array_tests(self):
-        return [(reg1, reg2, scaleshift, ofs)
+        return [(self.getseg(), reg1, reg2, scaleshift, ofs)
                     for reg1 in self.NONSPECREGS
                     for reg2 in self.NONSPECREGS
                     for scaleshift in [0, 1, 2, 3]
-                    for ofs in self.stack_bp_tests(1)
+                    for ofs in self._all_numbers(1)
                 ]
 
     def imm8_tests(self):
@@ -109,6 +123,9 @@
              [random.randrange(128, 256) for i in range(COUNT1)])
         return self.imm8_tests() + v
 
+    def addr_tests(self):
+        return [(self.getseg(), x) for x in self.imm32_tests()]
+
     def relative_tests(self):
         py.test.skip("explicit test required for %r" % (self.methname,))
 
@@ -123,10 +140,15 @@
             'a': self.array_tests,
             'i': self.imm32_tests,
             'i8': self.imm8_tests,
-            'j': self.imm32_tests,
+            'j': self.addr_tests,
             'l': self.relative_tests,
             }
 
+    def assembler_segment(self, segment):
+        return {rx86.SEGMENT_NO: '',
+                rx86.SEGMENT_FS: '%fs:',
+                rx86.SEGMENT_GS: '%gs:'}[segment]
+
     def assembler_operand_reg(self, regnum):
         return self.REGNAMES[regnum]
 
@@ -137,26 +159,30 @@
     def assembler_operand_xmm_reg(self, regnum):
         return self.XMMREGNAMES[regnum]
 
-    def assembler_operand_stack_bp(self, position):
-        return '%d(%s)' % (position, self.REGNAMES[5])
+    def assembler_operand_stack_bp(self, (seg, position)):
+        return '%s%d(%s)' % (self.assembler_segment(seg),
+                             position, self.REGNAMES[5])
 
     def assembler_operand_stack_sp(self, position):
         return '%d(%s)' % (position, self.REGNAMES[4])
 
-    def assembler_operand_memory(self, (reg1, offset)):
+    def assembler_operand_memory(self, (seg, reg1, offset)):
         if not offset: offset = ''
-        return '%s(%s)' % (offset, self.REGNAMES[reg1])
+        return '%s%s(%s)' % (self.assembler_segment(seg),
+                             offset, self.REGNAMES[reg1])
 
-    def assembler_operand_array(self, (reg1, reg2, scaleshift, offset)):
+    def assembler_operand_array(self, (seg, reg1, reg2, scaleshift, offset)):
+        assert isinstance(offset, int)
         if not offset: offset = ''
-        return '%s(%s,%s,%d)' % (offset, self.REGNAMES[reg1],
-                                 self.REGNAMES[reg2], 1<<scaleshift)
+        return '%s%s(%s,%s,%d)' % (self.assembler_segment(seg),
+                                   offset, self.REGNAMES[reg1],
+                                   self.REGNAMES[reg2], 1<<scaleshift)
 
     def assembler_operand_imm(self, value):
         return '$%d' % value
 
-    def assembler_operand_imm_addr(self, value):
-        return '%d' % value
+    def assembler_operand_imm_addr(self, (seg, value)):
+        return '%s%d' % (self.assembler_segment(seg), value)
 
     def get_all_assembler_operands(self):
         return {
@@ -362,7 +388,11 @@
         self.methname = methname
         self.is_xmm_insn = getattr(getattr(self.X86_CodeBuilder,
                                            methname), 'is_xmm_insn', False)
+        if methname.startswith('LEA'):
+            self.getseg = lambda: rx86.SEGMENT_NO
         ilist = self.make_all_tests(methname, argmodes)
+        if methname.startswith('LEA'):
+            del self.getseg
         oplist, as_code = self.run_test(methname, instrname, argmodes, ilist,
                                         instr_suffix)
         cls = self.get_code_checker_class()


More information about the pypy-commit mailing list