| | |
| | |
| | |
| |
|
| | #include "textflag.h" |
| | #include "funcdata.h" |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | TEXT 路Cas(SB), NOSPLIT, $0-13 |
| | MOVL ptr+0(FP), BX |
| | MOVL old+4(FP), AX |
| | MOVL new+8(FP), CX |
| | LOCK |
| | CMPXCHGL CX, 0(BX) |
| | SETEQ ret+12(FP) |
| | RET |
| |
|
| | TEXT 路Casint32(SB), NOSPLIT, $0-13 |
| | JMP 路Cas(SB) |
| |
|
| | TEXT 路Casint64(SB), NOSPLIT, $0-21 |
| | JMP 路Cas64(SB) |
| |
|
| | TEXT 路Casuintptr(SB), NOSPLIT, $0-13 |
| | JMP 路Cas(SB) |
| |
|
| | TEXT 路CasRel(SB), NOSPLIT, $0-13 |
| | JMP 路Cas(SB) |
| |
|
| | TEXT 路Loaduintptr(SB), NOSPLIT, $0-8 |
| | JMP 路Load(SB) |
| |
|
| | TEXT 路Loaduint(SB), NOSPLIT, $0-8 |
| | JMP 路Load(SB) |
| |
|
| | TEXT 路Storeint32(SB), NOSPLIT, $0-8 |
| | JMP 路Store(SB) |
| |
|
| | TEXT 路Storeint64(SB), NOSPLIT, $0-12 |
| | JMP 路Store64(SB) |
| |
|
| | TEXT 路Storeuintptr(SB), NOSPLIT, $0-8 |
| | JMP 路Store(SB) |
| |
|
| | TEXT 路Xadduintptr(SB), NOSPLIT, $0-12 |
| | JMP 路Xadd(SB) |
| |
|
| | TEXT 路Loadint32(SB), NOSPLIT, $0-8 |
| | JMP 路Load(SB) |
| |
|
| | TEXT 路Loadint64(SB), NOSPLIT, $0-12 |
| | JMP 路Load64(SB) |
| |
|
| | TEXT 路Xaddint32(SB), NOSPLIT, $0-12 |
| | JMP 路Xadd(SB) |
| |
|
| | TEXT 路Xaddint64(SB), NOSPLIT, $0-20 |
| | JMP 路Xadd64(SB) |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | TEXT 路Cas64(SB), NOSPLIT, $0-21 |
| | NO_LOCAL_POINTERS |
| | MOVL ptr+0(FP), BP |
| | TESTL $7, BP |
| | JZ 2(PC) |
| | CALL 路panicUnaligned(SB) |
| | MOVL old_lo+4(FP), AX |
| | MOVL old_hi+8(FP), DX |
| | MOVL new_lo+12(FP), BX |
| | MOVL new_hi+16(FP), CX |
| | LOCK |
| | CMPXCHG8B 0(BP) |
| | SETEQ ret+20(FP) |
| | RET |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | TEXT 路Casp1(SB), NOSPLIT, $0-13 |
| | MOVL ptr+0(FP), BX |
| | MOVL old+4(FP), AX |
| | MOVL new+8(FP), CX |
| | LOCK |
| | CMPXCHGL CX, 0(BX) |
| | SETEQ ret+12(FP) |
| | RET |
| |
|
| | |
| | |
| | |
| | |
| | TEXT 路Xadd(SB), NOSPLIT, $0-12 |
| | MOVL ptr+0(FP), BX |
| | MOVL delta+4(FP), AX |
| | MOVL AX, CX |
| | LOCK |
| | XADDL AX, 0(BX) |
| | ADDL CX, AX |
| | MOVL AX, ret+8(FP) |
| | RET |
| |
|
| | TEXT 路Xadd64(SB), NOSPLIT, $0-20 |
| | NO_LOCAL_POINTERS |
| | |
| | MOVL ptr+0(FP), BP |
| | TESTL $7, BP |
| | JZ 2(PC) |
| | CALL 路panicUnaligned(SB) |
| | |
| | MOVL delta_lo+4(FP), SI |
| | MOVL delta_hi+8(FP), DI |
| | |
| | MOVL 0(BP), AX |
| | MOVL 4(BP), DX |
| | addloop: |
| | // CX:BX = DX:AX (*addr) + DI:SI (delta) |
| | MOVL AX, BX |
| | MOVL DX, CX |
| | ADDL SI, BX |
| | ADCL DI, CX |
| |
|
| | // if *addr == DX:AX { |
| | |
| | |
| | |
| | |
| | |
| | LOCK |
| | CMPXCHG8B 0(BP) |
| |
|
| | JNZ addloop |
| |
|
| | |
| | |
| | MOVL BX, ret_lo+12(FP) |
| | MOVL CX, ret_hi+16(FP) |
| | RET |
| |
|
| | |
| | TEXT 路Xchg8(SB), NOSPLIT, $0-9 |
| | MOVL ptr+0(FP), BX |
| | MOVB new+4(FP), AX |
| | XCHGB AX, 0(BX) |
| | MOVB AX, ret+8(FP) |
| | RET |
| |
|
| | TEXT 路Xchg(SB), NOSPLIT, $0-12 |
| | MOVL ptr+0(FP), BX |
| | MOVL new+4(FP), AX |
| | XCHGL AX, 0(BX) |
| | MOVL AX, ret+8(FP) |
| | RET |
| |
|
| | TEXT 路Xchgint32(SB), NOSPLIT, $0-12 |
| | JMP 路Xchg(SB) |
| |
|
| | TEXT 路Xchgint64(SB), NOSPLIT, $0-20 |
| | JMP 路Xchg64(SB) |
| |
|
| | TEXT 路Xchguintptr(SB), NOSPLIT, $0-12 |
| | JMP 路Xchg(SB) |
| |
|
| | TEXT 路Xchg64(SB),NOSPLIT,$0-20 |
| | NO_LOCAL_POINTERS |
| | |
| | MOVL ptr+0(FP), BP |
| | TESTL $7, BP |
| | JZ 2(PC) |
| | CALL 路panicUnaligned(SB) |
| | |
| | MOVL new_lo+4(FP), BX |
| | MOVL new_hi+8(FP), CX |
| | |
| | MOVL 0(BP), AX |
| | MOVL 4(BP), DX |
| | swaploop: |
| | // if *addr == DX:AX |
| | // *addr = CX:BX |
| | // else |
| | // DX:AX = *addr |
| | // all in one instruction |
| | LOCK |
| | CMPXCHG8B 0(BP) |
| | JNZ swaploop |
| |
|
| | // success |
| | // return DX:AX |
| | MOVL AX, ret_lo+12(FP) |
| | MOVL DX, ret_hi+16(FP) |
| | RET |
| |
|
| | TEXT 路StorepNoWB(SB), NOSPLIT, $0-8 |
| | MOVL ptr+0(FP), BX |
| | MOVL val+4(FP), AX |
| | XCHGL AX, 0(BX) |
| | RET |
| |
|
| | TEXT 路Store(SB), NOSPLIT, $0-8 |
| | MOVL ptr+0(FP), BX |
| | MOVL val+4(FP), AX |
| | XCHGL AX, 0(BX) |
| | RET |
| |
|
| | TEXT 路StoreRel(SB), NOSPLIT, $0-8 |
| | JMP 路Store(SB) |
| |
|
| | TEXT 路StoreReluintptr(SB), NOSPLIT, $0-8 |
| | JMP 路Store(SB) |
| |
|
| | // uint64 atomicload64(uint64 volatile* addr); |
| | TEXT 路Load64(SB), NOSPLIT, $0-12 |
| | NO_LOCAL_POINTERS |
| | MOVL ptr+0(FP), AX |
| | TESTL $7, AX |
| | JZ 2(PC) |
| | CALL 路panicUnaligned(SB) |
| | MOVQ (AX), M0 |
| | MOVQ M0, ret+4(FP) |
| | EMMS |
| | RET |
| |
|
| | |
| | TEXT 路Store64(SB), NOSPLIT, $0-12 |
| | NO_LOCAL_POINTERS |
| | MOVL ptr+0(FP), AX |
| | TESTL $7, AX |
| | JZ 2(PC) |
| | CALL 路panicUnaligned(SB) |
| | |
| | MOVQ val+4(FP), M0 |
| | MOVQ M0, (AX) |
| | EMMS |
| | |
| | |
| | XORL AX, AX |
| | LOCK |
| | XADDL AX, (SP) |
| | RET |
| |
|
| | |
| | TEXT 路Or8(SB), NOSPLIT, $0-5 |
| | MOVL ptr+0(FP), AX |
| | MOVB val+4(FP), BX |
| | LOCK |
| | ORB BX, (AX) |
| | RET |
| |
|
| | |
| | TEXT 路And8(SB), NOSPLIT, $0-5 |
| | MOVL ptr+0(FP), AX |
| | MOVB val+4(FP), BX |
| | LOCK |
| | ANDB BX, (AX) |
| | RET |
| |
|
| | TEXT 路Store8(SB), NOSPLIT, $0-5 |
| | MOVL ptr+0(FP), BX |
| | MOVB val+4(FP), AX |
| | XCHGB AX, 0(BX) |
| | RET |
| |
|
| | |
| | TEXT 路Or(SB), NOSPLIT, $0-8 |
| | MOVL ptr+0(FP), AX |
| | MOVL val+4(FP), BX |
| | LOCK |
| | ORL BX, (AX) |
| | RET |
| |
|
| | |
| | TEXT 路And(SB), NOSPLIT, $0-8 |
| | MOVL ptr+0(FP), AX |
| | MOVL val+4(FP), BX |
| | LOCK |
| | ANDL BX, (AX) |
| | RET |
| |
|
| | |
| | TEXT 路And32(SB), NOSPLIT, $0-12 |
| | MOVL ptr+0(FP), BX |
| | MOVL val+4(FP), CX |
| | casloop: |
| | MOVL CX, DX |
| | MOVL (BX), AX |
| | ANDL AX, DX |
| | LOCK |
| | CMPXCHGL DX, (BX) |
| | JNZ casloop |
| | MOVL AX, ret+8(FP) |
| | RET |
| |
|
| | // func Or32(addr *uint32, v uint32) old uint32 |
| | TEXT 路Or32(SB), NOSPLIT, $0-12 |
| | MOVL ptr+0(FP), BX |
| | MOVL val+4(FP), CX |
| | casloop: |
| | MOVL CX, DX |
| | MOVL (BX), AX |
| | ORL AX, DX |
| | LOCK |
| | CMPXCHGL DX, (BX) |
| | JNZ casloop |
| | MOVL AX, ret+8(FP) |
| | RET |
| |
|
| | // func And64(addr *uint64, v uint64) old uint64 |
| | TEXT 路And64(SB), NOSPLIT, $0-20 |
| | MOVL ptr+0(FP), BP |
| | // DI:SI = v |
| | MOVL val_lo+4(FP), SI |
| | MOVL val_hi+8(FP), DI |
| | // DX:AX = *addr |
| | MOVL 0(BP), AX |
| | MOVL 4(BP), DX |
| | casloop: |
| | // CX:BX = DX:AX (*addr) & DI:SI (mask) |
| | MOVL AX, BX |
| | MOVL DX, CX |
| | ANDL SI, BX |
| | ANDL DI, CX |
| | LOCK |
| | CMPXCHG8B 0(BP) |
| | JNZ casloop |
| | MOVL AX, ret_lo+12(FP) |
| | MOVL DX, ret_hi+16(FP) |
| | RET |
| |
|
| |
|
| | // func Or64(addr *uint64, v uint64) old uint64 |
| | TEXT 路Or64(SB), NOSPLIT, $0-20 |
| | MOVL ptr+0(FP), BP |
| | // DI:SI = v |
| | MOVL val_lo+4(FP), SI |
| | MOVL val_hi+8(FP), DI |
| | // DX:AX = *addr |
| | MOVL 0(BP), AX |
| | MOVL 4(BP), DX |
| | casloop: |
| | // CX:BX = DX:AX (*addr) | DI:SI (mask) |
| | MOVL AX, BX |
| | MOVL DX, CX |
| | ORL SI, BX |
| | ORL DI, CX |
| | LOCK |
| | CMPXCHG8B 0(BP) |
| | JNZ casloop |
| | MOVL AX, ret_lo+12(FP) |
| | MOVL DX, ret_hi+16(FP) |
| | RET |
| |
|
| | // func Anduintptr(addr *uintptr, v uintptr) old uintptr |
| | TEXT 路Anduintptr(SB), NOSPLIT, $0-12 |
| | JMP 路And32(SB) |
| |
|
| | // func Oruintptr(addr *uintptr, v uintptr) old uintptr |
| | TEXT 路Oruintptr(SB), NOSPLIT, $0-12 |
| | JMP 路Or32(SB) |
| |
|