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 TEXT ·StdCall<ABIInternal>(SB),NOSPLIT,$0
9 MOVQ AX, CX
10 JMP ·asmstdcall(SB)
11
12 TEXT ·asmstdcall(SB),NOSPLIT,$16
13 MOVQ SP, AX
14 ANDQ $~15, SP // alignment as per Windows requirement
15 MOVQ AX, 8(SP)
16 MOVQ CX, 0(SP) // asmcgocall will put first argument into CX.
17
18 MOVQ StdCallInfo_Fn(CX), AX
19 MOVQ StdCallInfo_Args(CX), SI
20 MOVQ StdCallInfo_N(CX), CX
21
22 // SetLastError(0).
23 MOVQ 0x30(GS), DI
24 MOVL $0, 0x68(DI)
25
26 SUBQ $(const_MaxArgs*8), SP // room for args
27
28 // Fast version, do not store args on the stack.
29 CMPL CX, $0; JE _0args
30 CMPL CX, $1; JE _1args
31 CMPL CX, $2; JE _2args
32 CMPL CX, $3; JE _3args
33 CMPL CX, $4; JE _4args
34
35 // Check we have enough room for args.
36 CMPL CX, $const_MaxArgs
37 JLE 2(PC)
38 INT $3 // not enough room -> crash
39
40 // Copy args to the stack.
41 MOVQ SP, DI
42 CLD
43 REP; MOVSQ
44 MOVQ SP, SI
45
46 // Load first 4 args into correspondent registers.
47 // Floating point arguments are passed in the XMM
48 // registers. Set them here in case any of the arguments
49 // are floating point values. For details see
50 // https://learn.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-170
51 _4args:
52 MOVQ 24(SI), R9
53 MOVQ R9, X3
54 _3args:
55 MOVQ 16(SI), R8
56 MOVQ R8, X2
57 _2args:
58 MOVQ 8(SI), DX
59 MOVQ DX, X1
60 _1args:
61 MOVQ 0(SI), CX
62 MOVQ CX, X0
63 _0args:
64
65 // Call stdcall function.
66 CALL AX
67
68 ADDQ $(const_MaxArgs*8), SP
69
70 // Return result.
71 MOVQ 0(SP), CX
72 MOVQ 8(SP), SP
73 MOVQ AX, StdCallInfo_R1(CX)
74 // Floating point return values are returned in XMM0. Setting r2 to this
75 // value in case this call returned a floating point value. For details,
76 // see https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention
77 MOVQ X0, StdCallInfo_R2(CX)
78
79 // GetLastError().
80 MOVQ 0x30(GS), DI
81 MOVL 0x68(DI), AX
82 MOVQ AX, StdCallInfo_Err(CX)
83
84 RET
85
View as plain text