trampolines_loong64.s raw

   1  // SPDX-License-Identifier: Apache-2.0
   2  // SPDX-FileCopyrightText: 2025 The Ebitengine Authors
   3  
   4  //go:build !cgo && linux
   5  
   6  #include "textflag.h"
   7  #include "go_asm.h"
   8  #include "abi_loong64.h"
   9  
  10  // these trampolines map the gcc ABI to Go ABI and then calls into the Go equivalent functions.
  11  // R23 is used as temporary register.
  12  
  13  TEXT x_cgo_init_trampoline(SB), NOSPLIT, $16
  14  	MOVV R4, 8(R3)
  15  	MOVV R5, 16(R3)
  16  	MOVV ·x_cgo_init_call(SB), R23
  17  	MOVV (R23), R23
  18  	CALL (R23)
  19  	RET
  20  
  21  TEXT x_cgo_thread_start_trampoline(SB), NOSPLIT, $8
  22  	MOVV R4, 8(R3)
  23  	MOVV ·x_cgo_thread_start_call(SB), R23
  24  	MOVV (R23), R23
  25  	CALL (R23)
  26  	RET
  27  
  28  TEXT x_cgo_setenv_trampoline(SB), NOSPLIT, $8
  29  	MOVV R4, 8(R3)
  30  	MOVV ·x_cgo_setenv_call(SB), R23
  31  	MOVV (R23), R23
  32  	CALL (R23)
  33  	RET
  34  
  35  TEXT x_cgo_unsetenv_trampoline(SB), NOSPLIT, $8
  36  	MOVV R4, 8(R3)
  37  	MOVV ·x_cgo_unsetenv_call(SB), R23
  38  	MOVV (R23), R23
  39  	CALL (R23)
  40  	RET
  41  
  42  TEXT x_cgo_notify_runtime_init_done_trampoline(SB), NOSPLIT, $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
  52  	MOVV G+8(FP), R4
  53  	MOVV setg+0(FP), R23
  54  	CALL (R23)
  55  	RET
  56  
  57  TEXT threadentry_trampoline(SB), NOSPLIT, $0
  58  	// See crosscall2.
  59  	ADDV $(-23*8), R3
  60  	MOVV R4, (1*8)(R3) // fn unsafe.Pointer
  61  	MOVV R5, (2*8)(R3) // a unsafe.Pointer
  62  	MOVV R7, (3*8)(R3) // ctxt uintptr
  63  
  64  	SAVE_R22_TO_R31((4*8))
  65  	SAVE_F24_TO_F31((14*8))
  66  	MOVV R1, (22*8)(R3)
  67  
  68  	MOVV ·threadentry_call(SB), R23
  69  	MOVV (R23), R23
  70  	CALL (R23)
  71  
  72  	RESTORE_R22_TO_R31((4*8))
  73  	RESTORE_F24_TO_F31((14*8))
  74  	MOVV (22*8)(R3), R1
  75  
  76  	ADDV $(23*8), R3
  77  	RET
  78  
  79  TEXT ·call5(SB), NOSPLIT, $0-0
  80  	MOVV fn+0(FP), R23
  81  	MOVV a1+8(FP), R4
  82  	MOVV a2+16(FP), R5
  83  	MOVV a3+24(FP), R6
  84  	MOVV a4+32(FP), R7
  85  	MOVV a5+40(FP), R8
  86  	CALL (R23)
  87  	MOVV R4, ret+48(FP)
  88  	RET
  89