| // Copyright 2025 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| #include "go_asm.h" |
| #include "textflag.h" |
| |
| TEXT ·StdCall<ABIInternal>(SB),NOSPLIT,$0 |
| JMP ·asmstdcall(SB) |
| |
| TEXT ·asmstdcall(SB),NOSPLIT,$0 |
| MOVL fn+0(FP), BX |
| MOVL SP, BP // save stack pointer |
| |
| // SetLastError(0). |
| MOVL $0, 0x34(FS) |
| |
| MOVL StdCallInfo_N(BX), CX |
| |
| // Fast version, do not store args on the stack. |
| CMPL CX, $0 |
| JE docall |
| |
| // Copy args to the stack. |
| MOVL CX, AX |
| SALL $2, AX |
| SUBL AX, SP // room for args |
| MOVL SP, DI |
| MOVL StdCallInfo_Args(BX), SI |
| CLD |
| REP; MOVSL |
| |
| docall: |
| // Call stdcall or cdecl function. |
| // DI SI BP BX are preserved, SP is not |
| CALL StdCallInfo_Fn(BX) |
| MOVL BP, SP |
| |
| // Return result. |
| MOVL fn+0(FP), BX |
| MOVL AX, StdCallInfo_R1(BX) |
| MOVL DX, StdCallInfo_R2(BX) |
| |
| // GetLastError(). |
| MOVL 0x34(FS), AX |
| MOVL AX, StdCallInfo_Err(BX) |
| |
| RET |