Author: Richard Plangger <planri...@gmail.com>
Branch: ppc-vsx-support
Changeset: r87220:a7ce3d0c0585
Date: 2016-09-19 09:42 +0200
http://bitbucket.org/pypy/pypy/changeset/a7ce3d0c0585/

Log:    expand gpr/fpr to a vector reg

diff --git a/rpython/jit/backend/zarch/instruction_builder.py 
b/rpython/jit/backend/zarch/instruction_builder.py
--- a/rpython/jit/backend/zarch/instruction_builder.py
+++ b/rpython/jit/backend/zarch/instruction_builder.py
@@ -546,6 +546,19 @@
         self.writechar(opcode2)
     return encode_vri_a
 
+def build_vri_c(mnemonic, (opcode1,opcode2), argtypes='v,v,i16,m'):
+    @builder.arguments(argtypes)
+    def encode_vri_c(self, v1, v3, i2, mask4):
+        self.writechar(opcode1)
+        rbx  = (v1 >= 16) << 3
+        rbx |= (v3 >= 16) << 2
+        byte = (v1 & BIT_MASK_4) << 4 | (v3 & BIT_MASK_4)
+        self.writechar(chr(byte))
+        self.write_i16(i2 & BIT_MASK_16)
+        self.writechar(chr((mask4 & BIT_MASK_4) << 4 | (rbx & BIT_MASK_4)))
+        self.writechar(opcode2)
+    return encode_vri_c
+
 def build_vrs_b(mnemonic, (opcode1,opcode2), argtypes='v,r,db,m'):
     @builder.arguments(argtypes)
     def encode_vrs_b(self, v1, r2, db3, m4):
diff --git a/rpython/jit/backend/zarch/instructions.py 
b/rpython/jit/backend/zarch/instructions.py
--- a/rpython/jit/backend/zarch/instructions.py
+++ b/rpython/jit/backend/zarch/instructions.py
@@ -300,6 +300,8 @@
 
     'VST':    ('vrx', ['\xE7','\x0E'], 'v,bid'),
 
+    'VREP':   ('vri_c', ['\xE7','\x4D']),
+
     # integral
     # -> arith
     'VA':     ('vrr_c', ['\xE7','\xF3'], 'v,v,v,m'),
diff --git a/rpython/jit/backend/zarch/vector_ext.py 
b/rpython/jit/backend/zarch/vector_ext.py
--- a/rpython/jit/backend/zarch/vector_ext.py
+++ b/rpython/jit/backend/zarch/vector_ext.py
@@ -244,9 +244,20 @@
         assert isinstance(op, VectorOp)
         resloc, loc0 = arglocs
         size = op.bytesize
-        self.mc.VLREP(resloc, loc0, l.itemsize_to_mask(size))
+        if loc0.is_core_reg():
+            self.mc.VLVG(resloc, loc0, l.addr(0), l.itemsize_to_mask(size))
+            self.mc.VREP(resloc, loc0, l.imm0, l.itemsize_to_mask(size))
+        else:
+            self.mc.VLREP(resloc, loc0, l.itemsize_to_mask(size))
 
-    emit_vec_expand_f = emit_vec_expand_i
+    def emit_vec_expand_f(self, op, arglocs, regalloc):
+        assert isinstance(op, VectorOp)
+        resloc, loc0 = arglocs
+        size = op.bytesize
+        if loc0.is_fp_reg():
+            self.mc.VREP(resloc, loc0, l.imm0, l.itemsize_to_mask(size))
+        else:
+            self.mc.VLREP(resloc, loc0, l.itemsize_to_mask(size))
 
     def _accum_reduce(self, op, arg, accumloc, targetloc):
         # Currently the accumulator can ONLY be 64 bit float/int
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to