|
|
@@ -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; |
|
|
|
} |
|
|
|