Author: Richard Plangger <r...@pasra.at> Branch: vecopt2 Changeset: r77117:771fe82d7b07 Date: 2015-04-16 15:27 +0200 http://bitbucket.org/pypy/pypy/changeset/771fe82d7b07/
Log: introduced vec_getarrayitem_raw which was previously handled by vector raw load (was not correct) 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 @@ -684,6 +684,12 @@ def bh_vec_int_signext(self, vx, ext, count): return [heaptracker.int_signext(_vx, ext) for _vx in vx] + def bh_vec_getarrayitem_raw(self, struct, offset, count, descr): + values = [] + for i in range(count): + val = self.bh_getarrayitem_raw(struct, offset + i, descr) + values.append(val) + return values def bh_vec_raw_load(self, struct, offset, count, descr): values = [] stride = descr.get_item_size_in_bytes() @@ -696,6 +702,9 @@ stride = descr.get_item_size_in_bytes() for i in range(count): self.bh_raw_store(struct, offset + i*stride, newvalues[i], descr) + def bh_vec_setarrayitem_raw(self, struct, offset, newvalues, count, descr): + for i in range(count): + self.bh_setarrayitem_raw(struct, offset + i, newvalues[i], descr) def store_fail_descr(self, deadframe, descr): diff --git a/rpython/jit/metainterp/blackhole.py b/rpython/jit/metainterp/blackhole.py --- a/rpython/jit/metainterp/blackhole.py +++ b/rpython/jit/metainterp/blackhole.py @@ -1477,13 +1477,14 @@ assert kind == 'v' return lltype.nullptr(rclass.OBJECTPTR.TO) - def _prepare_resume_from_failure(self, opnum, deadframe): + def _prepare_resume_from_failure(self, opnum, deadframe, resumedescr): from rpython.jit.metainterp.resoperation import rop # if opnum == rop.GUARD_FUTURE_CONDITION: pass elif opnum == rop.GUARD_NO_EARLY_EXIT: - self.position = 0 + self.position = resumedescr.rd_frame_info_list.pc + pass elif opnum == rop.GUARD_TRUE: # Produced directly by some goto_if_not_xxx() opcode that did not # jump, but which must now jump. The pc is just after the opcode. @@ -1656,7 +1657,7 @@ all_virtuals) current_exc = blackholeinterp._prepare_resume_from_failure( - resumedescr.guard_opnum, deadframe) + resumedescr.guard_opnum, deadframe, resumedescr) _run_forever(blackholeinterp, current_exc) diff --git a/rpython/jit/metainterp/executor.py b/rpython/jit/metainterp/executor.py --- a/rpython/jit/metainterp/executor.py +++ b/rpython/jit/metainterp/executor.py @@ -338,12 +338,14 @@ rop.CALL_MALLOC_NURSERY_VARSIZE, rop.CALL_MALLOC_NURSERY_VARSIZE_FRAME, rop.LABEL, + rop.VEC_RAW_LOAD, + rop.VEC_RAW_STORE, + rop.VEC_GETARRAYITEM_RAW, + rop.VEC_SETARRAYITEM_RAW, ): # list of opcodes never executed by pyjitpl continue - # XXX this is temporary! after the algorithm works adjust the - # black hole interpreter! - if rop._VEC_ARITHMETIC_FIRST <= value <= rop._VEC_ARITHMETIC_LAST or \ - value == rop.VEC_RAW_LOAD or value == rop.VEC_RAW_STORE: + # trace will generate such an op + if rop._VEC_ARITHMETIC_FIRST <= value <= rop._VEC_ARITHMETIC_LAST: continue raise AssertionError("missing %r" % (key,)) diff --git a/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py b/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py --- a/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py @@ -556,7 +556,7 @@ def test_packset_init_simple(self): ops = """ [p0,i0] - i3 = getarrayitem_gc(p0, i0, descr=chararraydescr) + i3 = getarrayitem_raw(p0, i0, descr=chararraydescr) i1 = int_add(i0, 1) i2 = int_le(i1, 16) guard_true(i2) [p0, i0] @@ -601,7 +601,7 @@ i1 = int_add(i0, 1) i2 = int_le(i1, 16) guard_true(i2) [p0, i0] - i3 = getarrayitem_gc(p0, i1, descr=chararraydescr) + i3 = getarrayitem_raw(p0, i1, descr=chararraydescr) jump(p0,i1) """ loop = self.parse_loop(ops) @@ -631,12 +631,12 @@ def test_isomorphic_operations(self): ops_src = """ [p1,p0,i0] - i3 = getarrayitem_gc(p0, i0, descr=chararraydescr) + i3 = getarrayitem_raw(p0, i0, descr=chararraydescr) i1 = int_add(i0, 1) i2 = int_le(i1, 16) - i4 = getarrayitem_gc(p0, i1, descr=chararraydescr) - i5 = getarrayitem_gc(p1, i1, descr=floatarraydescr) - i6 = getarrayitem_gc(p0, i1, descr=floatarraydescr) + i4 = getarrayitem_raw(p0, i1, descr=chararraydescr) + i5 = getarrayitem_raw(p1, i1, descr=floatarraydescr) + i6 = getarrayitem_raw(p0, i1, descr=floatarraydescr) guard_true(i2) [p0, i0] jump(p1,p0,i1) """ @@ -657,7 +657,7 @@ i1 = int_add(i0, 1) i2 = int_le(i1, 16) guard_true(i2) [p0, i0] - i3 = getarrayitem_gc(p0, i1, descr=chararraydescr) + i3 = getarrayitem_raw(p0, i1, descr=chararraydescr) i4 = int_add(i3, 1) jump(p0,i1) """ @@ -676,9 +676,9 @@ i1 = int_add(i0, 1) i2 = int_le(i1, 16) guard_true(i2) [p0, i0] - i3 = getarrayitem_gc(p0, i1, descr=chararraydescr) + i3 = getarrayitem_raw(p0, i1, descr=chararraydescr) i4 = int_mul(i3, 2) - setarrayitem_gc(p0, i1, i4, descr=chararraydescr) + setarrayitem_raw(p0, i1, i4, descr=chararraydescr) jump(p0,i1) """ loop = self.parse_loop(ops) @@ -695,7 +695,7 @@ def test_packset_combine_simple(self,descr): ops = """ [p0,i0] - i3 = getarrayitem_gc(p0, i0, descr={descr}arraydescr) + i3 = getarrayitem_raw(p0, i0, descr={descr}arraydescr) i1 = int_add(i0,1) jump(p0,i1) """.format(descr=descr) @@ -736,9 +736,9 @@ def test_packset_combine_2_loads_one_redundant(self): ops = """ [p0,i0] - i3 = getarrayitem_gc(p0, i0, descr=floatarraydescr) + i3 = getarrayitem_raw(p0, i0, descr=floatarraydescr) i1 = int_add(i0,1) - i4 = getarrayitem_gc(p0, i1, descr=floatarraydescr) + i4 = getarrayitem_raw(p0, i1, descr=floatarraydescr) jump(p0,i1) """ pytest.skip("loop unrolling must apply redundant loop unrolling") @@ -762,7 +762,7 @@ ops = """ [p0,i0] - i3 = getarrayitem_gc(p0, i0, descr=floatarraydescr) + i3 = getarrayitem_raw(p0, i0, descr=floatarraydescr) jump(p0,i3) """ try: @@ -826,10 +826,10 @@ guard_no_early_exit() [] i10 = int_le(i0, 128) # 1, 8, 15, 22 guard_true(i10) [p0,p1,p2,i0] # 2, 9, 16, 23 - i2 = getarrayitem_gc(p0, i0, descr={descr}arraydescr) # 3, 10, 17, 24 - i3 = getarrayitem_gc(p1, i0, descr={descr}arraydescr) # 4, 11, 18, 25 + i2 = getarrayitem_raw(p0, i0, descr={descr}arraydescr) # 3, 10, 17, 24 + i3 = getarrayitem_raw(p1, i0, descr={descr}arraydescr) # 4, 11, 18, 25 i4 = {op}(i2,i3) # 5, 12, 19, 26 - setarrayitem_gc(p2, i0, i4, descr={descr}arraydescr) # 6, 13, 20, 27 + setarrayitem_raw(p2, i0, i4, descr={descr}arraydescr) # 6, 13, 20, 27 i1 = int_add(i0, {stride}) # 7, 14, 21, 28 jump(p0,p1,p2,i1) # 29 """.format(op=op,descr=descr,stride=1) # stride getarray is always 1 @@ -842,10 +842,10 @@ guard_true(i11) [] i12 = int_add(i1, {stride}) guard_no_early_exit() [] - v1 = vec_raw_load(p0, i0, 2, descr={descr}arraydescr) - v2 = vec_raw_load(p1, i0, 2, descr={descr}arraydescr) + v1 = vec_getarrayitem_raw(p0, i0, 2, descr={descr}arraydescr) + v2 = vec_getarrayitem_raw(p1, i0, 2, descr={descr}arraydescr) v3 = {op}(v1,v2,2) - vec_raw_store(p2, i0, v3, 2, descr={descr}arraydescr) + vec_setarrayitem_raw(p2, i0, v3, 2, descr={descr}arraydescr) jump(p0,p1,p2,i12) """.format(op='vec_'+op,descr=descr,stride=1) loop = self.parse_loop(ops) diff --git a/rpython/jit/metainterp/optimizeopt/vectorize.py b/rpython/jit/metainterp/optimizeopt/vectorize.py --- a/rpython/jit/metainterp/optimizeopt/vectorize.py +++ b/rpython/jit/metainterp/optimizeopt/vectorize.py @@ -497,9 +497,13 @@ def _vectorize_VEC_RAW_LOAD(self, vop): self.vector_result(vop) + def _vectorize_VEC_GETARRAYITEM_RAW(self, vop): + self.vector_result(vop) def _vectorize_VEC_RAW_STORE(self, vop): self.vector_arg(vop, 2) + def _vectorize_VEC_SETARRAYITEM_RAW(self, vop): + self.vector_arg(vop, 2) VecScheduleData._inspect_operation = \ make_dispatcher_method(VecScheduleData, '_vectorize_') diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py --- a/rpython/jit/metainterp/resoperation.py +++ b/rpython/jit/metainterp/resoperation.py @@ -507,6 +507,7 @@ 'GETARRAYITEM_GC/2d', 'GETARRAYITEM_RAW/2d', + 'VEC_GETARRAYITEM_RAW/3d', 'RAW_LOAD/2d', 'VEC_RAW_LOAD/3d', 'GETINTERIORFIELD_GC/2d', @@ -530,6 +531,7 @@ 'INCREMENT_DEBUG_COUNTER/1', 'SETARRAYITEM_GC/3d', 'SETARRAYITEM_RAW/3d', + 'VEC_SETARRAYITEM_RAW/4d', 'RAW_STORE/3d', 'VEC_RAW_STORE/4d', 'SETINTERIORFIELD_GC/3d', @@ -705,12 +707,10 @@ } _opvector = { rop.RAW_LOAD: rop.VEC_RAW_LOAD, - rop.GETARRAYITEM_RAW: rop.VEC_RAW_LOAD, - rop.GETARRAYITEM_GC: rop.VEC_RAW_LOAD, + rop.GETARRAYITEM_RAW: rop.VEC_GETARRAYITEM_RAW, rop.RAW_STORE: rop.VEC_RAW_STORE, - rop.SETARRAYITEM_RAW: rop.VEC_RAW_STORE, - rop.SETARRAYITEM_GC: rop.VEC_RAW_STORE, + rop.SETARRAYITEM_RAW: rop.VEC_SETARRAYITEM_RAW, rop.INT_ADD: rop.VEC_INT_ADD, rop.INT_SUB: rop.VEC_INT_SUB, diff --git a/rpython/jit/metainterp/test/test_vectorize.py b/rpython/jit/metainterp/test/test_vectorize.py --- a/rpython/jit/metainterp/test/test_vectorize.py +++ b/rpython/jit/metainterp/test/test_vectorize.py @@ -79,7 +79,7 @@ assert res == 42 self.check_trace_count(1) - @py.test.mark.parametrize('i',[8]) + @py.test.mark.parametrize('i',[1,2,3,8,17,128,500]) def test_vectorize_array_get_set(self,i): myjitdriver = JitDriver(greens = [], reds = ['i','d','va','vb','vc'], @@ -112,7 +112,8 @@ return res res = self.meta_interp(f, [i]) assert res == f(i) - self.check_trace_count(1) + if i > 4: + self.check_trace_count(1) class TestLLtype(VectorizeTest, LLJitMixin): pass _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit