aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2024-07-29 13:10:18 +0200
committerRichard Biener <rguenth@gcc.gnu.org>2024-08-01 12:27:47 +0200
commitc71646436a55afdd36948d7e7292b3bd5de04e1a (patch)
treee145439befe38ee2dc9302ab68dff07d76bb2b68
parentb3974356b0981c7caf9694fe4c2faad902169c00 (diff)
downloadgcc-c71646436a55afdd36948d7e7292b3bd5de04e1a.zip
gcc-c71646436a55afdd36948d7e7292b3bd5de04e1a.tar.gz
gcc-c71646436a55afdd36948d7e7292b3bd5de04e1a.tar.bz2
[x86] implement TARGET_MODE_CAN_TRANSFER_BITS
The following implements the hook, excluding x87 modes for scalar and complex float modes. * config/i386/i386.cc (TARGET_MODE_CAN_TRANSFER_BITS): Define. (ix86_mode_can_transfer_bits): New function.
-rw-r--r--gcc/config/i386/i386.cc22
1 files changed, 22 insertions, 0 deletions
diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
index 77c4418..8f289b5 100644
--- a/gcc/config/i386/i386.cc
+++ b/gcc/config/i386/i386.cc
@@ -26105,6 +26105,25 @@ ix86_have_ccmp ()
return (bool) TARGET_APX_CCMP;
}
+/* Implement TARGET_MODE_CAN_TRANSFER_BITS. */
+static bool
+ix86_mode_can_transfer_bits (machine_mode mode)
+{
+ if (GET_MODE_CLASS (mode) == MODE_FLOAT
+ || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
+ switch (GET_MODE_INNER (mode))
+ {
+ case SFmode:
+ case DFmode:
+ /* These suffer from normalization upon load when not using SSE. */
+ return !(ix86_fpmath & FPMATH_387);
+ default:
+ return true;
+ }
+
+ return true;
+}
+
/* Target-specific selftests. */
#if CHECKING_P
@@ -26951,6 +26970,9 @@ ix86_libgcc_floating_mode_supported_p
#undef TARGET_HAVE_CCMP
#define TARGET_HAVE_CCMP ix86_have_ccmp
+#undef TARGET_MODE_CAN_TRANSFER_BITS
+#define TARGET_MODE_CAN_TRANSFER_BITS ix86_mode_can_transfer_bits
+
static bool
ix86_libc_has_fast_function (int fcode ATTRIBUTE_UNUSED)
{