abi_amd64.h raw

   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
 100