github.com/miolini/go@v0.0.0-20160405192216-fca68c8cb408/src/runtime/cgo/asm_amd64.s (about) 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 /* 8 * void crosscall2(void (*fn)(void*, int32), void*, int32) 9 * Save registers and call fn with two arguments. 10 */ 11 TEXT crosscall2(SB),NOSPLIT,$0 12 #ifndef GOOS_windows 13 SUBQ $0x58, SP /* keeps stack pointer 32-byte aligned */ 14 #else 15 SUBQ $0xf8, SP /* also need to save xmm6 - xmm15 */ 16 #endif 17 MOVQ BX, 0x10(SP) 18 MOVQ BP, 0x18(SP) 19 MOVQ R12, 0x20(SP) 20 MOVQ R13, 0x28(SP) 21 MOVQ R14, 0x30(SP) 22 MOVQ R15, 0x38(SP) 23 24 #ifdef GOOS_windows 25 // Win64 save RBX, RBP, RDI, RSI, RSP, R12, R13, R14, R15 and XMM6 -- XMM15. 26 MOVQ DI, 0x40(SP) 27 MOVQ SI, 0x48(SP) 28 MOVUPS X6, 0x50(SP) 29 MOVUPS X7, 0x60(SP) 30 MOVUPS X8, 0x70(SP) 31 MOVUPS X9, 0x80(SP) 32 MOVUPS X10, 0x90(SP) 33 MOVUPS X11, 0xa0(SP) 34 MOVUPS X12, 0xb0(SP) 35 MOVUPS X13, 0xc0(SP) 36 MOVUPS X14, 0xd0(SP) 37 MOVUPS X15, 0xe0(SP) 38 39 MOVQ DX, 0(SP) /* arg */ 40 MOVQ R8, 8(SP) /* argsize (includes padding) */ 41 42 CALL CX /* fn */ 43 44 MOVQ 0x40(SP), DI 45 MOVQ 0x48(SP), SI 46 MOVUPS 0x50(SP), X6 47 MOVUPS 0x60(SP), X7 48 MOVUPS 0x70(SP), X8 49 MOVUPS 0x80(SP), X9 50 MOVUPS 0x90(SP), X10 51 MOVUPS 0xa0(SP), X11 52 MOVUPS 0xb0(SP), X12 53 MOVUPS 0xc0(SP), X13 54 MOVUPS 0xd0(SP), X14 55 MOVUPS 0xe0(SP), X15 56 #else 57 MOVQ SI, 0(SP) /* arg */ 58 MOVQ DX, 8(SP) /* argsize (includes padding) */ 59 60 CALL DI /* fn */ 61 #endif 62 63 MOVQ 0x10(SP), BX 64 MOVQ 0x18(SP), BP 65 MOVQ 0x20(SP), R12 66 MOVQ 0x28(SP), R13 67 MOVQ 0x30(SP), R14 68 MOVQ 0x38(SP), R15 69 70 #ifndef GOOS_windows 71 ADDQ $0x58, SP 72 #else 73 ADDQ $0xf8, SP 74 #endif 75 RET