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