The following implements the hook, excluding x87 modes for scalar and complex float modes.
Bootstrapped and tested on x86_64-unknown-linux-gnu. OK this way? Thanks, Richard. * i386.cc (TARGET_MODE_CAN_TRANSFER_BITS): Define. (ix86_mode_can_transfer_bits): New function. --- gcc/config/i386/i386.cc | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc index 12d15feb5e9..9869c44ee15 100644 --- a/gcc/config/i386/i386.cc +++ b/gcc/config/i386/i386.cc @@ -26113,6 +26113,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 @@ -26959,6 +26978,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) { -- 2.43.0