- 论坛徽章:
- 0
|
在TICKET自旋锁中,第086行的leal语句是作什么用的?对于该行不太清楚。整个代码的内容应大概流程应该当是:
1、tmp = lock->slock,判断Select == Owner,若不等给tmp = 0;若相同则执行第2步;
2、利用cmpxchgw比较原先slock的tmp 8~32位和当前slock的8~32位(即select)是否未发生变化。若相同则给slock->select++,tmp = 1,终止;已发生变化则tmp = 0,终止。
080 static __always_inline int __ticket_spin_trylock(arch_spinlock_t *lock)
081 {
082 int tmp, new;
083
084 asm volatile("movzwl %2, %0\n\t"
085 "cmpb %h0,%b0\n\t"
086 "leal 0x100(%" REG_PTR_MODE "0), %1\n\t"
087 "jne 1f\n\t"
088 LOCK_PREFIX "cmpxchgw %w1,%2\n\t"
089 "1:"
090 "sete %b1\n\t"
091 "movzbl %b1,%0\n\t"
092 : "=&a" (tmp), "=&q" (new), "+m" (lock->slock)
093 :
094 : "memory", "cc");
095
096 return tmp;
097 }
|
|