1 /* Machine-specific calling sequence for `mcount' profiling function. MIPS 2 Copyright (C) 1996-2021 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library. If not, see 17 <https://www.gnu.org/licenses/>. */ 18 19 #include <sgidefs.h> 20 21 #define _MCOUNT_DECL(frompc,selfpc) \ 22 static void __attribute_used__ __mcount (u_long frompc, u_long selfpc) 23 24 /* Call __mcount with the return PC for our caller, 25 and the return PC our caller will return to. */ 26 27 #if _MIPS_SIM == _ABIO32 28 29 #ifdef __PIC__ 30 # define CPLOAD ".cpload $25;" 31 # define CPRESTORE ".cprestore 44\n\t" 32 #else 33 # define CPLOAD 34 # define CPRESTORE 35 #endif 36 37 #define MCOUNT asm(\ 38 ".globl _mcount;\n\t" \ 39 ".align 2;\n\t" \ 40 ".set push;\n\t" \ 41 ".set nomips16;\n\t" \ 42 ".type _mcount,@function;\n\t" \ 43 ".ent _mcount\n\t" \ 44 "_mcount:\n\t" \ 45 ".frame $sp,44,$31\n\t" \ 46 ".set noreorder;\n\t" \ 47 ".set noat;\n\t" \ 48 CPLOAD \ 49 "subu $29,$29,48;\n\t" \ 50 CPRESTORE \ 51 "sw $4,24($29);\n\t" \ 52 "sw $5,28($29);\n\t" \ 53 "sw $6,32($29);\n\t" \ 54 "sw $7,36($29);\n\t" \ 55 "sw $2,40($29);\n\t" \ 56 "sw $1,16($29);\n\t" \ 57 "sw $31,20($29);\n\t" \ 58 "move $5,$31;\n\t" \ 59 "move $4,$1;\n\t" \ 60 "jal __mcount;\n\t" \ 61 "nop;\n\t" \ 62 "lw $4,24($29);\n\t" \ 63 "lw $5,28($29);\n\t" \ 64 "lw $6,32($29);\n\t" \ 65 "lw $7,36($29);\n\t" \ 66 "lw $2,40($29);\n\t" \ 67 "lw $31,20($29);\n\t" \ 68 "lw $1,16($29);\n\t" \ 69 "addu $29,$29,56;\n\t" \ 70 "j $31;\n\t" \ 71 "move $31,$1;\n\t" \ 72 ".end _mcount;\n\t" \ 73 ".set pop"); 74 75 #else 76 77 #ifdef __PIC__ 78 # define CPSETUP ".cpsetup $25, 88, _mcount;" 79 # define CPRETURN ".cpreturn;" 80 #else 81 # define CPSETUP 82 # define CPRETURN 83 #endif 84 85 #if _MIPS_SIM == _ABIN32 86 # if !defined __mips_isa_rev || __mips_isa_rev < 6 87 # define PTR_ADDU_STRING "add" /* no u */ 88 # define PTR_SUBU_STRING "sub" /* no u */ 89 # else 90 # define PTR_ADDU_STRING "addu" 91 # define PTR_SUBU_STRING "subu" 92 # endif 93 #elif _MIPS_SIM == _ABI64 94 # define PTR_ADDU_STRING "daddu" 95 # define PTR_SUBU_STRING "dsubu" 96 #else 97 # error "Unknown ABI" 98 #endif 99 100 #define MCOUNT asm(\ 101 ".globl _mcount;\n\t" \ 102 ".align 3;\n\t" \ 103 ".set push;\n\t" \ 104 ".set nomips16;\n\t" \ 105 ".type _mcount,@function;\n\t" \ 106 ".ent _mcount\n\t" \ 107 "_mcount:\n\t" \ 108 ".frame $sp,88,$31\n\t" \ 109 ".set noreorder;\n\t" \ 110 ".set noat;\n\t" \ 111 PTR_SUBU_STRING " $29,$29,96;\n\t" \ 112 CPSETUP \ 113 "sd $4,24($29);\n\t" \ 114 "sd $5,32($29);\n\t" \ 115 "sd $6,40($29);\n\t" \ 116 "sd $7,48($29);\n\t" \ 117 "sd $8,56($29);\n\t" \ 118 "sd $9,64($29);\n\t" \ 119 "sd $10,72($29);\n\t" \ 120 "sd $11,80($29);\n\t" \ 121 "sd $2,16($29);\n\t" \ 122 "sd $1,0($29);\n\t" \ 123 "sd $31,8($29);\n\t" \ 124 "move $5,$31;\n\t" \ 125 "move $4,$1;\n\t" \ 126 "jal __mcount;\n\t" \ 127 "nop;\n\t" \ 128 "ld $4,24($29);\n\t" \ 129 "ld $5,32($29);\n\t" \ 130 "ld $6,40($29);\n\t" \ 131 "ld $7,48($29);\n\t" \ 132 "ld $8,56($29);\n\t" \ 133 "ld $9,64($29);\n\t" \ 134 "ld $10,72($29);\n\t" \ 135 "ld $11,80($29);\n\t" \ 136 "ld $2,16($29);\n\t" \ 137 "ld $31,8($29);\n\t" \ 138 "ld $1,0($29);\n\t" \ 139 CPRETURN \ 140 PTR_ADDU_STRING " $29,$29,96;\n\t" \ 141 "j $31;\n\t" \ 142 "move $31,$1;\n\t" \ 143 ".end _mcount;\n\t" \ 144 ".set pop"); 145 146 #endif 147