diff --git a/gcc/config.gcc b/gcc/config.gcc index 0defa13dc69..bae0c640e27 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -1764,7 +1764,7 @@ epiphany-*-elf | epiphany-*-rtems*) extra_headers="epiphany_intrinsics.h" ;; *-fcx-*) - tm_file="${tm_file} elfos.h gnu-user.h freebsd-spec.h newlib-stdint.h rs6000/sysv4.h rs6000/eabi.h rs6000/eabialtivec.h" + tm_file="${tm_file} elfos.h gnu-user.h freebsd-spec.h newlib-stdint.h rs6000/sysv4.h rs6000/eabi.h rs6000/eabialtivec.h rs6000/xenon.h" extra_options="${extra_options} rs6000/sysv4.opt" tmake_file="rs6000/t-fprules rs6000/t-ppcendian rs6000/t-ppccomm" use_gcc_stdint=wrap diff --git a/gcc/config/rs6000/rs6000-logue.cc b/gcc/config/rs6000/rs6000-logue.cc index edc0d6c8f52..acfbd846585 100644 --- a/gcc/config/rs6000/rs6000-logue.cc +++ b/gcc/config/rs6000/rs6000-logue.cc @@ -767,7 +767,7 @@ rs6000_stack_info (void) RS6000_ALIGN (crtl->outgoing_args_size + info->fixed_size, STACK_BOUNDARY / BITS_PER_UNIT) - info->fixed_size; else - info->parm_size = RS6000_ALIGN (crtl->outgoing_args_size, + info->parm_size = RS6000_ALIGN (crtl->outgoing_args_size, TARGET_ALTIVEC ? 16 : 8); if (FRAME_GROWS_DOWNWARD) info->vars_size @@ -826,34 +826,29 @@ rs6000_stack_info (void) info->lr_save_offset = 2*reg_size; break; - case ABI_V4: - info->fp_save_offset = -info->fp_size; - info->gp_save_offset = info->fp_save_offset - info->gp_size; - info->cr_save_offset = info->gp_save_offset - info->cr_size; + case ABI_V4: /* Just replacing the SV4 ABI with the Xenon one... It's hacky, but I was having trouble defining a special ABI_XENON */ + info->cr_save_p = 0; /* We don't seem to save condition registers on 360 */ + info->gp_save_offset = -0xC - info->gp_size; + info->fp_save_offset = info->gp_save_offset - info->fp_size; + info->vrsave_save_offset = info->fp_save_offset - info->vrsave_size; - if (TARGET_ALTIVEC_ABI) - { - info->vrsave_save_offset = info->cr_save_offset - info->vrsave_size; + /* Align stack so vector save area is on a quadword boundary. */ + if (info->altivec_size != 0) + info->altivec_padding_size = 16 - (-info->vrsave_save_offset % 16); - /* Align stack so vector save area is on a quadword boundary. */ - if (info->altivec_size != 0) - info->altivec_padding_size = 16 - (-info->vrsave_save_offset % 16); - - info->altivec_save_offset = info->vrsave_save_offset + info->altivec_save_offset = info->vrsave_save_offset - info->altivec_padding_size - info->altivec_size; - /* Adjust for AltiVec case. */ - info->ehrd_offset = info->altivec_save_offset; - } - else - info->ehrd_offset = info->cr_save_offset; + /* Adjust for AltiVec case. */ + info->ehrd_offset = info->altivec_save_offset; - info->ehrd_offset -= ehrd_size; - info->lr_save_offset = reg_size; + info->ehrd_offset -= ehrd_size; + info->lr_save_offset = -0x8; + break; } - save_align = (TARGET_ALTIVEC_ABI || DEFAULT_ABI == ABI_DARWIN) ? 16 : 8; + save_align = ((TARGET_ALTIVEC_ABI || DEFAULT_ABI == ABI_DARWIN) && DEFAULT_ABI != ABI_V4) ? 16 : 8; info->save_size = RS6000_ALIGN (info->fp_size + info->gp_size + info->altivec_size @@ -947,7 +942,7 @@ debug_stack_info (rs6000_stack_t *info) case ABI_AIX: abi_string = "AIX"; break; case ABI_ELFv2: abi_string = "ELFv2"; break; case ABI_DARWIN: abi_string = "Darwin"; break; - case ABI_V4: abi_string = "V.4"; break; + case ABI_V4: abi_string = "Xenon"; break; } fprintf (stderr, "\tABI = %5s\n", abi_string); diff --git a/gcc/config/rs6000/xenon.h b/gcc/config/rs6000/xenon.h new file mode 100644 index 00000000000..5fe48741cef --- /dev/null +++ b/gcc/config/rs6000/xenon.h @@ -0,0 +1,49 @@ +/* Redefinitions for FreeChainXenon + Copyright (C) 2025 Aiden Isik + + This file is part of GCC. + + GCC is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 3, or (at your + option) any later version. + + GCC is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU General Public License + along with GCC; see the file COPYING3. If not see + . */ + +#undef TARGET_DEBUG_STACK +#define TARGET_DEBUG_STACK 1 + +/* Force the pointer size to 32 bits (even though we run in 64-bit mode) */ +//#undef POINTER_SIZE +//#define POINTER_SIZE 32 + +/* Change the fixed area for the 360's stack frame convention */ +#undef RS6000_SAVE_AREA +#define RS6000_SAVE_AREA 0x10 + (RS6000_ALIGN (crtl->outgoing_args_size.to_constant (), 16) - crtl->outgoing_args_size.to_constant ()) + 0x40 + +/* Redefine the starting frame offset, since it relies on the size of the fixed area */ +#undef RS6000_STARTING_FRAME_OFFSET +#define RS6000_STARTING_FRAME_OFFSET \ + (cfun->calls_alloca \ + ? (RS6000_ALIGN (crtl->outgoing_args_size + RS6000_SAVE_AREA, 16)) \ + : (RS6000_ALIGN (crtl->outgoing_args_size, 16) + RS6000_SAVE_AREA)) + +/* Redefine the offset of the first stack argument, since it relies on the size of the fixed area */ +#undef FIRST_PARM_OFFSET +#define FIRST_PARM_OFFSET(FNDECL) RS6000_SAVE_AREA + +/* Redefine stack pointer offset, since it relies on the size of the fixed area */ +#undef STACK_POINTER_OFFSET +#define STACK_POINTER_OFFSET RS6000_SAVE_AREA + +/* Redefine the offset from the stack pointer to items allocated by alloca() and friends */ +#undef STACK_DYNAMIC_OFFSET +#define STACK_DYNAMIC_OFFSET(FUNDECL) \ + RS6000_ALIGN (crtl->outgoing_args_size.to_constant () + STACK_POINTER_OFFSET, 16)