...

Text file src/runtime/cgo/abi_amd64.h

Documentation: runtime/cgo

		 1// Copyright 2021 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// Macros for transitioning from the host ABI to Go ABI0.
		 6//
		 7// These save the frame pointer, so in general, functions that use
		 8// these should have zero frame size to suppress the automatic frame
		 9// pointer, though it's harmless to not do this.
		10
		11#ifdef GOOS_windows
		12
		13// REGS_HOST_TO_ABI0_STACK is the stack bytes used by
		14// PUSH_REGS_HOST_TO_ABI0.
		15#define REGS_HOST_TO_ABI0_STACK (28*8 + 8)
		16
		17// PUSH_REGS_HOST_TO_ABI0 prepares for transitioning from
		18// the host ABI to Go ABI0 code. It saves all registers that are
		19// callee-save in the host ABI and caller-save in Go ABI0 and prepares
		20// for entry to Go.
		21//
		22// Save DI SI BP BX R12 R13 R14 R15 X6-X15 registers and the DF flag.
		23// Clear the DF flag for the Go ABI.
		24// MXCSR matches the Go ABI, so we don't have to set that,
		25// and Go doesn't modify it, so we don't have to save it.
		26#define PUSH_REGS_HOST_TO_ABI0()	\
		27	PUSHFQ			\
		28	CLD			\
		29	ADJSP	$(REGS_HOST_TO_ABI0_STACK - 8)	\
		30	MOVQ	DI, (0*0)(SP)	\
		31	MOVQ	SI, (1*8)(SP)	\
		32	MOVQ	BP, (2*8)(SP)	\
		33	MOVQ	BX, (3*8)(SP)	\
		34	MOVQ	R12, (4*8)(SP)	\
		35	MOVQ	R13, (5*8)(SP)	\
		36	MOVQ	R14, (6*8)(SP)	\
		37	MOVQ	R15, (7*8)(SP)	\
		38	MOVUPS	X6, (8*8)(SP)	\
		39	MOVUPS	X7, (10*8)(SP)	\
		40	MOVUPS	X8, (12*8)(SP)	\
		41	MOVUPS	X9, (14*8)(SP)	\
		42	MOVUPS	X10, (16*8)(SP)	\
		43	MOVUPS	X11, (18*8)(SP)	\
		44	MOVUPS	X12, (20*8)(SP)	\
		45	MOVUPS	X13, (22*8)(SP)	\
		46	MOVUPS	X14, (24*8)(SP)	\
		47	MOVUPS	X15, (26*8)(SP)
		48
		49#define POP_REGS_HOST_TO_ABI0()	\
		50	MOVQ	(0*0)(SP), DI	\
		51	MOVQ	(1*8)(SP), SI	\
		52	MOVQ	(2*8)(SP), BP	\
		53	MOVQ	(3*8)(SP), BX	\
		54	MOVQ	(4*8)(SP), R12	\
		55	MOVQ	(5*8)(SP), R13	\
		56	MOVQ	(6*8)(SP), R14	\
		57	MOVQ	(7*8)(SP), R15	\
		58	MOVUPS	(8*8)(SP), X6	\
		59	MOVUPS	(10*8)(SP), X7	\
		60	MOVUPS	(12*8)(SP), X8	\
		61	MOVUPS	(14*8)(SP), X9	\
		62	MOVUPS	(16*8)(SP), X10	\
		63	MOVUPS	(18*8)(SP), X11	\
		64	MOVUPS	(20*8)(SP), X12	\
		65	MOVUPS	(22*8)(SP), X13	\
		66	MOVUPS	(24*8)(SP), X14	\
		67	MOVUPS	(26*8)(SP), X15	\
		68	ADJSP	$-(REGS_HOST_TO_ABI0_STACK - 8)	\
		69	POPFQ
		70
		71#else
		72// SysV ABI
		73
		74#define REGS_HOST_TO_ABI0_STACK (6*8)
		75
		76// SysV MXCSR matches the Go ABI, so we don't have to set that,
		77// and Go doesn't modify it, so we don't have to save it.
		78// Both SysV and Go require DF to be cleared, so that's already clear.
		79// The SysV and Go frame pointer conventions are compatible.
		80#define PUSH_REGS_HOST_TO_ABI0()	\
		81	ADJSP	$(REGS_HOST_TO_ABI0_STACK)	\
		82	MOVQ	BP, (5*8)(SP)	\
		83	LEAQ	(5*8)(SP), BP	\
		84	MOVQ	BX, (0*8)(SP)	\
		85	MOVQ	R12, (1*8)(SP)	\
		86	MOVQ	R13, (2*8)(SP)	\
		87	MOVQ	R14, (3*8)(SP)	\
		88	MOVQ	R15, (4*8)(SP)
		89
		90#define POP_REGS_HOST_TO_ABI0()	\
		91	MOVQ	(0*8)(SP), BX	\
		92	MOVQ	(1*8)(SP), R12	\
		93	MOVQ	(2*8)(SP), R13	\
		94	MOVQ	(3*8)(SP), R14	\
		95	MOVQ	(4*8)(SP), R15	\
		96	MOVQ	(5*8)(SP), BP	\
		97	ADJSP	$-(REGS_HOST_TO_ABI0_STACK)
		98
		99#endif

View as plain text