//===-- save.S - save up to 12 callee-saved 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 save // //===----------------------------------------------------------------------===// // 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_save_12 .type __riscv_save_12,@function __riscv_save_12: addi sp, sp, -64 mv t1, zero sw s11, 12(sp) j .Lriscv_save_11_8 .globl __riscv_save_11 .type __riscv_save_11,@function .globl __riscv_save_10 .type __riscv_save_10,@function .globl __riscv_save_9 .type __riscv_save_9,@function .globl __riscv_save_8 .type __riscv_save_8,@function __riscv_save_11: __riscv_save_10: __riscv_save_9: __riscv_save_8: addi sp, sp, -64 li t1, 16 .Lriscv_save_11_8: sw s10, 16(sp) sw s9, 20(sp) sw s8, 24(sp) sw s7, 28(sp) j .Lriscv_save_7_4 .globl __riscv_save_7 .type __riscv_save_7,@function .globl __riscv_save_6 .type __riscv_save_6,@function .globl __riscv_save_5 .type __riscv_save_5,@function .globl __riscv_save_4 .type __riscv_save_4,@function __riscv_save_7: __riscv_save_6: __riscv_save_5: __riscv_save_4: addi sp, sp, -64 li t1, 32 .Lriscv_save_7_4: sw s6, 32(sp) sw s5, 36(sp) sw s4, 40(sp) sw s3, 44(sp) sw s2, 48(sp) sw s1, 52(sp) sw s0, 56(sp) sw ra, 60(sp) add sp, sp, t1 jr t0 .globl __riscv_save_3 .type __riscv_save_3,@function .globl __riscv_save_2 .type __riscv_save_2,@function .globl __riscv_save_1 .type __riscv_save_1,@function .globl __riscv_save_0 .type __riscv_save_0,@function __riscv_save_3: __riscv_save_2: __riscv_save_1: __riscv_save_0: addi sp, sp, -16 sw s2, 0(sp) sw s1, 4(sp) sw s0, 8(sp) sw ra, 12(sp) jr t0 #elif __riscv_xlen == 64 .globl __riscv_save_12 .type __riscv_save_12,@function __riscv_save_12: addi sp, sp, -112 mv t1, zero sd s11, 8(sp) j .Lriscv_save_11_10 .globl __riscv_save_11 .type __riscv_save_11,@function .globl __riscv_save_10 .type __riscv_save_10,@function __riscv_save_11: __riscv_save_10: addi sp, sp, -112 li t1, 16 .Lriscv_save_11_10: sd s10, 16(sp) sd s9, 24(sp) j .Lriscv_save_9_8 .globl __riscv_save_9 .type __riscv_save_9,@function .globl __riscv_save_8 .type __riscv_save_8,@function __riscv_save_9: __riscv_save_8: addi sp, sp, -112 li t1, 32 .Lriscv_save_9_8: sd s8, 32(sp) sd s7, 40(sp) j .Lriscv_save_7_6 .globl __riscv_save_7 .type __riscv_save_7,@function .globl __riscv_save_6 .type __riscv_save_6,@function __riscv_save_7: __riscv_save_6: addi sp, sp, -112 li t1, 48 .Lriscv_save_7_6: sd s6, 48(sp) sd s5, 56(sp) j .Lriscv_save_5_4 .globl __riscv_save_5 .type __riscv_save_5,@function .globl __riscv_save_4 .type __riscv_save_4,@function __riscv_save_5: __riscv_save_4: addi sp, sp, -112 li t1, 64 .Lriscv_save_5_4: sd s4, 64(sp) sd s3, 72(sp) j .Lriscv_save_3_2 .globl __riscv_save_3 .type __riscv_save_3,@function .globl __riscv_save_2 .type __riscv_save_2,@function __riscv_save_3: __riscv_save_2: addi sp, sp, -112 li t1, 80 .Lriscv_save_3_2: sd s2, 80(sp) sd s1, 88(sp) sd s0, 96(sp) sd ra, 104(sp) add sp, sp, t1 jr t0 .globl __riscv_save_1 .type __riscv_save_1,@function .globl __riscv_save_0 .type __riscv_save_0,@function __riscv_save_1: __riscv_save_0: addi sp, sp, -16 sd s0, 0(sp) sd ra, 8(sp) jr t0 #else # error "xlen must be 32 or 64 for save-restore implementation #endif