github.com/dannin/go@v0.0.0-20161031215817-d35dfd405eaa/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)