1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
//===-- restore.S - restore up to 12 callee-save registers ----------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// Multiple entry points depending on number of registers to restore
//
//===----------------------------------------------------------------------===//
// All of the entry points are in the same section since we rely on many of
// them falling through into each other and don't want the linker to
// accidentally split them up, garbage collect, or reorder them.
//
// The entry points are grouped up into 2s for rv64 and 4s for rv32 since this
// is the minimum grouping which will maintain the required 16-byte stack
// alignment.
.text
#if __riscv_xlen == 32
.globl __riscv_restore_12
.type __riscv_restore_12,@function
__riscv_restore_12:
lw s11, 12(sp)
addi sp, sp, 16
// fallthrough into __riscv_restore_11/10/9/8
.globl __riscv_restore_11
.type __riscv_restore_11,@function
.globl __riscv_restore_10
.type __riscv_restore_10,@function
.globl __riscv_restore_9
.type __riscv_restore_9,@function
.globl __riscv_restore_8
.type __riscv_restore_8,@function
__riscv_restore_11:
__riscv_restore_10:
__riscv_restore_9:
__riscv_restore_8:
lw s10, 0(sp)
lw s9, 4(sp)
lw s8, 8(sp)
lw s7, 12(sp)
addi sp, sp, 16
// fallthrough into __riscv_restore_7/6/5/4
.globl __riscv_restore_7
.type __riscv_restore_7,@function
.globl __riscv_restore_6
.type __riscv_restore_6,@function
.globl __riscv_restore_5
.type __riscv_restore_5,@function
.globl __riscv_restore_4
.type __riscv_restore_4,@function
__riscv_restore_7:
__riscv_restore_6:
__riscv_restore_5:
__riscv_restore_4:
lw s6, 0(sp)
lw s5, 4(sp)
lw s4, 8(sp)
lw s3, 12(sp)
addi sp, sp, 16
// fallthrough into __riscv_restore_3/2/1/0
.globl __riscv_restore_3
.type __riscv_restore_3,@function
.globl __riscv_restore_2
.type __riscv_restore_2,@function
.globl __riscv_restore_1
.type __riscv_restore_1,@function
.globl __riscv_restore_0
.type __riscv_restore_0,@function
__riscv_restore_3:
__riscv_restore_2:
__riscv_restore_1:
__riscv_restore_0:
lw s2, 0(sp)
lw s1, 4(sp)
lw s0, 8(sp)
lw ra, 12(sp)
addi sp, sp, 16
ret
#elif __riscv_xlen == 64
.globl __riscv_restore_12
.type __riscv_restore_12,@function
__riscv_restore_12:
ld s11, 8(sp)
addi sp, sp, 16
// fallthrough into __riscv_restore_11/10
.globl __riscv_restore_11
.type __riscv_restore_11,@function
.globl __riscv_restore_10
.type __riscv_restore_10,@function
__riscv_restore_11:
__riscv_restore_10:
ld s10, 0(sp)
ld s9, 8(sp)
addi sp, sp, 16
// fallthrough into __riscv_restore_9/8
.globl __riscv_restore_9
.type __riscv_restore_9,@function
.globl __riscv_restore_8
.type __riscv_restore_8,@function
__riscv_restore_9:
__riscv_restore_8:
ld s8, 0(sp)
ld s7, 8(sp)
addi sp, sp, 16
// fallthrough into __riscv_restore_7/6
.globl __riscv_restore_7
.type __riscv_restore_7,@function
.globl __riscv_restore_6
.type __riscv_restore_6,@function
__riscv_restore_7:
__riscv_restore_6:
ld s6, 0(sp)
ld s5, 8(sp)
addi sp, sp, 16
// fallthrough into __riscv_restore_5/4
.globl __riscv_restore_5
.type __riscv_restore_5,@function
.globl __riscv_restore_4
.type __riscv_restore_4,@function
__riscv_restore_5:
__riscv_restore_4:
ld s4, 0(sp)
ld s3, 8(sp)
addi sp, sp, 16
// fallthrough into __riscv_restore_3/2
.globl __riscv_restore_3
.type __riscv_restore_3,@function
.globl __riscv_restore_2
.type __riscv_restore_2,@function
__riscv_restore_3:
__riscv_restore_2:
ld s2, 0(sp)
ld s1, 8(sp)
addi sp, sp, 16
// fallthrough into __riscv_restore_1/0
.globl __riscv_restore_1
.type __riscv_restore_1,@function
.globl __riscv_restore_0
.type __riscv_restore_0,@function
__riscv_restore_1:
__riscv_restore_0:
ld s0, 0(sp)
ld ra, 8(sp)
addi sp, sp, 16
ret
#else
# error "xlen must be 32 or 64 for save-restore implementation
#endif
|