improve implementation of ainc and adec for 386 and amd64 Reference: /n/atom/patch/applied/ainc386 Date: Fri May 23 20:21:08 CES 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/libc/amd64/atom.s Fri May 23 20:21:08 2014 +++ /sys/src/libc/amd64/atom.s Fri May 23 20:21:08 2014 @@ -1,21 +1,14 @@ TEXT ainc(SB), 1, $0 /* int ainc(int *); */ -ainclp: - MOVL (RARG), AX /* exp */ - MOVL AX, BX - INCL BX /* new */ - LOCK; CMPXCHGL BX, (RARG) - JNZ ainclp - MOVL BX, AX +TEXT ainc32(SB), 1, $0 /* u32int ainc(u32int*); */ + MOVL $1, AX + LOCK; XADDL AX, (RARG) + ADDL $1, AX RET TEXT adec(SB), 1, $0 /* int adec(int*); */ -adeclp: - MOVL (RARG), AX - MOVL AX, BX - DECL BX - LOCK; CMPXCHGL BX, (RARG) - JNZ adeclp - MOVL BX, AX + MOVL $-1, AX + LOCK; XADDL AX, (RARG) + SUBL $1, AX RET /* --- /sys/src/libc/386/atom.s Fri May 23 20:21:08 2014 +++ /sys/src/libc/386/atom.s Fri May 23 20:21:08 2014 @@ -1,25 +1,16 @@ TEXT ainc(SB), $0 /* int ainc(int *); */ +TEXT ainc32(SB), 1, $0 /* u32int ainc(u32int*); */ MOVL addr+0(FP), BX -ainclp: - MOVL (BX), AX - MOVL AX, CX - INCL CX - LOCK - BYTE $0x0F; BYTE $0xB1; BYTE $0x0B /* CMPXCHGL CX, (BX) */ - JNZ ainclp - MOVL CX, AX + MOVL $1, AX + LOCK; XADDL AX, (BX) + ADDL $1, AX RET TEXT adec(SB), $0 /* int adec(int*); */ MOVL addr+0(FP), BX -adeclp: - MOVL (BX), AX - MOVL AX, CX - DECL CX - LOCK - BYTE $0x0F; BYTE $0xB1; BYTE $0x0B /* CMPXCHGL CX, (BX) */ - JNZ adeclp - MOVL CX, AX + MOVL $-1, AX + LOCK; XADDL AX, (BX) + SUBL $1, AX RET /*