[gcc(refs/users/meissner/heads/work078)] Don't do int cmoves for IEEE comparisons.

Michael Meissner meissner@gcc.gnu.org
Thu Feb 17 03:52:25 GMT 2022


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

commit c4eee68ab4248600dcfdf23dffdeffcfc2ae5e0a
Author: Michael Meissner <meissner@linux.ibm.com>
Date:   Wed Feb 16 22:52:07 2022 -0500

    Don't do int cmoves for IEEE comparisons.
    
    Protect int cmove from raising an assertion if it is trying to do an int
    conditional move where the test involves IEEE comparisons that must be
    done with a CCFPmode instead of the CCmode normally used for int cmoves.
    
    2022-02-16  Michael Meissner  <meissner@the-meissners.org>
    
    gcc/
            PR target/104256
            * config/rs6000/rs6000.cc (rs6000_emit_int_cmove): Don't do
            integer conditional moves if the test involves IEEE comparisons.

Diff:
---
 gcc/config/rs6000/rs6000.cc | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index f56cf66313a..10af34fca69 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -16181,6 +16181,15 @@ rs6000_emit_int_cmove (rtx dest, rtx op, rtx true_cond, rtx false_cond)
   if (mode != SImode && (!TARGET_POWERPC64 || mode != DImode))
     return false;
 
+  /* Don't do int cmoves for IEEE comparisons.  The rs6000_generate_compare
+     function will eventually raise an exception because the mode used is
+     CCmode (due to this being an int cmove), but you can only do these
+     comparsions with CCFP mode.  */
+  enum rtx_code op_code = GET_CODE (op);
+  if (op_code == ORDERED || op_code == UNORDERED || op_code == UNEQ || op_code == LTGT
+      || op_code == UNGT || op_code == UNLT || op_code == UNGE || op_code == UNLE)
+    return false;
+					
   /* We still have to do the compare, because isel doesn't do a
      compare, it just looks at the CRx bits set by a previous compare
      instruction.  */


More information about the Gcc-cvs mailing list