| /* Callee-saved register spill and fill routines for RISC-V. | 
 |  | 
 |    Copyright (C) 2016-2021 Free Software Foundation, Inc. | 
 |  | 
 | 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. | 
 |  | 
 | Under Section 7 of GPL version 3, you are granted additional | 
 | permissions described in the GCC Runtime Library Exception, version | 
 | 3.1, as published by the Free Software Foundation. | 
 |  | 
 | You should have received a copy of the GNU General Public License and | 
 | a copy of the GCC Runtime Library Exception along with this program; | 
 | see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see | 
 | <http://www.gnu.org/licenses/>.  */ | 
 |  | 
 | #include "riscv-asm.h" | 
 |  | 
 |   .text | 
 |  | 
 | #if __riscv_xlen == 64 | 
 |  | 
 | FUNC_BEGIN (__riscv_save_12) | 
 |   .cfi_startproc | 
 |   # __riscv_save_* routine use t0/x5 as return address | 
 |   .cfi_return_column 5 | 
 |   addi sp, sp, -112 | 
 |   .cfi_def_cfa_offset 112 | 
 |   li t1, 0 | 
 |   sd s11, 8(sp) | 
 |   .cfi_offset 27, -104 | 
 |   j .Ls10 | 
 |  | 
 | FUNC_BEGIN (__riscv_save_11) | 
 | FUNC_BEGIN (__riscv_save_10) | 
 |   .cfi_restore 27 | 
 |   addi sp, sp, -112 | 
 |   .cfi_def_cfa_offset 112 | 
 |   li t1, 1 | 
 | .Ls10: | 
 |   sd s10, 16(sp) | 
 |   .cfi_offset 26, -96 | 
 |   sd s9, 24(sp) | 
 |   .cfi_offset 25, -88 | 
 |   j .Ls8 | 
 |  | 
 | FUNC_BEGIN (__riscv_save_9) | 
 | FUNC_BEGIN (__riscv_save_8) | 
 |   .cfi_restore 25 | 
 |   .cfi_restore 26 | 
 |   .cfi_restore 27 | 
 |   addi sp, sp, -112 | 
 |   .cfi_def_cfa_offset 112 | 
 |   li t1, 2 | 
 | .Ls8: | 
 |   sd s8, 32(sp) | 
 |   .cfi_offset 24, -80 | 
 |   sd s7, 40(sp) | 
 |   .cfi_offset 23, -72 | 
 |   j .Ls6 | 
 |  | 
 | FUNC_BEGIN (__riscv_save_7) | 
 | FUNC_BEGIN (__riscv_save_6) | 
 |   .cfi_restore 23 | 
 |   .cfi_restore 24 | 
 |   .cfi_restore 25 | 
 |   .cfi_restore 26 | 
 |   .cfi_restore 27 | 
 |   addi sp, sp, -112 | 
 |   .cfi_def_cfa_offset 112 | 
 |   li t1, 3 | 
 | .Ls6: | 
 |   sd s6, 48(sp) | 
 |   .cfi_offset 22, -64 | 
 |   sd s5, 56(sp) | 
 |   .cfi_offset 21, -56 | 
 |   j .Ls4 | 
 |  | 
 | FUNC_BEGIN (__riscv_save_5) | 
 | FUNC_BEGIN (__riscv_save_4) | 
 |   .cfi_restore 21 | 
 |   .cfi_restore 22 | 
 |   .cfi_restore 24 | 
 |   .cfi_restore 25 | 
 |   .cfi_restore 26 | 
 |   .cfi_restore 27 | 
 |   .cfi_restore 24 | 
 |   .cfi_restore 25 | 
 |   .cfi_restore 26 | 
 |   .cfi_restore 27 | 
 |   addi sp, sp, -112 | 
 |   .cfi_def_cfa_offset 112 | 
 |   li t1, 4 | 
 | .Ls4: | 
 |   sd s4, 64(sp) | 
 |   .cfi_offset 20, -48 | 
 |   sd s3, 72(sp) | 
 |   .cfi_offset 19, -40 | 
 |   j .Ls2 | 
 |  | 
 | FUNC_BEGIN (__riscv_save_3) | 
 | FUNC_BEGIN (__riscv_save_2) | 
 |   .cfi_restore 19 | 
 |   .cfi_restore 20 | 
 |   .cfi_restore 21 | 
 |   .cfi_restore 22 | 
 |   .cfi_restore 24 | 
 |   .cfi_restore 25 | 
 |   .cfi_restore 26 | 
 |   .cfi_restore 27 | 
 |   .cfi_restore 24 | 
 |   .cfi_restore 25 | 
 |   .cfi_restore 26 | 
 |   .cfi_restore 27 | 
 |   addi sp, sp, -112 | 
 |   .cfi_def_cfa_offset 112 | 
 |   li t1, 5 | 
 | .Ls2: | 
 |   sd s2, 80(sp) | 
 |   .cfi_offset 18, -32 | 
 |   sd s1, 88(sp) | 
 |   .cfi_offset 9, -24 | 
 |   sd s0, 96(sp) | 
 |   .cfi_offset 8, -16 | 
 |   sd ra, 104(sp) | 
 |   .cfi_offset 1, -8 | 
 |   slli t1, t1, 4 | 
 |   # CFA info is not correct in next 2 instruction since t1's | 
 |   # value is depend on how may register really save. | 
 |   add sp, sp, t1 | 
 |   jr t0 | 
 |   .cfi_endproc | 
 | FUNC_END (__riscv_save_12) | 
 | FUNC_END (__riscv_save_11) | 
 | FUNC_END (__riscv_save_10) | 
 | FUNC_END (__riscv_save_9) | 
 | FUNC_END (__riscv_save_8) | 
 | FUNC_END (__riscv_save_7) | 
 | FUNC_END (__riscv_save_6) | 
 | FUNC_END (__riscv_save_5) | 
 | FUNC_END (__riscv_save_4) | 
 | FUNC_END (__riscv_save_3) | 
 | FUNC_END (__riscv_save_2) | 
 |  | 
 | FUNC_BEGIN (__riscv_save_1) | 
 | FUNC_BEGIN (__riscv_save_0) | 
 |   .cfi_startproc | 
 |   # __riscv_save_* routine use t0/x5 as return address | 
 |   .cfi_return_column 5 | 
 |   addi sp, sp, -16 | 
 |   .cfi_def_cfa_offset 16 | 
 |   sd s0, 0(sp) | 
 |   .cfi_offset 8, -16 | 
 |   sd ra, 8(sp) | 
 |   .cfi_offset 1, -8 | 
 |   jr t0 | 
 |   .cfi_endproc | 
 | FUNC_END (__riscv_save_1) | 
 | FUNC_END (__riscv_save_0) | 
 |  | 
 | FUNC_BEGIN (__riscv_restore_12) | 
 |   .cfi_startproc | 
 |   .cfi_def_cfa_offset 112 | 
 |   .cfi_offset 27, -104 | 
 |   .cfi_offset 26, -96 | 
 |   .cfi_offset 25, -88 | 
 |   .cfi_offset 24, -80 | 
 |   .cfi_offset 23, -72 | 
 |   .cfi_offset 22, -64 | 
 |   .cfi_offset 21, -56 | 
 |   .cfi_offset 20, -48 | 
 |   .cfi_offset 19, -40 | 
 |   .cfi_offset 18, -32 | 
 |   .cfi_offset 9, -24 | 
 |   .cfi_offset 8, -16 | 
 |   .cfi_offset 1, -8 | 
 |   ld s11, 8(sp) | 
 |   .cfi_restore 27 | 
 |   addi sp, sp, 16 | 
 |  | 
 | FUNC_BEGIN (__riscv_restore_11) | 
 | FUNC_BEGIN (__riscv_restore_10) | 
 |   .cfi_restore 27 | 
 |   .cfi_def_cfa_offset 96 | 
 |   ld s10, 0(sp) | 
 |   .cfi_restore 26 | 
 |   ld s9, 8(sp) | 
 |   .cfi_restore 25 | 
 |   addi sp, sp, 16 | 
 |  | 
 | FUNC_BEGIN (__riscv_restore_9) | 
 | FUNC_BEGIN (__riscv_restore_8) | 
 |   .cfi_restore 25 | 
 |   .cfi_restore 26 | 
 |   .cfi_restore 27 | 
 |   .cfi_def_cfa_offset 80 | 
 |   ld s8, 0(sp) | 
 |   .cfi_restore 24 | 
 |   ld s7, 8(sp) | 
 |   .cfi_restore 23 | 
 |   addi sp, sp, 16 | 
 |  | 
 | FUNC_BEGIN (__riscv_restore_7) | 
 | FUNC_BEGIN (__riscv_restore_6) | 
 |   .cfi_restore 23 | 
 |   .cfi_restore 24 | 
 |   .cfi_restore 25 | 
 |   .cfi_restore 26 | 
 |   .cfi_restore 27 | 
 |   .cfi_def_cfa_offset 64 | 
 |   ld s6, 0(sp) | 
 |   .cfi_restore 22 | 
 |   ld s5, 8(sp) | 
 |   .cfi_restore 21 | 
 |   addi sp, sp, 16 | 
 |  | 
 | FUNC_BEGIN (__riscv_restore_5) | 
 | FUNC_BEGIN (__riscv_restore_4) | 
 |   .cfi_restore 21 | 
 |   .cfi_restore 22 | 
 |   .cfi_restore 23 | 
 |   .cfi_restore 24 | 
 |   .cfi_restore 25 | 
 |   .cfi_restore 26 | 
 |   .cfi_restore 27 | 
 |   .cfi_def_cfa_offset 48 | 
 |   ld s4, 0(sp) | 
 |   .cfi_restore 20 | 
 |   ld s3, 8(sp) | 
 |   .cfi_restore 19 | 
 |   addi sp, sp, 16 | 
 |  | 
 | FUNC_BEGIN (__riscv_restore_3) | 
 | FUNC_BEGIN (__riscv_restore_2) | 
 |   .cfi_restore 19 | 
 |   .cfi_restore 20 | 
 |   .cfi_restore 21 | 
 |   .cfi_restore 22 | 
 |   .cfi_restore 23 | 
 |   .cfi_restore 24 | 
 |   .cfi_restore 25 | 
 |   .cfi_restore 26 | 
 |   .cfi_restore 27 | 
 |   .cfi_def_cfa_offset 32 | 
 |   ld s2, 0(sp) | 
 |   .cfi_restore 18 | 
 |   ld s1, 8(sp) | 
 |   .cfi_restore 9 | 
 |   addi sp, sp, 16 | 
 |  | 
 | FUNC_BEGIN (__riscv_restore_1) | 
 | FUNC_BEGIN (__riscv_restore_0) | 
 |   .cfi_restore 9 | 
 |   .cfi_restore 18 | 
 |   .cfi_restore 19 | 
 |   .cfi_restore 20 | 
 |   .cfi_restore 21 | 
 |   .cfi_restore 22 | 
 |   .cfi_restore 23 | 
 |   .cfi_restore 24 | 
 |   .cfi_restore 25 | 
 |   .cfi_restore 26 | 
 |   .cfi_restore 27 | 
 |   .cfi_def_cfa_offset 16 | 
 |   ld s0, 0(sp) | 
 |   .cfi_restore 8 | 
 |   ld ra, 8(sp) | 
 |   .cfi_restore 1 | 
 |   addi sp, sp, 16 | 
 |   .cfi_def_cfa_offset 0 | 
 |   ret | 
 |   .cfi_endproc | 
 | FUNC_END (__riscv_restore_12) | 
 | FUNC_END (__riscv_restore_11) | 
 | FUNC_END (__riscv_restore_10) | 
 | FUNC_END (__riscv_restore_9) | 
 | FUNC_END (__riscv_restore_8) | 
 | FUNC_END (__riscv_restore_7) | 
 | FUNC_END (__riscv_restore_6) | 
 | FUNC_END (__riscv_restore_5) | 
 | FUNC_END (__riscv_restore_4) | 
 | FUNC_END (__riscv_restore_3) | 
 | FUNC_END (__riscv_restore_2) | 
 | FUNC_END (__riscv_restore_1) | 
 | FUNC_END (__riscv_restore_0) | 
 |  | 
 | #else | 
 |  | 
 | #ifdef __riscv_32e | 
 | FUNC_BEGIN(__riscv_save_2) | 
 | FUNC_BEGIN(__riscv_save_1) | 
 | FUNC_BEGIN(__riscv_save_0) | 
 |   .cfi_startproc | 
 |   # __riscv_save_* routine use t0/x5 as return address | 
 |   .cfi_return_column 5 | 
 |   addi sp, sp, -12 | 
 |   .cfi_def_cfa_offset 12 | 
 |   sw s1, 0(sp) | 
 |   .cfi_offset 9, -12 | 
 |   sw s0, 4(sp) | 
 |   .cfi_offset 8, -8 | 
 |   sw ra, 8(sp) | 
 |   .cfi_offset 1, 0 | 
 |   jr t0 | 
 |   .cfi_endproc | 
 | FUNC_END(__riscv_save_2) | 
 | FUNC_END(__riscv_save_1) | 
 | FUNC_END(__riscv_save_0) | 
 |  | 
 | FUNC_BEGIN(__riscv_restore_2) | 
 | FUNC_BEGIN(__riscv_restore_1) | 
 | FUNC_BEGIN(__riscv_restore_0) | 
 |   .cfi_startproc | 
 |   .cfi_def_cfa_offset 14 | 
 |   lw s1, 0(sp) | 
 |   .cfi_restore 9 | 
 |   lw s0, 4(sp) | 
 |   .cfi_restore 8 | 
 |   lw ra, 8(sp) | 
 |   .cfi_restore 1 | 
 |   addi sp, sp, 12 | 
 |   .cfi_def_cfa_offset 0 | 
 |   ret | 
 |   .cfi_endproc | 
 | FUNC_END(__riscv_restore_2) | 
 | FUNC_END(__riscv_restore_1) | 
 | FUNC_END(__riscv_restore_0) | 
 |  | 
 | #else | 
 |  | 
 | FUNC_BEGIN (__riscv_save_12) | 
 |   .cfi_startproc | 
 |   # __riscv_save_* routine use t0/x5 as return address | 
 |   .cfi_return_column 5 | 
 |   addi sp, sp, -64 | 
 |   .cfi_def_cfa_offset 64 | 
 |   li t1, 0 | 
 |   sw s11, 12(sp) | 
 |   .cfi_offset 27, -52 | 
 |   j .Ls10 | 
 |  | 
 | FUNC_BEGIN (__riscv_save_11) | 
 | FUNC_BEGIN (__riscv_save_10) | 
 | FUNC_BEGIN (__riscv_save_9) | 
 | FUNC_BEGIN (__riscv_save_8) | 
 |   .cfi_restore 27 | 
 |   addi sp, sp, -64 | 
 |   .cfi_def_cfa_offset 64 | 
 |   li t1, -16 | 
 | .Ls10: | 
 |   sw s10, 16(sp) | 
 |   .cfi_offset 26, -48 | 
 |   sw s9, 20(sp) | 
 |   .cfi_offset 25, -44 | 
 |   sw s8, 24(sp) | 
 |   .cfi_offset 24, -40 | 
 |   sw s7, 28(sp) | 
 |   .cfi_offset 23, -36 | 
 |   j .Ls6 | 
 |  | 
 | FUNC_BEGIN (__riscv_save_7) | 
 | FUNC_BEGIN (__riscv_save_6) | 
 | FUNC_BEGIN (__riscv_save_5) | 
 | FUNC_BEGIN (__riscv_save_4) | 
 |   .cfi_restore 23 | 
 |   .cfi_restore 24 | 
 |   .cfi_restore 25 | 
 |   .cfi_restore 26 | 
 |   .cfi_restore 27 | 
 |   addi sp, sp, -64 | 
 |   .cfi_def_cfa_offset 64 | 
 |   li t1, -32 | 
 | .Ls6: | 
 |   sw s6, 32(sp) | 
 |   .cfi_offset 22, -32 | 
 |   sw s5, 36(sp) | 
 |   .cfi_offset 21, -28 | 
 |   sw s4, 40(sp) | 
 |   .cfi_offset 20, -24 | 
 |   sw s3, 44(sp) | 
 |   .cfi_offset 19, -20 | 
 |   sw s2, 48(sp) | 
 |   .cfi_offset 18, -16 | 
 |   sw s1, 52(sp) | 
 |   .cfi_offset 9, -12 | 
 |   sw s0, 56(sp) | 
 |   .cfi_offset 8, -8 | 
 |   sw ra, 60(sp) | 
 |   .cfi_offset 1, -4 | 
 |   # CFA info is not correct in next 2 instruction since t1's | 
 |   # value is depend on how may register really save. | 
 |   sub sp, sp, t1 | 
 |   jr t0 | 
 |   .cfi_endproc | 
 | FUNC_END (__riscv_save_12) | 
 | FUNC_END (__riscv_save_11) | 
 | FUNC_END (__riscv_save_10) | 
 | FUNC_END (__riscv_save_9) | 
 | FUNC_END (__riscv_save_8) | 
 | FUNC_END (__riscv_save_7) | 
 | FUNC_END (__riscv_save_6) | 
 | FUNC_END (__riscv_save_5) | 
 | FUNC_END (__riscv_save_4) | 
 |  | 
 | FUNC_BEGIN (__riscv_save_3) | 
 | FUNC_BEGIN (__riscv_save_2) | 
 | FUNC_BEGIN (__riscv_save_1) | 
 | FUNC_BEGIN (__riscv_save_0) | 
 |   .cfi_startproc | 
 |   # __riscv_save_* routine use t0/x5 as return address | 
 |   .cfi_return_column 5 | 
 |   addi sp, sp, -16 | 
 |   .cfi_def_cfa_offset 16 | 
 |   sw s2, 0(sp) | 
 |   sw s1, 4(sp) | 
 |   .cfi_offset 9, -16 | 
 |   sw s0, 8(sp) | 
 |   .cfi_offset 8, -8 | 
 |   sw ra, 12(sp) | 
 |   .cfi_offset 1, -4 | 
 |   jr t0 | 
 |   .cfi_endproc | 
 | FUNC_END (__riscv_save_3) | 
 | FUNC_END (__riscv_save_2) | 
 | FUNC_END (__riscv_save_1) | 
 | FUNC_END (__riscv_save_0) | 
 |  | 
 | FUNC_BEGIN (__riscv_restore_12) | 
 |   .cfi_startproc | 
 |   .cfi_def_cfa_offset 64 | 
 |   .cfi_offset 27, -52 | 
 |   .cfi_offset 26, -48 | 
 |   .cfi_offset 25, -44 | 
 |   .cfi_offset 24, -40 | 
 |   .cfi_offset 23, -36 | 
 |   .cfi_offset 22, -32 | 
 |   .cfi_offset 21, -28 | 
 |   .cfi_offset 20, -24 | 
 |   .cfi_offset 19, -20 | 
 |   .cfi_offset 18, -16 | 
 |   .cfi_offset 9, -12 | 
 |   .cfi_offset 8, -8 | 
 |   .cfi_offset 1, -4 | 
 |   lw s11, 12(sp) | 
 |   .cfi_restore 27 | 
 |   addi sp, sp, 16 | 
 |  | 
 | FUNC_BEGIN (__riscv_restore_11) | 
 | FUNC_BEGIN (__riscv_restore_10) | 
 | FUNC_BEGIN (__riscv_restore_9) | 
 | FUNC_BEGIN (__riscv_restore_8) | 
 |   .cfi_restore 27 | 
 |   .cfi_def_cfa_offset 48 | 
 |   lw s10, 0(sp) | 
 |   .cfi_restore 26 | 
 |   lw s9, 4(sp) | 
 |   .cfi_restore 25 | 
 |   lw s8, 8(sp) | 
 |   .cfi_restore 24 | 
 |   lw s7, 12(sp) | 
 |   .cfi_restore 23 | 
 |   addi sp, sp, 16 | 
 |  | 
 | FUNC_BEGIN (__riscv_restore_7) | 
 | FUNC_BEGIN (__riscv_restore_6) | 
 | FUNC_BEGIN (__riscv_restore_5) | 
 | FUNC_BEGIN (__riscv_restore_4) | 
 |   .cfi_restore 23 | 
 |   .cfi_restore 24 | 
 |   .cfi_restore 25 | 
 |   .cfi_restore 26 | 
 |   .cfi_restore 27 | 
 |   .cfi_def_cfa_offset 32 | 
 |   lw s6, 0(sp) | 
 |   .cfi_restore 22 | 
 |   lw s5, 4(sp) | 
 |   .cfi_restore 21 | 
 |   lw s4, 8(sp) | 
 |   .cfi_restore 20 | 
 |   lw s3, 12(sp) | 
 |   .cfi_restore 19 | 
 |   addi sp, sp, 16 | 
 |  | 
 | FUNC_BEGIN (__riscv_restore_3) | 
 | FUNC_BEGIN (__riscv_restore_2) | 
 | FUNC_BEGIN (__riscv_restore_1) | 
 | FUNC_BEGIN (__riscv_restore_0) | 
 |   .cfi_restore 19 | 
 |   .cfi_restore 20 | 
 |   .cfi_restore 21 | 
 |   .cfi_restore 22 | 
 |   .cfi_restore 24 | 
 |   .cfi_restore 25 | 
 |   .cfi_restore 26 | 
 |   .cfi_restore 27 | 
 |   .cfi_def_cfa_offset 16 | 
 |   lw s2, 0(sp) | 
 |   .cfi_restore 18 | 
 |   lw s1, 4(sp) | 
 |   .cfi_restore 9 | 
 |   lw s0, 8(sp) | 
 |   .cfi_restore 8 | 
 |   lw ra, 12(sp) | 
 |   .cfi_restore 1 | 
 |   addi sp, sp, 16 | 
 |   .cfi_def_cfa_offset 0 | 
 |   ret | 
 |   .cfi_endproc | 
 | FUNC_END (__riscv_restore_12) | 
 | FUNC_END (__riscv_restore_11) | 
 | FUNC_END (__riscv_restore_10) | 
 | FUNC_END (__riscv_restore_9) | 
 | FUNC_END (__riscv_restore_8) | 
 | FUNC_END (__riscv_restore_7) | 
 | FUNC_END (__riscv_restore_6) | 
 | FUNC_END (__riscv_restore_5) | 
 | FUNC_END (__riscv_restore_4) | 
 | FUNC_END (__riscv_restore_3) | 
 | FUNC_END (__riscv_restore_2) | 
 | FUNC_END (__riscv_restore_1) | 
 | FUNC_END (__riscv_restore_0) | 
 |  | 
 | #endif /* __riscv_32e */ | 
 |  | 
 | #endif /* __riscv_xlen == 64 */ |