[gcc(refs/users/meissner/heads/work221-float)] Add -mbfloat16 switch.

Michael Meissner meissner@gcc.gnu.org
Thu Sep 11 05:44:13 GMT 2025


https://gcc.gnu.org/g:e69688d1c0d368e893e031e8d3104de1d29bbf7c

commit e69688d1c0d368e893e031e8d3104de1d29bbf7c
Author: Michael Meissner <meissner@linux.ibm.com>
Date:   Thu Sep 11 01:43:50 2025 -0400

    Add -mbfloat16 switch.
    
    2025-09-11  Michael Meissner  <meissner@linux.ibm.com>
    
    gcc/
    
            * config/rs6000/altivec.md (VM): Add initial bfloat16 support.
            (VM2): Likewise.
            (VI_char): Likewise.
            (VI_scalar): Likewise.
            (VI_unit): Likewise.
            (VU_char): Likewise.
            * config/rs6000/rs6000-builtin.cc (rs6000_type_string): Likewise.
            (rs6000_init_builtins): Likewise.
            * config/rs6000/rs6000-cpus.def (POWERPC_MASKS): Likewise.
            * config/rs6000/rs6000-modes.def (BFmode): Likewise.
            * config/rs6000/rs6000.cc (rs6000_option_override_internal): Likewise.
            (rs6000_opt_masks): Likewise.
            * config/rs6000/rs6000.md (FMOVE128_GPR): Likewise.
            (RELOAD): Likewise.
            (FP16): New mode iterator.
            (mov<mode>, FP16 iterator): Rename insns, to support both HFmode and
            BFmode moves.
            (mov<mode>_xxsplti): Likewise.
            (mov<mode>_internal, FP16 iterator): Likewise.
            * config/rs6000/rs6000.opt (-mbfloat16): New switch.
            * config/rs6000/vector.md (VEC_L): Add initial __bfloat16 support.
            (VEC_M): Likewise.
            (VEC_E): Likewise.
            (VEC_base): Likewise.
            (VEC_base_l): Likewise.
            * config/rs6000/vsx.md (VECTOR_16BIT): Rename from V8HI_V8HF and add
            bfloat16 support.
            (VSX_L): Likewise.
            (VSX_M): Likewise.
            (VSX_XXBR): Likewise.
            (VSm): Likewise.
            (VSr): Likewise.
            (VSisa): Likewise.
            (??r): Likewise.
            (nW): Likewise.
            (VSv): Likewise.
            (VM3): Likewise.
            (VM3_char): Likewise.
            (vsx_extract_<mode>_store_p9): Likewise.
            (vsx_extract_<mode>_p8): Likewise.

Diff:
---
 gcc/config/rs6000/altivec.md        |  6 +++
 gcc/config/rs6000/rs6000-builtin.cc | 14 ++++++
 gcc/config/rs6000/rs6000-cpus.def   |  1 +
 gcc/config/rs6000/rs6000-modes.def  |  3 ++
 gcc/config/rs6000/rs6000.cc         |  9 ++++
 gcc/config/rs6000/rs6000.md         | 45 ++++++++++--------
 gcc/config/rs6000/rs6000.opt        |  4 ++
 gcc/config/rs6000/vector.md         |  5 ++
 gcc/config/rs6000/vsx.md            | 94 +++++++++++++++++++++----------------
 9 files changed, 121 insertions(+), 60 deletions(-)

diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md
index b6f92a71f963..fb960f7ba966 100644
--- a/gcc/config/rs6000/altivec.md
+++ b/gcc/config/rs6000/altivec.md
@@ -191,6 +191,7 @@
 ;; otherwise handled by altivec (v2df, v2di, ti)
 (define_mode_iterator VM [V4SI
 			  V8HI
+			  V8BF
 			  V8HF
 			  V16QI
 			  V4SF
@@ -204,6 +205,7 @@
 ;; Like VM, except don't do TImode
 (define_mode_iterator VM2 [V4SI
 			   V8HI
+			   V8BF
 			   V8HF
 			   V16QI
 			   V4SF
@@ -227,15 +229,18 @@
 (define_mode_attr VI_char [(V2DI "d")
 			   (V4SI "w")
 			   (V8HI "h")
+			   (V8BF "h")
 			   (V8HF "h")
 			   (V16QI "b")])
 (define_mode_attr VI_scalar [(V2DI "DI")
 			     (V4SI "SI")
 			     (V8HI "HI")
+			     (V8BF "BF")
 			     (V8HF "HF")
 			     (V16QI "QI")])
 (define_mode_attr VI_unit [(V16QI "VECTOR_UNIT_ALTIVEC_P (V16QImode)")
 			   (V8HI "VECTOR_UNIT_ALTIVEC_P (V8HImode)")
+			   (V8BF "VECTOR_UNIT_ALTIVEC_P (V8BFmode)")
 			   (V8HF "VECTOR_UNIT_ALTIVEC_P (V8HFmode)")
 			   (V4SI "VECTOR_UNIT_ALTIVEC_P (V4SImode)")
 			   (V2DI "VECTOR_UNIT_P8_VECTOR_P (V2DImode)")])
@@ -251,6 +256,7 @@
 (define_mode_attr VU_char [(V2DI "w")
 			   (V4SI "h")
 			   (V8HI "b")
+			   (V8BF "b")
 			   (V8HF "b")])
 
 ;; Vector negate
diff --git a/gcc/config/rs6000/rs6000-builtin.cc b/gcc/config/rs6000/rs6000-builtin.cc
index 05a730a8fdca..845adcdae8e6 100644
--- a/gcc/config/rs6000/rs6000-builtin.cc
+++ b/gcc/config/rs6000/rs6000-builtin.cc
@@ -493,6 +493,8 @@ const char *rs6000_type_string (tree type_node)
     return "_Float128";
   else if (type_node == float16_type_node)
     return "_Float16";
+  else if (TARGET_BFLOAT16 && type_node == bfloat16_type_node)
+    return "__bfloat16";
   else if (type_node == vector_pair_type_node)
     return "__vector_pair";
   else if (type_node == vector_quad_type_node)
@@ -758,6 +760,18 @@ rs6000_init_builtins (void)
   else
     ieee128_float_type_node = NULL_TREE;
 
+  /* __bfloat16 support.  */
+  if (TARGET_BFLOAT16)
+    {
+      bfloat16_type_node = make_node (REAL_TYPE);
+      TYPE_PRECISION (bfloat16_type_node) = 16;
+      SET_TYPE_MODE (bfloat16_type_node, BFmode);
+      layout_type (bfloat16_type_node);
+      t = build_qualified_type (bfloat16_type_node, TYPE_QUAL_CONST);
+      lang_hooks.types.register_builtin_type (bfloat16_type_node,
+					      "__bfloat16");
+    }
+
   /* Vector pair and vector quad support.  */
   vector_pair_type_node = make_node (OPAQUE_TYPE);
   SET_TYPE_MODE (vector_pair_type_node, OOmode);
diff --git a/gcc/config/rs6000/rs6000-cpus.def b/gcc/config/rs6000/rs6000-cpus.def
index 5523a749f18b..798b6404f7e9 100644
--- a/gcc/config/rs6000/rs6000-cpus.def
+++ b/gcc/config/rs6000/rs6000-cpus.def
@@ -114,6 +114,7 @@
 
 /* Mask of all options to set the default isa flags based on -mcpu=<xxx>.  */
 #define POWERPC_MASKS		(OPTION_MASK_ALTIVEC			\
+				 | OPTION_MASK_BFLOAT16			\
 				 | OPTION_MASK_CMPB			\
 				 | OPTION_MASK_CRYPTO			\
 				 | OPTION_MASK_DFP			\
diff --git a/gcc/config/rs6000/rs6000-modes.def b/gcc/config/rs6000/rs6000-modes.def
index 04dc1d8c9194..81de144a987f 100644
--- a/gcc/config/rs6000/rs6000-modes.def
+++ b/gcc/config/rs6000/rs6000-modes.def
@@ -48,6 +48,9 @@ FLOAT_MODE (IF, 16, ibm_extended_format);
 /* Explicit IEEE 16-bit floating point.  */
 FLOAT_MODE (HF, 2, ieee_half_format);
 
+/* Explicit bfloat16 floating point.  */
+FLOAT_MODE (BF, 2, arm_bfloat_half_format);
+
 /* Add any extra modes needed to represent the condition code.
 
    For the RS/6000, we need separate modes when unsigned (logical) comparisons
diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index 92511a8928b9..6eb53f3b4c8b 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -3925,6 +3925,14 @@ rs6000_option_override_internal (bool global_init_p)
 	error ("%qs requires at least %qs", "-mieee16", "-mcpu=power9");
     }
 
+  /* -mbfloat16 needs power10 at a minimum.  */
+  if (TARGET_BFLOAT16 && !TARGET_POWER10)
+    {
+      rs6000_isa_flags &= ~OPTION_MASK_BFLOAT16;
+      if (rs6000_isa_flags_explicit & OPTION_MASK_BFLOAT16)
+	error ("%qs requires at least %qs", "-mbfloat16", "-mcpu=power10");
+    }
+
   /* If hard-float/altivec/vsx were explicitly turned off then don't allow
      the -mcpu setting to enable options that conflict. */
   if ((!TARGET_HARD_FLOAT || !TARGET_ALTIVEC || !TARGET_VSX)
@@ -24541,6 +24549,7 @@ struct rs6000_opt_mask {
 static struct rs6000_opt_mask const rs6000_opt_masks[] =
 {
   { "altivec",			OPTION_MASK_ALTIVEC,		false, true  },
+  { "bfloat16",			OPTION_MASK_BFLOAT16,		false, true  },
   { "block-ops-unaligned-vsx",	OPTION_MASK_BLOCK_OPS_UNALIGNED_VSX,
 								false, true  },
   { "block-ops-vector-pair",	OPTION_MASK_BLOCK_OPS_VECTOR_PAIR,
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index 7b6cc75b3e38..3da282932395 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -552,6 +552,7 @@
 (define_mode_iterator FMOVE128_GPR [TI
 				    V16QI
 				    V8HI
+				    V8BF
 				    V8HF
 				    V4SI
 				    V4SF
@@ -838,8 +839,8 @@
 
 ;; Reload iterator for creating the function to allocate a base register to
 ;; supplement addressing modes.
-(define_mode_iterator RELOAD [V16QI V8HI V8HF V4SI V2DI V4SF V2DF V1TI
-			      SF SD SI DF DD DI TI PTI KF IF TF HF
+(define_mode_iterator RELOAD [V16QI V8HI V8BF V8HF V4SI V2DI V4SF V2DF V1TI
+			      SF SD SI DF DD DI TI PTI KF IF TF HF BF
 			      OO XO])
 
 ;; Iterate over smin, smax
@@ -858,6 +859,10 @@
 				     (SF "TARGET_P8_VECTOR")
 				     (DI "TARGET_POWERPC64")])
 
+;; Mode iterator for 16-bit floating modes.
+(define_mode_iterator FP16 [(BF "TARGET_BFLOAT16")
+			    (HF "TARGET_IEEE16")])
+
 ;; Mode iterator for floating point modes other than SF/DFmode that we
 ;; convert to/from _Float16 (HFmode) via DFmode.
 (define_mode_iterator HF_CONVERT [TF KF IF SD DD TD])
@@ -8246,45 +8251,45 @@
 		 p9v,       *,         *,         *")])
 
 
-(define_expand "movhf"
-  [(set (match_operand:HF 0 "nonimmediate_operand")
-	(match_operand:HF 1 "any_operand"))]
-  "TARGET_IEEE16"
+(define_expand "mov<mode>"
+  [(set (match_operand:FP16 0 "nonimmediate_operand")
+	(match_operand:FP16 1 "any_operand"))]
+  ""
 {
   if (MEM_P (operands[0]) && !REG_P (operands[1]))
-    operands[1] = force_reg (HFmode, operands[1]);
+    operands[1] = force_reg (<MODE>mode, operands[1]);
 })
 
-;; On power10, we can load up HFmode constants with xxspltiw or pli.
-(define_insn "*movhf_xxspltiw"
-  [(set (match_operand:HF 0 "gpc_reg_operand" "=wa,r")
-	(match_operand:HF 1 "ieee16_xxspltiw_constant" "eP,eP"))]
-  "TARGET_IEEE16 && TARGET_POWER10 && TARGET_PREFIXED"
+;; On power10, we can load up HFmode and BFmode constants with xxspltiw
+;; or pli.
+(define_insn "*mov<mode>_xxspltiw"
+  [(set (match_operand:FP16 0 "gpc_reg_operand" "=wa,r")
+	(match_operand:FP16 1 "ieee16_xxspltiw_constant" "eP,eP"))]
+  "TARGET_POWER10 && TARGET_PREFIXED"
 {
   rtx op1 = operands[1];
   const REAL_VALUE_TYPE *rtype = CONST_DOUBLE_REAL_VALUE (op1);
   long real_words[VECTOR_128BIT_WORDS];
 
-  real_to_target (real_words, rtype, HFmode);
+  real_to_target (real_words, rtype, <MODE>mode);
   operands[2] = GEN_INT (real_words[0]);
-  return (vsx_register_operand (operands[0], HFmode)
+  return (vsx_register_operand (operands[0], <MODE>mode)
 	  ? "xxspltiw %x0,%2"
 	  : "li %0,%2");
 }
   [(set_attr "type" "vecperm,*")
    (set_attr "prefixed" "yes")])
 
-(define_insn "*movhf_internal"
-  [(set (match_operand:HF 0 "nonimmediate_operand"
+(define_insn "*mov<mode>_internal"
+  [(set (match_operand:FP16 0 "nonimmediate_operand"
                     "=wa,       wa,       Z,         r,          r,
                       m,        r,        wa,        wa,         r")
 
-	(match_operand:HF 1 "any_operand"
+	(match_operand:FP16 1 "any_operand"
                     "wa,        Z,        wa,        r,          m,
                      r,         wa,       r,         j,          j"))]
-  "TARGET_IEEE16
-   && (gpc_reg_operand (operands[0], HFmode)
-       || gpc_reg_operand (operands[1], HFmode))"
+  "gpc_reg_operand (operands[0], <MODE>mode)
+    || gpc_reg_operand (operands[1], <MODE>mode)"
   "@
    xxlor %x0,%x1,%x1
    lxsihzx %x0,%y1
diff --git a/gcc/config/rs6000/rs6000.opt b/gcc/config/rs6000/rs6000.opt
index 779c13d233b9..61fecea0e049 100644
--- a/gcc/config/rs6000/rs6000.opt
+++ b/gcc/config/rs6000/rs6000.opt
@@ -650,6 +650,10 @@ mieee16-gpr-args
 Target Undocumented Var(TARGET_IEEE16_GPR_ARGS) Init(1) Save
 Pass _Float16 in GPR registers.
 
+mbfloat16
+Target Undocumented Mask(BFLOAT16) Var(rs6000_isa_flags)
+Enable or disable __bfloat16 support.
+
 ; Documented parameters
 
 -param=rs6000-vect-unroll-limit=
diff --git a/gcc/config/rs6000/vector.md b/gcc/config/rs6000/vector.md
index ed427ea05e9b..0a9f092c1951 100644
--- a/gcc/config/rs6000/vector.md
+++ b/gcc/config/rs6000/vector.md
@@ -52,6 +52,7 @@
 ;; Vector logical modes
 (define_mode_iterator VEC_L [V16QI
 			     V8HI
+			     V8BF
 			     V8HF
 			     V4SI
 			     V2DI
@@ -68,6 +69,7 @@
 			     V8HI
 			     V4SI
 			     V2DI
+			     V8BF
 			     V8HF
 			     V4SF
 			     V2DF
@@ -85,6 +87,7 @@
 			     V8HI
 			     V4SI
 			     V2DI
+			     V8BF
 			     V8HF
 			     V4SF
 			     V2DF])
@@ -100,6 +103,7 @@
 			    (V8HI  "HI")
 			    (V4SI  "SI")
 			    (V2DI  "DI")
+			    (V8BF  "BF")
 			    (V8HF  "HF")
 			    (V4SF  "SF")
 			    (V2DF  "DF")
@@ -111,6 +115,7 @@
 			      (V8HI  "hi")
 			      (V4SI  "si")
 			      (V2DI  "di")
+			      (V8BF  "bf")
 			      (V8HF  "hf")
 			      (V4SF  "sf")
 			      (V2DF  "df")
diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md
index 09b4d53813ba..aee4a9ba8c1a 100644
--- a/gcc/config/rs6000/vsx.md
+++ b/gcc/config/rs6000/vsx.md
@@ -47,12 +47,14 @@
 (define_mode_iterator VSX_F [V4SF V2DF])
 
 ;; Iterator for 8 element vectors
-(define_mode_iterator V8HI_V8HF [V8HI
-				 (V8HF "TARGET_IEEE16")])
+(define_mode_iterator VECTOR_16BIT [V8HI
+				    (V8BF "TARGET_BFLOAT16")
+				    (V8HF "TARGET_IEEE16")])
 
 ;; Iterator for logical types supported by VSX
 (define_mode_iterator VSX_L [V16QI
 			     V8HI
+			     (V8BF	"TARGET_BFLOAT16")
 			     (V8HF	"TARGET_IEEE16")
 			     V4SI
 			     V2DI
@@ -66,6 +68,7 @@
 ;; Iterator for memory moves.
 (define_mode_iterator VSX_M [V16QI
 			     V8HI
+			     (V8BF	"TARGET_BFLOAT16")
 			     (V8HF	"TARGET_IEEE16")
 			     V4SI
 			     V2DI
@@ -77,6 +80,7 @@
 			     TI])
 
 (define_mode_attr VSX_XXBR  [(V8HI  "h")
+			     (V8BF  "h")
 			     (V8HF  "h")
 			     (V4SI  "w")
 			     (V4SF  "w")
@@ -87,6 +91,7 @@
 ;; Map into the appropriate load/store name based on the type
 (define_mode_attr VSm  [(V16QI "vw4")
 			(V8HI  "vw4")
+			(V8BF  "vw4")
 			(V8HF  "vw4")
 			(V4SI  "vw4")
 			(V4SF  "vw4")
@@ -101,6 +106,7 @@
 ;; Map the register class used
 (define_mode_attr VSr	[(V16QI "v")
 			 (V8HI  "v")
+			 (V8BF  "v")
 			 (V8HF  "v")
 			 (V4SI  "v")
 			 (V4SF  "wa")
@@ -117,6 +123,7 @@
 ;; What value we need in the "isa" field, to make the IEEE QP float work.
 (define_mode_attr VSisa	[(V16QI "*")
 			 (V8HI  "*")
+			 (V8BF  "p10")
 			 (V8HF  "p9v")
 			 (V4SI  "*")
 			 (V4SF  "*")
@@ -134,6 +141,7 @@
 ;; integer modes.
 (define_mode_attr ??r	[(V16QI	"??r")
 			 (V8HI	"??r")
+			 (V8BF	"??r")
 			 (V8HF	"??r")
 			 (V4SI	"??r")
 			 (V4SF	"??r")
@@ -147,6 +155,7 @@
 ;; A mode attribute used for 128-bit constant values.
 (define_mode_attr nW	[(V16QI	"W")
 			 (V8HI	"W")
+			 (V8BF	"W")
 			 (V8HF	"W")
 			 (V4SI	"W")
 			 (V4SF	"W")
@@ -175,6 +184,7 @@
 ;; operation
 (define_mode_attr VSv	[(V16QI "v")
 			 (V8HI  "v")
+			 (V8BF  "v")
 			 (V8HF  "v")
 			 (V4SI  "v")
 			 (V4SF  "v")
@@ -409,6 +419,7 @@
 ;; Like VM2 in altivec.md, just do char, short, int, long, float and double
 (define_mode_iterator VM3 [V4SI
 			   V8HI
+			   V8BF
 			   V8HF
 			   V16QI
 			   V4SF
@@ -421,6 +432,7 @@
 (define_mode_attr VM3_char [(V2DI "d")
 			   (V4SI "w")
 			   (V8HI "h")
+			   (V8BF "h")
 			   (V8HF "h")
 			   (V16QI "b")
 			   (V2DF  "d")
@@ -557,20 +569,20 @@
    (set_attr "length" "8")])
 
 (define_insn_and_split "*vsx_le_perm_load_<mode>"
-  [(set (match_operand:V8HI_V8HF 0 "vsx_register_operand" "=wa")
-        (match_operand:V8HI_V8HF 1 "indexed_or_indirect_operand" "Z"))]
+  [(set (match_operand:VECTOR_16BIT 0 "vsx_register_operand" "=wa")
+        (match_operand:VECTOR_16BIT 1 "indexed_or_indirect_operand" "Z"))]
   "!BYTES_BIG_ENDIAN && TARGET_VSX && !TARGET_P9_VECTOR"
   "#"
   "&& 1"
   [(set (match_dup 2)
-        (vec_select:V8HI_V8HF
+        (vec_select:VECTOR_16BIT
           (match_dup 1)
           (parallel [(const_int 4) (const_int 5)
                      (const_int 6) (const_int 7)
                      (const_int 0) (const_int 1)
                      (const_int 2) (const_int 3)])))
    (set (match_dup 0)
-        (vec_select:V8HI_V8HF
+        (vec_select:VECTOR_16BIT
           (match_dup 2)
           (parallel [(const_int 4) (const_int 5)
                      (const_int 6) (const_int 7)
@@ -818,26 +830,26 @@
   "")
 
 (define_insn "*vsx_le_perm_store_<mode>"
-  [(set (match_operand:V8HI_V8HF 0 "indexed_or_indirect_operand" "=Z")
-        (match_operand:V8HI_V8HF 1 "vsx_register_operand" "wa"))]
+  [(set (match_operand:VECTOR_16BIT 0 "indexed_or_indirect_operand" "=Z")
+        (match_operand:VECTOR_16BIT 1 "vsx_register_operand" "wa"))]
   "!BYTES_BIG_ENDIAN && TARGET_VSX && !TARGET_P9_VECTOR"
   "#"
   [(set_attr "type" "vecstore")
    (set_attr "length" "12")])
 
 (define_split
-  [(set (match_operand:V8HI_V8HF 0 "indexed_or_indirect_operand")
-        (match_operand:V8HI_V8HF 1 "vsx_register_operand"))]
+  [(set (match_operand:VECTOR_16BIT 0 "indexed_or_indirect_operand")
+        (match_operand:VECTOR_16BIT 1 "vsx_register_operand"))]
   "!BYTES_BIG_ENDIAN && TARGET_VSX && !TARGET_P9_VECTOR && !reload_completed"
   [(set (match_dup 2)
-        (vec_select:V8HI_V8HF
+        (vec_select:VECTOR_16BIT
           (match_dup 1)
           (parallel [(const_int 4) (const_int 5)
                      (const_int 6) (const_int 7)
                      (const_int 0) (const_int 1)
                      (const_int 2) (const_int 3)])))
    (set (match_dup 0)
-        (vec_select:V8HI_V8HF
+        (vec_select:VECTOR_16BIT
           (match_dup 2)
           (parallel [(const_int 4) (const_int 5)
                      (const_int 6) (const_int 7)
@@ -876,25 +888,25 @@
 ;; The post-reload split requires that we re-permute the source
 ;; register in case it is still live.
 (define_split
-  [(set (match_operand:V8HI_V8HF 0 "indexed_or_indirect_operand")
-        (match_operand:V8HI_V8HF 1 "vsx_register_operand"))]
+  [(set (match_operand:VECTOR_16BIT 0 "indexed_or_indirect_operand")
+        (match_operand:VECTOR_16BIT 1 "vsx_register_operand"))]
   "!BYTES_BIG_ENDIAN && TARGET_VSX && !TARGET_P9_VECTOR && reload_completed"
   [(set (match_dup 1)
-        (vec_select:V8HI_V8HF
+        (vec_select:VECTOR_16BIT
           (match_dup 1)
           (parallel [(const_int 4) (const_int 5)
                      (const_int 6) (const_int 7)
                      (const_int 0) (const_int 1)
                      (const_int 2) (const_int 3)])))
    (set (match_dup 0)
-        (vec_select:V8HI_V8HF
+        (vec_select:VECTOR_16BIT
           (match_dup 1)
           (parallel [(const_int 4) (const_int 5)
                      (const_int 6) (const_int 7)
                      (const_int 0) (const_int 1)
                      (const_int 2) (const_int 3)])))
    (set (match_dup 1)
-        (vec_select:V8HI_V8HF
+        (vec_select:VECTOR_16BIT
           (match_dup 1)
           (parallel [(const_int 4) (const_int 5)
                      (const_int 6) (const_int 7)
@@ -1450,9 +1462,9 @@
   [(set_attr "type" "vecload")])
 
 (define_expand "vsx_ld_elemrev_<mode>"
-  [(set (match_operand:V8HI_V8HF 0 "vsx_register_operand" "=wa")
-        (vec_select:V8HI_V8HF
-	  (match_operand:V8HI_V8HF 1 "memory_operand" "Z")
+  [(set (match_operand:VECTOR_16BIT 0 "vsx_register_operand" "=wa")
+        (vec_select:VECTOR_16BIT
+	  (match_operand:VECTOR_16BIT 1 "memory_operand" "Z")
 	  (parallel [(const_int 7) (const_int 6)
 	             (const_int 5) (const_int 4)
 		     (const_int 3) (const_int 2)
@@ -1484,9 +1496,9 @@
 })
 
 (define_insn "*vsx_ld_elemrev_<mode>_internal"
-  [(set (match_operand:V8HI_V8HF 0 "vsx_register_operand" "=wa")
-        (vec_select:V8HI_V8HF
-          (match_operand:V8HI_V8HF 1 "memory_operand" "Z")
+  [(set (match_operand:VECTOR_16BIT 0 "vsx_register_operand" "=wa")
+        (vec_select:VECTOR_16BIT
+          (match_operand:VECTOR_16BIT 1 "memory_operand" "Z")
           (parallel [(const_int 7) (const_int 6)
                      (const_int 5) (const_int 4)
                      (const_int 3) (const_int 2)
@@ -1600,9 +1612,9 @@
   [(set_attr "type" "vecstore")])
 
 (define_expand "vsx_st_elemrev_<mode>"
-  [(set (match_operand:V8HI_V8HF 0 "memory_operand" "=Z")
-        (vec_select:V8HI_V8HF
-          (match_operand:V8HI_V8HF 1 "vsx_register_operand" "wa")
+  [(set (match_operand:VECTOR_16BIT 0 "memory_operand" "=Z")
+        (vec_select:VECTOR_16BIT
+          (match_operand:VECTOR_16BIT 1 "vsx_register_operand" "wa")
           (parallel [(const_int 7) (const_int 6)
                      (const_int 5) (const_int 4)
                      (const_int 3) (const_int 2)
@@ -1642,9 +1654,9 @@
   [(set_attr "type" "vecstore")])
 
 (define_insn "*vsx_st_elemrev_<mode>_internal"
-  [(set (match_operand:V8HI_V8HF 0 "memory_operand" "=Z")
-        (vec_select:V8HI_V8HF
-          (match_operand:V8HI_V8HF 1 "vsx_register_operand" "wa")
+  [(set (match_operand:VECTOR_16BIT 0 "memory_operand" "=Z")
+        (vec_select:VECTOR_16BIT
+          (match_operand:VECTOR_16BIT 1 "vsx_register_operand" "wa")
           (parallel [(const_int 7) (const_int 6)
                      (const_int 5) (const_int 4)
                      (const_int 3) (const_int 2)
@@ -3335,9 +3347,9 @@
   [(set_attr "type" "vecperm")])
 
 (define_insn "xxswapd_<mode>"
-  [(set (match_operand:V8HI_V8HF 0 "vsx_register_operand" "=wa")
-	(vec_select:V8HI_V8HF
-	  (match_operand:V8HI_V8HF 1 "vsx_register_operand" "wa")
+  [(set (match_operand:VECTOR_16BIT 0 "vsx_register_operand" "=wa")
+	(vec_select:VECTOR_16BIT
+	  (match_operand:VECTOR_16BIT 1 "vsx_register_operand" "wa")
 	  (parallel [(const_int 4) (const_int 5)
 		     (const_int 6) (const_int 7)
 		     (const_int 0) (const_int 1)
@@ -3438,9 +3450,9 @@
   [(set_attr "type" "vecload")])
 
 (define_insn "*vsx_lxvd2x8_le_<MODE>"
-  [(set (match_operand:V8HI_V8HF 0 "vsx_register_operand" "=wa")
-        (vec_select:V8HI_V8HF
-          (match_operand:V8HI_V8HF 1 "memory_operand" "Z")
+  [(set (match_operand:VECTOR_16BIT 0 "vsx_register_operand" "=wa")
+        (vec_select:VECTOR_16BIT
+          (match_operand:VECTOR_16BIT 1 "memory_operand" "Z")
           (parallel [(const_int 4) (const_int 5)
                      (const_int 6) (const_int 7)
                      (const_int 0) (const_int 1)
@@ -3514,9 +3526,9 @@
    (set_attr "length" "8")])
 
 (define_insn "*vsx_stxvd2x8_le_<MODE>"
-  [(set (match_operand:V8HI_V8HF 0 "memory_operand" "=Z")
-        (vec_select:V8HI_V8HF
-          (match_operand:V8HI_V8HF 1 "vsx_register_operand" "wa")
+  [(set (match_operand:VECTOR_16BIT 0 "memory_operand" "=Z")
+        (vec_select:VECTOR_16BIT
+          (match_operand:VECTOR_16BIT 1 "vsx_register_operand" "wa")
           (parallel [(const_int 4) (const_int 5)
                      (const_int 6) (const_int 7)
                      (const_int 0) (const_int 1)
@@ -4095,7 +4107,8 @@
   if (which_alternative == 0
       && ((<MODE>mode == V16QImode
 	   && INTVAL (operands[2]) == (BYTES_BIG_ENDIAN ? 7 : 8))
-	  || ((<MODE>mode == V8HImode || <MODE>mode == V8HFmode)
+	  || ((<MODE>mode == V8HImode || <MODE>mode == V8HFmode
+	      || <MODE>mode == V8BFmode)
 	      && INTVAL (operands[2]) == (BYTES_BIG_ENDIAN ? 3 : 4))))
     {
       enum machine_mode dest_mode = GET_MODE (operands[0]);
@@ -4174,7 +4187,8 @@
       else
 	vec_tmp = src;
     }
-  else if (<MODE>mode == V8HImode || <MODE>mode == V8HFmode)
+  else if (<MODE>mode == V8HImode || <MODE>mode == V8HFmode
+	   || <MODE>mode == V8BFmode)
     {
       if (value != 3)
 	emit_insn (gen_altivec_vsplth_direct (vec_tmp, src, element));


More information about the Gcc-cvs mailing list