github.com/tidwall/go@v0.0.0-20170415222209-6694a6888b7d/src/runtime/cgo/asm_ppc64x.s (about) 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 // TODO(austin): ABI v1 (fn is probably a function descriptor) 15 16 // Start with standard C stack frame layout and linkage 17 MOVD LR, R0 18 MOVD R0, 16(R1) // Save LR in caller's frame 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 MOVD R3, CTR 31 MOVD R4, FIXED_FRAME+0(R1) 32 MOVD R5, FIXED_FRAME+8(R1) 33 MOVD R6, FIXED_FRAME+16(R1) 34 BL (CTR) 35 36 ADD $(288+3*8+FIXED_FRAME), R1 37 38 BL restoreregs2<>(SB) 39 40 MOVD 24(R1), R2 41 MOVD 16(R1), R0 42 MOVD R0, LR 43 RET 44 45 TEXT saveregs2<>(SB),NOSPLIT|NOFRAME,$0 46 // 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 47 MOVD R14, -288(R1) 48 MOVD R15, -280(R1) 49 MOVD R16, -272(R1) 50 MOVD R17, -264(R1) 51 MOVD R18, -256(R1) 52 MOVD R19, -248(R1) 53 MOVD R20, -240(R1) 54 MOVD R21, -232(R1) 55 MOVD R22, -224(R1) 56 MOVD R23, -216(R1) 57 MOVD R24, -208(R1) 58 MOVD R25, -200(R1) 59 MOVD R26, -192(R1) 60 MOVD R27, -184(R1) 61 MOVD R28, -176(R1) 62 MOVD R29, -168(R1) 63 MOVD g, -160(R1) 64 MOVD R31, -152(R1) 65 FMOVD F14, -144(R1) 66 FMOVD F15, -136(R1) 67 FMOVD F16, -128(R1) 68 FMOVD F17, -120(R1) 69 FMOVD F18, -112(R1) 70 FMOVD F19, -104(R1) 71 FMOVD F20, -96(R1) 72 FMOVD F21, -88(R1) 73 FMOVD F22, -80(R1) 74 FMOVD F23, -72(R1) 75 FMOVD F24, -64(R1) 76 FMOVD F25, -56(R1) 77 FMOVD F26, -48(R1) 78 FMOVD F27, -40(R1) 79 FMOVD F28, -32(R1) 80 FMOVD F29, -24(R1) 81 FMOVD F30, -16(R1) 82 FMOVD F31, -8(R1) 83 84 RET 85 86 TEXT restoreregs2<>(SB),NOSPLIT|NOFRAME,$0 87 // 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 88 MOVD -288(R1), R14 89 MOVD -280(R1), R15 90 MOVD -272(R1), R16 91 MOVD -264(R1), R17 92 MOVD -256(R1), R18 93 MOVD -248(R1), R19 94 MOVD -240(R1), R20 95 MOVD -232(R1), R21 96 MOVD -224(R1), R22 97 MOVD -216(R1), R23 98 MOVD -208(R1), R24 99 MOVD -200(R1), R25 100 MOVD -192(R1), R26 101 MOVD -184(R1), R27 102 MOVD -176(R1), R28 103 MOVD -168(R1), R29 104 MOVD -160(R1), g 105 MOVD -152(R1), R31 106 FMOVD -144(R1), F14 107 FMOVD -136(R1), F15 108 FMOVD -128(R1), F16 109 FMOVD -120(R1), F17 110 FMOVD -112(R1), F18 111 FMOVD -104(R1), F19 112 FMOVD -96(R1), F20 113 FMOVD -88(R1), F21 114 FMOVD -80(R1), F22 115 FMOVD -72(R1), F23 116 FMOVD -64(R1), F24 117 FMOVD -56(R1), F25 118 FMOVD -48(R1), F26 119 FMOVD -40(R1), F27 120 FMOVD -32(R1), F28 121 FMOVD -24(R1), F29 122 FMOVD -16(R1), F30 123 FMOVD -8(R1), F31 124 125 RET