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

jcreigh at codespeak.net jcreigh at codespeak.net
Fri Aug 27 18:08:35 CEST 2010


Author: jcreigh
Date: Fri Aug 27 18:08:32 2010
New Revision: 76750

Modified:
   pypy/trunk/pypy/jit/backend/test/runner_test.py
   pypy/trunk/pypy/jit/backend/x86/assembler.py
   pypy/trunk/pypy/jit/backend/x86/test/test_runner.py
Log:
64-bit JIT: support 32-bit wide types in (get|set)(field|arrayitem)

Modified: pypy/trunk/pypy/jit/backend/test/runner_test.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/test/runner_test.py	(original)
+++ pypy/trunk/pypy/jit/backend/test/runner_test.py	Fri Aug 27 18:08:32 2010
@@ -785,6 +785,20 @@
                                        'float', descr=arraydescr)
             assert r.value == 4.5
 
+        # For platforms where sizeof(INT) != sizeof(Signed) (ie, x86-64)
+        a_box, A = self.alloc_array_of(rffi.INT, 342)
+        arraydescr = self.cpu.arraydescrof(A)
+        assert not arraydescr.is_array_of_pointers()
+        r = self.execute_operation(rop.ARRAYLEN_GC, [a_box],
+                                   'int', descr=arraydescr)
+        assert r.value == 342
+        r = self.execute_operation(rop.SETARRAYITEM_GC, [a_box, BoxInt(310),
+                                                         BoxInt(7441)],
+                                   'void', descr=arraydescr)
+        assert r is None
+        r = self.execute_operation(rop.GETARRAYITEM_GC, [a_box, BoxInt(310)],
+                                   'int', descr=arraydescr)
+        assert r.value == 7441
 
     def test_string_basic(self):
         s_box = self.alloc_string("hello\xfe")

Modified: pypy/trunk/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/x86/assembler.py	(original)
+++ pypy/trunk/pypy/jit/backend/x86/assembler.py	Fri Aug 27 18:08:32 2010
@@ -1046,7 +1046,10 @@
             self.mc.MOVZX8(resloc, source_addr)
         elif size == 2:
             self.mc.MOVZX16(resloc, source_addr)
-        elif size == WORD:
+        elif size == 4:
+            # MOV32 is zero-extending on 64-bit, so this is okay
+            self.mc.MOV32(resloc, source_addr)
+        elif IS_X86_64 and size == 8:
             self.mc.MOV(resloc, source_addr)
         else:
             raise NotImplementedError("getfield size = %d" % size)
@@ -1059,19 +1062,18 @@
         base_loc, ofs_loc, scale, ofs = arglocs
         assert isinstance(ofs, ImmedLoc)
         assert isinstance(scale, ImmedLoc)
+        src_addr = addr_add(base_loc, ofs_loc, ofs.value, scale.value)
         if op.result.type == FLOAT:
-            self.mc.MOVSD(resloc, addr_add(base_loc, ofs_loc, ofs.value,
-                                             scale.value))
+            self.mc.MOVSD(resloc, src_addr)
         else:
             if scale.value == 0:
-                self.mc.MOVZX8(resloc, addr_add(base_loc, ofs_loc, ofs.value,
-                                                scale.value))
+                self.mc.MOVZX8(resloc, src_addr)
             elif scale.value == 1:
-                self.mc.MOVZX16(resloc, addr_add(base_loc, ofs_loc, ofs.value,
-                                                scale.value))
-            elif (1 << scale.value) == WORD:
-                self.mc.MOV(resloc, addr_add(base_loc, ofs_loc, ofs.value,
-                                             scale.value))
+                self.mc.MOVZX16(resloc, src_addr)
+            elif scale.value == 2:
+                self.mc.MOV32(resloc, src_addr)
+            elif IS_X86_64 and scale.value == 3:
+                self.mc.MOV(resloc, src_addr)
             else:
                 print "[asmgen]getarrayitem unsupported size: %d" % scale.value
                 raise NotImplementedError()
@@ -1086,8 +1088,10 @@
         dest_addr = AddressLoc(base_loc, ofs_loc)
         if isinstance(value_loc, RegLoc) and value_loc.is_xmm:
             self.mc.MOVSD(dest_addr, value_loc)
-        elif size == WORD:
+        elif IS_X86_64 and size == 8:
             self.mc.MOV(dest_addr, value_loc)
+        elif size == 4:
+            self.mc.MOV32(dest_addr, value_loc)
         elif size == 2:
             self.mc.MOV16(dest_addr, value_loc)
         elif size == 1:
@@ -1104,8 +1108,10 @@
         if op.args[2].type == FLOAT:
             self.mc.MOVSD(dest_addr, value_loc)
         else:
-            if (1 << scale_loc.value) == WORD:
+            if IS_X86_64 and scale_loc.value == 3:
                 self.mc.MOV(dest_addr, value_loc)
+            elif scale_loc.value == 2:
+                self.mc.MOV32(dest_addr, value_loc)
             elif scale_loc.value == 1:
                 self.mc.MOV16(dest_addr, value_loc)
             elif scale_loc.value == 0:

Modified: pypy/trunk/pypy/jit/backend/x86/test/test_runner.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/x86/test/test_runner.py	(original)
+++ pypy/trunk/pypy/jit/backend/x86/test/test_runner.py	Fri Aug 27 18:08:32 2010
@@ -193,6 +193,7 @@
 
     def test_getfield_setfield(self):
         TP = lltype.GcStruct('x', ('s', lltype.Signed),
+                             ('i', rffi.INT),
                              ('f', lltype.Float),
                              ('u', rffi.USHORT),
                              ('c1', lltype.Char),
@@ -201,6 +202,7 @@
         res = self.execute_operation(rop.NEW, [],
                                      'ref', self.cpu.sizeof(TP))
         ofs_s = self.cpu.fielddescrof(TP, 's')
+        ofs_i = self.cpu.fielddescrof(TP, 'i')
         #ofs_f = self.cpu.fielddescrof(TP, 'f')
         ofs_u = self.cpu.fielddescrof(TP, 'u')
         ofsc1 = self.cpu.fielddescrof(TP, 'c1')
@@ -218,6 +220,11 @@
                                ofs_s)
         s = self.execute_operation(rop.GETFIELD_GC, [res], 'int', ofs_s)
         assert s.value == 3
+
+        self.execute_operation(rop.SETFIELD_GC, [res, BoxInt(1234)], 'void', ofs_i)
+        i = self.execute_operation(rop.GETFIELD_GC, [res], 'int', ofs_i)
+        assert i.value == 1234
+        
         #u = self.execute_operation(rop.GETFIELD_GC, [res, ofs_u], 'int')
         #assert u.value == 5
         self.execute_operation(rop.SETFIELD_GC, [res, ConstInt(1)], 'void',



More information about the Pypy-commit mailing list