sys_unix_loong64.s raw

   1  // SPDX-License-Identifier: Apache-2.0
   2  // SPDX-FileCopyrightText: 2025 The Ebitengine Authors
   3  
   4  //go:build linux
   5  
   6  #include "textflag.h"
   7  #include "go_asm.h"
   8  #include "funcdata.h"
   9  #include "abi_loong64.h"
  10  
  11  TEXT callbackasm1(SB), NOSPLIT|NOFRAME, $0
  12  	NO_LOCAL_POINTERS
  13  
  14  	SUBV	$(16*8), R3, R14
  15  	MOVD	F0, 0(R14)
  16  	MOVD	F1, 8(R14)
  17  	MOVD	F2, 16(R14)
  18  	MOVD	F3, 24(R14)
  19  	MOVD	F4, 32(R14)
  20  	MOVD	F5, 40(R14)
  21  	MOVD	F6, 48(R14)
  22  	MOVD	F7, 56(R14)
  23  	MOVV	R4, 64(R14)
  24  	MOVV	R5, 72(R14)
  25  	MOVV	R6, 80(R14)
  26  	MOVV	R7, 88(R14)
  27  	MOVV	R8, 96(R14)
  28  	MOVV	R9, 104(R14)
  29  	MOVV	R10, 112(R14)
  30  	MOVV	R11, 120(R14)
  31  
  32  	// Adjust SP by frame size.
  33  	SUBV	$(22*8), R3
  34  
  35  	// It is important to save R30 because the go assembler
  36  	// uses it for move instructions for a variable.
  37  	// This line:
  38  	// MOVV ·callbackWrap_call(SB), R4
  39  	// Creates the instructions:
  40  	// PCALAU12I	off1(PC), R30
  41  	// MOVV		off2(R30), R4
  42  	// R30 is a callee saved register so we are responsible
  43  	// for ensuring its value doesn't change. So save it and
  44  	// restore it at the end of this function.
  45  	// R1 is the link register. crosscall2 doesn't save it
  46  	// so it's saved here.
  47  	MOVV	R1, 0(R3)
  48  	MOVV	R30, 8(R3)
  49  
  50  	// Create a struct callbackArgs on our stack.
  51  	MOVV	$(callbackArgs__size)(R3), R13
  52  	MOVV	R12, callbackArgs_index(R13)    // callback index
  53  	MOVV	R14, callbackArgs_args(R13)     // address of args vector
  54  	MOVV	$0, callbackArgs_result(R13)    // result
  55  
  56  	// Move parameters into registers
  57  	// Get the ABIInternal function pointer
  58  	// without <ABIInternal> by using a closure.
  59  	MOVV	·callbackWrap_call(SB), R4
  60  	MOVV	(R4), R4  // fn unsafe.Pointer
  61  	MOVV	R13, R5   // frame (&callbackArgs{...})
  62  	MOVV	$0, R7	  // ctxt uintptr
  63  
  64  	JAL	crosscall2(SB)
  65  
  66  	// Get callback result.
  67  	MOVV	$(callbackArgs__size)(R3), R13
  68  	MOVV	callbackArgs_result(R13), R4
  69  
  70  	// Restore LR and R30
  71  	MOVV	0(R3), R1
  72  	MOVV	8(R3), R30
  73  	ADDV	$(22*8), R3
  74  
  75  	RET
  76