[pypy-commit] pypy ppc-vsx-support: added three more tests to ensure enforce_var_in_vector_reg works (found one issue)

plan_rich pypy.commits at gmail.com
Mon Aug 1 15:23:32 EDT 2016


Author: Richard Plangger <planrichi at gmail.com>
Branch: ppc-vsx-support
Changeset: r85971:a88c5ddefcb0
Date: 2016-08-01 21:22 +0200
http://bitbucket.org/pypy/pypy/changeset/a88c5ddefcb0/

Log:	added three more tests to ensure enforce_var_in_vector_reg works
	(found one issue)

diff --git a/rpython/jit/backend/x86/test/test_x86vector.py b/rpython/jit/backend/x86/test/test_x86vector.py
--- a/rpython/jit/backend/x86/test/test_x86vector.py
+++ b/rpython/jit/backend/x86/test/test_x86vector.py
@@ -1,10 +1,14 @@
 import py
 from rpython.jit.backend.x86.regloc import *
+from rpython.jit.backend.x86.regalloc import (RegAlloc,
+        X86FrameManager, X86XMMRegisterManager, X86RegisterManager)
+from rpython.jit.backend.x86.vector_ext import TempVector
 from rpython.jit.backend.x86.test import test_basic
 from rpython.jit.backend.x86.test.test_assembler import \
         (TestRegallocPushPop as BaseTestAssembler)
 from rpython.jit.metainterp.test import test_vector
 from rpython.rtyper.lltypesystem import lltype
+from rpython.jit.backend.detect_cpu import getcpuclass
 
 class TestBasic(test_basic.Jit386Mixin, test_vector.VectorizeTests):
     # for the individual tests see
@@ -26,6 +30,30 @@
 
     enable_opts = 'intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll'
 
+ at py.test.fixture
+def regalloc(request):
+    from rpython.jit.backend.x86.regalloc import X86FrameManager
+    from rpython.jit.backend.x86.regalloc import X86XMMRegisterManager
+    class FakeToken:
+        class compiled_loop_token:
+            asmmemmgr_blocks = None
+    cpu = getcpuclass()(None, None)
+    cpu.setup()
+    if cpu.HAS_CODEMAP:
+        cpu.codemap.setup()
+    looptoken = FakeToken()
+    asm = cpu.assembler
+    asm.setup_once()
+    asm.setup(looptoken)
+    regalloc = RegAlloc(asm)
+    regalloc.fm = fm = X86FrameManager(cpu.get_baseofs_of_frame_field())
+    regalloc.rm = X86RegisterManager({}, frame_manager = fm, assembler = asm)
+    regalloc.xrm = X86XMMRegisterManager({}, frame_manager = fm, assembler = asm)
+    request.cls.asm = asm
+    request.cls.regalloc = regalloc
+
+
+
 class TestAssembler(BaseTestAssembler):
 
     def imm_4_int32(self, a, b, c, d):
@@ -88,3 +116,48 @@
         res = self.do_test(callback) & 0xffffffff
         assert res == 22
 
+    def test_enforce_var(self, regalloc):
+        arg = TempVector('f')
+        args = []
+        self.regalloc.fm.bindings[arg] = FrameLoc(0, 64, 'f')
+        reg = self.regalloc.enforce_var_in_vector_reg(arg, args, xmm0)
+        assert reg is xmm0
+
+    def test_enforce_var_xmm0_forbidden(self, regalloc):
+        arg = TempVector('f')
+        arg1 = TempVector('f')
+        args = [arg1]
+        xrm = self.regalloc.xrm
+        xrm.reg_bindings[arg1] = xmm0
+        fr = xrm.free_regs
+        xrm.free_regs = [r for r in fr if r is not xmm0]
+        self.regalloc.fm.bindings[arg] = FrameLoc(0, 64, 'f')
+        reg = self.regalloc.enforce_var_in_vector_reg(arg, args, xmm0)
+        assert reg is xmm0
+        assert len(xrm.reg_bindings) == 2
+        assert xrm.reg_bindings[arg] == xmm0
+        assert xrm.reg_bindings[arg1] != xmm0
+
+    def test_enforce_var_spill(self, regalloc):
+        arg = TempVector('f')
+        arg1 = TempVector('f')
+        arg2 = TempVector('f')
+        args = []
+        xrm = self.regalloc.xrm
+        xrm.reg_bindings[arg1] = xmm0
+        xrm.reg_bindings[arg2] = xmm1
+        xrm.longevity[arg1] = (0,1)
+        xrm.longevity[arg2] = (0,2)
+        xrm.longevity[arg] = (0,3)
+        fr = xrm.free_regs
+        xrm.free_regs = []
+        self.regalloc.fm.bindings[arg] = FrameLoc(0, 64, 'f')
+        self.regalloc.fm.bindings[arg2] = FrameLoc(0, 72, 'f')
+        reg = self.regalloc.enforce_var_in_vector_reg(arg, args, xmm0)
+        assert reg is xmm0
+        assert len(xrm.reg_bindings) == 2
+        assert xrm.reg_bindings[arg] == xmm0
+        assert xrm.reg_bindings[arg1] == xmm1
+        assert arg2 not in xrm.reg_bindings
+
+
diff --git a/rpython/jit/backend/x86/vector_ext.py b/rpython/jit/backend/x86/vector_ext.py
--- a/rpython/jit/backend/x86/vector_ext.py
+++ b/rpython/jit/backend/x86/vector_ext.py
@@ -10,7 +10,7 @@
     xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14,
     X86_64_SCRATCH_REG, X86_64_XMM_SCRATCH_REG, AddressLoc)
 from rpython.jit.backend.llsupport.vector_ext import VectorExt
-from rpython.jit.backend.llsupport.regalloc import get_scale, TempVar
+from rpython.jit.backend.llsupport.regalloc import get_scale, TempVar, NoVariableToSpill
 from rpython.jit.metainterp.resoperation import (rop, ResOperation,
         VectorOp, VectorGuardOp)
 from rpython.rlib.objectmodel import we_are_translated, always_inline
@@ -317,7 +317,7 @@
         # register, and we emit a load from the cc into this register.
 
         if resloc is ebp:
-            self.assembler.guard_success_cc = condition
+            self.guard_success_cc = rev_cond
         else:
             assert lhsloc is xmm0
             maskloc = X86_64_XMM_SCRATCH_REG
@@ -654,7 +654,11 @@
             # do we have a free register?
             if len(xrm.free_regs) == 0:
                 # spill a non forbidden variable
-                self._spill_var(candidate_to_spill, forbidden_vars, None)
+                if not candidate_to_spill:
+                    raise NoVariableToSpill
+                reg = xrm.reg_bindings[candidate_to_spill]
+                xrm._spill_var(candidate_to_spill, forbidden_vars, None)
+                xrm.free_regs.append(reg)
             loc = xrm.free_regs.pop()
             self.assembler.mov(selected_reg, loc)
             reg = xrm.reg_bindings.get(arg, None)


More information about the pypy-commit mailing list