; Copyright 2005 Chris Thomasson .686 .XMM .MODEL FLAT, C .CODE align 16 ; int refcount_ia32_init( ; refcount_ia32_t*, ; int, ; refcount_ia32_fpdtor_t, ; void*) refcount_ia32_init PROC MOV ECX, [ESP + 4] MOV EAX, [ESP + 8] CMP EAX, 0 JLE refcount_ia32_init_failed MOV EDX, [ESP + 12] MOV [ECX], EAX MOV [ECX + 4], EDX MOV EDX, [ESP + 16] MOV [ECX + 8], EDX MOV EAX, 1 RET refcount_ia32_init_failed: XOR EAX, EAX RET refcount_ia32_init ENDP align 16 ; void* refcount_ia32_state_load_depends( ; refcount_ia32_t volatile*) refcount_ia32_state_load_depends PROC MOV EAX, [ESP + 4] TEST EAX, EAX JE refcount_ia32_state_load_depends_failed MOV EAX, [EAX + 8] refcount_ia32_state_load_depends_failed: RET refcount_ia32_state_load_depends ENDP align 16 ; refcount_ia32_t* refcount_ia32_add_load_strong( ; refcount_ia32_t* volatile*, ; int, ; spinlock_ia32_table_t const*, ; size_t) refcount_ia32_add_load_strong PROC PUSH ESI PUSH EBX MOV ECX, [ESP + 12] MOV EDX, [ESP + 20] MOV ESI, [ESP + 16] CMP ESI, 0 JLE refcount_ia32_add_load_strong_failed refcount_ia32_add_load_strong_retry: MOV EAX, [ECX] TEST EAX, EAX JE refcount_ia32_add_load_strong_failed MOV EBX, EAX IMUL EBX, 567 SHR EBX, 8 AND EBX, 0FFh IMUL EBX, [ESP + 24] LEA EBX, [EDX + EBX] refcount_ia32_add_load_strong_lock_retry: MOV ESI, 1 XCHG [EBX], ESI TEST ESI, ESI JNE refcount_ia32_add_load_strong_lock_pause_retry MOV ESI, [ECX] CMP EAX, ESI JNE refcount_ia32_add_load_strong_unlock_retry MOV ESI, [ESP + 16] LOCK XADD [EAX], ESI CMP ESI, 0 JLE refcount_ia32_add_load_strong_unlock_retry XOR ESI, ESI MOV [EBX], ESI POP EBX POP ESI RET refcount_ia32_add_load_strong_failed: XOR EAX, EAX POP EBX POP ESI RET refcount_ia32_add_load_strong_lock_pause_retry: PAUSE JMP refcount_ia32_add_load_strong_lock_retry refcount_ia32_add_load_strong_unlock_retry: XOR ESI, ESI MOV [EBX], ESI JMP refcount_ia32_add_load_strong_retry refcount_ia32_add_load_strong ENDP align 16 ; int refcount_ia32_sub_strong( ; refcount_ia32_t volatile*, ; int, ; spinlock_ia32_table_t const*, ; size_t) refcount_ia32_sub_strong PROC MOV EAX, [ESP + 4] TEST EAX, EAX JE refcount_ia32_sub_strong_skip MOV EDX, [ESP + 8] CMP EDX, 0 JLE refcount_ia32_sub_strong_skip NEG EDX LOCK XADD [EAX], EDX JZ refcount_ia32_sub_strong_destroy JS refcount_ia32_sub_strong_destroy refcount_ia32_sub_strong_skip: XOR EAX, EAX RET refcount_ia32_sub_strong_destroy: MOV EDX, [ESP + 12] MOV ECX, EAX IMUL ECX, 567 SHR ECX, 8 AND ECX, 0FFh IMUL ECX, [ESP + 16] LEA ECX, [EDX + ECX] refcount_ia32_sub_strong_lock_retry: MOV EDX, 1 XCHG [ECX], EDX TEST EDX, EDX JNE refcount_ia32_sub_strong_lock_pause_retry MOV EDX, [EAX + 4] PUSH [EAX + 8] XOR EAX, EAX MOV [ECX], EAX TEST EDX, EDX JE refcount_ia32_sub_strong_done CALL EDX refcount_ia32_sub_strong_done: POP EDX MOV EAX, 1 RET refcount_ia32_sub_strong_lock_pause_retry: PAUSE JMP refcount_ia32_sub_strong_lock_retry refcount_ia32_sub_strong ENDP align 16 ; void refcount_ia32_add_weak( ; refcount_ia32_t volatile*, ; int) refcount_ia32_add_weak PROC MOV ECX, [ESP + 4] MOV EAX, [ESP + 8] CMP EAX, 0 JLE refcount_ia32_add_weak_done LOCK XADD [ECX], EAX refcount_ia32_add_weak_done: RET refcount_ia32_add_weak ENDP align 16 ; refcount_ia32_t* refcount_ia32_add_swap_weak( ; refcount_ia32_t* volatile*, ; refcount_ia32_t*, ; int) refcount_ia32_add_swap_weak PROC MOV ECX, [ESP + 4] MOV EAX, [ESP + 8] TEST EAX, EAX JE refcount_swap_weak_execute MOV EDX, [ESP + 12] CMP EDX, 0 JLE refcount_swap_weak_execute LOCK XADD [EAX], EDX refcount_swap_weak_execute: XCHG [ECX], EAX RET refcount_ia32_add_swap_weak ENDP END