aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/riscv/riscv.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/riscv/riscv.c')
-rw-r--r--gcc/config/riscv/riscv.c16
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"