trampolines_arm.s raw

   1  // SPDX-License-Identifier: Apache-2.0
   2  // SPDX-FileCopyrightText: 2026 The Ebitengine Authors
   3  
   4  //go:build !cgo && (freebsd || linux)
   5  
   6  #include "textflag.h"
   7  #include "go_asm.h"
   8  
   9  // These trampolines map the gcc ABI to Go ABI0 and then call into the Go equivalent functions.
  10  // On ARM32, Go ABI0 uses stack-based calling convention.
  11  // Arguments are placed on the stack starting at 4(SP) after the prologue.
  12  
  13  TEXT x_cgo_init_trampoline(SB), NOSPLIT, $8-0
  14  	MOVW R0, 4(R13)
  15  	MOVW R1, 8(R13)
  16  	MOVW ·x_cgo_init_call(SB), R12
  17  	MOVW (R12), R12
  18  	CALL (R12)
  19  	RET
  20  
  21  TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8-0
  22  	MOVW R0, 4(R13)
  23  	MOVW ·x_cgo_thread_start_call(SB), R12
  24  	MOVW (R12), R12
  25  	CALL (R12)
  26  	RET
  27  
  28  TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8-0
  29  	MOVW R0, 4(R13)
  30  	MOVW ·x_cgo_setenv_call(SB), R12
  31  	MOVW (R12), R12
  32  	CALL (R12)
  33  	RET
  34  
  35  TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8-0
  36  	MOVW R0, 4(R13)
  37  	MOVW ·x_cgo_unsetenv_call(SB), R12
  38  	MOVW (R12), R12
  39  	CALL (R12)
  40  	RET
  41  
  42  TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $0-0
  43  	CALL ·x_cgo_notify_runtime_init_done(SB)
  44  	RET
  45  
  46  TEXT x_cgo_bindm_trampoline(SB), NOSPLIT, $0
  47  	CALL ·x_cgo_bindm(SB)
  48  	RET
  49  
  50  // func setg_trampoline(setg uintptr, g uintptr)
  51  TEXT ·setg_trampoline(SB), NOSPLIT, $0-8
  52  	MOVW G+4(FP), R0
  53  	MOVW setg+0(FP), R12
  54  	BL   (R12)
  55  	RET
  56  
  57  TEXT threadentry_trampoline(SB), NOSPLIT, $8-0
  58  	// See crosscall2.
  59  	MOVW R0, 4(R13)
  60  	MOVW ·threadentry_call(SB), R12
  61  	MOVW (R12), R12
  62  	CALL (R12)
  63  	RET
  64  
  65  TEXT ·call5(SB), NOSPLIT, $8-28
  66  	MOVW fn+0(FP), R12
  67  	MOVW a1+4(FP), R0
  68  	MOVW a2+8(FP), R1
  69  	MOVW a3+12(FP), R2
  70  	MOVW a4+16(FP), R3
  71  	MOVW a5+20(FP), R4
  72  
  73  	// Store 5th arg below SP (in local frame area)
  74  	MOVW R4, arg5-8(SP)
  75  
  76  	// Align SP to 8 bytes for call (required by ARM AAPCS)
  77  	SUB  $8, R13
  78  	CALL (R12)
  79  	ADD  $8, R13
  80  	MOVW R0, r1+24(FP)
  81  	RET
  82