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