blob: 4446943e383a719180cda963dcb35d0e1d6092bd [file] [log] [blame]
/* 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 */