Hello!
I am porting SableVM (JVM) to alpha platform. I am almost finished, but
as I don't really know alpha assemler too well and google can't give
guarantees that what I created works as I wanted it to - I decided
to ask here.
In the app there's small assembler code, which does the following:
function test&exchange(volatile *pword, old_value, new_value)
if (*pword == old_value)
{
*pword = new_value;
return 1;
}
else
{
return 0;
}
}
But it cannot be written in C. That part of operations:
if (*pword == old_value)
{
*pword = new_value;
must:
- be atomic / non-preempable "in the middle" by
exceptions/interrupts/etc
- make sure, that other processors see exactly the same data
if they also try to do that operation (assure coherency between
main memory, processor cache and it seems also register - when
the operation is being done)
I spent all evening and night digging ito many sources, from gcc
assembler documentation, alpha-assembler-guides, to bsd-alpha and
postgresql mailing list archives.
And finally - here's what I wrote:
static inline jboolean
_svmh_compare_and_swap (volatile _svmt_word *pword, _svmt_word
old_value, _svmt_word new_value) {
register int result, tmp;
__asm__ __volatile__ (
"1: mb\n\t" // make sure (may be unneded?)
" ldq_l %1,%4\n\t" // load *pword into tmp (reg,<= mem)
// does above make sure main memory->cache->register are coherent?
" cmpeq %1,%5,%0\n\t" // result = (*pword == tmp)
" beq %0,2f\n\t" // nothing to do if they differ we
// get 0 just jump away (what happens to processor lock then?)
" stq_c %3,%4\n\t" // *pword = new_value (reg,=> mem)
" mb\n\t" // make sure everything was put back to
// main mem
"2: nop"
: "=&r"(result), "=&r"(tmp), "=m"(*pword)
: "r" (new_value), "m" (*pword), "r" (old_value));
return result ? JNI_TRUE : JNI_FALSE;
}
_svmt_word is 64 bit (on alpha)
Please verify, comment and elaborate if you can.
Cc: me on replies. Thanks.
Regards
Grzegorz B. Prokopski
PS: I never wrote in alpha assember, but I did for i386, i8051,
motorola HC11
PSS: If nobody is able to verify that code (can happen?) - please point
me to where I should ask for this.
Attachment:
signature.asc
Description: PGP signature