Page 2 of 2
Re: Question about inline assembler and C backend.
Posted: Sat Feb 08, 2025 10:05 am
by idle
Code: Select all
Procedure lockinc(var)
CompilerIf #PB_Compiler_Backend = #PB_Backend_C
!asm("lock inc %0" : "+m" (v_var) : "r" (v_var));
CompilerElseIf #PB_Compiler_Processor = #PB_Processor_x86
!lock inc dword [p.v_var]
CompilerElse
!lock inc qword [p.v_var]
CompilerEndIf
ProcedureReturn var
EndProcedure
Re: Question about inline assembler and C backend.
Posted: Sat Feb 08, 2025 1:43 pm
by breeze4me
Armoured wrote: Sat Feb 08, 2025 9:44 am
I need a function like InterlockedIncrement.
There are the following built-in functions.
__sync_add_and_fetch , __atomic_add_fetch
Code: Select all
CompilerIf #PB_Compiler_Backend <> #PB_Backend_C
CompilerError "Use C backend."
CompilerEndIf
Global a
Structure aa
i.i
EndStructure
Global b.aa
Procedure t(v)
Delay(Random(80, 50))
For i = 1 To 1000000
!__sync_add_and_fetch(&g_a, 1);
;!__sync_add_and_fetch(&g_b.f_i, 1);
Next
EndProcedure
t1 = CreateThread(@t(), 0)
t2 = CreateThread(@t(), 0)
t3 = CreateThread(@t(), 0)
t4 = CreateThread(@t(), 0)
WaitThread(t1)
WaitThread(t2)
WaitThread(t3)
WaitThread(t4)
MessageRequester("", "" + a)
;MessageRequester("", "" + b\i)
Re: Question about inline assembler and C backend.
Posted: Sun Feb 09, 2025 12:55 am
by Armoured
Ok! Thanks Fred, Jack, Idle, Brezee4me and Mk-soft.
This discussion was helpful to me.