|
- /*********************************************************************/
- /* 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_ALPHA
- #define COMMON_ALPHA
-
- #ifndef ASSEMBLER
-
- #define MB asm("mb")
- #define WMB asm("wmb")
- #define RMB asm("rmb")
-
- static void __inline blas_lock(unsigned long *address){
- #ifndef __DECC
- unsigned long tmp1, tmp2;
- asm volatile(
- "1: ldq %1, %0\n"
- " bne %1, 2f\n"
- " ldq_l %1, %0\n"
- " bne %1, 2f\n"
- " or %1, 1, %2\n"
- " stq_c %2, %0\n"
- " beq %2, 2f\n"
- " mb\n "
- " br $31, 3f\n"
- "2: br $31, 1b\n"
- "3:\n" : "=m"(*address), "=&r"(tmp1), "=&r"(tmp2) : : "memory");
- #else
- asm (
- "10:"
- " ldq %t0, 0(%a0); "
- " bne %t0, 20f; "
- " ldq_l %t0, 0(%a0); "
- " bne %t0, 20f; "
- " or %t0, 1, %t1;"
- " stq_c %t1, 0(%a0); "
- " beq %t1, 20f; "
- " mb; "
- " br %r31,30f; "
- "20: "
- " br %r31,10b; "
- "30:", address);
- #endif
- }
- #define BLAS_LOCK_DEFINED
-
- static __inline unsigned int rpcc(void){
-
- unsigned int r0;
-
- #ifndef __DECC
- asm __volatile__("rpcc %0" : "=r"(r0) : : "memory");
- #else
- r0 = asm("rpcc %v0");
- #endif
-
- return r0;
- }
- #define RPCC_DEFINED
-
-
- #define HALT ldq $0, 0($0)
-
- #ifndef __DECC
- #define GET_IMAGE(res) asm __volatile__("fmov $f1, %0" : "=f"(res) : : "memory")
- #else
- #define GET_IMAGE(res) res = dasm("fmov $f1, %f0")
- #endif
-
- #ifdef SMP
- #ifdef USE64BITINT
- static __inline long blas_quickdivide(long x, long y){
- return x/y;
- }
- #else
- extern unsigned int blas_quick_divide_table[];
-
- static __inline int blas_quickdivide(unsigned int x, unsigned int y){
- if (y <= 1) return x;
- return (int)((x * (unsigned long)blas_quick_divide_table[y]) >> 32);
- }
- #endif
- #endif
-
- #define BASE_ADDRESS ((0x1b0UL << 33) | (0x1c0UL << 23) | (0x000UL << 13))
-
- #ifndef PAGESIZE
- #define PAGESIZE ( 8UL << 10)
- #define HUGE_PAGESIZE ( 4 << 20)
- #endif
- #define BUFFER_SIZE (32UL << 20)
-
- #else
-
- #ifndef F_INTERFACE
- #define REALNAME ASMNAME
- #else
- #define REALNAME ASMFNAME
- #endif
-
- #define PROLOGUE \
- .arch ev6; \
- .set noat; \
- .set noreorder; \
- .text; \
- .align 5; \
- .globl REALNAME; \
- .ent REALNAME; \
- REALNAME:
-
- #ifdef PROFILE
- #define PROFCODE \
- ldgp $gp, 0($27); \
- lda $28, _mcount; \
- jsr $28, ($28), _mcount; \
- .prologue 1
- #else
- #define PROFCODE .prologue 0
- #endif
-
- #if defined(__linux__) && defined(__ELF__)
- #define GNUSTACK .section .note.GNU-stack,"",@progbits
- #else
- #define GNUSTACK
- #endif
-
- #define EPILOGUE \
- .end REALNAME; \
- .ident VERSION; \
- GNUSTACK
-
- #endif
-
- #ifdef DOUBLE
- #define SXADDQ s8addq
- #define SXSUBL s8subl
- #define LD ldt
- #define ST stt
- #define STQ stq
- #define ADD addt/su
- #define SUB subt/su
- #define MUL mult/su
- #define DIV divt/su
- #else
- #define SXADDQ s4addq
- #define SXSUBL s4subl
- #define LD lds
- #define ST sts
- #define STQ stl
- #define ADD adds/su
- #define SUB subs/su
- #define MUL muls/su
- #define DIV divs/su
- #endif
- #endif
|