Author: Richard Plangger <[email protected]>
Branch: ppc-vsx-support
Changeset: r85562:c97b2b5608a4
Date: 2016-07-05 16:27 +0200
http://bitbucket.org/pypy/pypy/changeset/c97b2b5608a4/

Log:    remove the integer register allocator. float and int vector register
        are colocated (i.e. float 32 -> int 0, float 33 -> int 1, ...), this
        makes things much easier

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
@@ -142,9 +142,9 @@
         self.temp_boxes.append(box)
         return reg
 
-class IntegerVectorRegisterManager(RegisterManager):
-    all_regs              = r.MANAGED_INTEGER_VECTOR_REGS
-    box_types             = [INT]
+class VectorRegisterManager(RegisterManager):
+    all_regs              = r.MANAGED_FLOAT_VECTOR_REGS
+    box_types             = [FLOAT, INT]
     save_around_call_regs = [] # ??? lookup the ABI
     assert set(save_around_call_regs).issubset(all_regs)
 
@@ -154,26 +154,11 @@
     def ensure_reg(self, box):
         raise NotImplementedError
 
-    def get_scratch_reg(self):
-        box = TempInt()
-        reg = self.force_allocate_reg(box, forbidden_vars=self.temp_boxes)
-        self.temp_boxes.append(box)
-        return reg
-
-class FloatVectorRegisterManager(IntegerVectorRegisterManager):
-    all_regs              = r.MANAGED_FLOAT_VECTOR_REGS
-    box_types             = [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
-
-    def get_scratch_reg(self):
-        box = TempFloat()
+    def get_scratch_reg(self, type=INT):
+        if type == FLOAT:
+            box = TempFloat()
+        else:
+            box = TempInt()
         reg = self.force_allocate_reg(box, forbidden_vars=self.temp_boxes)
         self.temp_boxes.append(box)
         return reg
@@ -221,10 +206,8 @@
                                      assembler = self.assembler)
         self.fprm = FPRegisterManager(self.longevity, frame_manager = self.fm,
                                       assembler = self.assembler)
-        self.vrm = FloatVectorRegisterManager(self.longevity, frame_manager = 
self.fm,
-                                      assembler = self.assembler)
-        self.ivrm = IntegerVectorRegisterManager(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):
@@ -286,16 +269,13 @@
 
     def possibly_free_var(self, var):
         if var is not None:
-            if var.type == FLOAT:
-                if var.is_vector():
+            if var.is_vector():
+                if var.type != VOID:
                     self.vrm.possibly_free_var(var)
-                else:
-                    self.fprm.possibly_free_var(var)
+            elif var.type == FLOAT:
+                self.fprm.possibly_free_var(var)
             elif var.type == INT:
-                if var.is_vector():
-                    self.ivrm.possibly_free_var(var)
-                else:
-                    self.rm.possibly_free_var(var)
+                self.rm.possibly_free_var(var)
 
     def possibly_free_vars(self, vars):
         for var in vars:
@@ -339,7 +319,6 @@
             self.rm.position = i
             self.fprm.position = i
             self.vrm.position = i
-            self.ivrm.position = i
             opnum = op.opnum
             if rop.has_no_side_effect(opnum) and op not in self.longevity:
                 i += 1
@@ -348,16 +327,13 @@
             #
             for j in range(op.numargs()):
                 box = op.getarg(j)
-                if box.type != FLOAT:
-                    if box.is_vector():
-                        self.ivrm.temp_boxes.append(box)
-                    else:
-                        self.rm.temp_boxes.append(box)
+                if box.is_vector():
+                    if box.type != VOID:
+                        self.vrm.temp_boxes.append(box)
+                elif box.type != FLOAT:
+                    self.rm.temp_boxes.append(box)
                 else:
-                    if box.is_vector():
-                        self.vrm.temp_boxes.append(box)
-                    else:
-                        self.fprm.temp_boxes.append(box)
+                    self.fprm.temp_boxes.append(box)
             #
             if not we_are_translated() and opnum == rop.FORCE_SPILL:
                 self._consider_force_spill(op)
@@ -369,7 +345,6 @@
             self.rm._check_invariants()
             self.fprm._check_invariants()
             self.vrm._check_invariants()
-            self.ivrm._check_invariants()
             if self.assembler.mc.get_relative_pos() > self.limit_loop_break:
                 self.assembler.break_long_loop(self)
                 self.limit_loop_break = (self.assembler.mc.get_relative_pos() +
@@ -413,10 +388,7 @@
 
     def loc(self, var):
         if var.is_vector():
-            if var.type == FLOAT:
-                return self.vrm.loc(var)
-            else:
-                return self.ivrm.loc(var)
+            return self.vrm.loc(var)
         else:
             if var.type == FLOAT:
                 return self.fprm.loc(var)
@@ -487,7 +459,6 @@
         self.rm.free_temp_vars()
         self.fprm.free_temp_vars()
         self.vrm.free_temp_vars()
-        self.ivrm.free_temp_vars()
 
     # ******************************************************
     # *         P R E P A R E  O P E R A T I O N S         * 
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
@@ -51,8 +51,8 @@
     else:
         resval = result_loc.value
         # either doubleword integer 1 (2x) or word integer 1 (4x)
-        ones = regalloc.ivrm.get_scratch_reg().value
-        zeros = regalloc.ivrm.get_scratch_reg().value
+        ones = regalloc.vrm.get_scratch_reg(type=INT).value
+        zeros = regalloc.vrm.get_scratch_reg(type=INT).value
         asm.mc.vxor(zeros, zeros, zeros)
         if size == 4:
             asm.mc.vspltisw(ones, 1)
@@ -121,15 +121,15 @@
         indexloc = self._apply_offset(indexloc, baseofs)
         assert baseofs.value == 0
         if integer_loc.value:
-            Vloloc = regalloc.ivrm.get_scratch_reg()
-            Vhiloc = regalloc.ivrm.get_scratch_reg()
-            Vploc = regalloc.ivrm.get_scratch_reg()
+            Vloloc = regalloc.vrm.get_scratch_reg(type=INT)
+            Vhiloc = regalloc.vrm.get_scratch_reg(type=INT)
+            Vploc = regalloc.vrm.get_scratch_reg(type=INT)
             tloc = regalloc.rm.get_scratch_reg()
-            V1sloc = regalloc.ivrm.get_scratch_reg()
+            V1sloc = regalloc.vrm.get_scratch_reg(type=INT)
             V1s = V1sloc.value
-            V0sloc = regalloc.ivrm.get_scratch_reg()
+            V0sloc = regalloc.vrm.get_scratch_reg(type=INT)
             V0s = V0sloc.value
-            Vmaskloc = regalloc.ivrm.get_scratch_reg()
+            Vmaskloc = regalloc.vrm.get_scratch_reg(type=INT)
             Vmask = Vmaskloc.value
             Vlo = Vhiloc.value
             Vhi = Vloloc.value
@@ -372,7 +372,7 @@
     def emit_vec_int_is_true(self, op, arglocs, regalloc):
         resloc, argloc, sizeloc = arglocs
         size = sizeloc.value
-        tmp = regalloc.ivrm.get_scratch_reg().value
+        tmp = regalloc.vrm.get_scratch_reg(type=INT).value
         self.mc.vxor(tmp, tmp, tmp)
         # argloc[i] > 0:
         # For an unsigned integer that is equivalent to argloc[i] != 0
@@ -616,13 +616,11 @@
     def emit_vec_cast_float_to_int(self, op, arglocs, regalloc):
         res, l0 = arglocs
         offloc = regalloc.rm.get_scratch_reg()
-        v0 = regalloc.vrm.get_scratch_reg()
+        v0 = regalloc.vrm.get_scratch_reg(type=INT)
         off = offloc.value
         # SP is always 16 byte aligned, and PARAM_SAVE_AREA_OFFSET % 16 == 0
         self.mc.load_imm(offloc, PARAM_SAVE_AREA_OFFSET)
-        self.mc.xvcvdpsxds(v0.value, l0.value)
-        self.mc.stxvd2x(v0.value, off, r.SP.value)
-        self.mc.lvx(res.value, off, r.SP.value)
+        self.mc.xvcvdpsxds(res.value, l0.value)
 
     # needed as soon as PPC's support_singlefloat is implemented!
     #def genop_vec_cast_singlefloat_to_float(self, op, arglocs, regalloc):
@@ -637,10 +635,7 @@
 
     def force_allocate_vector_reg(self, op):
         forbidden_vars = self.vrm.temp_boxes
-        if op.type == FLOAT:
-            return self.vrm.force_allocate_reg(op, forbidden_vars)
-        else:
-            return self.ivrm.force_allocate_reg(op, forbidden_vars)
+        return self.vrm.force_allocate_reg(op, forbidden_vars)
 
     def force_allocate_vector_reg_or_cc(self, op):
         assert op.type == INT
@@ -654,12 +649,8 @@
             return self.force_allocate_vector_reg(op)
 
     def ensure_vector_reg(self, box):
-        if box.type == FLOAT:
-            return self.vrm.make_sure_var_in_reg(box,
-                               forbidden_vars=self.vrm.temp_boxes)
-        else:
-            return self.ivrm.make_sure_var_in_reg(box,
-                               forbidden_vars=self.ivrm.temp_boxes)
+        return self.vrm.make_sure_var_in_reg(box,
+                           forbidden_vars=self.vrm.temp_boxes)
 
     def _prepare_load(self, op):
         descr = op.getdescr()
@@ -691,9 +682,9 @@
         ofs_loc = self.ensure_reg(a1)
         result_loc = self.force_allocate_vector_reg(op)
         tloc = self.rm.get_scratch_reg()
-        Vhiloc = self.ivrm.get_scratch_reg()
-        Vloloc = self.ivrm.get_scratch_reg()
-        Vploc = self.ivrm.get_scratch_reg()
+        Vhiloc = self.vrm.get_scratch_reg(type=INT)
+        Vloloc = self.vrm.get_scratch_reg(type=INT)
+        Vploc = self.vrm.get_scratch_reg(type=INT)
         return [result_loc, base_loc, ofs_loc, imm(itemsize), imm(ofs),
                 Vhiloc, Vloloc, Vploc, tloc]
 
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
@@ -613,7 +613,7 @@
             yield (size, Typ(*t1), Typ(*t2), Typ(*t3), op[0], op[1])
     types = [('rffi.DOUBLE', 'float', 'float'),
              ('rffi.SIGNED', 'int', 'int'),
-             ('rffi.FLOAT', 'rffi.r_singlefloat', 'float'),
+             #('rffi.FLOAT', 'rffi.r_singlefloat', 'float'),
             ]
     operators = [('add', '+'),
                 ]
@@ -629,11 +629,11 @@
                 vector_b = lltype.malloc(T2, size, flavor='raw')
                 vector_c = lltype.malloc(T3, size, flavor='raw')
                 for i in range(size):
-                    vector_a[i] = {type_a_storecast}(i+1)
+                    vector_a[i] = {type_a_storecast}(1)
                 for i in range(size):
-                    vector_b[i] = {type_b_storecast}(i+1)
+                    vector_b[i] = {type_b_storecast}(1)
                 for i in range(size):
-                    vector_c[i] = {type_c_storecast}(i+1)
+                    vector_c[i] = {type_c_storecast}(1)
                 i = 0
                 while i < size:
                     myjitdriver.jit_merge_point()
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to