[pypy-commit] pypy ppc-vsx-support: update the llgraph runner to exec vec_load/store
plan_rich
pypy.commits at gmail.com
Mon Sep 12 08:28:25 EDT 2016
Author: Richard Plangger <planrichi at gmail.com>
Branch: ppc-vsx-support
Changeset: r87037:7ee75be77c56
Date: 2016-09-12 14:17 +0200
http://bitbucket.org/pypy/pypy/changeset/7ee75be77c56/
Log: update the llgraph runner to exec vec_load/store
diff --git a/rpython/jit/backend/llgraph/runner.py b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -330,7 +330,9 @@
is_llgraph = True
vector_ext = VectorExt()
vector_ext.enable(16, accum=True)
+ vector_ext.setup_once = lambda asm: asm
load_supported_factors = (1,2,4,8)
+ assembler = None
def __init__(self, rtyper, stats=None, *ignored_args, **kwds):
model.AbstractCPU.__init__(self)
@@ -927,50 +929,32 @@
def bh_vec_int_signext(self, vx, ext, count):
return [heaptracker.int_signext(_vx, ext) for _vx in vx]
- def build_getarrayitem(func):
- def method(self, struct, offset, descr, _count):
+ def build_load(func):
+ def method(self, struct, offset, scale, disp, descr, _count):
values = []
count = self.vector_ext.vec_size() // descr.get_item_size_in_bytes()
assert _count == count
assert count > 0
+ adr = struct + (offset * scale + disp)
+ a = support.cast_arg(lltype.Ptr(descr.A), adr)
+ array = a._obj
for i in range(count):
- val = func(self, struct, offset + i, descr)
+ val = support.cast_result(descr.A.OF, array.getitem(i))
values.append(val)
return values
return method
- bh_vec_getarrayitem_gc_i = build_getarrayitem(bh_getarrayitem_gc)
- bh_vec_getarrayitem_gc_f = build_getarrayitem(bh_getarrayitem_gc)
- bh_vec_getarrayitem_raw_i = build_getarrayitem(bh_getarrayitem_raw)
- bh_vec_getarrayitem_raw_f = build_getarrayitem(bh_getarrayitem_raw)
- del build_getarrayitem
+ bh_vec_load_i = build_load(bh_getarrayitem_raw)
+ bh_vec_load_f = build_load(bh_getarrayitem_raw)
+ del build_load
- def _bh_vec_raw_load(self, struct, offset, descr, _count):
- values = []
+ def bh_vec_store(self, struct, offset, newvalues, scale, disp, descr, count):
stride = descr.get_item_size_in_bytes()
- count = self.vector_ext.vec_size() // descr.get_item_size_in_bytes()
- assert _count == count
- assert count > 0
- for i in range(count):
- val = self.bh_raw_load(struct, offset + i*stride, descr)
- values.append(val)
- return values
-
- bh_vec_raw_load_i = _bh_vec_raw_load
- bh_vec_raw_load_f = _bh_vec_raw_load
-
- def bh_vec_raw_store(self, struct, offset, newvalues, descr, count):
- stride = descr.get_item_size_in_bytes()
+ adr = struct + (offset * scale + disp)
+ a = support.cast_arg(lltype.Ptr(descr.A), adr)
+ array = a._obj
for i,n in enumerate(newvalues):
- self.bh_raw_store(struct, offset + i*stride, n, descr)
-
- def bh_vec_setarrayitem_raw(self, struct, offset, newvalues, descr, count):
- for i,n in enumerate(newvalues):
- self.bh_setarrayitem_raw(struct, offset + i, n, descr)
-
- def bh_vec_setarrayitem_gc(self, struct, offset, newvalues, descr, count):
- for i,n in enumerate(newvalues):
- self.bh_setarrayitem_gc(struct, offset + i, n, descr)
+ array.setitem(i, support.cast_arg(descr.A.OF, n))
def store_fail_descr(self, deadframe, descr):
pass # I *think*
diff --git a/rpython/jit/metainterp/test/support.py b/rpython/jit/metainterp/test/support.py
--- a/rpython/jit/metainterp/test/support.py
+++ b/rpython/jit/metainterp/test/support.py
@@ -9,6 +9,7 @@
from rpython.jit.metainterp import pyjitpl, history, jitexc
from rpython.jit.codewriter.policy import JitPolicy
from rpython.jit.codewriter import codewriter, longlong
+from rpython.jit.backend.llsupport.vector_ext import VectorExt
from rpython.rlib.rfloat import isnan
from rpython.rlib.jit import ENABLE_ALL_OPTS
from rpython.translator.backendopt.all import backend_optimizations
@@ -298,6 +299,9 @@
class LLJitMixin(JitMixin):
CPUClass = runner.LLGraphCPU
+ def supports_vector_ext(self):
+ return True
+
@staticmethod
def Ptr(T):
return lltype.Ptr(T)
More information about the pypy-commit
mailing list