Author: Richard Plangger <planri...@gmail.com>
Branch: ppc-vsx-support
Changeset: r85179:fcd54f26d4ff
Date: 2016-06-15 16:02 +0200
http://bitbucket.org/pypy/pypy/changeset/fcd54f26d4ff/

Log:    a new vector register managed, starting to impl. regalloc for loads

diff --git a/rpython/jit/backend/ppc/opassembler.py 
b/rpython/jit/backend/ppc/opassembler.py
--- a/rpython/jit/backend/ppc/opassembler.py
+++ b/rpython/jit/backend/ppc/opassembler.py
@@ -29,6 +29,7 @@
 from rpython.jit.codewriter.effectinfo import EffectInfo
 from rpython.jit.backend.ppc import callbuilder
 from rpython.rlib.rarithmetic import r_uint
+from rpython.jit.backend.ppc.vector_ext import VectorAssembler
 
 class IntOpAssembler(object):
         
@@ -1322,12 +1323,12 @@
         mc.b_abs(target)
         mc.copy_to_raw_memory(oldadr)
 
-
 class OpAssembler(IntOpAssembler, GuardOpAssembler,
                   MiscOpAssembler, FieldOpAssembler,
                   StrOpAssembler, CallOpAssembler,
                   UnicodeOpAssembler, ForceOpAssembler,
-                  AllocOpAssembler, FloatOpAssembler):
+                  AllocOpAssembler, FloatOpAssembler,
+                  VectorAssembler):
     _mixin_ = True
 
     def nop(self):
diff --git a/rpython/jit/backend/ppc/regalloc.py 
b/rpython/jit/backend/ppc/regalloc.py
--- a/rpython/jit/backend/ppc/regalloc.py
+++ b/rpython/jit/backend/ppc/regalloc.py
@@ -27,6 +27,7 @@
 from rpython.jit.codewriter.effectinfo import EffectInfo
 from rpython.rlib import rgc
 from rpython.rlib.rarithmetic import r_uint
+from rpython.jit.backend.ppc.vector_ext import VectorRegalloc
 
 LIMIT_LOOP_BREAK = 15000      # should be much smaller than 32 KB
 
@@ -135,6 +136,17 @@
         self.temp_boxes.append(box)
         return reg
 
+class VectorRegisterManager(RegisterManager):
+    all_regs              = r.MANAGED_VECTOR_REGS
+    box_types             = [INT, FLOAT]
+    save_around_call_regs = [] # ??? lookup the ABI
+    assert set(save_around_call_regs).issubset(all_regs)
+
+    def __init__(self, longevity, frame_manager=None, assembler=None):
+        RegisterManager.__init__(self, longevity, frame_manager, assembler)
+
+    def ensure_reg(self, box):
+        raise NotImplementedError
 
 class PPCFrameManager(FrameManager):
     def __init__(self, base_ofs):
@@ -155,8 +167,7 @@
         assert isinstance(loc, locations.StackLocation)
         return loc.position
 
-
-class Regalloc(BaseRegalloc):
+class Regalloc(BaseRegalloc, VectorRegalloc):
 
     def __init__(self, assembler=None):
         self.cpu = assembler.cpu
@@ -180,6 +191,8 @@
                                      assembler = self.assembler)
         self.fprm = FPRegisterManager(self.longevity, frame_manager = self.fm,
                                       assembler = self.assembler)
+        self.vrm = VectorRegisterManager(self.longevity, frame_manager = 
self.fm,
+                                      assembler = self.assembler)
         return operations
 
     def prepare_loop(self, inputargs, operations, looptoken, allgcrefs):
@@ -287,6 +300,7 @@
             self.assembler.mc.mark_op(op)
             self.rm.position = i
             self.fprm.position = i
+            self.vrm.position = i
             opnum = op.opnum
             if rop.has_no_side_effect(opnum) and op not in self.longevity:
                 i += 1
@@ -297,6 +311,8 @@
                 box = op.getarg(j)
                 if box.type != FLOAT:
                     self.rm.temp_boxes.append(box)
+                elif box.is_vector():
+                    self.vrm.temp_boxes.append(box)
                 else:
                     self.fprm.temp_boxes.append(box)
             #
@@ -309,6 +325,7 @@
             self.possibly_free_var(op)
             self.rm._check_invariants()
             self.fprm._check_invariants()
+            self.vrm._check_invariants()
             if self.assembler.mc.get_relative_pos() > self.limit_loop_break:
                 self.assembler.break_long_loop()
                 self.limit_loop_break = (self.assembler.mc.get_relative_pos() +
diff --git a/rpython/jit/backend/ppc/register.py 
b/rpython/jit/backend/ppc/register.py
--- a/rpython/jit/backend/ppc/register.py
+++ b/rpython/jit/backend/ppc/register.py
@@ -51,6 +51,8 @@
 
 MANAGED_FP_REGS = VOLATILES_FLOAT #+ NONVOLATILES_FLOAT
 
+MANAGED_VECTOR_REGS = ALL_VECTOR_REGS
+
 assert RCS1 in MANAGED_REGS and RCS1 in NONVOLATILES
 assert RCS2 in MANAGED_REGS and RCS2 in NONVOLATILES
 assert RCS3 in MANAGED_REGS and RCS3 in NONVOLATILES
diff --git a/rpython/jit/backend/ppc/vector_ext.py 
b/rpython/jit/backend/ppc/vector_ext.py
--- a/rpython/jit/backend/ppc/vector_ext.py
+++ b/rpython/jit/backend/ppc/vector_ext.py
@@ -17,7 +17,7 @@
         llop.debug_print(lltype.Void, msg)
     raise NotImplementedError(msg)
 
-class PPCVectorAssemblerMixin(object):
+class VectorAssembler(object):
     _mixin_ = True
 
     #def genop_guard_vec_guard_true(self, guard_op, guard_token, locs, resloc):
@@ -510,30 +510,36 @@
     #def genop_vec_cast_singlefloat_to_float(self, op, arglocs, resloc):
     #    self.mc.CVTPS2PD(resloc, arglocs[0])
 
-clas#s VectorRegallocMixin(object):
-    #_mixin_ = True
+class VectorRegalloc(object):
+    _mixin_ = True
 
-    #def _consider_vec_getarrayitem(self, op):
-    #    descr = op.getdescr()
-    #    assert isinstance(descr, ArrayDescr)
-    #    assert not descr.is_array_of_pointers() and \
-    #           not descr.is_array_of_structs()
-    #    itemsize, ofs, _ = unpack_arraydescr(descr)
-    #    integer = not (descr.is_array_of_floats() or descr.getconcrete_type() 
== FLOAT)
-    #    aligned = False
-    #    args = op.getarglist()
-    #    base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args)
-    #    ofs_loc = self.rm.make_sure_var_in_reg(op.getarg(1), args)
-    #    result_loc = self.force_allocate_reg(op)
-    #    self.perform(op, [base_loc, ofs_loc, imm(itemsize), imm(ofs),
-    #                      imm(integer), imm(aligned)], result_loc)
+    def force_allocate_vector_reg(self, op):
+        forbidden_vars = self.vrm.temp_boxes
+        self.vrm.force_allocate_reg(op, forbidden_vars)
 
-    #consider_vec_getarrayitem_raw_i = _consider_vec_getarrayitem
-    #consider_vec_getarrayitem_raw_f = _consider_vec_getarrayitem
-    #consider_vec_getarrayitem_gc_i = _consider_vec_getarrayitem
-    #consider_vec_getarrayitem_gc_f = _consider_vec_getarrayitem
-    #consider_vec_raw_load_i = _consider_vec_getarrayitem
-    #consider_vec_raw_load_f = _consider_vec_getarrayitem
+    def _consider_load(self, op):
+        descr = op.getdescr()
+        assert isinstance(descr, ArrayDescr)
+        assert not descr.is_array_of_pointers() and \
+               not descr.is_array_of_structs()
+        itemsize, ofs, _ = unpack_arraydescr(descr)
+        integer = not (descr.is_array_of_floats() or descr.getconcrete_type() 
== FLOAT)
+        aligned = False
+        args = op.getarglist()
+        a0 = op.getarg(0)
+        a1 = op.getarg(1)
+        base_loc = self.ensure_reg(a0)
+        ofs_loc = self.ensure_reg(a1)
+        result_loc = self.force_allocate_vector_reg(op)
+        self.perform(op, [base_loc, ofs_loc, imm(itemsize), imm(ofs),
+                          imm(integer), imm(aligned)], result_loc)
+
+    consider_vec_getarrayitem_raw_i = _consider_load
+    consider_vec_getarrayitem_raw_f = _consider_load
+    consider_vec_getarrayitem_gc_i = _consider_load
+    consider_vec_getarrayitem_gc_f = _consider_load
+    consider_vec_raw_load_i = _consider_load
+    consider_vec_raw_load_f = _consider_load
 
     #def _consider_vec_setarrayitem(self, op):
     #    descr = op.getdescr()
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to