|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884 |
- /*********************************************************************/
- /* Copyright 2009, 2010 The University of Texas at Austin. */
- /* All rights reserved. */
- /* */
- /* Redistribution and use in source and binary forms, with or */
- /* without modification, are permitted provided that the following */
- /* conditions are met: */
- /* */
- /* 1. Redistributions of source code must retain the above */
- /* copyright notice, this list of conditions and the following */
- /* disclaimer. */
- /* */
- /* 2. Redistributions in binary form must reproduce the above */
- /* copyright notice, this list of conditions and the following */
- /* disclaimer in the documentation and/or other materials */
- /* provided with the distribution. */
- /* */
- /* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF TEXAS AT */
- /* AUSTIN ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, */
- /* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
- /* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */
- /* DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT */
- /* AUSTIN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, */
- /* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES */
- /* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE */
- /* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR */
- /* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */
- /* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */
- /* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT */
- /* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */
- /* POSSIBILITY OF SUCH DAMAGE. */
- /* */
- /* The views and conclusions contained in the software and */
- /* documentation are those of the authors and should not be */
- /* interpreted as representing official policies, either expressed */
- /* or implied, of The University of Texas at Austin. */
- /*********************************************************************/
-
- #ifndef COMMON_POWER
- #define COMMON_POWER
-
- #define str(x) #x
-
- #ifdef OS_AIX
- #define XXSPLTD(T,A,z) xxpermdi T, A, A, 0b##z##z
- #define XXMRGHD(T,A,B) xxpermdi T, A, B, 0b00
- #define XXMRGLD(T,A,B) xxpermdi T, A, B, 0b11
- #define XXSWAPD(T,A) xxpermdi T, A, A, 0b10
- #define XVMOVDP(T,A) xvcpsgndp T, A, A
-
- #define XXSPLTD_S(T,A,z) "xxpermdi " str(T) ", " str(A) ", " str(A) ", 0b" str(z ## z) " \n\t"
- #define XXMRGHD_S(T,A,B) "xxpermdi " str(T) ", " str(A) ", " str(B) ", 0b00 \n\t"
- #define XXMRGLD_S(T,A,B) "xxpermdi " str(T) ", " str(A) ", " str(B) ", 0b11 \n\t"
- #define XXSWAPD_S(T,A) "xxpermdi " str(T) ", " str(A) ", " str(A) ", 0b10 \n\t"
-
- #else
- #define XXSPLTD(T,A,z) xxspltd T, A, z
- #define XXMRGHD(T,A,B) xxmrghd T, A, B
- #define XXMRGLD(T,A,B) xxmrgld T, A, B
- #define XXSWAPD(T,A) xxswapd T, A
- #define XVMOVDP(T,A) xvmovdp T, A
-
- #define XXSPLTD_S(T,A,z) "xxspltd " str(T) ", " str(A) ", " str(z)" \n\t"
- #define XXMRGHD_S(T,A,B) "xxmrghd " str(T) ", " str(A) ", " str(B)" \n\t"
- #define XXMRGLD_S(T,A,B) "xxmrgld " str(T) ", " str(A) ", " str(B)" \n\t"
- #define XXSWAPD_S(T,A) "xxswapd " str(T) ", " str(A) " \n\t"
-
- #endif
-
-
- #if defined(POWER8) || defined(POWER9) || defined(POWER10)
- #define MB __asm__ __volatile__ ("eieio":::"memory")
- #define WMB __asm__ __volatile__ ("eieio":::"memory")
- #define RMB __asm__ __volatile__ ("eieio":::"memory")
- #else
- #define MB __asm__ __volatile__ ("sync")
- #define WMB __asm__ __volatile__ ("sync")
- #define RMB __asm__ __volatile__ ("sync")
- #endif
-
- #define INLINE inline
-
- #ifdef PPC440
- #define STDERR stdout
- #define QNONCACHE 0x1
- #define QCOMMS 0x2
- #define QFAST 0x4
- #endif
-
- #ifndef ASSEMBLER
-
- void *qalloc(int flags, size_t bytes);
-
- static void INLINE blas_lock(volatile unsigned long *address){
-
- long int ret, val = 1;
-
- do {
- while (*address) {YIELDING;};
-
- #if defined(OS_LINUX) || defined(OS_DARWIN)
- __asm__ __volatile__ (
- "0: lwarx %0, 0, %1\n"
- " cmpwi %0, 0\n"
- " bne- 1f\n"
- " stwcx. %2,0, %1\n"
- " bne- 0b\n"
- " isync\n"
- "1: "
- : "=&r"(ret)
- : "r"(address), "r" (val)
- : "cr0", "memory");
- #else
- __asm__ __volatile__ (
- ".machine \"any\"\n"
- " lwarx %0, 0, %1\n"
- " cmpwi %0, 0\n"
- " bne- $+12\n"
- " stwcx. %2,0, %1\n"
- " bne- $-16\n"
- : "=&r"(ret)
- : "r"(address), "r" (val)
- : "cr0", "memory");
- #endif
- } while (ret);
- }
- #define BLAS_LOCK_DEFINED
-
- static inline unsigned long rpcc(void){
- unsigned long ret;
-
- #ifdef OS_AIX
- __asm__ __volatile__(".machine \"any\" ;");
- #endif
- __asm__ __volatile__ ("mftb %0" : "=r" (ret) : );
-
- #if defined(POWER5) || defined(PPC970)
- return (ret << 6);
- #else
- return (ret << 3);
- #endif
-
- }
- #define RPCC_DEFINED
-
- #ifdef __64BIT__
- #define RPCC64BIT
- #endif
-
- static inline unsigned long getstackaddr(void){
- unsigned long addr;
-
- __asm__ __volatile__ ("mr %0, 1"
- : "=r"(addr) : : "memory");
-
- return addr;
- };
-
- #if defined(OS_LINUX) || defined(OS_AIX)
- #define GET_IMAGE(res) __asm__ __volatile__("fmr %0, 2" : "=f"(res) : : "memory")
- #else
- #define GET_IMAGE(res) __asm__ __volatile__("fmr %0, f2" : "=f"(res) : : "memory")
-
- #define GET_IMAGE_CANCEL
-
- #endif
-
- #ifdef SMP
- static inline int blas_quickdivide(blasint x, blasint y){
- return x / y;
- }
- #endif
-
- #endif
-
-
- #ifdef ASSEMBLER
-
- #ifdef DOUBLE
- #define LFD lfd
- #define LFDX lfdx
- #define LFPDX lfpdx
- #define LFSDX lfsdx
- #define LFXDX lfxdx
- #define LFDU lfdu
- #define LFDUX lfdux
- #define LFPDUX lfpdux
- #define LFSDUX lfsdux
- #define LFXDUX lfxdux
- #define STFD stfd
- #define STFDX stfdx
- #define STFPDX stfpdx
- #define STFSDX stfsdx
- #define STFXDX stfxdx
- #define STFDU stfdu
- #define STFDUX stfdux
- #define STFPDUX stfpdux
- #define STFSDUX stfsdux
- #define STFXDUX stfxdux
- #define FMADD fmadd
- #define FMSUB fmsub
- #define FNMADD fnmadd
- #define FNMSUB fnmsub
- #define FMUL fmul
- #define FADD fadd
- #define FSUB fsub
- #else
- #define LFD lfs
- #define LFDX lfsx
- #define LFPDX lfpsx
- #define LFSDX lfssx
- #define LFXDX lfxsx
- #define LFDU lfsu
- #define LFDUX lfsux
- #define LFPDUX lfpsux
- #define LFSDUX lfssux
- #define LFXDUX lfxsux
- #define STFD stfs
- #define STFDX stfsx
- #define STFPDX stfpsx
- #define STFSDX stfssx
- #define STFXDX stfxsx
- #define STFDU stfsu
- #define STFDUX stfsux
- #define STFPDUX stfpsux
- #define STFSDUX stfssux
- #define STFXDUX stfxsux
- #define FMADD fmadds
- #define FMSUB fmsubs
- #define FNMADD fnmadds
- #define FNMSUB fnmsubs
- #define FMUL fmuls
- #define FADD fadds
- #define FSUB fsubs
- #endif
-
- #ifdef __64BIT__
- #define LDLONG ld
- #else
- #define LDLONG lwz
- #endif
-
- #ifdef OS_DARWIN
- #define LL(x) L##x
- #endif
-
- #ifdef OS_LINUX
- #define LL(x) .L##x
- #endif
-
- #ifndef LL
- #define LL(x) __L##x
- #endif
-
-
- #if defined(__64BIT__) && defined(USE64BITINT)
- #define LDINT ld
- #elif defined(__64BIT__) && !defined(USE64BITINT)
- #define LDINT lwa
- #else
- #define LDINT lwz
- #endif
-
- /*
- #define DCBT(REGA, REGB, NUM) .long (0x7c00022c | (REGA << 16) | (REGB << 11) | ((NUM) << 21))
- #define DCBTST(REGA, REGB, NUM) .long (0x7c0001ec | (REGA << 16) | (REGB << 11) | ((NUM) << 21))
- */
-
- #define DSTATTR_H(SIZE, COUNT, STRIDE) ((SIZE << 8) | (COUNT))
- #define DSTATTR_L(SIZE, COUNT, STRIDE) (STRIDE)
-
- #if defined(PPC970) || defined(POWER3) || defined(POWER4) || defined(POWER5) || defined(PPCG4)
- #define HAVE_PREFETCH
- #endif
-
- #if defined(POWER3) || defined(POWER6) || defined(PPCG4) || defined(CELL) || defined(POWER8) || defined(POWER9) || defined(POWER10) || defined(PPC970)
- #define DCBT_ARG 0
- #else
- #define DCBT_ARG 8
- #endif
-
- #ifdef CELL
- #define L1_DUALFETCH
- #define L1_PREFETCHSIZE (64 + 128 * 13)
- #endif
-
- #if defined(POWER3) || defined(POWER4) || defined(POWER5)
- #define L1_DUALFETCH
- #define L1_PREFETCHSIZE (96 + 128 * 12)
- #endif
-
- #if defined(POWER6)
- #define L1_DUALFETCH
- #define L1_PREFETCHSIZE (16 + 128 * 100)
- #define L1_PREFETCH dcbtst
- #endif
-
- #if defined(POWER8) || defined(POWER9) || defined(POWER10)
- #define L1_DUALFETCH
- #define L1_PREFETCHSIZE (16 + 128 * 100)
- #define L1_PREFETCH dcbtst
- #endif
-
- #
- #ifndef L1_PREFETCH
- #define L1_PREFETCH dcbt
- #endif
-
- #ifndef L1_PREFETCHW
- #define L1_PREFETCHW dcbtst
- #endif
-
- #if DCBT_ARG == 0
- #define DCBT(REGA, REGB) L1_PREFETCH REGB, REGA
- #define DCBTST(REGA, REGB) L1_PREFETCHW REGB, REGA
- #else
- #define DCBT(REGA, REGB) L1_PREFETCH DCBT_ARG, REGB, REGA
- #define DCBTST(REGA, REGB) L1_PREFETCHW DCBT_ARG, REGB, REGA
- #endif
-
-
- #ifndef L1_PREFETCHSIZE
- #define L1_PREFETCHSIZE (96 + 128 * 12)
- #endif
-
- #if !defined(OS_DARWIN) || defined(NEEDPARAM)
- #define f0 0
- #define f1 1
- #define f2 2
- #define f3 3
- #define f4 4
- #define f5 5
- #define f6 6
- #define f7 7
- #define f8 8
- #define f9 9
- #define f10 10
- #define f11 11
- #define f12 12
- #define f13 13
- #define f14 14
- #define f15 15
- #define f16 16
- #define f17 17
- #define f18 18
- #define f19 19
- #define f20 20
- #define f21 21
- #define f22 22
- #define f23 23
- #define f24 24
- #define f25 25
- #define f26 26
- #define f27 27
- #define f28 28
- #define f29 29
- #define f30 30
- #define f31 31
-
- #define r0 0
- #define r1 1
- #define r2 2
- #define r3 3
- #define r4 4
- #define r5 5
- #define r6 6
- #define r7 7
- #define r8 8
- #define r9 9
- #define r10 10
- #define r11 11
- #define r12 12
- #define r13 13
- #define r14 14
- #define r15 15
- #define r16 16
- #define r17 17
- #define r18 18
- #define r19 19
- #define r20 20
- #define r21 21
- #define r22 22
- #define r23 23
- #define r24 24
- #define r25 25
- #define r26 26
- #define r27 27
- #define r28 28
- #define r29 29
- #define r30 30
- #define r31 31
-
- #define v0 0
- #define v1 1
- #define v2 2
- #define v3 3
- #define v4 4
- #define v5 5
- #define v6 6
- #define v7 7
- #define v8 8
- #define v9 9
- #define v10 10
- #define v11 11
- #define v12 12
- #define v13 13
- #define v14 14
- #define v15 15
- #define v16 16
- #define v17 17
- #define v18 18
- #define v19 19
- #define v20 20
- #define v21 21
- #define v22 22
- #define v23 23
- #define v24 24
- #define v25 25
- #define v26 26
- #define v27 27
- #define v28 28
- #define v29 29
- #define v30 30
- #define v31 31
-
- #define BO_dCTR_NZERO_AND_NOT 0
- #define BO_dCTR_NZERO_AND_NOT_1 1
- #define BO_dCTR_ZERO_AND_NOT 2
- #define BO_dCTR_ZERO_AND_NOT_1 3
- #define BO_IF_NOT 4
- #define BO_IF_NOT_1 5
- #define BO_IF_NOT_2 6
- #define BO_IF_NOT_3 7
- #define BO_dCTR_NZERO_AND 8
- #define BO_dCTR_NZERO_AND_1 9
- #define BO_dCTR_ZERO_AND 10
- #define BO_dCTR_ZERO_AND_1 11
- #define BO_IF 12
- #define BO_IF_1 13
- #define BO_IF_2 14
- #define BO_IF_3 15
- #define BO_dCTR_NZERO 16
- #define BO_dCTR_NZERO_1 17
- #define BO_dCTR_ZERO 18
- #define BO_dCTR_ZERO_1 19
- #define BO_ALWAYS 20
- #define BO_ALWAYS_1 21
- #define BO_ALWAYS_2 22
- #define BO_ALWAYS_3 23
- #define BO_dCTR_NZERO_8 24
- #define BO_dCTR_NZERO_9 25
- #define BO_dCTR_ZERO_8 26
- #define BO_dCTR_ZERO_9 27
- #define BO_ALWAYS_8 28
- #define BO_ALWAYS_9 29
- #define BO_ALWAYS_10 30
- #define BO_ALWAYS_11 31
-
- #define CR0_LT 0
- #define CR0_GT 1
- #define CR0_EQ 2
- #define CR0_SO 3
- #define CR1_FX 4
- #define CR1_FEX 5
- #define CR1_VX 6
- #define CR1_OX 7
- #define CR2_LT 8
- #define CR2_GT 9
- #define CR2_EQ 10
- #define CR2_SO 11
- #define CR3_LT 12
- #define CR3_GT 13
- #define CR3_EQ 14
- #define CR3_SO 15
- #define CR4_LT 16
- #define CR4_GT 17
- #define CR4_EQ 18
- #define CR4_SO 19
- #define CR5_LT 20
- #define CR5_GT 21
- #define CR5_EQ 22
- #define CR5_SO 23
- #define CR6_LT 24
- #define CR6_GT 25
- #define CR6_EQ 26
- #define CR6_SO 27
- #define CR7_LT 28
- #define CR7_GT 29
- #define CR7_EQ 30
- #define CR7_SO 31
- #define TO_LT 16
- #define TO_GT 8
- #define TO_EQ 4
- #define TO_LLT 2
- #define TO_LGT 1
- #define CR0 0
- #define CR1 1
- #define CR2 2
- #define CR3 3
- #define CR4 4
- #define CR5 5
- #define CR6 6
- #define CR7 7
- #define cr0 0
- #define cr1 1
- #define cr2 2
- #define cr3 3
- #define cr4 4
- #define cr5 5
- #define cr6 6
- #define cr7 7
- #define VRsave 256
-
- #endif
-
- #define CTR 9
- #define SP r1
-
- #ifdef __64BIT__
- #define slwi sldi
- #define cmpwi cmpdi
- #define srawi sradi
- #define mullw mulld
- #endif
-
- #ifndef F_INTERFACE
- #define REALNAME ASMNAME
- #else
- #define REALNAME ASMFNAME
- #endif
-
- #if defined(ASSEMBLER) && !defined(NEEDPARAM)
-
- #if defined(OS_LINUX) || defined(OS_FREEBSD)
- #ifndef __64BIT__
- #define PROLOGUE \
- .section .text;\
- .align 6;\
- .globl REALNAME;\
- .type REALNAME, @function;\
- REALNAME:
- #define EPILOGUE .size REALNAME, .-REALNAME
- #else
- #if _CALL_ELF == 2
- #define PROLOGUE \
- .section .text;\
- .align 6;\
- .globl REALNAME;\
- .type REALNAME, @function;\
- REALNAME:
- #define EPILOGUE .size REALNAME, .-REALNAME
- #else
- #define PROLOGUE \
- .section .text;\
- .align 5;\
- .globl REALNAME;\
- .section ".opd","aw";\
- .align 3;\
- REALNAME:;\
- .quad .REALNAME, .TOC.@tocbase, 0;\
- .previous;\
- .size REALNAME, 24;\
- .type .REALNAME, @function;\
- .globl .REALNAME;\
- .REALNAME:
- #define EPILOGUE \
- .long 0 ; \
- .byte 0,0,0,1,128,0,0,0 ; \
- .size .REALNAME, .-.REALNAME; \
- .section .note.GNU-stack,"",@progbits
- #endif
- #endif
-
- #ifdef PROFILE
- #ifndef __64BIT__
- #define PROFCODE ;\
- .section ".data";\
- .align 2;\
- .LP3:;\
- .long 0;\
- .section ".text";\
- mflr r0;\
- stw r0, 4(SP);\
- lis r12, .LP3@ha;\
- la r0, .LP3@l(r12);\
- bl _mcount;\
- lwz r0, 4(SP);\
- mtlr r0
- #else
- #define PROFCODE \
- .globl _mcount; \
- mflr r0; \
- std r0, 16(SP); \
- mr r11, SP; \
- addi SP, SP, -256; \
- std r11, 0(SP); \
- std r3, 128(SP); \
- std r4, 136(SP); \
- std r5, 144(SP); \
- std r6, 152(SP); \
- std r7, 160(SP); \
- std r8, 168(SP); \
- std r9, 176(SP); \
- std r10, 184(SP); \
- stfd f3, 192(SP); \
- stfd f4, 200(SP); \
- bl ._mcount; \
- nop; \
- ld r3, 128(SP);\
- ld r4, 136(SP);\
- ld r5, 144(SP);\
- ld r6, 152(SP);\
- ld r7, 160(SP);\
- ld r8, 168(SP);\
- ld r9, 176(SP);\
- ld r10, 184(SP);\
- lfd f3, 192(SP);\
- lfd f4, 200(SP);\
- addi SP, SP, 256;\
- ld r0, 16(SP);\
- mtlr r0
- #endif
- #else
- #define PROFCODE
- #endif
-
- #endif
-
- #if OS_AIX
- #ifndef __64BIT__
- #define PROLOGUE \
- .machine "any";\
- .toc;\
- .globl .REALNAME;\
- .globl REALNAME;\
- .csect REALNAME[DS],3;\
- REALNAME:;\
- .long .REALNAME, TOC[tc0], 0;\
- .csect .text[PR],5;\
- .REALNAME:
-
- #define EPILOGUE \
- _section_.text:;\
- .csect .data[RW],4;\
- .long _section_.text;
-
- #else
-
- #define PROLOGUE \
- .machine "any";\
- .toc;\
- .globl .REALNAME;\
- .globl REALNAME;\
- .csect REALNAME[DS],3;\
- REALNAME:;\
- .llong .REALNAME, TOC[tc0], 0;\
- .csect .text[PR], 5;\
- .REALNAME:
-
- #define EPILOGUE \
- _section_.text:;\
- .csect .data[RW],4;\
- .llong _section_.text;
- #endif
-
- #define PROFCODE
-
- #endif
-
- #ifdef OS_DARWIN
- #ifndef __64BIT__
- .macro PROLOGUE
- .section __TEXT,__text,regular,pure_instructions
- .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
- .machine ppc
- .text
- .align 4
- .globl REALNAME
- REALNAME:
- .endmacro
- #else
- .macro PROLOGUE
- .section __TEXT,__text,regular,pure_instructions
- .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
- .machine ppc64
- .text
- .align 4
- .globl REALNAME
- REALNAME:
- .endmacro
- #endif
-
- #ifndef PROFILE
- #define PROFCODE
- #define EPILOGUE .subsections_via_symbols
- #else
- #ifndef __64BIT__
-
- .macro PROFCODE
- mflr r0
- stw r0, 8(SP)
- addi SP, SP, -64
- stw SP, 0(SP)
- stw r3, 12(SP)
- stw r4, 16(SP)
- stw r5, 20(SP)
- stw r6, 24(SP)
- stw r7, 28(SP)
- stw r8, 32(SP)
- stw r9, 36(SP)
- stw r10, 40(SP)
- stfd f1, 48(SP)
- stfd f2, 56(SP)
- mr r3, r0
- bl Lmcount$stub
- nop
- lwz r3, 12(SP)
- lwz r4, 16(SP)
- lwz r5, 20(SP)
- lwz r6, 24(SP)
- lwz r7, 28(SP)
- lwz r8, 32(SP)
- lwz r9, 36(SP)
- lwz r10, 40(SP)
- lfd f1, 48(SP)
- lfd f2, 56(SP)
- addi SP, SP, 64
- lwz r0, 8(SP)
- mtlr r0
- .endmacro
-
- .macro EPILOGUE
- .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
- .align 5
- Lmcount$stub:
- .indirect_symbol mcount
- mflr r0
- bcl 20,31,L00000000001$spb
- L00000000001$spb:
- mflr r11
- addis r11,r11,ha16(Lmcount$lazy_ptr-L00000000001$spb)
- mtlr r0
- lwzu r12,lo16(Lmcount$lazy_ptr-L00000000001$spb)(r11)
- mtctr r12
- bctr
- .lazy_symbol_pointer
- Lmcount$lazy_ptr:
- .indirect_symbol mcount
- .long dyld_stub_binding_helper
- .subsections_via_symbols
- .endmacro
-
- #else
- .macro PROFCODE
- mflr r0
- std r0, 16(SP)
- addi SP, SP, -128
- std SP, 0(SP)
- std r3, 24(SP)
- std r4, 32(SP)
- std r5, 40(SP)
- std r6, 48(SP)
- std r7, 56(SP)
- std r8, 64(SP)
- std r9, 72(SP)
- std r10, 80(SP)
- stfd f1, 88(SP)
- stfd f2, 96(SP)
- mr r3, r0
- bl Lmcount$stub
- nop
- ld r3, 24(SP)
- ld r4, 32(SP)
- ld r5, 40(SP)
- ld r6, 48(SP)
- ld r7, 56(SP)
- ld r8, 64(SP)
- ld r9, 72(SP)
- ld r10, 80(SP)
- lfd f1, 88(SP)
- lfd f2, 86(SP)
- addi SP, SP, 128
- ld r0, 16(SP)
- mtlr r0
- .endmacro
-
- .macro EPILOGUE
- .data
- .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
- .align 5
- Lmcount$stub:
- .indirect_symbol mcount
- mflr r0
- bcl 20,31,L00000000001$spb
- L00000000001$spb:
- mflr r11
- addis r11,r11,ha16(Lmcount$lazy_ptr-L00000000001$spb)
- mtlr r0
- ld r12,lo16(Lmcount$lazy_ptr-L00000000001$spb)(r11)
- mtctr r12
- bctr
- .lazy_symbol_pointer
- Lmcount$lazy_ptr:
- .indirect_symbol mcount
- .quad dyld_stub_binding_helper
- .subsections_via_symbols
- .endmacro
- #endif
-
- #endif
-
- #endif
- #endif
-
- #endif
-
- #define HALT mfspr r0, 1023
-
- #if defined(OS_LINUX) || defined(OS_FREEBSD)
- #if defined(PPC440) || defined(PPC440FP2)
- #undef MAX_CPU_NUMBER
- #define MAX_CPU_NUMBER 1
- #endif
- #if !defined(__64BIT__) && !defined(PROFILE) && !defined(PPC440) && !defined(PPC440FP2)
- #define START_ADDRESS (0x0b000000UL)
- #else
- #define SEEK_ADDRESS
- #endif
- #endif
-
- #ifdef OS_AIX
- #ifndef __64BIT__
- #define START_ADDRESS (0xf0000000UL)
- #else
- #define SEEK_ADDRESS
- #endif
- #endif
-
- #ifdef OS_DARWIN
- #define SEEK_ADDRESS
- #endif
-
- #if defined(PPC440)
- #define BUFFER_SIZE ( 2 << 20)
- #elif defined(PPC440FP2)
- #define BUFFER_SIZE ( 16 << 20)
- #elif defined(POWER6) || defined(POWER8) || defined(POWER9) || defined(POWER10)
- #define BUFFER_SIZE ( 64 << 22)
- #else
- #define BUFFER_SIZE ( 16 << 20)
- #endif
-
- #ifndef PAGESIZE
- #define PAGESIZE ( 4 << 10)
- #endif
- #define HUGE_PAGESIZE (16 << 20)
-
- #define BASE_ADDRESS (START_ADDRESS - BUFFER_SIZE * MAX_CPU_NUMBER)
-
- #ifndef MAP_ANONYMOUS
- #define MAP_ANONYMOUS MAP_ANON
- #endif
-
- #if defined(OS_LINUX) || defined(OS_FREEBSD)
- #ifndef __64BIT__
- #define FRAMESLOT(X) (((X) * 4) + 8)
- #else
- #if _CALL_ELF == 2
- #define FRAMESLOT(X) (((X) * 8) + 96)
- #else
- #define FRAMESLOT(X) (((X) * 8) + 112)
- #endif
- #endif
- #endif
-
- #if defined(OS_AIX) || defined(OS_DARWIN)
- #ifndef __64BIT__
- #define FRAMESLOT(X) (((X) * 4) + 56)
- #else
- #define FRAMESLOT(X) (((X) * 8) + 112)
- #endif
- #endif
-
- #endif
|