| // Copyright 2009 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 "../../../cmd/ld/textflag.h" |
| |
| /* |
| * void crosscall2(void (*fn)(void*, int32), void*, int32) |
| * Save registers and call fn with two arguments. |
| */ |
| TEXT crosscall2(SB),NOSPLIT,$0 |
| SUBQ $0x58, SP /* keeps stack pointer 32-byte aligned */ |
| MOVQ BX, 0x10(SP) |
| MOVQ BP, 0x18(SP) |
| MOVQ R12, 0x20(SP) |
| MOVQ R13, 0x28(SP) |
| MOVQ R14, 0x30(SP) |
| MOVQ R15, 0x38(SP) |
| |
| #ifdef GOOS_windows |
| // Win64 save RBX, RBP, RDI, RSI, RSP, R12, R13, R14, and R15 |
| MOVQ DI, 0x40(SP) |
| MOVQ SI, 0x48(SP) |
| |
| MOVQ DX, 0(SP) /* arg */ |
| MOVQ R8, 8(SP) /* argsize (includes padding) */ |
| |
| CALL CX /* fn */ |
| |
| MOVQ 0x40(SP), DI |
| MOVQ 0x48(SP), SI |
| #else |
| MOVQ SI, 0(SP) /* arg */ |
| MOVQ DX, 8(SP) /* argsize (includes padding) */ |
| |
| CALL DI /* fn */ |
| #endif |
| |
| MOVQ 0x10(SP), BX |
| MOVQ 0x18(SP), BP |
| MOVQ 0x20(SP), R12 |
| MOVQ 0x28(SP), R13 |
| MOVQ 0x30(SP), R14 |
| MOVQ 0x38(SP), R15 |
| |
| ADDQ $0x58, SP |
| RET |