...

Text file src/runtime/cgo/asm_ppc64x.s

     1	// Copyright 2014 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	// +build ppc64 ppc64le
     6	
     7	#include "textflag.h"
     8	#include "asm_ppc64x.h"
     9	
    10	// Called by C code generated by cmd/cgo.
    11	// func crosscall2(fn func(a unsafe.Pointer, n int32, ctxt uintptr), a unsafe.Pointer, n int32, ctxt uintptr)
    12	// Saves C callee-saved registers and calls fn with three arguments.
    13	TEXT crosscall2(SB),NOSPLIT|NOFRAME,$0
    14		// Start with standard C stack frame layout and linkage
    15		MOVD	LR, R0
    16		MOVD	R0, 16(R1)	// Save LR in caller's frame
    17		MOVW	CR, R0		// Save CR in caller's frame
    18		MOVD	R0, 8(R1)
    19		MOVD	R2, 24(R1)	// Save TOC in caller's frame
    20	
    21		BL	saveregs2<>(SB)
    22	
    23		MOVDU	R1, (-288-3*8-FIXED_FRAME)(R1)
    24	
    25		// Initialize Go ABI environment
    26		BL	runtimeĀ·reginit(SB)
    27		BL	runtimeĀ·load_g(SB)
    28	
    29		MOVD	R3, R12
    30	#ifdef GOARCH_ppc64
    31		// ppc64 use elf ABI v1. we must get the real entry address from
    32		// first slot of the function descriptor before call.
    33		// Same for AIX.
    34		MOVD	8(R12), R2
    35		MOVD	(R12), R12
    36	#endif
    37		MOVD	R12, CTR
    38		MOVD	R4, FIXED_FRAME+0(R1)
    39		MOVW	R5, FIXED_FRAME+8(R1)
    40		MOVD	R6, FIXED_FRAME+16(R1)
    41		BL	(CTR)
    42	
    43		ADD	$(288+3*8+FIXED_FRAME), R1
    44	
    45		BL	restoreregs2<>(SB)
    46	
    47		MOVD	24(R1), R2
    48		MOVD	8(R1), R0
    49		MOVFL	R0, $0xff
    50		MOVD	16(R1), R0
    51		MOVD	R0, LR
    52		RET
    53	
    54	TEXT saveregs2<>(SB),NOSPLIT|NOFRAME,$0
    55		// O=-288; for R in R{14..31}; do echo "\tMOVD\t$R, $O(R1)"|sed s/R30/g/; ((O+=8)); done; for F in F{14..31}; do echo "\tFMOVD\t$F, $O(R1)"; ((O+=8)); done
    56		MOVD	R14, -288(R1)
    57		MOVD	R15, -280(R1)
    58		MOVD	R16, -272(R1)
    59		MOVD	R17, -264(R1)
    60		MOVD	R18, -256(R1)
    61		MOVD	R19, -248(R1)
    62		MOVD	R20, -240(R1)
    63		MOVD	R21, -232(R1)
    64		MOVD	R22, -224(R1)
    65		MOVD	R23, -216(R1)
    66		MOVD	R24, -208(R1)
    67		MOVD	R25, -200(R1)
    68		MOVD	R26, -192(R1)
    69		MOVD	R27, -184(R1)
    70		MOVD	R28, -176(R1)
    71		MOVD	R29, -168(R1)
    72		MOVD	g, -160(R1)
    73		MOVD	R31, -152(R1)
    74		FMOVD	F14, -144(R1)
    75		FMOVD	F15, -136(R1)
    76		FMOVD	F16, -128(R1)
    77		FMOVD	F17, -120(R1)
    78		FMOVD	F18, -112(R1)
    79		FMOVD	F19, -104(R1)
    80		FMOVD	F20, -96(R1)
    81		FMOVD	F21, -88(R1)
    82		FMOVD	F22, -80(R1)
    83		FMOVD	F23, -72(R1)
    84		FMOVD	F24, -64(R1)
    85		FMOVD	F25, -56(R1)
    86		FMOVD	F26, -48(R1)
    87		FMOVD	F27, -40(R1)
    88		FMOVD	F28, -32(R1)
    89		FMOVD	F29, -24(R1)
    90		FMOVD	F30, -16(R1)
    91		FMOVD	F31, -8(R1)
    92	
    93		RET
    94	
    95	TEXT restoreregs2<>(SB),NOSPLIT|NOFRAME,$0
    96		// O=-288; for R in R{14..31}; do echo "\tMOVD\t$O(R1), $R"|sed s/R30/g/; ((O+=8)); done; for F in F{14..31}; do echo "\tFMOVD\t$O(R1), $F"; ((O+=8)); done
    97		MOVD	-288(R1), R14
    98		MOVD	-280(R1), R15
    99		MOVD	-272(R1), R16
   100		MOVD	-264(R1), R17
   101		MOVD	-256(R1), R18
   102		MOVD	-248(R1), R19
   103		MOVD	-240(R1), R20
   104		MOVD	-232(R1), R21
   105		MOVD	-224(R1), R22
   106		MOVD	-216(R1), R23
   107		MOVD	-208(R1), R24
   108		MOVD	-200(R1), R25
   109		MOVD	-192(R1), R26
   110		MOVD	-184(R1), R27
   111		MOVD	-176(R1), R28
   112		MOVD	-168(R1), R29
   113		MOVD	-160(R1), g
   114		MOVD	-152(R1), R31
   115		FMOVD	-144(R1), F14
   116		FMOVD	-136(R1), F15
   117		FMOVD	-128(R1), F16
   118		FMOVD	-120(R1), F17
   119		FMOVD	-112(R1), F18
   120		FMOVD	-104(R1), F19
   121		FMOVD	-96(R1), F20
   122		FMOVD	-88(R1), F21
   123		FMOVD	-80(R1), F22
   124		FMOVD	-72(R1), F23
   125		FMOVD	-64(R1), F24
   126		FMOVD	-56(R1), F25
   127		FMOVD	-48(R1), F26
   128		FMOVD	-40(R1), F27
   129		FMOVD	-32(R1), F28
   130		FMOVD	-24(R1), F29
   131		FMOVD	-16(R1), F30
   132		FMOVD	-8(R1), F31
   133	
   134		RET

View as plain text