1a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* ----------------------------------------------------------------------- 2a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project asm.h - Copyright (c) 1998 Geoffrey Keating 3a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 4a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project PowerPC Assembly glue. 5a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 6a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project Permission is hereby granted, free of charge, to any person obtaining 7a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project a copy of this software and associated documentation files (the 8a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ``Software''), to deal in the Software without restriction, including 9a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project without limitation the rights to use, copy, modify, merge, publish, 10a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project distribute, sublicense, and/or sell copies of the Software, and to 11a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project permit persons to whom the Software is furnished to do so, subject to 12a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project the following conditions: 13a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 14a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project The above copyright notice and this permission notice shall be included 15a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project in all copies or substantial portions of the Software. 16a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 17a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS 18a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 20a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR 21a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 22a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project OTHER DEALINGS IN THE SOFTWARE. 24a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ----------------------------------------------------------------------- */ 25a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 26a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define ASM_GLOBAL_DIRECTIVE .globl 27a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 28a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 29a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define C_SYMBOL_NAME(name) name 30a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* Macro for a label. */ 31a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef __STDC__ 32a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define C_LABEL(name) name##: 33a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else 34a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define C_LABEL(name) name/**/: 35a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif 36a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 37a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* This seems to always be the case on PPC. */ 38a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define ALIGNARG(log2) log2 39a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* For ELF we need the `.type' directive to make shared libs work right. */ 40a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg; 41a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define ASM_SIZE_DIRECTIVE(name) .size name,.-name 42a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 43a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* If compiled for profiling, call `_mcount' at the start of each function. */ 44a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef PROF 45a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* The mcount code relies on a the return address being on the stack 46a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project to locate our caller and so it can restore it; so store one just 47a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project for its benefit. */ 48a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef PIC 49a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define CALL_MCOUNT \ 50a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project .pushsection; \ 51a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project .section ".data"; \ 52a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project .align ALIGNARG(2); \ 53a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project0:.long 0; \ 54a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project .previous; \ 55a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project mflr %r0; \ 56a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project stw %r0,4(%r1); \ 57a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project bl _GLOBAL_OFFSET_TABLE_@local-4; \ 58a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project mflr %r11; \ 59a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project lwz %r0,0b@got(%r11); \ 60a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project bl JUMPTARGET(_mcount); 61a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else /* PIC */ 62a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define CALL_MCOUNT \ 63a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project .section ".data"; \ 64a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project .align ALIGNARG(2); \ 65a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project0:.long 0; \ 66a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project .previous; \ 67a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project mflr %r0; \ 68a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project lis %r11,0b@ha; \ 69a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project stw %r0,4(%r1); \ 70a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project addi %r0,%r11,0b@l; \ 71a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project bl JUMPTARGET(_mcount); 72a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif /* PIC */ 73a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else /* PROF */ 74a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define CALL_MCOUNT /* Do nothing. */ 75a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif /* PROF */ 76a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 77a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define ENTRY(name) \ 78a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ 79a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \ 80a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project .align ALIGNARG(2); \ 81a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project C_LABEL(name) \ 82a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project CALL_MCOUNT 83a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 84a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define EALIGN_W_0 /* No words to insert. */ 85a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define EALIGN_W_1 nop 86a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define EALIGN_W_2 nop;nop 87a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define EALIGN_W_3 nop;nop;nop 88a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define EALIGN_W_4 EALIGN_W_3;nop 89a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define EALIGN_W_5 EALIGN_W_4;nop 90a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define EALIGN_W_6 EALIGN_W_5;nop 91a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define EALIGN_W_7 EALIGN_W_6;nop 92a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 93a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* EALIGN is like ENTRY, but does alignment to 'words'*4 bytes 94a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project past a 2^align boundary. */ 95a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef PROF 96a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define EALIGN(name, alignt, words) \ 97a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ 98a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \ 99a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project .align ALIGNARG(2); \ 100a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project C_LABEL(name) \ 101a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project CALL_MCOUNT \ 102a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project b 0f; \ 103a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project .align ALIGNARG(alignt); \ 104a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project EALIGN_W_##words; \ 105a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 0: 106a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else /* PROF */ 107a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define EALIGN(name, alignt, words) \ 108a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \ 109a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function) \ 110a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project .align ALIGNARG(alignt); \ 111a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project EALIGN_W_##words; \ 112a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project C_LABEL(name) 113a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif 114a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 115a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define END(name) \ 116a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project ASM_SIZE_DIRECTIVE(name) 117a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 118a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#ifdef PIC 119a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define JUMPTARGET(name) name##@plt 120a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#else 121a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define JUMPTARGET(name) name 122a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#endif 123a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project 124a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project/* Local labels stripped out by the linker. */ 125a89495f48f185779ff7d9d64ce6e6b037c9ded87The Android Open Source Project#define L(x) .L##x 126