On Thu, Feb 26, 2026 at 8:39 AM H.J. Lu <[email protected]> wrote: > > TARGET_PROMOTE_PROTOTYPES is an optimization, not an ABI requirement. > TARGET_PROMOTE_FUNCTION_MODE should be used for ABI requirement. Like > xtensa, mcore ABI requires sign extension of signed 8/16-bit integer > arguments to 32 bits and zero extension of unsigned integer 8/16-bit > arguments to 32 bits: > > 1. Rename xtensa_promote_function_mode to > default_promote_function_mode_sign_extend to sign-extend signed 8/16-bit > integer arguments to 32 bits and zero-extend of unsigned 8/16-bit > integer arguments to 32 bits. > 2. Replace xtensa_promote_function_mode with > default_promote_function_mode_sign_extend. > 3. Remove TARGET_PROMOTE_PROTOTYPES for mcore and define > TARGET_PROMOTE_FUNCTION_MODE with > default_promote_function_mode_sign_extend to properly extend 8/16-bit > arguments to 32 bits. > > Targets with the same ABI requirement should define > TARGET_PROMOTE_FUNCTION_MODE with > default_promote_function_mode_sign_extend. > > gcc/ > > PR target/119979 > PR target/120888 > * targhooks.cc (default_promote_function_mode_sign_extend): New. > * targhooks.h (default_promote_function_mode_sign_extend): > Likewise. > * config/mcore/mcore.cc (TARGET_PROMOTE_FUNCTION_MODE): Use > default_promote_function_mode_sign_extend. > (TARGET_PROMOTE_PROTOTYPES): Removed. > * config/xtensa/xtensa.cc (xtensa_promote_function_mode): Removed. > (TARGET_PROMOTE_FUNCTION_MODE): Use > default_promote_function_mode_sign_extend. > > gcc/testsuite/ > > PR target/119979 > PR target/120888 > * gcc.target/xtensa/pr120888-1.c: Removed to ... > * gcc.dg/zero-extend.c: This. Enable for mcore and xtensa. > * gcc.target/xtensa/pr120888-2.c: Removed to ... > * gcc.dg/sign-extend.c: This. Enable for mcore and xtensa. > > > -- > H.J.
Add the missing patch. -- H.J.
From fae8b68b2381d54eb3ec74b0c334f1ae96e92aae Mon Sep 17 00:00:00 2001 From: "H.J. Lu" <[email protected]> Date: Thu, 1 Jan 2026 07:14:57 +0800 Subject: [PATCH] Add default_promote_function_mode_sign_extend TARGET_PROMOTE_PROTOTYPES is an optimization, not an ABI requirement. TARGET_PROMOTE_FUNCTION_MODE should be used for ABI requirement. Like xtensa, mcore ABI requires sign extension of signed 8/16-bit integer arguments to 32 bits and zero extension of unsigned integer 8/16-bit arguments to 32 bits: 1. Rename xtensa_promote_function_mode to default_promote_function_mode_sign_extend to sign-extend signed 8/16-bit integer arguments to 32 bits and zero-extend of unsigned 8/16-bit integer arguments to 32 bits. 2. Replace xtensa_promote_function_mode with default_promote_function_mode_sign_extend. 3. Remove TARGET_PROMOTE_PROTOTYPES for mcore and define TARGET_PROMOTE_FUNCTION_MODE with default_promote_function_mode_sign_extend to properly extend 8/16-bit arguments to 32 bits. Targets with the same ABI requirement should define TARGET_PROMOTE_FUNCTION_MODE with default_promote_function_mode_sign_extend. gcc/ PR target/119979 PR target/120888 * targhooks.cc (default_promote_function_mode_sign_extend): New. * targhooks.h (default_promote_function_mode_sign_extend): Likewise. * config/mcore/mcore.cc (TARGET_PROMOTE_FUNCTION_MODE): Use default_promote_function_mode_sign_extend. (TARGET_PROMOTE_PROTOTYPES): Removed. * config/xtensa/xtensa.cc (xtensa_promote_function_mode): Removed. (TARGET_PROMOTE_FUNCTION_MODE): Use default_promote_function_mode_sign_extend. gcc/testsuite/ PR target/119979 PR target/120888 * gcc.target/xtensa/pr120888-1.c: Removed to ... * gcc.dg/zero-extend.c: This. Enable for mcore and xtensa. * gcc.target/xtensa/pr120888-2.c: Removed to ... * gcc.dg/sign-extend.c: This. Enable for mcore and xtensa. Signed-off-by: H.J. Lu <[email protected]> --- gcc/config/mcore/mcore.cc | 6 ++---- gcc/config/xtensa/xtensa.cc | 20 ++----------------- gcc/targhooks.cc | 17 ++++++++++++++++ gcc/targhooks.h | 2 ++ .../pr120888-2.c => gcc.dg/sign-extend.c} | 2 +- .../pr120888-1.c => gcc.dg/zero-extend.c} | 2 +- 6 files changed, 25 insertions(+), 24 deletions(-) rename gcc/testsuite/{gcc.target/xtensa/pr120888-2.c => gcc.dg/sign-extend.c} (80%) rename gcc/testsuite/{gcc.target/xtensa/pr120888-1.c => gcc.dg/zero-extend.c} (80%) diff --git a/gcc/config/mcore/mcore.cc b/gcc/config/mcore/mcore.cc index 9be652e3748..e5ee2c1fc74 100644 --- a/gcc/config/mcore/mcore.cc +++ b/gcc/config/mcore/mcore.cc @@ -202,10 +202,8 @@ TARGET_GNU_ATTRIBUTES (mcore_attribute_table, #define TARGET_MACHINE_DEPENDENT_REORG mcore_reorg #undef TARGET_PROMOTE_FUNCTION_MODE -#define TARGET_PROMOTE_FUNCTION_MODE default_promote_function_mode_always_promote -#undef TARGET_PROMOTE_PROTOTYPES -#define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true - +#define TARGET_PROMOTE_FUNCTION_MODE \ + default_promote_function_mode_sign_extend #undef TARGET_RETURN_IN_MEMORY #define TARGET_RETURN_IN_MEMORY mcore_return_in_memory #undef TARGET_MUST_PASS_IN_STACK diff --git a/gcc/config/xtensa/xtensa.cc b/gcc/config/xtensa/xtensa.cc index c2a6a161066..d9420bb2cda 100644 --- a/gcc/config/xtensa/xtensa.cc +++ b/gcc/config/xtensa/xtensa.cc @@ -158,10 +158,6 @@ static void xtensa_asm_trampoline_template (FILE *); static void xtensa_trampoline_init (rtx, tree, rtx); static bool xtensa_output_addr_const_extra (FILE *, rtx); static bool xtensa_cannot_force_const_mem (machine_mode, rtx); -static machine_mode xtensa_promote_function_mode (const_tree, - machine_mode, - int *, const_tree, - int); static reg_class_t xtensa_preferred_reload_class (rtx, reg_class_t); static reg_class_t xtensa_preferred_output_reload_class (rtx, reg_class_t); @@ -242,7 +238,8 @@ static rtx_insn *xtensa_md_asm_adjust (vec<rtx> &, vec<rtx> &, #define TARGET_EXPAND_BUILTIN_VA_START xtensa_va_start #undef TARGET_PROMOTE_FUNCTION_MODE -#define TARGET_PROMOTE_FUNCTION_MODE xtensa_promote_function_mode +#define TARGET_PROMOTE_FUNCTION_MODE \ + default_promote_function_mode_sign_extend #undef TARGET_RETURN_IN_MEMORY #define TARGET_RETURN_IN_MEMORY xtensa_return_in_memory @@ -4675,19 +4672,6 @@ xtensa_insn_cost (rtx_insn *insn, bool speed) return pattern_cost (PATTERN (insn), speed); } -/* Worker function for TARGET_PROMOTE_FUNCTION_MODE. */ - -static machine_mode -xtensa_promote_function_mode (const_tree type, machine_mode mode, - int *punsignedp, const_tree, int) -{ - if (GET_MODE_CLASS (mode) == MODE_INT - && GET_MODE_SIZE (mode) < GET_MODE_SIZE (SImode)) - return SImode; - - return promote_mode (type, mode, punsignedp); -} - /* Worker function for TARGET_RETURN_IN_MEMORY. */ static bool diff --git a/gcc/targhooks.cc b/gcc/targhooks.cc index 7cb48192255..5f1eac75122 100644 --- a/gcc/targhooks.cc +++ b/gcc/targhooks.cc @@ -162,6 +162,23 @@ default_promote_function_mode_always_promote (const_tree type, return promote_mode (type, mode, punsignedp); } +/* Sign-extend signed 8/16-bit integer arguments to 32 bits and + zero-extend unsigned 8/16-bit integer arguments to 32 bits. */ + +machine_mode +default_promote_function_mode_sign_extend (const_tree type, + machine_mode mode, + int *punsignedp, + const_tree, int) +{ + if (GET_MODE_CLASS (mode) == MODE_INT + && (GET_MODE_SIZE (as_a <scalar_int_mode> (mode)) + < GET_MODE_SIZE (SImode))) + return SImode; + + return promote_mode (type, mode, punsignedp); +} + machine_mode default_cc_modes_compatible (machine_mode m1, machine_mode m2) { diff --git a/gcc/targhooks.h b/gcc/targhooks.h index dc24eec5e04..9582233e69f 100644 --- a/gcc/targhooks.h +++ b/gcc/targhooks.h @@ -33,6 +33,8 @@ extern machine_mode default_promote_function_mode (const_tree, machine_mode, int *, const_tree, int); extern machine_mode default_promote_function_mode_always_promote (const_tree, machine_mode, int *, const_tree, int); +extern machine_mode default_promote_function_mode_sign_extend + (const_tree, machine_mode, int *, const_tree, int); extern machine_mode default_cc_modes_compatible (machine_mode, machine_mode); diff --git a/gcc/testsuite/gcc.target/xtensa/pr120888-2.c b/gcc/testsuite/gcc.dg/sign-extend.c similarity index 80% rename from gcc/testsuite/gcc.target/xtensa/pr120888-2.c rename to gcc/testsuite/gcc.dg/sign-extend.c index 9b5caad8329..3ded5050d17 100644 --- a/gcc/testsuite/gcc.target/xtensa/pr120888-2.c +++ b/gcc/testsuite/gcc.dg/sign-extend.c @@ -1,4 +1,4 @@ -/* { dg-do compile } */ +/* { dg-do compile { target mcore-*-* xtensa-*-* } } */ /* { dg-options "-O1 -fdump-rtl-expand" } */ void s8(signed char c); diff --git a/gcc/testsuite/gcc.target/xtensa/pr120888-1.c b/gcc/testsuite/gcc.dg/zero-extend.c similarity index 80% rename from gcc/testsuite/gcc.target/xtensa/pr120888-1.c rename to gcc/testsuite/gcc.dg/zero-extend.c index f438e4c676c..22671e56897 100644 --- a/gcc/testsuite/gcc.target/xtensa/pr120888-1.c +++ b/gcc/testsuite/gcc.dg/zero-extend.c @@ -1,4 +1,4 @@ -/* { dg-do compile } */ +/* { dg-do compile { target mcore-*-* xtensa-*-* } } */ /* { dg-options "-O1 -fdump-rtl-expand" } */ void u8(unsigned char c); -- 2.53.0
