| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| static void __inline blas_lock(unsigned long *address){ |
| |
| 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"); |
| |
| 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); |
| |
| } |
| |
| static __inline unsigned int rpcc(void){ |
| |
| unsigned int r0; |
| |
| |
| asm __volatile__("rpcc %0" : "=r"(r0) : : "memory"); |
| |
| r0 = asm("rpcc %v0"); |
| |
| |
| return r0; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| static __inline long blas_quickdivide(long x, long y){ |
| return x/y; |
| } |
| |
| 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); |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| .arch ev6; \ |
| .set noat; \ |
| .set noreorder; \ |
| .text; \ |
| .align 5; \ |
| .globl REALNAME; \ |
| .ent REALNAME; \ |
| REALNAME: |
| |
| |
| |
| ldgp $gp, 0($27); \ |
| lda $28, _mcount; \ |
| jsr $28, ($28), _mcount; \ |
| .prologue 1 |
| |
| |
| |
| |
| |
| .end REALNAME; \ |
| .ident VERSION |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |