From: Nick Clifton Date: Fri, 25 Jan 2002 11:44:12 +0000 (+0000) Subject: Allow any general purpose register to hold an SImode (or smaller) value. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=55492b32d768d06b1fee8bcade2ac198c3b8aee4;p=gcc.git Allow any general purpose register to hold an SImode (or smaller) value. From-SVN: r49213 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 52937b1639a..a76845cffaa 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-01-25 Nick Clifton + + * config/arm/arm.c (arm_hard_regno_mode_ok): Allow any general + purpose register to hold an SImode (or smaller) value. + 2002-01-25 Jakub Jelinek * unwind-dw2-fde-glibc.c: If inhibit_libc, use __register_frame* diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 1999af04e4e..dd823a2b206 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -9139,24 +9139,20 @@ arm_hard_regno_mode_ok (regno, mode) return (NUM_REGS (mode) < 2) || (regno < LAST_LO_REGNUM); if (regno <= LAST_ARM_REGNUM) - /* If the register is a general purpose ARM register we allow - it only if it not a special register (SP, LR, PC) and only - if there will be enough (non-special) registers to hold the - entire value. */ - { - /* As a special exception we allow an SImode value to be - "assigned" to the stack pointer. This is not intended - to actually allow a value to be stored in the SP, but so - that the stack pointer can be referenced from C code like - this: - - register char * stack_ptr asm ("sp"); - - This expression is actually used in newlib... */ - if (mode == SImode && regno == SP_REGNUM) - return 1; - return regno < (SP_REGNUM - (unsigned) NUM_REGS (mode)); - } + /* We allow an SImode or smaller value to be stored in any + general purpose register. This does not mean, for example + that GCC will choose to store a variable in the stack pointer + since it is a fixed register. But it is important to allow + access to these special registers, so that they can be + referenced from C code via the asm assembler alias, eg: + + register char * stack_ptr asm ("sp"); + + For any mode requiring more than one register to hold the + value we restrict the choice so that r13, r14, and r15 + cannot be part of the register set. */ + return (NUM_REGS (mode) <= 1) + || (regno < (SP_REGNUM - (unsigned) NUM_REGS (mode))); if ( regno == FRAME_POINTER_REGNUM || regno == ARG_POINTER_REGNUM)