root/src/pkg/runtime/cgo/asm_amd64.s

/* [<][>][^][v][top][bottom][index][help] */
// 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

/* [<][>][^][v][top][bottom][index][help] */