Text file src/runtime/cgo/gcc_mips64x.S

     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 mips64 || mips64le
     6  
     7  .file "gcc_mips64x.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 N64 ABI, where $16-$23, $28, $30, and $f24-$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  	daddiu	$29, $29, -160
    21  #else
    22  	daddiu	$29, $29, -96 // For soft-float, no need to make room for FP registers
    23  #endif
    24  	sd	$31, 0($29)
    25  	sd	$16, 8($29)
    26  	sd	$17, 16($29)
    27  	sd	$18, 24($29)
    28  	sd	$19, 32($29)
    29  	sd	$20, 40($29)
    30  	sd	$21, 48($29)
    31  	sd	$22, 56($29)
    32  	sd	$23, 64($29)
    33  	sd	$28, 72($29)
    34  	sd	$30, 80($29)
    35  #ifndef __mips_soft_float
    36  	sdc1	$f24, 88($29)
    37  	sdc1	$f25, 96($29)
    38  	sdc1	$f26, 104($29)
    39  	sdc1	$f27, 112($29)
    40  	sdc1	$f28, 120($29)
    41  	sdc1	$f29, 128($29)
    42  	sdc1	$f30, 136($29)
    43  	sdc1	$f31, 144($29)
    44  #endif
    45  
    46  	// prepare SB register = pc & 0xffffffff00000000
    47  	bal	1f
    48  1:
    49  	dsrl	$28, $31, 32
    50  	dsll	$28, $28, 32
    51  
    52  	move	$20, $4 // save R4
    53  	move	$1, $6
    54  	jalr	$5	// call setg_gcc (clobbers R4)
    55  	jalr	$20	// call fn
    56  
    57  	ld	$16, 8($29)
    58  	ld	$17, 16($29)
    59  	ld	$18, 24($29)
    60  	ld	$19, 32($29)
    61  	ld	$20, 40($29)
    62  	ld	$21, 48($29)
    63  	ld	$22, 56($29)
    64  	ld	$23, 64($29)
    65  	ld	$28, 72($29)
    66  	ld	$30, 80($29)
    67  #ifndef __mips_soft_float
    68  	ldc1	$f24, 88($29)
    69  	ldc1	$f25, 96($29)
    70  	ldc1	$f26, 104($29)
    71  	ldc1	$f27, 112($29)
    72  	ldc1	$f28, 120($29)
    73  	ldc1	$f29, 128($29)
    74  	ldc1	$f30, 136($29)
    75  	ldc1	$f31, 144($29)
    76  #endif
    77  	ld	$31, 0($29)
    78  #ifndef __mips_soft_float
    79  	daddiu	$29, $29, 160
    80  #else
    81  	daddiu	$29, $29, 96
    82  #endif
    83  	jr	$31
    84  
    85  .set at
    86  
    87  #ifdef __ELF__
    88  .section .note.GNU-stack,"",%progbits
    89  #endif
    90  

View as plain text