diff options
author | Richard Biener <rguenther@suse.de> | 2024-07-29 13:10:18 +0200 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2024-08-01 12:27:47 +0200 |
commit | c71646436a55afdd36948d7e7292b3bd5de04e1a (patch) | |
tree | e145439befe38ee2dc9302ab68dff07d76bb2b68 | |
parent | b3974356b0981c7caf9694fe4c2faad902169c00 (diff) | |
download | gcc-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.cc | 22 |
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) { |