trampolines_arm64.s raw

   1  // SPDX-License-Identifier: Apache-2.0
   2  // SPDX-FileCopyrightText: 2022 The Ebitengine Authors
   3  
   4  //go:build !cgo && (darwin || freebsd || linux)
   5  
   6  #include "textflag.h"
   7  #include "go_asm.h"
   8  #include "abi_arm64.h"
   9  
  10  // These trampolines map the gcc ABI to Go ABIInternal and then calls into the Go equivalent functions.
  11  // Note that C arguments are passed in R0-R7, which matches Go ABIInternal for the first eight arguments.
  12  // R9 is used as a temporary register.
  13  
  14  TEXT x_cgo_init_trampoline(SB), NOSPLIT, $0-0
  15  	MOVD ·x_cgo_init_call(SB), R9
  16  	MOVD (R9), R9
  17  	CALL R9
  18  	RET
  19  
  20  TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $0-0
  21  	MOVD ·x_cgo_thread_start_call(SB), R9
  22  	MOVD (R9), R9
  23  	CALL R9
  24  	RET
  25  
  26  TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $0-0
  27  	MOVD ·x_cgo_setenv_call(SB), R9
  28  	MOVD (R9), R9
  29  	CALL R9
  30  	RET
  31  
  32  TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $0-0
  33  	MOVD ·x_cgo_unsetenv_call(SB), R9
  34  	MOVD (R9), R9
  35  	CALL R9
  36  	RET
  37  
  38  TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0-0
  39  	CALL ·x_cgo_notify_runtime_init_done(SB)
  40  	RET
  41  
  42  TEXT x_cgo_bindm_trampoline(SB), NOSPLIT, $0
  43  	CALL ·x_cgo_bindm(SB)
  44  	RET
  45  
  46  // func setg_trampoline(setg uintptr, g uintptr)
  47  TEXT ·setg_trampoline(SB), NOSPLIT, $0-16
  48  	MOVD G+8(FP), R0
  49  	MOVD setg+0(FP), R9
  50  	CALL R9
  51  	RET
  52  
  53  TEXT threadentry_trampoline(SB), NOSPLIT, $0-0
  54  	// See crosscall2.
  55  	SUB  $(8*24), RSP
  56  	STP  (R0, R1), (8*1)(RSP)
  57  	MOVD R3, (8*3)(RSP)
  58  
  59  	SAVE_R19_TO_R28(8*4)
  60  	SAVE_F8_TO_F15(8*14)
  61  	STP (R29, R30), (8*22)(RSP)
  62  
  63  	MOVD ·threadentry_call(SB), R9
  64  	MOVD (R9), R9
  65  	CALL R9
  66  	MOVD $0, R0                    // TODO: get the return value from threadentry
  67  
  68  	RESTORE_R19_TO_R28(8*4)
  69  	RESTORE_F8_TO_F15(8*14)
  70  	LDP (8*22)(RSP), (R29, R30)
  71  
  72  	ADD $(8*24), RSP
  73  	RET
  74  
  75  TEXT ·call5(SB), NOSPLIT, $0-0
  76  	MOVD fn+0(FP), R9
  77  	MOVD a1+8(FP), R0
  78  	MOVD a2+16(FP), R1
  79  	MOVD a3+24(FP), R2
  80  	MOVD a4+32(FP), R3
  81  	MOVD a5+40(FP), R4
  82  	CALL R9
  83  	MOVD R0, ret+48(FP)
  84  	RET
  85