[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