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

commit bbc09fa267bf2886ceda4198a93ef25073f8c11a
Author: Michael Meissner <[email protected]>
Date:   Mon Sep 21 15:48:55 2026 -0400

    Rework bfloat16_v4sf_operand
    
    2026-09-21  Michael Meissner  <[email protected]>
    
    gcc/
    
            * config/rs6000/predicates.md (bfloat16_v4sf_operand): Rework.

Diff:
---
 gcc/config/rs6000/predicates.md | 72 +++++++++++++++++++++++++----------------
 1 file changed, 44 insertions(+), 28 deletions(-)

diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md
index 221fd9171629..afe63447eb0d 100644
--- a/gcc/config/rs6000/predicates.md
+++ b/gcc/config/rs6000/predicates.md
@@ -2323,39 +2323,55 @@
   if (mode != BFmode && mode != SFmode)
     return false;
 
-  if (REG_P (op) || SUBREG_P (op))
-    return register_operand (op, mode);
-
-  if (CONST_DOUBLE_P (op))
-    return true;
+  if (mode != GET_MODE (op))
+    return false;
 
-  enum rtx_code icode = GET_CODE (op);
-  if (icode == FLOAT_EXTEND)
+  switch (GET_CODE (op))
     {
-      rtx op_arg = XEXP (op, 0);
-      return (mode == SFmode
-             && GET_MODE (op_arg) == BFmode
-             && (REG_P (op_arg) || SUBREG_P (op_arg)));
-    }
+      case REG:
+      case SUBREG:
+       return register_operand (op, mode);
 
-  if (icode == FLOAT_TRUNCATE)
-    {
-      rtx op_arg = XEXP (op, 0);
-      return (mode == BFmode
-             && GET_MODE (op_arg) == SFmode
-             && (REG_P (op_arg) || SUBREG_P (op_arg)));
-    }
+      case CONST_DOUBLE:
+       return true;
 
-  /* Allow for chained operations.  */
-  if (icode == PLUS || icode == MINUS || icode == MULT)
-    {
-      rtx op0 = XEXP (op, 0);
-      rtx op1 = XEXP (op, 1);
+      case FLOAT_EXTEND:
+       {
+         if (mode != SFmode)
+           return false;
+
+         rtx arg = XEXP (op, 0);
+         machine_mode arg_mode = GET_MODE (arg);
+
+         if (arg_mode != BFmode)
+           return false;
+
+         if (MEM_P (arg))
+           return true;
+
+         return register_operand (arg, arg_mode);
+       }
+
+      case FLOAT_TRUNCATE:
+       {
+          if (mode != BFmode)
+           return false;
+
+         rtx arg = XEXP (op, 0);
+         return (GET_MODE (arg) == SFmode
+                 && GET_CODE (arg) == FLOAT_EXTEND
+                 && GET_MODE (XEXP (arg, 0)) == BFmode);
+       }
+
+        /* Allow for chained operations.  */
+      case PLUS:
+      case MINUS:
+      case MULT:
+        return (bfloat16_v4sf_operand (XEXP (op, 0), mode)
+               && bfloat16_v4sf_operand (XEXP (op, 1), mode));
 
-      return (GET_MODE (op0) == mode
-             && GET_MODE (op1) == mode
-             && bfloat16_v4sf_operand (op0, mode)
-             && bfloat16_v4sf_operand (op1, mode));
+      default:
+       break;
     }
     
   return false;

Reply via email to