]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - gcc/config/rs6000/mma.md
Make MMA builtins use opaque modes
[thirdparty/gcc.git] / gcc / config / rs6000 / mma.md
index a3fd28bdd0afc824b23b7e47781d248cdd8d1258..4d291c42f7a1e5be19a16030ccf1e8c317f1fa90 100644 (file)
 ;; along with GCC; see the file COPYING3.  If not see
 ;; <http://www.gnu.org/licenses/>.
 
-;; The MMA patterns use the multi-register PXImode and POImode partial
-;; integer modes to implement the target specific __vector_quad and
-;; __vector_pair types that the MMA built-in functions reference.
-;; To use these modes, we must define XImode and OImode move patterns
-;; so the independent parts of the compiler can use our large partial
-;; integer modes.  However, if we enable the XImode and OImode move
-;; patterns, then the compiler will attempt to use them and this can
-;; cause byte swapping issues on litte-endian systems.  We don't need
-;; the XImode and OImode move patterns for actual code generation,
-;; therefore, we define the XImode and OImode move patterns, but we
-;; disable their use with a "false" condition flag.
+;; The MMA patterns use the multi-register XOmode and OOmode opaque
+;; modes to implement the target specific __vector_quad and
+;; __vector_pair types that the MMA built-in functions reference.  We
+;; use OPAQUE_MODE to prevent anything from trying to open them up.
 
 (define_constants [(MAX_MMA_OPERANDS 7)])
 
 ;; Constants for creating unspecs
 
 (define_c_enum "unspec"
-  [UNSPEC_MMA_ASSEMBLE_ACC
+  [UNSPEC_MMA_ASSEMBLE
+   UNSPEC_MMA_EXTRACT
    UNSPEC_MMA_PMXVBF16GER2
    UNSPEC_MMA_PMXVBF16GER2NN
    UNSPEC_MMA_PMXVBF16GER2NP
@@ -97,6 +91,7 @@
    UNSPEC_MMA_XVI8GER4SPP
    UNSPEC_MMA_XXMFACC
    UNSPEC_MMA_XXMTACC
+   UNSPEC_MMA_XXSETACCZ
   ])
 
 ;; MMA instructions with 1 accumulator argument
                                 (UNSPEC_MMA_PMXVI8GER4SPP      "pmxvi8ger4spp")])
 
 
-;; Define a disabled OImode move pattern, so we can use POImode.
-(define_expand "movoi"
-  [(set (match_operand:OI 0 "nonimmediate_operand")
-       (match_operand:OI 1 "input_operand"))]
-  "0"
-{
-  gcc_unreachable ();
-})
-
-;; Vector pair support.  POImode can only live in VSRs.
-(define_expand "movpoi"
-  [(set (match_operand:POI 0 "nonimmediate_operand")
-       (match_operand:POI 1 "input_operand"))]
+;; Vector pair support.  OOmode can only live in VSRs.
+(define_expand "movoo"
+  [(set (match_operand:OO 0 "nonimmediate_operand")
+       (match_operand:OO 1 "input_operand"))]
   "TARGET_MMA"
 {
-  rs6000_emit_move (operands[0], operands[1], POImode);
+  rs6000_emit_move (operands[0], operands[1], OOmode);
   DONE;
 })
 
-(define_insn_and_split "*movpoi"
-  [(set (match_operand:POI 0 "nonimmediate_operand" "=wa,m,wa")
-       (match_operand:POI 1 "input_operand" "m,wa,wa"))]
+(define_insn_and_split "*movoo"
+  [(set (match_operand:OO 0 "nonimmediate_operand" "=wa,m,wa")
+       (match_operand:OO 1 "input_operand" "m,wa,wa"))]
   "TARGET_MMA
-   && (gpc_reg_operand (operands[0], POImode)
-       || gpc_reg_operand (operands[1], POImode))"
+   && (gpc_reg_operand (operands[0], OOmode)
+       || gpc_reg_operand (operands[1], OOmode))"
   "@
    lxvp%X1 %x0,%1
    stxvp%X0 %x1,%0
    (set_attr "length" "*,*,8")])
 
 \f
-;; Define a disabled XImode move pattern, so we can use PXImode.
-(define_expand "movxi"
-  [(set (match_operand:XI 0 "nonimmediate_operand")
-       (match_operand:XI 1 "input_operand"))]
-  "0"
-{
-  gcc_unreachable ();
-})
-
-;; Vector quad support.  PXImode can only live in FPRs.
-(define_expand "movpxi"
-  [(set (match_operand:PXI 0 "nonimmediate_operand")
-       (match_operand:PXI 1 "input_operand"))]
+;; Vector quad support.  XOmode can only live in FPRs.
+(define_expand "movxo"
+  [(set (match_operand:XO 0 "nonimmediate_operand")
+       (match_operand:XO 1 "input_operand"))]
   "TARGET_MMA"
 {
-  rs6000_emit_move (operands[0], operands[1], PXImode);
+  rs6000_emit_move (operands[0], operands[1], XOmode);
   DONE;
 })
 
-(define_insn_and_split "*movpxi"
-  [(set (match_operand:PXI 0 "nonimmediate_operand" "=d,m,d,d")
-       (match_operand:PXI 1 "input_operand" "m,d,d,O"))]
+(define_insn_and_split "*movxo"
+  [(set (match_operand:XO 0 "nonimmediate_operand" "=d,m,d")
+       (match_operand:XO 1 "input_operand" "m,d,d"))]
   "TARGET_MMA
-   && (gpc_reg_operand (operands[0], PXImode)
-       || gpc_reg_operand (operands[1], PXImode))"
+   && (gpc_reg_operand (operands[0], XOmode)
+       || gpc_reg_operand (operands[1], XOmode))"
   "@
    #
    #
-   #
-   xxsetaccz %A0"
-  "&& reload_completed
-   && !(fpr_reg_operand (operands[0], PXImode) && operands[1] == const0_rtx)"
+   #"
+  "&& reload_completed"
   [(const_int 0)]
 {
   rs6000_split_multireg_move (operands[0], operands[1]);
   DONE;
 }
-  [(set_attr "type" "vecload,vecstore,veclogical,mma")
-   (set_attr "length" "8,8,16,*")
-   (set_attr "max_prefixed_insns" "2,2,*,*")])
+  [(set_attr "type" "vecload,vecstore,veclogical")
+   (set_attr "length" "8,8,16")
+   (set_attr "max_prefixed_insns" "2,2,*")])
 
 (define_expand "mma_assemble_pair"
-  [(match_operand:POI 0 "vsx_register_operand")
-   (match_operand:V16QI 1 "input_operand")
-   (match_operand:V16QI 2 "input_operand")]
+  [(match_operand:OO 0 "vsx_register_operand")
+   (match_operand:V16QI 1 "mma_assemble_input_operand")
+   (match_operand:V16QI 2 "mma_assemble_input_operand")]
   "TARGET_MMA"
 {
-  rtx dst;
+  rtx src = gen_rtx_UNSPEC (OOmode,
+                           gen_rtvec (2, operands[1], operands[2]),
+                           UNSPEC_MMA_ASSEMBLE);
+  emit_move_insn (operands[0], src);
+  DONE;
+})
 
-  /* Let the compiler know the code below fully defines our output value.  */
-  emit_clobber (operands[0]);
+(define_insn_and_split "*mma_assemble_pair"
+  [(set (match_operand:OO 0 "vsx_register_operand" "=wa")
+       (unspec:OO [(match_operand:V16QI 1 "mma_assemble_input_operand" "mwa")
+                   (match_operand:V16QI 2 "mma_assemble_input_operand" "mwa")]
+                   UNSPEC_MMA_ASSEMBLE))]
+  "TARGET_MMA"
+  "#"
+  "&& reload_completed"
+  [(const_int 0)]
+{
+  rtx src = gen_rtx_UNSPEC (OOmode,
+                           gen_rtvec (2, operands[1], operands[2]),
+                           UNSPEC_MMA_ASSEMBLE);
+  rs6000_split_multireg_move (operands[0], src);
+  DONE;
+})
+
+(define_expand "mma_disassemble_pair"
+  [(match_operand:V16QI 0 "mma_disassemble_output_operand")
+   (match_operand:OO 1 "vsx_register_operand")
+   (match_operand 2 "const_0_to_1_operand")]
+  "TARGET_MMA"
+{
+  rtx src;
+  int regoff = INTVAL (operands[2]);
+  src = gen_rtx_UNSPEC (V16QImode,
+                       gen_rtvec (2, operands[1], GEN_INT (regoff)),
+                       UNSPEC_MMA_EXTRACT);
+  emit_move_insn (operands[0], src);
+  DONE;
+})
 
-  dst = simplify_gen_subreg (V16QImode, operands[0], POImode, 0);
-  emit_move_insn (dst, operands[1]);
-  dst = simplify_gen_subreg (V16QImode, operands[0], POImode, 16);
-  emit_move_insn (dst, operands[2]);
+(define_insn_and_split "*mma_disassemble_pair"
+  [(set (match_operand:V16QI 0 "mma_disassemble_output_operand" "=mwa")
+       (unspec:V16QI [(match_operand:OO 1 "vsx_register_operand" "wa")
+                     (match_operand 2 "const_0_to_1_operand")]
+                     UNSPEC_MMA_EXTRACT))]
+  "TARGET_MMA
+   && vsx_register_operand (operands[1], OOmode)"
+  "#"
+  "&& reload_completed"
+  [(const_int 0)]
+{
+  int reg = REGNO (operands[1]);
+  int regoff = INTVAL (operands[2]);
+  rtx src = gen_rtx_REG (V16QImode, reg + regoff);
+  emit_move_insn (operands[0], src);
   DONE;
 })
 
 (define_expand "mma_assemble_acc"
-  [(match_operand:PXI 0 "fpr_reg_operand")
-   (match_operand:V16QI 1 "input_operand")
-   (match_operand:V16QI 2 "input_operand")
-   (match_operand:V16QI 3 "input_operand")
-   (match_operand:V16QI 4 "input_operand")]
+  [(match_operand:XO 0 "fpr_reg_operand")
+   (match_operand:V16QI 1 "mma_assemble_input_operand")
+   (match_operand:V16QI 2 "mma_assemble_input_operand")
+   (match_operand:V16QI 3 "mma_assemble_input_operand")
+   (match_operand:V16QI 4 "mma_assemble_input_operand")]
   "TARGET_MMA"
 {
-  rtx src = gen_rtx_UNSPEC (PXImode,
+  rtx src = gen_rtx_UNSPEC (XOmode,
                            gen_rtvec (4, operands[1], operands[2],
                                       operands[3], operands[4]),
-                           UNSPEC_MMA_ASSEMBLE_ACC);
+                           UNSPEC_MMA_ASSEMBLE);
   emit_move_insn (operands[0], src);
   DONE;
 })
 
 (define_insn_and_split "*mma_assemble_acc"
-  [(set (match_operand:PXI 0 "fpr_reg_operand" "=d")
-       (unspec:PXI [(match_operand:V16QI 1 "mma_assemble_input_operand" "mwa")
-                    (match_operand:V16QI 2 "mma_assemble_input_operand" "mwa")
-                    (match_operand:V16QI 3 "mma_assemble_input_operand" "mwa")
-                    (match_operand:V16QI 4 "mma_assemble_input_operand" "mwa")]
-                    UNSPEC_MMA_ASSEMBLE_ACC))]
+  [(set (match_operand:XO 0 "fpr_reg_operand" "=d")
+       (unspec:XO [(match_operand:V16QI 1 "mma_assemble_input_operand" "mwa")
+                   (match_operand:V16QI 2 "mma_assemble_input_operand" "mwa")
+                   (match_operand:V16QI 3 "mma_assemble_input_operand" "mwa")
+                   (match_operand:V16QI 4 "mma_assemble_input_operand" "mwa")]
+                   UNSPEC_MMA_ASSEMBLE))]
   "TARGET_MMA
-   && fpr_reg_operand (operands[0], PXImode)"
+   && fpr_reg_operand (operands[0], XOmode)"
   "#"
   "&& reload_completed"
   [(const_int 0)]
 {
-  rtx src = gen_rtx_UNSPEC (PXImode,
+  rtx src = gen_rtx_UNSPEC (XOmode,
                            gen_rtvec (4, operands[1], operands[2],
                                       operands[3], operands[4]),
-                           UNSPEC_MMA_ASSEMBLE_ACC);
+                           UNSPEC_MMA_ASSEMBLE);
   rs6000_split_multireg_move (operands[0], src);
   DONE;
 })
 
+(define_expand "mma_disassemble_acc"
+  [(match_operand:V16QI 0 "mma_disassemble_output_operand")
+   (match_operand:XO 1 "fpr_reg_operand")
+   (match_operand 2 "const_0_to_3_operand")]
+  "TARGET_MMA"
+{
+  rtx src;
+  int regoff = INTVAL (operands[2]);
+  src = gen_rtx_UNSPEC (V16QImode,
+                       gen_rtvec (2, operands[1], GEN_INT (regoff)),
+                       UNSPEC_MMA_EXTRACT);
+  emit_move_insn (operands[0], src);
+  DONE;
+})
+
+(define_insn_and_split "*mma_disassemble_acc"
+  [(set (match_operand:V16QI 0 "mma_disassemble_output_operand" "=mwa")
+       (unspec:V16QI [(match_operand:XO 1 "fpr_reg_operand" "d")
+                     (match_operand 2 "const_0_to_3_operand")]
+                     UNSPEC_MMA_EXTRACT))]
+  "TARGET_MMA
+   && fpr_reg_operand (operands[1], XOmode)"
+  "#"
+  "&& reload_completed"
+  [(const_int 0)]
+{
+  int reg = REGNO (operands[1]);
+  int regoff = INTVAL (operands[2]);
+  rtx src = gen_rtx_REG (V16QImode, reg + regoff);
+  emit_move_insn (operands[0], src);
+  DONE;
+})
+
 ;; MMA instructions that do not use their accumulators as an input, still
 ;; must not allow their vector operands to overlap the registers used by
 ;; the accumulator.  We enforce this by marking the output as early clobber.
 
 (define_insn "mma_<acc>"
-  [(set (match_operand:PXI 0 "fpr_reg_operand" "=&d")
-       (unspec:PXI [(match_operand:PXI 1 "fpr_reg_operand" "0")]
+  [(set (match_operand:XO 0 "fpr_reg_operand" "=&d")
+       (unspec:XO [(match_operand:XO 1 "fpr_reg_operand" "0")]
                    MMA_ACC))]
   "TARGET_MMA"
   "<acc> %A0"
   [(set_attr "type" "mma")])
 
+;; We can't have integer constants in XOmode so we wrap this in an UNSPEC.
+
 (define_expand "mma_xxsetaccz"
-  [(set (match_operand:PXI 0 "fpr_reg_operand")
+  [(set (match_operand:XO 0 "fpr_reg_operand")
        (const_int 0))]
   "TARGET_MMA"
 {
-  emit_insn (gen_movpxi (operands[0], const0_rtx));
+  rtx xo0 = gen_rtx_UNSPEC (XOmode, gen_rtvec (1, const0_rtx),
+                           UNSPEC_MMA_XXSETACCZ);
+  emit_insn (gen_rtx_SET (operands[0], xo0));
   DONE;
 })
 
+(define_insn_and_split "*mma_xxsetaccz"
+  [(set (match_operand:XO 0 "fpr_reg_operand" "=d")
+       (unspec:XO [(match_operand 1 "const_0_to_1_operand" "O")]
+        UNSPEC_MMA_XXSETACCZ))]
+  "TARGET_MMA"
+  "xxsetaccz %A0"
+  "&& reload_completed"
+  [(set (match_dup 0) (unspec:XO [(match_dup 1)] UNSPEC_MMA_XXSETACCZ))]
+  ""
+  [(set_attr "type" "mma")
+   (set_attr "length" "4")])
+
 (define_insn "mma_<vv>"
-  [(set (match_operand:PXI 0 "fpr_reg_operand" "=&d")
-       (unspec:PXI [(match_operand:V16QI 1 "vsx_register_operand" "wa")
-                    (match_operand:V16QI 2 "vsx_register_operand" "wa")]
-                    MMA_VV))]
+  [(set (match_operand:XO 0 "fpr_reg_operand" "=&d")
+       (unspec:XO [(match_operand:V16QI 1 "vsx_register_operand" "wa")
+                   (match_operand:V16QI 2 "vsx_register_operand" "wa")]
+                   MMA_VV))]
   "TARGET_MMA"
   "<vv> %A0,%x1,%x2"
   [(set_attr "type" "mma")])
 
 (define_insn "mma_<avv>"
-  [(set (match_operand:PXI 0 "fpr_reg_operand" "=&d")
-       (unspec:PXI [(match_operand:PXI 1 "fpr_reg_operand" "0")
-                    (match_operand:V16QI 2 "vsx_register_operand" "wa")
-                    (match_operand:V16QI 3 "vsx_register_operand" "wa")]
-                    MMA_AVV))]
+  [(set (match_operand:XO 0 "fpr_reg_operand" "=&d")
+       (unspec:XO [(match_operand:XO 1 "fpr_reg_operand" "0")
+                   (match_operand:V16QI 2 "vsx_register_operand" "wa")
+                   (match_operand:V16QI 3 "vsx_register_operand" "wa")]
+                   MMA_AVV))]
   "TARGET_MMA"
   "<avv> %A0,%x2,%x3"
   [(set_attr "type" "mma")])
 
 (define_insn "mma_<pv>"
-  [(set (match_operand:PXI 0 "fpr_reg_operand" "=&d")
-       (unspec:PXI [(match_operand:POI 1 "vsx_register_operand" "wa")
-                    (match_operand:V16QI 2 "vsx_register_operand" "wa")]
-                    MMA_PV))]
+  [(set (match_operand:XO 0 "fpr_reg_operand" "=&d")
+       (unspec:XO [(match_operand:OO 1 "vsx_register_operand" "wa")
+                   (match_operand:V16QI 2 "vsx_register_operand" "wa")]
+                   MMA_PV))]
   "TARGET_MMA"
   "<pv> %A0,%x1,%x2"
   [(set_attr "type" "mma")])
 
 (define_insn "mma_<apv>"
-  [(set (match_operand:PXI 0 "fpr_reg_operand" "=&d")
-       (unspec:PXI [(match_operand:PXI 1 "fpr_reg_operand" "0")
-                    (match_operand:POI 2 "vsx_register_operand" "wa")
-                    (match_operand:V16QI 3 "vsx_register_operand" "wa")]
-                    MMA_APV))]
+  [(set (match_operand:XO 0 "fpr_reg_operand" "=&d")
+       (unspec:XO [(match_operand:XO 1 "fpr_reg_operand" "0")
+                   (match_operand:OO 2 "vsx_register_operand" "wa")
+                   (match_operand:V16QI 3 "vsx_register_operand" "wa")]
+                   MMA_APV))]
   "TARGET_MMA"
   "<apv> %A0,%x2,%x3"
   [(set_attr "type" "mma")])
 
 (define_insn "mma_<vvi4i4i8>"
-  [(set (match_operand:PXI 0 "fpr_reg_operand" "=&d")
-       (unspec:PXI [(match_operand:V16QI 1 "vsx_register_operand" "wa")
-                    (match_operand:V16QI 2 "vsx_register_operand" "wa")
-                    (match_operand:SI 3 "const_0_to_15_operand" "n")
-                    (match_operand:SI 4 "const_0_to_15_operand" "n")
-                    (match_operand:SI 5 "u8bit_cint_operand" "n")]
-                    MMA_VVI4I4I8))]
+  [(set (match_operand:XO 0 "fpr_reg_operand" "=&d")
+       (unspec:XO [(match_operand:V16QI 1 "vsx_register_operand" "wa")
+                   (match_operand:V16QI 2 "vsx_register_operand" "wa")
+                   (match_operand:SI 3 "const_0_to_15_operand" "n")
+                   (match_operand:SI 4 "const_0_to_15_operand" "n")
+                   (match_operand:SI 5 "u8bit_cint_operand" "n")]
+                   MMA_VVI4I4I8))]
   "TARGET_MMA"
   "<vvi4i4i8> %A0,%x1,%x2,%3,%4,%5"
   [(set_attr "type" "mma")
    (set_attr "length" "8")])
 
 (define_insn "mma_<avvi4i4i8>"
-  [(set (match_operand:PXI 0 "fpr_reg_operand" "=&d")
-       (unspec:PXI [(match_operand:PXI 1 "fpr_reg_operand" "0")
-                    (match_operand:V16QI 2 "vsx_register_operand" "wa")
-                    (match_operand:V16QI 3 "vsx_register_operand" "wa")
-                    (match_operand:SI 4 "const_0_to_15_operand" "n")
-                    (match_operand:SI 5 "const_0_to_15_operand" "n")
-                    (match_operand:SI 6 "u8bit_cint_operand" "n")]
-                    MMA_AVVI4I4I8))]
+  [(set (match_operand:XO 0 "fpr_reg_operand" "=&d")
+       (unspec:XO [(match_operand:XO 1 "fpr_reg_operand" "0")
+                   (match_operand:V16QI 2 "vsx_register_operand" "wa")
+                   (match_operand:V16QI 3 "vsx_register_operand" "wa")
+                   (match_operand:SI 4 "const_0_to_15_operand" "n")
+                   (match_operand:SI 5 "const_0_to_15_operand" "n")
+                   (match_operand:SI 6 "u8bit_cint_operand" "n")]
+                   MMA_AVVI4I4I8))]
   "TARGET_MMA"
   "<avvi4i4i8> %A0,%x2,%x3,%4,%5,%6"
   [(set_attr "type" "mma")
    (set_attr "length" "8")])
 
 (define_insn "mma_<vvi4i4i2>"
-  [(set (match_operand:PXI 0 "fpr_reg_operand" "=&d")
-       (unspec:PXI [(match_operand:V16QI 1 "vsx_register_operand" "wa")
-                    (match_operand:V16QI 2 "vsx_register_operand" "wa")
-                    (match_operand:SI 3 "const_0_to_15_operand" "n")
-                    (match_operand:SI 4 "const_0_to_15_operand" "n")
-                    (match_operand:SI 5 "const_0_to_3_operand" "n")]
-                    MMA_VVI4I4I2))]
+  [(set (match_operand:XO 0 "fpr_reg_operand" "=&d")
+       (unspec:XO [(match_operand:V16QI 1 "vsx_register_operand" "wa")
+                   (match_operand:V16QI 2 "vsx_register_operand" "wa")
+                   (match_operand:SI 3 "const_0_to_15_operand" "n")
+                   (match_operand:SI 4 "const_0_to_15_operand" "n")
+                   (match_operand:SI 5 "const_0_to_3_operand" "n")]
+                   MMA_VVI4I4I2))]
   "TARGET_MMA"
   "<vvi4i4i2> %A0,%x1,%x2,%3,%4,%5"
   [(set_attr "type" "mma")
    (set_attr "length" "8")])
 
 (define_insn "mma_<avvi4i4i2>"
-  [(set (match_operand:PXI 0 "fpr_reg_operand" "=&d")
-       (unspec:PXI [(match_operand:PXI 1 "fpr_reg_operand" "0")
-                    (match_operand:V16QI 2 "vsx_register_operand" "wa")
-                    (match_operand:V16QI 3 "vsx_register_operand" "wa")
-                    (match_operand:SI 4 "const_0_to_15_operand" "n")
-                    (match_operand:SI 5 "const_0_to_15_operand" "n")
-                    (match_operand:SI 6 "const_0_to_3_operand" "n")]
-                    MMA_AVVI4I4I2))]
+  [(set (match_operand:XO 0 "fpr_reg_operand" "=&d")
+       (unspec:XO [(match_operand:XO 1 "fpr_reg_operand" "0")
+                   (match_operand:V16QI 2 "vsx_register_operand" "wa")
+                   (match_operand:V16QI 3 "vsx_register_operand" "wa")
+                   (match_operand:SI 4 "const_0_to_15_operand" "n")
+                   (match_operand:SI 5 "const_0_to_15_operand" "n")
+                   (match_operand:SI 6 "const_0_to_3_operand" "n")]
+                   MMA_AVVI4I4I2))]
   "TARGET_MMA"
   "<avvi4i4i2> %A0,%x2,%x3,%4,%5,%6"
   [(set_attr "type" "mma")
    (set_attr "length" "8")])
 
 (define_insn "mma_<vvi4i4>"
-  [(set (match_operand:PXI 0 "fpr_reg_operand" "=&d")
-       (unspec:PXI [(match_operand:V16QI 1 "vsx_register_operand" "wa")
-                    (match_operand:V16QI 2 "vsx_register_operand" "wa")
-                    (match_operand:SI 3 "const_0_to_15_operand" "n")
-                    (match_operand:SI 4 "const_0_to_15_operand" "n")]
-                    MMA_VVI4I4))]
+  [(set (match_operand:XO 0 "fpr_reg_operand" "=&d")
+       (unspec:XO [(match_operand:V16QI 1 "vsx_register_operand" "wa")
+                   (match_operand:V16QI 2 "vsx_register_operand" "wa")
+                   (match_operand:SI 3 "const_0_to_15_operand" "n")
+                   (match_operand:SI 4 "const_0_to_15_operand" "n")]
+                   MMA_VVI4I4))]
   "TARGET_MMA"
   "<vvi4i4> %A0,%x1,%x2,%3,%4"
   [(set_attr "type" "mma")
    (set_attr "length" "8")])
 
 (define_insn "mma_<avvi4i4>"
-  [(set (match_operand:PXI 0 "fpr_reg_operand" "=&d")
-       (unspec:PXI [(match_operand:PXI 1 "fpr_reg_operand" "0")
-                    (match_operand:V16QI 2 "vsx_register_operand" "wa")
-                    (match_operand:V16QI 3 "vsx_register_operand" "wa")
-                    (match_operand:SI 4 "const_0_to_15_operand" "n")
-                    (match_operand:SI 5 "const_0_to_15_operand" "n")]
-                    MMA_AVVI4I4))]
+  [(set (match_operand:XO 0 "fpr_reg_operand" "=&d")
+       (unspec:XO [(match_operand:XO 1 "fpr_reg_operand" "0")
+                   (match_operand:V16QI 2 "vsx_register_operand" "wa")
+                   (match_operand:V16QI 3 "vsx_register_operand" "wa")
+                   (match_operand:SI 4 "const_0_to_15_operand" "n")
+                   (match_operand:SI 5 "const_0_to_15_operand" "n")]
+                   MMA_AVVI4I4))]
   "TARGET_MMA"
   "<avvi4i4> %A0,%x2,%x3,%4,%5"
   [(set_attr "type" "mma")
    (set_attr "length" "8")])
 
 (define_insn "mma_<pvi4i2>"
-  [(set (match_operand:PXI 0 "fpr_reg_operand" "=&d")
-       (unspec:PXI [(match_operand:POI 1 "vsx_register_operand" "wa")
-                    (match_operand:V16QI 2 "vsx_register_operand" "wa")
-                    (match_operand:SI 3 "const_0_to_15_operand" "n")
-                    (match_operand:SI 4 "const_0_to_3_operand" "n")]
-                    MMA_PVI4I2))]
+  [(set (match_operand:XO 0 "fpr_reg_operand" "=&d")
+       (unspec:XO [(match_operand:OO 1 "vsx_register_operand" "wa")
+                   (match_operand:V16QI 2 "vsx_register_operand" "wa")
+                   (match_operand:SI 3 "const_0_to_15_operand" "n")
+                   (match_operand:SI 4 "const_0_to_3_operand" "n")]
+                   MMA_PVI4I2))]
   "TARGET_MMA"
   "<pvi4i2> %A0,%x1,%x2,%3,%4"
   [(set_attr "type" "mma")
    (set_attr "length" "8")])
 
 (define_insn "mma_<apvi4i2>"
-  [(set (match_operand:PXI 0 "fpr_reg_operand" "=&d")
-       (unspec:PXI [(match_operand:PXI 1 "fpr_reg_operand" "0")
-                    (match_operand:POI 2 "vsx_register_operand" "wa")
-                    (match_operand:V16QI 3 "vsx_register_operand" "wa")
-                    (match_operand:SI 4 "const_0_to_15_operand" "n")
-                    (match_operand:SI 5 "const_0_to_3_operand" "n")]
-                    MMA_APVI4I2))]
+  [(set (match_operand:XO 0 "fpr_reg_operand" "=&d")
+       (unspec:XO [(match_operand:XO 1 "fpr_reg_operand" "0")
+                   (match_operand:OO 2 "vsx_register_operand" "wa")
+                   (match_operand:V16QI 3 "vsx_register_operand" "wa")
+                   (match_operand:SI 4 "const_0_to_15_operand" "n")
+                   (match_operand:SI 5 "const_0_to_3_operand" "n")]
+                   MMA_APVI4I2))]
   "TARGET_MMA"
   "<apvi4i2> %A0,%x2,%x3,%4,%5"
   [(set_attr "type" "mma")
    (set_attr "length" "8")])
 
 (define_insn "mma_<vvi4i4i4>"
-  [(set (match_operand:PXI 0 "fpr_reg_operand" "=&d")
-       (unspec:PXI [(match_operand:V16QI 1 "vsx_register_operand" "wa")
-                    (match_operand:V16QI 2 "vsx_register_operand" "wa")
-                    (match_operand:SI 3 "const_0_to_15_operand" "n")
-                    (match_operand:SI 4 "const_0_to_15_operand" "n")
-                    (match_operand:SI 5 "const_0_to_15_operand" "n")]
-                    MMA_VVI4I4I4))]
+  [(set (match_operand:XO 0 "fpr_reg_operand" "=&d")
+       (unspec:XO [(match_operand:V16QI 1 "vsx_register_operand" "wa")
+                   (match_operand:V16QI 2 "vsx_register_operand" "wa")
+                   (match_operand:SI 3 "const_0_to_15_operand" "n")
+                   (match_operand:SI 4 "const_0_to_15_operand" "n")
+                   (match_operand:SI 5 "const_0_to_15_operand" "n")]
+                   MMA_VVI4I4I4))]
   "TARGET_MMA"
   "<vvi4i4i4> %A0,%x1,%x2,%3,%4,%5"
   [(set_attr "type" "mma")
    (set_attr "length" "8")])
 
 (define_insn "mma_<avvi4i4i4>"
-  [(set (match_operand:PXI 0 "fpr_reg_operand" "=&d")
-       (unspec:PXI [(match_operand:PXI 1 "fpr_reg_operand" "0")
-                    (match_operand:V16QI 2 "vsx_register_operand" "wa")
-                    (match_operand:V16QI 3 "vsx_register_operand" "wa")
-                    (match_operand:SI 4 "const_0_to_15_operand" "n")
-                    (match_operand:SI 5 "const_0_to_15_operand" "n")
-                    (match_operand:SI 6 "const_0_to_15_operand" "n")]
-                    MMA_AVVI4I4I4))]
+  [(set (match_operand:XO 0 "fpr_reg_operand" "=&d")
+       (unspec:XO [(match_operand:XO 1 "fpr_reg_operand" "0")
+                   (match_operand:V16QI 2 "vsx_register_operand" "wa")
+                   (match_operand:V16QI 3 "vsx_register_operand" "wa")
+                   (match_operand:SI 4 "const_0_to_15_operand" "n")
+                   (match_operand:SI 5 "const_0_to_15_operand" "n")
+                   (match_operand:SI 6 "const_0_to_15_operand" "n")]
+                   MMA_AVVI4I4I4))]
   "TARGET_MMA"
   "<avvi4i4i4> %A0,%x2,%x3,%4,%5,%6"
   [(set_attr "type" "mma")