[gcc(refs/users/meissner/heads/work098)] Add ibm128_operand.

Michael Meissner meissner@gcc.gnu.org
Wed Aug 17 05:38:52 GMT 2022


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

commit e3549bbd67c77303823e541e08cdbb9d67b7db71
Author: Michael Meissner <meissner@linux.ibm.com>
Date:   Wed Aug 17 01:38:28 2022 -0400

    Add ibm128_operand.
    
    Since we have 2 modes for IBM 128-bit (IFmode and TFmode if long double is IBM
    128-bit), this patch provides a new predicate (ibm128_operand) that allows
    combining a conversion from one mode to another.
    
    2022-08-17   Michael Meissner  <meissner@linux.ibm.com>
    
    gcc/
    
            * config/rs6000/predicates.md (ibm128_operand): New predicate.
            * config/rs6000/rs6000.md (extendiftf2_internal): Add GPR registers in
            case -msoft-float is used.
            (extendtfif2_internal): Likewise.
            (unpack<mode>): Use ibm128_operand.
            (unpack<mode>_dm): Likewise.
            (unpack<mode>_nodm): Likewise.

Diff:
---
 gcc/config/rs6000/predicates.md | 23 +++++++++++++++++++++++
 gcc/config/rs6000/rs6000.md     | 15 +++++++--------
 2 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md
index dfc6eb8aa83..5bbb5c30bbb 100644
--- a/gcc/config/rs6000/predicates.md
+++ b/gcc/config/rs6000/predicates.md
@@ -144,6 +144,29 @@
   return altivec_register_operand (op, mode);
 })
 
+;; Return 1 if op is an IBM 128-bit floating point type.  We allow the operand
+;; to be converted from a mode that also supports IBM 128-bit.
+(define_predicate "ibm128_operand"
+  (match_code "reg,subreg,float_extend,float_truncate")
+{
+  if (mode == VOIDmode)
+    mode = GET_MODE (op);
+
+  if (!FLOAT128_IBM_P (mode))
+    return 0;
+
+  /* Allow conversions from another IBM 128-bit mode.  */
+  if (GET_CODE (op) == FLOAT_EXTEND || GET_CODE (op) == FLOAT_TRUNCATE)
+    {
+      op = XEXP (op, 0);
+      mode = GET_MODE (op);
+      if (!FLOAT128_IBM_P (mode))
+	return 0;
+    }
+
+  return register_operand (op, mode);
+})
+
 ;; Return 1 if op is a vector register that operates on floating point vectors
 ;; (either altivec or VSX).
 (define_predicate "vfloat_operand"
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index e0f6a3749a6..1905e4cc6c6 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -9170,9 +9170,9 @@
 
 ;; Convert between IFmode and TFmode when -mabi=ibmlongdouble
 (define_insn_and_split "*extendiftf2_internal"
-  [(set (match_operand:TF 0 "gpc_reg_operand" "=d,&d")
+  [(set (match_operand:TF 0 "gpc_reg_operand" "=d,&d,r,r")
 	(float_extend:TF
-	 (match_operand:IF 1 "input_operand" "0,d")))]
+	 (match_operand:IF 1 "input_operand" "0,d,0,r")))]
    "FLOAT128_IBM_P (TFmode)"
   "#"
   "&& reload_completed"
@@ -9190,9 +9190,9 @@
    (set_attr "num_insns" "2")])
 
 (define_insn_and_split "*extendtfif2_internal"
-  [(set (match_operand:IF 0 "gpc_reg_operand" "=d,&d")
+  [(set (match_operand:IF 0 "gpc_reg_operand" "=d,&d,r,&r")
 	(float_extend:IF
-	 (match_operand:TF 1 "input_operand" "0,d")))]
+	 (match_operand:TF 1 "input_operand" "0,d,0,r")))]
    "FLOAT128_IBM_P (TFmode)"
   "#"
   "&& reload_completed"
@@ -14614,7 +14614,7 @@
 (define_expand "unpack<mode>"
   [(set (match_operand:<FP128_64> 0 "nonimmediate_operand")
 	(unspec:<FP128_64>
-	 [(match_operand:FMOVE128 1 "register_operand")
+	 [(match_operand:FMOVE128 1 "ibm128_operand")
 	  (match_operand:QI 2 "const_0_to_1_operand")]
 	 UNSPEC_UNPACK_128BIT))]
   "FLOAT128_2REG_P (<MODE>mode)"
@@ -14623,7 +14623,7 @@
 (define_insn_and_split "unpack<mode>_dm"
   [(set (match_operand:<FP128_64> 0 "nonimmediate_operand" "=d,m,d,r,m")
 	(unspec:<FP128_64>
-	 [(match_operand:FMOVE128 1 "register_operand" "d,d,r,d,r")
+	 [(match_operand:FMOVE128 1 "ibm128_operand" "d,d,r,d,r")
 	  (match_operand:QI 2 "const_0_to_1_operand" "i,i,i,i,i")]
 	 UNSPEC_UNPACK_128BIT))]
   "TARGET_POWERPC64 && TARGET_DIRECT_MOVE && FLOAT128_2REG_P (<MODE>mode)"
@@ -14646,7 +14646,7 @@
 (define_insn_and_split "unpack<mode>_nodm"
   [(set (match_operand:<FP128_64> 0 "nonimmediate_operand" "=d,m,m")
 	(unspec:<FP128_64>
-	 [(match_operand:FMOVE128 1 "register_operand" "d,d,r")
+	 [(match_operand:FMOVE128 1 "ibm128_operand" "d,d,r")
 	  (match_operand:QI 2 "const_0_to_1_operand" "i,i,i")]
 	 UNSPEC_UNPACK_128BIT))]
   "(!TARGET_POWERPC64 || !TARGET_DIRECT_MOVE) && FLOAT128_2REG_P (<MODE>mode)"
@@ -14756,7 +14756,6 @@
   "xxpermdi %x0,%x1,%x2,0"
   [(set_attr "type" "vecperm")])
 
-
 
 ;; ISA 2.08 IEEE 128-bit floating point support.


More information about the Gcc-cvs mailing list