xf.li | bdd93d5 | 2023-05-12 07:10:14 -0700 | [diff] [blame^] | 1 | /* Machine-specific calling sequence for `mcount' profiling function. MIPS |
| 2 | Copyright (C) 1996-2016 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 | <http://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 |