Author: Armin Rigo <[email protected]>
Branch:
Changeset: r45176:76b06820d08b
Date: 2011-06-29 11:47 +0200
http://bitbucket.org/pypy/pypy/changeset/76b06820d08b/
Log: Test and fix on 64-bit.
diff --git a/pypy/jit/backend/x86/assembler.py
b/pypy/jit/backend/x86/assembler.py
--- a/pypy/jit/backend/x86/assembler.py
+++ b/pypy/jit/backend/x86/assembler.py
@@ -895,7 +895,7 @@
def regalloc_push(self, loc):
if isinstance(loc, RegLoc) and loc.is_xmm:
- self.mc.SUB_ri(esp.value, 2*WORD)
+ self.mc.SUB_ri(esp.value, 8) # = size of doubles
self.mc.MOVSD_sx(0, loc.value)
elif WORD == 4 and isinstance(loc, StackLoc) and loc.width == 8:
# XXX evil trick
@@ -907,7 +907,7 @@
def regalloc_pop(self, loc):
if isinstance(loc, RegLoc) and loc.is_xmm:
self.mc.MOVSD_xs(loc.value, 0)
- self.mc.ADD_ri(esp.value, 2*WORD)
+ self.mc.ADD_ri(esp.value, 8) # = size of doubles
elif WORD == 4 and isinstance(loc, StackLoc) and loc.width == 8:
# XXX evil trick
self.mc.POP_b(get_ebp_ofs(loc.position + 1))
diff --git a/pypy/jit/backend/x86/test/test_assembler.py
b/pypy/jit/backend/x86/test/test_assembler.py
--- a/pypy/jit/backend/x86/test/test_assembler.py
+++ b/pypy/jit/backend/x86/test/test_assembler.py
@@ -1,13 +1,15 @@
from pypy.jit.backend.x86.regloc import *
from pypy.jit.backend.x86.assembler import Assembler386
from pypy.jit.backend.x86.regalloc import X86FrameManager, get_ebp_ofs
-from pypy.jit.metainterp.history import BoxInt, BoxPtr, BoxFloat, INT, REF,
FLOAT
+from pypy.jit.metainterp.history import BoxInt, BoxPtr, BoxFloat, ConstFloat
+from pypy.jit.metainterp.history import INT, REF, FLOAT
from pypy.rlib.rarithmetic import intmask
from pypy.rpython.lltypesystem import lltype, llmemory, rffi
from pypy.jit.backend.x86.arch import WORD, IS_X86_32, IS_X86_64
from pypy.jit.backend.detect_cpu import getcpuclass
from pypy.jit.backend.x86.regalloc import X86RegisterManager,
X86_64_RegisterManager, X86XMMRegisterManager, X86_64_XMMRegisterManager
from pypy.jit.codewriter import longlong
+import ctypes
ACTUAL_CPU = getcpuclass()
@@ -238,3 +240,103 @@
assert assembler.fail_boxes_int.getitem(i) == expected_ints[i]
assert assembler.fail_boxes_ptr.getitem(i) == expected_ptrs[i]
assert assembler.fail_boxes_float.getitem(i) == expected_floats[i]
+
+# ____________________________________________________________
+
+class TestRegallocPushPop(object):
+
+ def do_test(self, callback):
+ from pypy.jit.backend.x86.regalloc import X86FrameManager
+ from pypy.jit.backend.x86.regalloc import X86XMMRegisterManager
+ class FakeToken:
+ class compiled_loop_token:
+ asmmemmgr_blocks = None
+ cpu = ACTUAL_CPU(None, None)
+ cpu.setup()
+ looptoken = FakeToken()
+ asm = cpu.assembler
+ asm.setup_once()
+ asm.setup(looptoken)
+ self.fm = X86FrameManager()
+ self.xrm = X86XMMRegisterManager(None, frame_manager=self.fm,
+ assembler=asm)
+ callback(asm)
+ asm.mc.RET()
+ rawstart = asm.materialize_loop(looptoken)
+ #
+ F = ctypes.CFUNCTYPE(ctypes.c_long)
+ fn = ctypes.cast(rawstart, F)
+ res = fn()
+ return res
+
+ def test_simple(self):
+ def callback(asm):
+ asm.mov(imm(42), edx)
+ asm.regalloc_push(edx)
+ asm.regalloc_pop(eax)
+ res = self.do_test(callback)
+ assert res == 42
+
+ def test_push_stack(self):
+ def callback(asm):
+ loc = self.fm.frame_pos(5, INT)
+ asm.mc.SUB_ri(esp.value, 64)
+ asm.mov(imm(42), loc)
+ asm.regalloc_push(loc)
+ asm.regalloc_pop(eax)
+ asm.mc.ADD_ri(esp.value, 64)
+ res = self.do_test(callback)
+ assert res == 42
+
+ def test_pop_stack(self):
+ def callback(asm):
+ loc = self.fm.frame_pos(5, INT)
+ asm.mc.SUB_ri(esp.value, 64)
+ asm.mov(imm(42), edx)
+ asm.regalloc_push(edx)
+ asm.regalloc_pop(loc)
+ asm.mov(loc, eax)
+ asm.mc.ADD_ri(esp.value, 64)
+ res = self.do_test(callback)
+ assert res == 42
+
+ def test_simple_xmm(self):
+ def callback(asm):
+ c = ConstFloat(longlong.getfloatstorage(-42.5))
+ loc = self.xrm.convert_to_imm(c)
+ asm.mov(loc, xmm5)
+ asm.regalloc_push(xmm5)
+ asm.regalloc_pop(xmm0)
+ asm.mc.CVTTSD2SI(eax, xmm0)
+ res = self.do_test(callback)
+ assert res == -42
+
+ def test_push_stack_xmm(self):
+ def callback(asm):
+ c = ConstFloat(longlong.getfloatstorage(-42.5))
+ loc = self.xrm.convert_to_imm(c)
+ loc2 = self.fm.frame_pos(4, FLOAT)
+ asm.mc.SUB_ri(esp.value, 64)
+ asm.mov(loc, xmm5)
+ asm.mov(xmm5, loc2)
+ asm.regalloc_push(loc2)
+ asm.regalloc_pop(xmm0)
+ asm.mc.ADD_ri(esp.value, 64)
+ asm.mc.CVTTSD2SI(eax, xmm0)
+ res = self.do_test(callback)
+ assert res == -42
+
+ def test_pop_stack_xmm(self):
+ def callback(asm):
+ c = ConstFloat(longlong.getfloatstorage(-42.5))
+ loc = self.xrm.convert_to_imm(c)
+ loc2 = self.fm.frame_pos(4, FLOAT)
+ asm.mc.SUB_ri(esp.value, 64)
+ asm.mov(loc, xmm5)
+ asm.regalloc_push(xmm5)
+ asm.regalloc_pop(loc2)
+ asm.mov(loc2, xmm0)
+ asm.mc.ADD_ri(esp.value, 64)
+ asm.mc.CVTTSD2SI(eax, xmm0)
+ res = self.do_test(callback)
+ assert res == -42
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit