Text file src/internal/runtime/syscall/windows/asm_windows_arm64.s

     1  // Copyright 2025 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  #include "go_asm.h"
     6  #include "textflag.h"
     7  
     8  // Offsets into Thread Environment Block (pointer in R18)
     9  #define TEB_error 0x68
    10  
    11  TEXT ·StdCall<ABIInternal>(SB),NOSPLIT,$0
    12  	B	·asmstdcall(SB)
    13  
    14  TEXT ·asmstdcall(SB),NOSPLIT,$16
    15  	STP	(R19, R20), 16(RSP) // save old R19, R20
    16  	MOVD	R0, R19	// save fn pointer
    17  	MOVD	RSP, R20	// save stack pointer
    18  
    19  	// SetLastError(0)
    20  	MOVD	$0,	TEB_error(R18_PLATFORM)
    21  	MOVD	StdCallInfo_Args(R19), R12
    22  
    23  	// Do we have more than 8 arguments?
    24  	MOVD	StdCallInfo_N(R19), R0
    25  	CMP	$0,	R0; BEQ	_0args
    26  	CMP	$1,	R0; BEQ	_1args
    27  	CMP	$2,	R0; BEQ	_2args
    28  	CMP	$3,	R0; BEQ	_3args
    29  	CMP	$4,	R0; BEQ	_4args
    30  	CMP	$5,	R0; BEQ	_5args
    31  	CMP	$6,	R0; BEQ	_6args
    32  	CMP	$7,	R0; BEQ	_7args
    33  	CMP	$8,	R0; BEQ	_8args
    34  
    35  	// Reserve stack space for remaining args
    36  	SUB	$8, R0, R2
    37  	ADD	$1, R2, R3 // make even number of words for stack alignment
    38  	AND	$~1, R3
    39  	LSL	$3, R3
    40  	SUB	R3, RSP
    41  
    42  	// R4: size of stack arguments (n-8)*8
    43  	// R5: &args[8]
    44  	// R6: loop counter, from 0 to (n-8)*8
    45  	// R7: scratch
    46  	// R8: copy of RSP - (R2)(RSP) assembles as (R2)(ZR)
    47  	SUB	$8, R0, R4
    48  	LSL	$3, R4
    49  	ADD	$(8*8), R12, R5
    50  	MOVD	$0, R6
    51  	MOVD	RSP, R8
    52  stackargs:
    53  	MOVD	(R6)(R5), R7
    54  	MOVD	R7, (R6)(R8)
    55  	ADD	$8, R6
    56  	CMP	R6, R4
    57  	BNE	stackargs
    58  
    59  _8args:
    60  	MOVD	(7*8)(R12), R7
    61  _7args:
    62  	MOVD	(6*8)(R12), R6
    63  _6args:
    64  	MOVD	(5*8)(R12), R5
    65  _5args:
    66  	MOVD	(4*8)(R12), R4
    67  _4args:
    68  	MOVD	(3*8)(R12), R3
    69  _3args:
    70  	MOVD	(2*8)(R12), R2
    71  _2args:
    72  	MOVD	(1*8)(R12), R1
    73  _1args:
    74  	MOVD	(0*8)(R12), R0
    75  _0args:
    76  
    77  	MOVD	StdCallInfo_Fn(R19), R12
    78  	BL	(R12)
    79  
    80  	MOVD	R20, RSP			// free stack space
    81  	MOVD	R0, StdCallInfo_R1(R19)		// save return value
    82  	// TODO(rsc) floating point like amd64 in StdCallInfo_R2?
    83  
    84  	// GetLastError
    85  	MOVD	TEB_error(R18_PLATFORM), R0
    86  	MOVD	R0, StdCallInfo_Err(R19)
    87  
    88  	// Restore callee-saved registers.
    89  	LDP	16(RSP), (R19, R20)
    90  	RET
    91  

View as plain text