[pypy-commit] pypy ppc-vsx-support: continue refactoring started in last commit
plan_rich
pypy.commits at gmail.com
Thu Jul 7 04:23:37 EDT 2016
Author: Richard Plangger <planrichi at gmail.com>
Branch: ppc-vsx-support
Changeset: r85595:b129dbdbe458
Date: 2016-07-07 10:22 +0200
http://bitbucket.org/pypy/pypy/changeset/b129dbdbe458/
Log: continue refactoring started in last commit
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
@@ -2,6 +2,7 @@
from rpython.jit.backend import model
from rpython.jit.backend.llgraph import support
from rpython.jit.backend.llsupport import symbolic
+from rpython.jit.backend.llsupport.vector_ext import VectorExt
from rpython.jit.metainterp.history import AbstractDescr
from rpython.jit.metainterp.history import Const, getkind
from rpython.jit.metainterp.history import INT, REF, FLOAT, VOID
@@ -931,7 +932,7 @@
def build_getarrayitem(func):
def method(self, struct, offset, descr, _count):
values = []
- count = self.vector_register_size // 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):
@@ -949,7 +950,7 @@
def _bh_vec_raw_load(self, struct, offset, descr, _count):
values = []
stride = descr.get_item_size_in_bytes()
- count = self.vector_register_size // 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):
diff --git a/rpython/jit/backend/x86/runner.py b/rpython/jit/backend/x86/runner.py
--- a/rpython/jit/backend/x86/runner.py
+++ b/rpython/jit/backend/x86/runner.py
@@ -63,6 +63,10 @@
if self.HAS_CODEMAP:
self.codemap.setup()
self.assembler.setup_once()
+ if self.vector_ext:
+ # TODO
+ pass
+ #self.vector_ext.
@rgc.no_release_gil
def finish_once(self):
@@ -149,8 +153,9 @@
HAS_CODEMAP = True
class CPU_X86_64_SSE4(CPU_X86_64):
- vector_extension = True
- vector_register_size = 16
- vector_horizontal_operations = True
+ vector_ext = X86VectorExt()
+ #vector_extension = True
+ #vector_register_size = 16
+ #vector_horizontal_operations = True
CPU = CPU386
diff --git a/rpython/jit/metainterp/optimizeopt/schedule.py b/rpython/jit/metainterp/optimizeopt/schedule.py
--- a/rpython/jit/metainterp/optimizeopt/schedule.py
+++ b/rpython/jit/metainterp/optimizeopt/schedule.py
@@ -473,7 +473,7 @@
def __init__(self, graph, packset, cpu, costmodel):
SchedulerState.__init__(self, cpu, graph)
self.box_to_vbox = {}
- self.vec_reg_size = cpu.vector_register_size
+ self.vec_reg_size = cpu.vector_ext.vec_size()
self.expanded_map = {}
self.costmodel = costmodel
self.inputargs = {}
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_costmodel.py b/rpython/jit/metainterp/optimizeopt/test/test_costmodel.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_costmodel.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_costmodel.py
@@ -13,11 +13,6 @@
from rpython.jit.metainterp.resoperation import rop, ResOperation, AbstractValue
from rpython.jit.tool.oparser import parse as opparse
from rpython.jit.tool.oparser_model import get_model
-from rpython.jit.backend.detect_cpu import getcpuclass
-
-CPU = getcpuclass()
-if not CPU.vector_extension:
- py.test.skip("this cpu %s has no implemented vector backend" % CPU)
class FakeMemoryRef(object):
def __init__(self, array, iv):
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_dependency.py b/rpython/jit/metainterp/optimizeopt/test/test_dependency.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_dependency.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_dependency.py
@@ -35,6 +35,8 @@
def setup_method(self, method):
self.test_name = method.__name__
+ if not self.cpu.vector_ext.is_enabled():
+ py.test.skip("cpu %s needs to implement the vector backend" % self.cpu)
def build_dependency(self, ops):
loop = self.parse_loop(ops)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_schedule.py b/rpython/jit/metainterp/optimizeopt/test/test_schedule.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_schedule.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_schedule.py
@@ -15,11 +15,6 @@
from rpython.jit.metainterp.resoperation import rop, ResOperation, VectorizationInfo
from rpython.jit.tool.oparser import parse as opparse
from rpython.jit.tool.oparser_model import get_model
-from rpython.jit.backend.detect_cpu import getcpuclass
-
-CPU = getcpuclass()
-if not CPU.vector_extension:
- py.test.skip("this cpu %s has no implemented vector backend" % CPU)
class FakeVecScheduleState(VecScheduleState):
def __init__(self):
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py b/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py
@@ -28,8 +28,6 @@
from rpython.jit.backend.detect_cpu import getcpuclass
CPU = getcpuclass()
-if not CPU.vector_extension:
- py.test.skip("this cpu %s has no implemented vector backend" % CPU)
class FakeJitDriverStaticData(object):
vec=True
@@ -111,7 +109,7 @@
def earlyexit(self, loop):
opt = self.vectoroptimizer(loop)
graph = opt.analyse_index_calculations(loop)
- state = SchedulerState(graph)
+ state = SchedulerState(self.cpu, graph)
opt.schedule(state)
return graph.loop
@@ -133,7 +131,7 @@
print "CYCLE found %s" % cycle
self.show_dot_graph(graph, "early_exit_" + self.test_name)
assert cycle is None
- state = SchedulerState(graph)
+ state = SchedulerState(self.cpu, graph)
opt.schedule(state)
opt.unroll_loop_iterations(loop, unroll_factor)
self.debug_print_operations(loop)
@@ -269,11 +267,11 @@
pack = Pack([Node(ResOperation(rop.RAW_STORE, [0,0,arg('f',4)], descr), 0),
Node(ResOperation(rop.RAW_STORE, [0,0,arg('f',4)], descr), 0),
])
- assert pack.opcount_filling_vector_register(16) == 2
+ assert pack.opcount_filling_vector_register(16, self.cpu.vector_ext) == 2
def test_opcount_filling_guard(self):
descr = ArrayDescr(0,4, None, 'S')
- vec = ResOperation(rop.VEC_RAW_LOAD_I, ['a','i'], descr=descr)
+ vec = ResOperation(rop.VEC_LOAD_I, ['a','i'], descr=descr)
vec.count = 4
pack = Pack([Node(ResOperation(rop.GUARD_TRUE, [vec]), 0),
Node(ResOperation(rop.GUARD_TRUE, [vec]), 1),
@@ -285,12 +283,13 @@
assert pack.pack_load(16) == 24-16
assert pack.pack_load(8) == 24-8
assert pack.pack_load(32) == 24-32
- assert pack.opcount_filling_vector_register(16) == 4
- ops, newops = pack.slice_operations(16)
+ ext = self.cpu.vector_ext
+ assert pack.opcount_filling_vector_register(16, ext) == 4
+ ops, newops = pack.slice_operations(16, ext)
assert len(ops) == 4
assert len(newops) == 2
- assert pack.opcount_filling_vector_register(8) == 2
- ops, newops = pack.slice_operations(8)
+ assert pack.opcount_filling_vector_register(8, ext) == 2
+ ops, newops = pack.slice_operations(8, ext)
assert len(ops) == 2
assert len(newops) == 4
@@ -1044,10 +1043,10 @@
i18 = int_lt(i13, i1)
guard_true(i18) [i11,i1,i2,i3,i4]
i14 = int_mul(i11, 8)
- v19[2xi64] = vec_raw_load_i(i2, i6, descr=arraydescr)
- v20[2xi64] = vec_raw_load_i(i3, i6, descr=arraydescr)
+ v19[2xi64] = vec_load_i(i2, i6, descr=arraydescr)
+ v20[2xi64] = vec_load_i(i3, i6, descr=arraydescr)
v21[2xi64] = vec_int_add(v19, v20)
- vec_raw_store(i4, i6, v21, descr=arraydescr)
+ vec_store(i4, i6, v21, descr=arraydescr)
jump(i13, i1, i2, i3, i4)
"""
loop = self.parse_loop(ops)
@@ -1182,7 +1181,7 @@
guard_true(i2) [p0, i0, v2[2xf64]]
i10 = int_add(i0, 16)
i20 = int_lt(i10, 100)
- v1[2xf64] = vec_raw_load_f(p0, i0, descr=floatarraydescr)
+ v1[2xf64] = vec_load_f(p0, i0, descr=floatarraydescr)
v3[2xf64] = vec_float_add(v2[2xf64], v1[2xf64])
jump(p0, i1, v3[2xf64])
"""
@@ -1222,10 +1221,10 @@
i55 = int_add(i44, 16)
i629 = int_add(i41, 16)
i637 = int_add(i37, 16)
- v61[2xf64] = vec_raw_load_f(i21, i44, descr=floatarraydescr)
- v62[2xf64] = vec_raw_load_f(i4, i41, descr=floatarraydescr)
+ v61[2xf64] = vec_load_f(i21, i44, descr=floatarraydescr)
+ v62[2xf64] = vec_load_f(i4, i41, descr=floatarraydescr)
v63[2xf64] = vec_float_add(v61, v62)
- vec_raw_store(i0, i37, v63, descr=floatarraydescr)
+ vec_store(i0, i37, v63, descr=floatarraydescr)
f100 = vec_unpack_f(v61, 1, 1)
f101 = vec_unpack_f(v62, 1, 1)
jump(p36, i637, p9, i56, p14, f100, p12, p38, f101, p39, i40, i54, p42, i43, i55, i21, i4, i0, i18)
@@ -1302,11 +1301,11 @@
i400 = int_add(i4, 16)
i401= int_lt(i400, 100)
i402 = int_add(i0, 16)
- v228[4xi32] = vec_raw_load_i(p0, i0, descr=float32arraydescr)
+ v228[4xi32] = vec_load_i(p0, i0, descr=float32arraydescr)
v229[2xf64] = vec_cast_singlefloat_to_float(v228)
v230 = vec_unpack_i(v228, 2, 2)
v231 = vec_cast_singlefloat_to_float(v230)
- v232 = vec_raw_load_i(p1, i189, descr=float32arraydescr)
+ v232 = vec_load_i(p1, i189, descr=float32arraydescr)
v233 = vec_cast_singlefloat_to_float(v232)
v236 = vec_float_add(v229, v233)
v238 = vec_cast_float_to_singlefloat(v236)
@@ -1315,7 +1314,7 @@
v237 = vec_float_add(v231, v235)
v239 = vec_cast_float_to_singlefloat(v237)
v240 = vec_pack_i(v238, v239, 2, 2)
- vec_raw_store(p2, i4, v240, descr=float32arraydescr)
+ vec_store(p2, i4, v240, descr=float32arraydescr)
jump(p0, p1, p2, i207, i500)
""")
vopt = self.vectorize(trace)
@@ -1355,7 +1354,7 @@
""")
vopt = self.schedule(trace)
self.ensure_operations([
- 'v10[2xf64] = vec_raw_load_f(p0,i0,descr=floatarraydescr)',
+ 'v10[2xf64] = vec_load_f(p0,i0,descr=floatarraydescr)',
'v11[2xf64] = vec_float_mul(v10[2xf64], v9[2xf64])',
'v12[2xf64] = vec_float_eq(v11[2xf64], v11[2xf64])',
'i100 = vec_unpack_f(v12[4xi32], 0, 1)',
diff --git a/rpython/jit/metainterp/optimizeopt/vector.py b/rpython/jit/metainterp/optimizeopt/vector.py
--- a/rpython/jit/metainterp/optimizeopt/vector.py
+++ b/rpython/jit/metainterp/optimizeopt/vector.py
@@ -216,6 +216,7 @@
def __init__(self, metainterp_sd, jitdriver_sd, cost_threshold):
Optimizer.__init__(self, metainterp_sd, jitdriver_sd)
self.cpu = metainterp_sd.cpu
+ self.vector_ext = self.cpu.vector_ext
self.cost_threshold = cost_threshold
self.packset = None
self.unroll_count = 0
@@ -226,7 +227,7 @@
self.orig_label_args = loop.label.getarglist_copy()
self.linear_find_smallest_type(loop)
byte_count = self.smallest_type_bytes
- vsize = self.cpu.vector_register_size
+ vsize = self.vector_ext.vec_size()
if vsize == 0 or byte_count == 0 or loop.label.getopnum() != rop.LABEL:
# stop, there is no chance to vectorize this trace
# we cannot optimize normal traces (if there is no label)
@@ -345,7 +346,7 @@
loop = graph.loop
operations = loop.operations
- self.packset = PackSet(self.cpu.vector_register_size)
+ self.packset = PackSet(self.vector_ext.vec_size())
memory_refs = graph.memory_refs.items()
# initialize the pack set
for node_a,memref_a in memory_refs:
@@ -558,7 +559,7 @@
"""
def __init__(self, cpu, threshold):
self.threshold = threshold
- self.vec_reg_size = cpu.vector_register_size
+ self.vec_reg_size = cpu.vector_ext.vec_size()
self.savings = 0
def reset_savings(self):
More information about the pypy-commit
mailing list