1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- /* Function to force register windows to the stack.
- Copyright (C) 2005, 2007 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- The GNU C Library 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
- Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
- #include <bits/xtensa-config.h>
- #ifdef __XTENSA_WINDOWED_ABI__
- .text
- .align 4
- .literal_position
- .global __window_spill
- .type __window_spill, @function
- __window_spill:
- entry a1, 48
- bbci.l a0, 31, .L4 /* branch if called with call4 */
- bbsi.l a0, 30, .L12 /* branch if called with call12 */
- /* Called with call8: touch register NUM_REGS-12 (4/20/52) */
- .L8:
- #if XCHAL_NUM_AREGS > 16
- call12 1f
- retw
- .align 4
- 1: _entry a1, 48 /* touch NUM_REGS-24 (x/8/40) */
- #if XCHAL_NUM_AREGS == 32
- mov a8, a0
- retw
- #else
- mov a12, a0
- _entry a1, 48 /* touch NUM_REGS-36 (x/x/28) */
- mov a12, a0
- _entry a1, 48 /* touch NUM_REGS-48 (x/x/16) */
- mov a12, a0
- _entry a1, 16 /* touch NUM_REGS-60 (x/x/4) */
- #endif
- #endif
- mov a4, a0
- retw
- /* Called with call4: touch register NUM_REGS-8 (8/24/56) */
- .L4:
- #if XCHAL_NUM_AREGS == 16
- mov a8, a0
- #else
- call12 1f
- retw
- .align 4
- 1: _entry a1, 48 /* touch NUM_REGS-20 (x/12/44) */
- mov a12, a0
- #if XCHAL_NUM_AREGS > 32
- _entry a1, 48 /* touch NUM_REGS-32 (x/x/32) */
- mov a12, a0
- _entry a1, 48 /* touch NUM_REGS-44 (x/x/20) */
- mov a12, a0
- _entry a1, 48 /* touch NUM_REGS-56 (x/x/8) */
- mov a8, a0
- #endif
- #endif
- retw
- /* Called with call12: touch register NUM_REGS-16 (x/16/48) */
- .L12:
- #if XCHAL_NUM_AREGS > 16
- call12 1f
- retw
- .align 4
- 1: _entry a1, 48 /* touch NUM_REGS-28 (x/4/36) */
- #if XCHAL_NUM_AREGS == 32
- mov a4, a0
- #else
- mov a12, a0
- _entry a1, 48 /* touch NUM_REGS-40 (x/x/24) */
- mov a12, a0
- _entry a1, 48 /* touch NUM_REGS-52 (x/x/12) */
- mov a12, a0
- #endif
- #endif
- retw
- #endif
|