From 862467c578545a4a7ed83767df2a181e7d845bc6 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 28 Dec 2024 23:38:31 -0800 Subject: [PATCH] m68k: TARGET_CAN_CHANGE_MODE_CLASS is false for FP regs Just like i386, you cannot extract float or double values by using the low bits of m68k float registers. Override this hook and check that case. Signed-off-by: Keith Packard --- gcc/config/m68k/m68k.cc | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/gcc/config/m68k/m68k.cc b/gcc/config/m68k/m68k.cc index 050ac096e55fa..54bcfaffa72c2 100644 --- a/gcc/config/m68k/m68k.cc +++ b/gcc/config/m68k/m68k.cc @@ -200,6 +200,7 @@ static void m68k_asm_final_postscan_insn (FILE *, rtx_insn *insn, rtx [], int); static HARD_REG_SET m68k_zero_call_used_regs (HARD_REG_SET); static machine_mode m68k_c_mode_for_floating_type (enum tree_index); static bool m68k_use_lra_p (void); +static bool m68k_can_change_mode_class (machine_mode from, machine_mode to, reg_class_t rclass); /* Initialize the GCC target structure. */ @@ -370,6 +371,9 @@ static bool m68k_use_lra_p (void); #undef TARGET_C_MODE_FOR_FLOATING_TYPE #define TARGET_C_MODE_FOR_FLOATING_TYPE m68k_c_mode_for_floating_type +#undef TARGET_CAN_CHANGE_MODE_CLASS +#define TARGET_CAN_CHANGE_MODE_CLASS m68k_can_change_mode_class + TARGET_GNU_ATTRIBUTES (m68k_attribute_table, { /* { name, min_len, max_len, decl_req, type_req, fn_type_req, @@ -7269,4 +7273,22 @@ m68k_use_lra_p () return m68k_lra_p; } +/* Implement TARGET_CAN_CHANGE_MODE_CLASS. */ + +static bool +m68k_can_change_mode_class (machine_mode from, + machine_mode to, + reg_class_t rclass) +{ + if (from == to) + return true; + + /* 68881 registers can't do subreg at all, as all values are reformatted + to extended precision. */ + if (reg_classes_intersect_p(rclass, FP_REGS)) + return false; + + return true; +} + #include "gt-m68k.h"