187 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			187 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
//===-- 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
 |