Thank's for hints. I finally understood why there were "beq"s after stq_c, and I see that stq_c overwrites source register with store result. Final (I think) version below. Is it OK now? static inline jboolean _svmh_compare_and_swap (volatile _svmt_word *pword, _svmt_word old_value, _svmt_word new_value) { register _svmt_word result, tmp; __asm__ __volatile__ ( "1: mb\n\t" // make sure " ldq_l %1,%4\n\t" // load *pword into tmp (reg,<= mem) " cmpeq %1,%5,%0\n\t" // result = (*pword == tmp) " beq %0,3f\n\t" // nothing to do if they differ(0) - // jump away " mov %3,%1\n\t" // copy tmp<=new so that we didn't // lose it " stq_c %1,%4\n\t" // *pword = new_value (reg,=> mem) " beq %1,2f\n\t" // store could fail! (%1 overwritten!) " mb\n\t" // make sure " br 3f\n\t" // we're done "2: br 1b\n\t" // goto "again" "3: nop" : "=&r"(result), "=&r"(tmp), "=m"(*pword) : "r" (new_value), "m" (*pword), "r" (old_value)); return result ? JNI_TRUE : JNI_FALSE; _svmt_word is 64bit usingned defined as: unsigned long long Regards Grzegorz B. Prokopski
Attachment:
signature.asc
Description: PGP signature