; assembly | /* r2dec pseudo code output */ | /* bdlcc_skiplist.t/assume @ 0x649ba0 */ | #include | ; (fcn) method.BloombergLP::bdlcc::SkipList_Control.decrementRefCount__ () | int32_t method_BloombergLP::bdlcc::SkipList_Control_decrementRefCount_ (uint32_t arg1) { | rdi = arg1; | /* BloombergLP::bdlcc::SkipList_Control::decrementRefCount() */ 0x00649ba0 mov esi, dword [rdi] | esi = *(rdi); 0x00649ba2 lea ecx, [rsi - 1] | ecx = rsi - 1; 0x00649ba5 mov eax, esi | eax = esi; 0x00649ba7 lock cmpxchg dword [rdi], ecx | __asm ("lock cmpxchg dword [rdi], ecx"); 0x00649bab cmp esi, eax | | if (esi == eax) { 0x00649bad je 0x649bcf | goto label_0; | } 0x00649baf mov edx, eax | edx = eax; 0x00649bb1 nop word cs:[rax + rax] | 0x00649bbb nop dword [rax + rax] | | do { 0x00649bc0 lea ecx, [rdx - 1] | ecx = rdx - 1; 0x00649bc3 mov eax, edx | eax = edx; 0x00649bc5 lock cmpxchg dword [rdi], ecx | __asm ("lock cmpxchg dword [rdi], ecx"); 0x00649bc9 cmp edx, eax | 0x00649bcb mov edx, eax | edx = eax; 0x00649bcd jne 0x649bc0 | | } while (edx != eax); | label_0: 0x00649bcf and ecx, 0xfffff | ecx &= 0xfffff; 0x00649bd5 mov eax, ecx | eax = ecx; 0x00649bd7 ret | return eax; | }