github.com/twelsh-aw/go/src@v0.0.0-20230516233729-a56fe86a7c81/runtime/cgo/gcc_mipsx.S (about) 1 // Copyright 2016 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 //go:build mips || mipsle 6 7 .file "gcc_mipsx.S" 8 9 /* 10 * void crosscall1(void (*fn)(void), void (*setg_gcc)(void *g), void *g) 11 * 12 * Calling into the gc tool chain, where all registers are caller save. 13 * Called from standard MIPS O32 ABI, where $16-$23, $30, and $f20-$f31 14 * are callee-save, so they must be saved explicitly, along with $31 (LR). 15 */ 16 .globl crosscall1 17 .set noat 18 crosscall1: 19 #ifndef __mips_soft_float 20 addiu $29, $29, -88 21 #else 22 addiu $29, $29, -40 // For soft-float, no need to make room for FP registers 23 #endif 24 sw $31, 0($29) 25 sw $16, 4($29) 26 sw $17, 8($29) 27 sw $18, 12($29) 28 sw $19, 16($29) 29 sw $20, 20($29) 30 sw $21, 24($29) 31 sw $22, 28($29) 32 sw $23, 32($29) 33 sw $30, 36($29) 34 35 #ifndef __mips_soft_float 36 sdc1 $f20, 40($29) 37 sdc1 $f22, 48($29) 38 sdc1 $f24, 56($29) 39 sdc1 $f26, 64($29) 40 sdc1 $f28, 72($29) 41 sdc1 $f30, 80($29) 42 #endif 43 move $20, $4 // save R4 44 move $4, $6 45 jalr $5 // call setg_gcc 46 jalr $20 // call fn 47 48 lw $16, 4($29) 49 lw $17, 8($29) 50 lw $18, 12($29) 51 lw $19, 16($29) 52 lw $20, 20($29) 53 lw $21, 24($29) 54 lw $22, 28($29) 55 lw $23, 32($29) 56 lw $30, 36($29) 57 #ifndef __mips_soft_float 58 ldc1 $f20, 40($29) 59 ldc1 $f22, 48($29) 60 ldc1 $f24, 56($29) 61 ldc1 $f26, 64($29) 62 ldc1 $f28, 72($29) 63 ldc1 $f30, 80($29) 64 #endif 65 lw $31, 0($29) 66 #ifndef __mips_soft_float 67 addiu $29, $29, 88 68 #else 69 addiu $29, $29, 40 70 #endif 71 jr $31 72 73 .set at 74 75 #ifdef __ELF__ 76 .section .note.GNU-stack,"",%progbits 77 #endif