[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