123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- /* Machine-specific calling sequence for `mcount' profiling function. MIPS
- Copyright (C) 1996-2019 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library. If not, see
- <http://www.gnu.org/licenses/>. */
- #include <sgidefs.h>
- #define _MCOUNT_DECL(frompc,selfpc) \
- static void __attribute_used__ __mcount (u_long frompc, u_long selfpc)
- /* Call __mcount with the return PC for our caller,
- and the return PC our caller will return to. */
- #if _MIPS_SIM == _ABIO32
- #ifdef __PIC__
- # define CPLOAD ".cpload $25;"
- # define CPRESTORE ".cprestore 44\n\t"
- #else
- # define CPLOAD
- # define CPRESTORE
- #endif
- #define MCOUNT asm(\
- ".globl _mcount;\n\t" \
- ".align 2;\n\t" \
- ".set push;\n\t" \
- ".set nomips16;\n\t" \
- ".type _mcount,@function;\n\t" \
- ".ent _mcount\n\t" \
- "_mcount:\n\t" \
- ".frame $sp,44,$31\n\t" \
- ".set noreorder;\n\t" \
- ".set noat;\n\t" \
- CPLOAD \
- "subu $29,$29,48;\n\t" \
- CPRESTORE \
- "sw $4,24($29);\n\t" \
- "sw $5,28($29);\n\t" \
- "sw $6,32($29);\n\t" \
- "sw $7,36($29);\n\t" \
- "sw $2,40($29);\n\t" \
- "sw $1,16($29);\n\t" \
- "sw $31,20($29);\n\t" \
- "move $5,$31;\n\t" \
- "move $4,$1;\n\t" \
- "jal __mcount;\n\t" \
- "nop;\n\t" \
- "lw $4,24($29);\n\t" \
- "lw $5,28($29);\n\t" \
- "lw $6,32($29);\n\t" \
- "lw $7,36($29);\n\t" \
- "lw $2,40($29);\n\t" \
- "lw $31,20($29);\n\t" \
- "lw $1,16($29);\n\t" \
- "addu $29,$29,56;\n\t" \
- "j $31;\n\t" \
- "move $31,$1;\n\t" \
- ".end _mcount;\n\t" \
- ".set pop");
- #else
- #ifdef __PIC__
- # define CPSETUP ".cpsetup $25, 88, _mcount;"
- # define CPRETURN ".cpreturn;"
- #else
- # define CPSETUP
- # define CPRETURN
- #endif
- #if _MIPS_SIM == _ABIN32
- # if !defined __mips_isa_rev || __mips_isa_rev < 6
- # define PTR_ADDU_STRING "add" /* no u */
- # define PTR_SUBU_STRING "sub" /* no u */
- # else
- # define PTR_ADDU_STRING "addu"
- # define PTR_SUBU_STRING "subu"
- # endif
- #elif _MIPS_SIM == _ABI64
- # define PTR_ADDU_STRING "daddu"
- # define PTR_SUBU_STRING "dsubu"
- #else
- # error "Unknown ABI"
- #endif
- #define MCOUNT asm(\
- ".globl _mcount;\n\t" \
- ".align 3;\n\t" \
- ".set push;\n\t" \
- ".set nomips16;\n\t" \
- ".type _mcount,@function;\n\t" \
- ".ent _mcount\n\t" \
- "_mcount:\n\t" \
- ".frame $sp,88,$31\n\t" \
- ".set noreorder;\n\t" \
- ".set noat;\n\t" \
- PTR_SUBU_STRING " $29,$29,96;\n\t" \
- CPSETUP \
- "sd $4,24($29);\n\t" \
- "sd $5,32($29);\n\t" \
- "sd $6,40($29);\n\t" \
- "sd $7,48($29);\n\t" \
- "sd $8,56($29);\n\t" \
- "sd $9,64($29);\n\t" \
- "sd $10,72($29);\n\t" \
- "sd $11,80($29);\n\t" \
- "sd $2,16($29);\n\t" \
- "sd $1,0($29);\n\t" \
- "sd $31,8($29);\n\t" \
- "move $5,$31;\n\t" \
- "move $4,$1;\n\t" \
- "jal __mcount;\n\t" \
- "nop;\n\t" \
- "ld $4,24($29);\n\t" \
- "ld $5,32($29);\n\t" \
- "ld $6,40($29);\n\t" \
- "ld $7,48($29);\n\t" \
- "ld $8,56($29);\n\t" \
- "ld $9,64($29);\n\t" \
- "ld $10,72($29);\n\t" \
- "ld $11,80($29);\n\t" \
- "ld $2,16($29);\n\t" \
- "ld $31,8($29);\n\t" \
- "ld $1,0($29);\n\t" \
- CPRETURN \
- PTR_ADDU_STRING " $29,$29,96;\n\t" \
- "j $31;\n\t" \
- "move $31,$1;\n\t" \
- ".end _mcount;\n\t" \
- ".set pop");
- #endif
|