atomic operation macros

Share your advanced PureBasic knowledge/code with the community.
User avatar
idle
Always Here
Always Here
Posts: 5915
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

atomic operation macros

Post by idle »

Code: Select all


Macro _lockB(op,var,val)   
  DisableDebugger
  EnableASM 
  !db 0xf0 
  op var, val 
  DisableASM
  EnableDebugger
EndMacro 

Macro _lockU(op,var)
  DisableDebugger
  EnableASM 
  !db 0xf0 
  op var 
  DisableASM
  EnableDebugger
EndMacro   

Macro Atomic_SUB(var,val)
  _lockB(sub,var,val) 
EndMacro 

Macro Atomic_ADD(var, val)
  _lockB(add,var,val)
EndMacro 

Macro Atomic_AND(var,val) 
  _lockB(And,var,val) 
EndMacro 

Macro Atomic_XOR(var,val) 
  _lockB(XOr,var,val)
EndMacro 

Macro Atomic_OR(var,val) 
  _lockB(Or,var,val)
EndMacro 

Macro Atomic_Not(var) 
  _lockU(Not,var)  
EndMacro 

Macro Atomic_NEG(var)
  _lockU(Neg,var)
EndMacro   

Macro Atomic_INC(var) 
  _lockU(inc,var)
EndMacro 

Macro Atomic_DEC(var) 
  _lockU(dec,var)
EndMacro 

Macro Atomic_BTS(var,bit)
  _lockB(BTS,var,bit)
EndMacro   

Macro Atomic_BTR(var,bit)
  _lockB(BTR,var,bit)
EndMacro   

Macro Atomic_BTC(var,bit)
  _lockb(BTC,var,bit)
EndMacro   


Global a.i,b.i

Atomic_ADD(a,2) 
Atomic_SUB(a,1) 
Atomic_INC(a)
Atomic_DEC(a) 
Debug a

Atomic_BTS(b,7) 
Atomic_BTR(b,7)
Atomic_BTC(b,7)
Debug b

didn't add all the supported operands so is missing ADC,SBB,CMPXCHG,XADD,XCHG
Windows 11, Manjaro, Raspberry Pi OS
Image