Compare commits

...
Sign in to create a new pull request.

2 commits

3 changed files with 67 additions and 23 deletions

View file

@ -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

View file

@ -826,14 +826,11 @@ 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;
if (TARGET_ALTIVEC_ABI)
{
info->vrsave_save_offset = info->cr_save_offset - info->vrsave_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;
/* Align stack so vector save area is on a quadword boundary. */
if (info->altivec_size != 0)
@ -845,15 +842,13 @@ rs6000_stack_info (void)
/* Adjust for AltiVec case. */
info->ehrd_offset = info->altivec_save_offset;
}
else
info->ehrd_offset = info->cr_save_offset;
info->ehrd_offset -= ehrd_size;
info->lr_save_offset = reg_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);

49
gcc/config/rs6000/xenon.h Normal file
View file

@ -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
<http://www.gnu.org/licenses/>. */
#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)