| * first argument (l) is in r3 at entry. |
| * r3 contains return value upon return. |
| * this __asm__ works with gcc on linux |
| " mr %2,%4 /* &x->val */\n" |
| " lis %3,0xdead /* assemble constant 0xdeaddead */\n" |
| " ori %3,%3,0xdead /* \" */\n" |
| " dcbf %2,%1 /* cache flush; \"fix for 603x bug\" */\n" |
| " lwarx %0,%2,%1 /* v = x->val with reservation */\n" |
| " cmp cr0,0,%0,%1 /* v == 0 */\n" |
| " stwcx. %3,%2,%1 /* if (x->val same) x->val = 0xdeaddead */\n" |
| : "=r" (v), "=&r" (tmp), "=&r"(tmp2), "=&r"(tmp3) |
| case 0xdeaddead: return 1; |
| default: fprint(2, "tas: corrupted 0x%lux\n", v); |