| /* Copyright (C) 1997-2016 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 <sysdeps/generic/sysdep.h> | 
 |  | 
 | #ifdef  __ASSEMBLER__ | 
 |  | 
 | /* Syntactic details of assembler.  */ | 
 |  | 
 | # define ALIGNARG(log2) log2 | 
 | # define ASM_SIZE_DIRECTIVE(name) .size name,.-name | 
 |  | 
 | /* Define an entry point visible from C.  */ | 
 | # define ENTRY(name)                          \ | 
 |   .globl C_SYMBOL_NAME(name);                 \ | 
 |   .type C_SYMBOL_NAME(name),@function;        \ | 
 |   .align ALIGNARG(2);                         \ | 
 |   C_LABEL(name)                               \ | 
 |   CALL_MCOUNT | 
 |  | 
 | # undef END | 
 | # define END(name) ASM_SIZE_DIRECTIVE(name) | 
 |  | 
 |  | 
 | /* If compiled for profiling, call `_mcount' at the start of each function.  */ | 
 | # ifdef  PROF | 
 | /* The mcount code relies on a normal frame pointer being on the stack | 
 |    to locate our caller, so push one just for its benefit.  */ | 
 | #  define CALL_MCOUNT                         \ | 
 |    addik r1,r1,-4;                            \ | 
 |    swi r15,r1,0;                              \ | 
 |    brlid r15,JUMPTARGET(mcount);              \ | 
 |    nop;                                       \ | 
 |    lwi r15,r1,0;                              \ | 
 |    addik r1,r1,4; | 
 | # else | 
 | #  define CALL_MCOUNT        /* Do nothing.  */ | 
 | # endif | 
 |  | 
 | /* Since C identifiers are not normally prefixed with an underscore | 
 |    on this system, the asm identifier `syscall_error' intrudes on the | 
 |    C name space.  Make sure we use an innocuous name.  */ | 
 | # define syscall_error   __syscall_error | 
 | # define mcount      _mcount | 
 |  | 
 | # define PSEUDO(name, syscall_name, args)     \ | 
 |   .globl syscall_error;                       \ | 
 |   ENTRY (name)                                \ | 
 |     DO_CALL (syscall_name, args); | 
 |  | 
 | # define ret                                  \ | 
 |   rtsd r15,8; nop; | 
 |  | 
 | # undef PSEUDO_END | 
 | # define PSEUDO_END(name)                     \ | 
 |   END (name) | 
 |  | 
 | # undef JUMPTARGET | 
 | # ifdef PIC | 
 | #  define JUMPTARGET(name)   name##@PLTPC | 
 | # else | 
 | #  define JUMPTARGET(name)   name | 
 | # endif | 
 |  | 
 | /* Local label name for asm code.  */ | 
 | # ifndef L | 
 | #  define L(name) $L##name | 
 | # endif | 
 |  | 
 | # endif  /* __ASSEMBLER__  */ |