Browse Source

Fix blas_lock for arm64

tags/v0.2.16.rc1
Ashwin Sekhar T K 10 years ago
parent
commit
1d121852c1
1 changed files with 19 additions and 8 deletions
  1. +19
    -8
      common_arm64.h

+ 19
- 8
common_arm64.h View File

@@ -43,28 +43,39 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#ifndef ASSEMBLER


static void __inline blas_lock(volatile BLASULONG *address){

long register ret;
BLASULONG ret;

do {
while (*address) {YIELDING;};

__asm__ __volatile__(
"ldaxr %0, [%1] \n\t"
"stlxr w2, %2, [%1] \n\t"
"orr %0, %0, x2 \n\t"
: "=r"(ret)
: "r"(address), "r"(1l)
: "memory", "x2"
"mov x4, #1 \n\t"
"1: \n\t"
"ldaxr x2, [%1] \n\t"
"cbnz x2, 1b \n\t"
"2: \n\t"
"stxr w3, x4, [%1] \n\t"
"cbnz w3, 1b \n\t"
"mov %0, #0 \n\t"
: "=r"(ret), "=r"(address)
: "1"(address)
: "memory", "x2" , "x3", "x4"


);


} while (ret);
MB;
}

#define BLAS_LOCK_DEFINED



static inline int blas_quickdivide(blasint x, blasint y){
return x / y;
}


Loading…
Cancel
Save