796 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			796 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
	
/*********************************************************************/
 | 
						|
/* 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 MB		__asm__ __volatile__ ("sync")
 | 
						|
#define WMB		__asm__ __volatile__ ("sync")
 | 
						|
 | 
						|
#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"
 | 
						|
	   "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);
 | 
						|
}
 | 
						|
 | 
						|
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
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
#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)
 | 
						|
#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
 | 
						|
 | 
						|
#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)
 | 
						|
 | 
						|
#ifdef OS_LINUX
 | 
						|
#ifndef __64BIT__
 | 
						|
#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
 | 
						|
 | 
						|
#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";\
 | 
						|
	.globl .REALNAME;\
 | 
						|
	.csect .text[PR],5;\
 | 
						|
.REALNAME:;
 | 
						|
 | 
						|
#define EPILOGUE \
 | 
						|
_section_.text:;\
 | 
						|
	.csect .data[RW],4;\
 | 
						|
	.long _section_.text;
 | 
						|
 | 
						|
#else
 | 
						|
 | 
						|
#define PROLOGUE \
 | 
						|
	.machine "any";\
 | 
						|
	.globl .REALNAME;\
 | 
						|
	.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
 | 
						|
 | 
						|
#ifdef OS_LINUX
 | 
						|
#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)
 | 
						|
#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
 | 
						|
#endif
 |