/*lock{} is a compiler stmt
which places asm LOCK inst
prefixes on code.Only use it on
read-modify-write stmts.
It will generate invalid insts
if you misuse it and it will crash.
U() to see what code was generated.
*/

#define CNT 0x1000000

I64 glbl;

U0 MPUnlockedInc(I64)
{
I64 i;
for (i=0;i<CNT;i++)
glbl++;
}

U0 UnlockedInc()
{
CJob *tmpm0,*tmpm1;
glbl=0;
tmpm0=JobQue(&MPUnlockedInc,NULL,0,0);
tmpm1=JobQue(&MPUnlockedInc,NULL,1,0);
JobResGet(tmpm0);
JobResGet(tmpm1);
"Correct Cnt:%X Actual Cnt:%X\n",CNT*2,glbl;
}

U0 MPLockedInc(I64)
{
I64 i;
for (i=0;i<CNT;i++)
lock //Can be used without {}
glbl++;
}

U0 LockedInc()
{
CJob *tmpm0,*tmpm1;
glbl=0;
tmpm0=JobQue(&MPLockedInc,NULL,0,0);
tmpm1=JobQue(&MPLockedInc,NULL,1,0);
JobResGet(tmpm0);
JobResGet(tmpm1);
"Correct Cnt:%X Actual Cnt:%X\n",CNT*2,glbl;
}

UnlockedInc;
LockedInc;