diff options
Diffstat (limited to 'gcc/config/riscv/riscv.c')
-rw-r--r-- | gcc/config/riscv/riscv.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/gcc/config/riscv/riscv.c b/gcc/config/riscv/riscv.c index defe8f2..62472e9 100644 --- a/gcc/config/riscv/riscv.c +++ b/gcc/config/riscv/riscv.c @@ -3558,6 +3558,19 @@ riscv_hard_regno_mode_ok (unsigned int regno, machine_mode mode) return true; } +/* Implement TARGET_MODES_TIEABLE_P. + + Don't allow floating-point modes to be tied, since type punning of + single-precision and double-precision is implementation defined. */ + +static bool +riscv_modes_tieable_p (machine_mode mode1, machine_mode mode2) +{ + return (mode1 == mode2 + || !(GET_MODE_CLASS (mode1) == MODE_FLOAT + && GET_MODE_CLASS (mode2) == MODE_FLOAT)); +} + /* Implement HARD_REGNO_NREGS. */ unsigned int @@ -4086,6 +4099,9 @@ riscv_cannot_copy_insn_p (rtx_insn *insn) #undef TARGET_HARD_REGNO_MODE_OK #define TARGET_HARD_REGNO_MODE_OK riscv_hard_regno_mode_ok +#undef TARGET_MODES_TIEABLE_P +#define TARGET_MODES_TIEABLE_P riscv_modes_tieable_p + struct gcc_target targetm = TARGET_INITIALIZER; #include "gt-riscv.h" |