github.com/fenixara/go@v0.0.0-20170127160404-96ea0918e670/src/runtime/rt0_linux_ppc64le.s (about)

     1  #include "go_asm.h"
     2  #include "textflag.h"
     3  
     4  TEXT _rt0_ppc64le_linux(SB),NOSPLIT,$0
     5  	BR _main<>(SB)
     6  
     7  TEXT _rt0_ppc64le_linux_lib(SB),NOSPLIT,$-8
     8  	// Start with standard C stack frame layout and linkage.
     9  	MOVD	LR, R0
    10  	MOVD	R0, 16(R1) // Save LR in caller's frame.
    11  	MOVD	R2, 24(R1) // Save TOC in caller's frame.
    12  	MOVDU	R1, -320(R1) // Allocate frame.
    13  	
    14  	// Preserve callee-save registers.
    15  	MOVD	R14, 24(R1)
    16  	MOVD	R15, 32(R1)
    17  	MOVD	R16, 40(R1)
    18  	MOVD	R17, 48(R1)
    19  	MOVD	R18, 56(R1)
    20  	MOVD	R19, 64(R1)
    21  	MOVD	R20, 72(R1)
    22  	MOVD	R21, 80(R1)
    23  	MOVD	R22, 88(R1)
    24  	MOVD	R23, 96(R1)
    25  	MOVD	R24, 104(R1)
    26  	MOVD	R25, 112(R1)
    27  	MOVD	R26, 120(R1)
    28  	MOVD	R27, 128(R1)
    29  	MOVD	R28, 136(R1)
    30  	MOVD	R29, 144(R1)
    31  	MOVD	g, 152(R1) // R30
    32  	MOVD	R31, 160(R1)
    33  	FMOVD	F14, 168(R1)
    34  	FMOVD	F15, 176(R1)
    35  	FMOVD	F16, 184(R1)
    36  	FMOVD	F17, 192(R1)
    37  	FMOVD	F18, 200(R1)
    38  	FMOVD	F19, 208(R1)
    39  	FMOVD	F20, 216(R1)
    40  	FMOVD	F21, 224(R1)
    41  	FMOVD	F22, 232(R1)
    42  	FMOVD	F23, 240(R1)
    43  	FMOVD	F24, 248(R1)
    44  	FMOVD	F25, 256(R1)
    45  	FMOVD	F26, 264(R1)
    46  	FMOVD	F27, 272(R1)
    47  	FMOVD	F28, 280(R1)
    48  	FMOVD	F29, 288(R1)
    49  	FMOVD	F30, 296(R1)
    50  	FMOVD	F31, 304(R1)
    51  
    52  	MOVD	R3, _rt0_ppc64le_linux_lib_argc<>(SB)
    53  	MOVD	R4, _rt0_ppc64le_linux_lib_argv<>(SB)
    54  
    55  	// Synchronous initialization.
    56  	MOVD	$runtime·libpreinit(SB), R12
    57  	MOVD	R12, CTR
    58  	BL	(CTR)
    59  
    60  	// Create a new thread to do the runtime initialization and return.
    61  	MOVD	_cgo_sys_thread_create(SB), R12
    62  	CMP	$0, R12
    63  	BEQ	nocgo
    64  	MOVD	$_rt0_ppc64le_linux_lib_go(SB), R3
    65  	MOVD	$0, R4
    66  	MOVD	R12, CTR
    67  	BL	(CTR)
    68  	BR	done
    69  
    70  nocgo:
    71  	MOVD	$0x800000, R12                     // stacksize = 8192KB
    72  	MOVD	R12, 8(R1)
    73  	MOVD	$_rt0_ppc64le_linux_lib_go(SB), R12
    74  	MOVD	R12, 16(R1)
    75  	MOVD	$runtime·newosproc0(SB),R12
    76  	MOVD	R12, CTR
    77  	BL	(CTR)
    78  
    79  done:
    80  	// Restore saved registers.
    81  	MOVD	24(R1), R14
    82  	MOVD	32(R1), R15
    83  	MOVD	40(R1), R16
    84  	MOVD	48(R1), R17
    85  	MOVD	56(R1), R18
    86  	MOVD	64(R1), R19
    87  	MOVD	72(R1), R20
    88  	MOVD	80(R1), R21
    89  	MOVD	88(R1), R22
    90  	MOVD	96(R1), R23
    91  	MOVD	104(R1), R24
    92  	MOVD	112(R1), R25
    93  	MOVD	120(R1), R26
    94  	MOVD	128(R1), R27
    95  	MOVD	136(R1), R28
    96  	MOVD	144(R1), R29
    97  	MOVD	152(R1), g // R30
    98  	MOVD	160(R1), R31
    99  	FMOVD	168(R1), F14
   100  	FMOVD	176(R1), F15
   101  	FMOVD	184(R1), F16
   102  	FMOVD	192(R1), F17
   103  	FMOVD	200(R1), F18
   104  	FMOVD	208(R1), F19
   105  	FMOVD	216(R1), F20
   106  	FMOVD	224(R1), F21
   107  	FMOVD	232(R1), F22
   108  	FMOVD	240(R1), F23
   109  	FMOVD	248(R1), F24
   110  	FMOVD	256(R1), F25
   111  	FMOVD	264(R1), F26
   112  	FMOVD	272(R1), F27
   113  	FMOVD	280(R1), F28
   114  	FMOVD	288(R1), F29
   115  	FMOVD	296(R1), F30
   116  	FMOVD	304(R1), F31
   117  
   118  	ADD	$320, R1
   119  	MOVD	24(R1), R2
   120  	MOVD	16(R1), R0
   121  	MOVD	R0, LR
   122  	RET
   123  
   124  TEXT _rt0_ppc64le_linux_lib_go(SB),NOSPLIT,$0
   125  	MOVD	_rt0_ppc64le_linux_lib_argc<>(SB), R3
   126  	MOVD	_rt0_ppc64le_linux_lib_argv<>(SB), R4
   127  	MOVD	$runtime·rt0_go(SB), R12
   128  	MOVD	R12, CTR
   129  	BR	(CTR)
   130  
   131  DATA _rt0_ppc64le_linux_lib_argc<>(SB)/8, $0
   132  GLOBL _rt0_ppc64le_linux_lib_argc<>(SB),NOPTR, $8
   133  DATA _rt0_ppc64le_linux_lib_argv<>(SB)/8, $0
   134  GLOBL _rt0_ppc64le_linux_lib_argv<>(SB),NOPTR, $8
   135  
   136  TEXT _main<>(SB),NOSPLIT,$-8
   137  	// In a statically linked binary, the stack contains argc,
   138  	// argv as argc string pointers followed by a NULL, envv as a
   139  	// sequence of string pointers followed by a NULL, and auxv.
   140  	// There is no TLS base pointer.
   141  	//
   142  	// In a dynamically linked binary, r3 contains argc, r4
   143  	// contains argv, r5 contains envp, r6 contains auxv, and r13
   144  	// contains the TLS pointer.
   145  	//
   146  	// Figure out which case this is by looking at r4: if it's 0,
   147  	// we're statically linked; otherwise we're dynamically
   148  	// linked.
   149  	CMP	R0, R4
   150  	BNE	dlink
   151  
   152  	// Statically linked
   153  	MOVD	0(R1), R3 // argc
   154  	ADD	$8, R1, R4 // argv
   155  	MOVD	$runtime·m0+m_tls(SB), R13 // TLS
   156  	ADD	$0x7000, R13
   157  
   158  dlink:
   159  	BR	main(SB)
   160  
   161  TEXT main(SB),NOSPLIT,$-8
   162  	MOVD	$runtime·rt0_go(SB), R12
   163  	MOVD	R12, CTR
   164  	BR	(CTR)