1// Copyright 2009 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 "textflag.h"
6
7// Called by C code generated by cmd/cgo.
8// func crosscall2(fn, a unsafe.Pointer, n int32, ctxt uintptr)
9// Saves C callee-saved registers and calls cgocallback with three arguments.
10// fn is the PC of a func(a unsafe.Pointer) function.
11// This signature is known to SWIG, so we can't change it.
12#ifndef GOOS_windows
13TEXT crosscall2(SB), NOSPLIT, $0x50-0 // keeps stack pointer 32-byte aligned
14#else
15TEXT crosscall2(SB), NOSPLIT, $0x110-0 // also need to save xmm6 - xmm15
16#endif
17 MOVQ BX, 0x18(SP)
18 MOVQ R12, 0x28(SP)
19 MOVQ R13, 0x30(SP)
20 MOVQ R14, 0x38(SP)
21 MOVQ R15, 0x40(SP)
22
23#ifdef GOOS_windows
24 // Win64 save RBX, RBP, RDI, RSI, RSP, R12, R13, R14, R15 and XMM6 -- XMM15.
25 MOVQ DI, 0x48(SP)
26 MOVQ SI, 0x50(SP)
27 MOVUPS X6, 0x60(SP)
28 MOVUPS X7, 0x70(SP)
29 MOVUPS X8, 0x80(SP)
30 MOVUPS X9, 0x90(SP)
31 MOVUPS X10, 0xa0(SP)
32 MOVUPS X11, 0xb0(SP)
33 MOVUPS X12, 0xc0(SP)
34 MOVUPS X13, 0xd0(SP)
35 MOVUPS X14, 0xe0(SP)
36 MOVUPS X15, 0xf0(SP)
37
38 MOVQ CX, 0x0(SP) // fn
39 MOVQ DX, 0x8(SP) // arg
40
41 // Skip n in R8.
42 MOVQ R9, 0x10(SP) // ctxt
43
44 CALL runtime·cgocallback(SB)
45
46 MOVQ 0x48(SP), DI
47 MOVQ 0x50(SP), SI
48 MOVUPS 0x60(SP), X6
49 MOVUPS 0x70(SP), X7
50 MOVUPS 0x80(SP), X8
51 MOVUPS 0x90(SP), X9
52 MOVUPS 0xa0(SP), X10
53 MOVUPS 0xb0(SP), X11
54 MOVUPS 0xc0(SP), X12
55 MOVUPS 0xd0(SP), X13
56 MOVUPS 0xe0(SP), X14
57 MOVUPS 0xf0(SP), X15
58
59#else
60 MOVQ DI, 0x0(SP) // fn
61 MOVQ SI, 0x8(SP) // arg
62
63 // Skip n in DX.
64 MOVQ CX, 0x10(SP) // ctxt
65
66 CALL runtime·cgocallback(SB)
67
68#endif
69
70 MOVQ 0x18(SP), BX
71 MOVQ 0x28(SP), R12
72 MOVQ 0x30(SP), R13
73 MOVQ 0x38(SP), R14
74 MOVQ 0x40(SP), R15
75
76 RET