Author: Richard Plangger <[email protected]>
Branch: ppc-vsx-support
Changeset: r88018:7e4d2957681d
Date: 2016-11-01 10:59 +0100
http://bitbucket.org/pypy/pypy/changeset/7e4d2957681d/

Log:    accum reduce on integers should not extract both values into the
        same register

diff --git a/rpython/jit/backend/x86/assembler.py 
b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -1,16 +1,14 @@
 import sys
-import os
-import py
 
-from rpython.jit.backend.llsupport import symbolic, jitframe, rewrite
-from rpython.jit.backend.llsupport.assembler import (GuardToken, 
BaseAssembler, debug_bridge)
+from rpython.jit.backend.llsupport import jitframe, rewrite
+from rpython.jit.backend.llsupport.assembler import (GuardToken, BaseAssembler)
 from rpython.jit.backend.llsupport.asmmemmgr import MachineDataBlockWrapper
 from rpython.jit.backend.llsupport.gcmap import allocate_gcmap
-from rpython.jit.metainterp.history import (Const, VOID, ConstInt)
-from rpython.jit.metainterp.history import AbstractFailDescr, INT, REF, FLOAT
+from rpython.jit.metainterp.history import (AbstractFailDescr, INT, REF, FLOAT,
+        Const)
 from rpython.jit.metainterp.compile import ResumeGuardDescr
 from rpython.rlib.rjitlog import rjitlog as jl
-from rpython.rtyper.lltypesystem import lltype, rffi, rstr, llmemory
+from rpython.rtyper.lltypesystem import lltype, rffi
 from rpython.rtyper.lltypesystem.lloperation import llop
 from rpython.rtyper.annlowlevel import cast_instance_to_gcref
 from rpython.rtyper import rclass
diff --git a/rpython/jit/backend/x86/regloc.py 
b/rpython/jit/backend/x86/regloc.py
--- a/rpython/jit/backend/x86/regloc.py
+++ b/rpython/jit/backend/x86/regloc.py
@@ -589,6 +589,9 @@
             self._scratch_register_value = value
         self.MOV_ri(X86_64_SCRATCH_REG.value, value)
 
+    def trap(self):
+        self.INT3()
+
     def begin_reuse_scratch_register(self):
         # --NEVER CALLED (only from a specific test)--
         # Flag the beginning of a block where it is okay to reuse the value
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,8 @@
     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, 
NoVariableToSpill
+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
@@ -39,7 +40,13 @@
     def is_vector(self):
         return True
     def __repr__(self):
-        return "<TempVector At %s>" % (id(self),)
+        return "<TempVector at %s>" % (id(self),)
+
+class TempInt(TempVar):
+    def __init__(self):
+        self.type = INT
+    def __repr__(self):
+        return "<TempInt at %s>" % (id(self),)
 
 class X86VectorExt(VectorExt):
 
@@ -123,12 +130,14 @@
             assert isinstance(vector_loc, RegLoc)
             assert scalar_arg is not None
             orig_scalar_loc = scalar_loc
+            tmpvar = None
             if not isinstance(scalar_loc, RegLoc):
                 # scalar loc might live in memory, use scratch register and 
save it back later
                 if scalar_arg.type == FLOAT:
                     scalar_loc = X86_64_XMM_SCRATCH_REG
                 else:
-                    scalar_loc = X86_64_SCRATCH_REG
+                    tmpvar = TempInt()
+                    scalar_loc = regalloc.rm.try_allocate_reg(tmpvar)
                 self.mov(orig_scalar_loc, scalar_loc)
             if accum_info.accum_operation == '+':
                 self._accum_reduce_sum(scalar_arg, vector_loc, scalar_loc)
@@ -137,12 +146,13 @@
             else:
                 not_implemented("accum operator %s not implemented" %
                                             (accum_info.accum_operation)) 
+            if tmpvar:
+                regalloc.rm.possibly_free_var(tmpvar)
             if scalar_loc is not orig_scalar_loc:
                 self.mov(scalar_loc, orig_scalar_loc)
             accum_info = accum_info.next()
 
     def _accum_reduce_mul(self, arg, accumloc, targetloc):
-        scratchloc = X86_64_XMM_SCRATCH_REG
         self.mov(accumloc, targetloc)
         # swap the two elements
         self.mc.SHUFPD_xxi(targetloc.value, targetloc.value, 0x01)
diff --git a/rpython/jit/backend/zarch/vector_ext.py 
b/rpython/jit/backend/zarch/vector_ext.py
--- a/rpython/jit/backend/zarch/vector_ext.py
+++ b/rpython/jit/backend/zarch/vector_ext.py
@@ -172,7 +172,7 @@
             assert scalar_arg is not None
             op = accum_info.accum_operation
             self._accum_reduce(op, scalar_arg, vector_loc, scalar_loc)
-            if scalar_loc is r. FP_SCRATCH:
+            if scalar_loc is r.FP_SCRATCH:
                 self.regalloc_mov(scalar_loc, orig_scalar_loc)
             accum_info = accum_info.next()
 
diff --git a/rpython/jit/metainterp/test/test_vector.py 
b/rpython/jit/metainterp/test/test_vector.py
--- a/rpython/jit/metainterp/test/test_vector.py
+++ b/rpython/jit/metainterp/test/test_vector.py
@@ -400,9 +400,8 @@
                 i += size
             return accum
 
-        bits = 64
         la = data.draw(st.lists(strat, min_size=10, max_size=150))
-        la = [1.0] * 10
+        #la = [1.0] * 10
         l = len(la)
 
         accum = data.draw(strat)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to