TEXT armXadd64<>(SB),NOSPLIT,$0-20 // addr is already in R1 MOVW delta_lo+4(FP), R2 MOVW delta_hi+8(FP), R3
1 2 3 4 5 6 7 8 9 10 11 12 13
//go:nosplit funcgoXadd64(addr *uint64, delta int64)uint64 { ifuintptr(unsafe.Pointer(addr))&7 != 0 { *(*int)(nil) = 0// crash on unaligned uint64 } _ = *addr // if nil, fault before taking the lock var r uint64 addrLock(addr).lock() r = *addr + uint64(delta) *addr = r addrLock(addr).unlock() return r }
什么?汇编看不懂吗?其实我也看不懂…,问问 gpt 吧
汇编在调用时做了CHECK_ALIGN(内存对齐的检查)
在内存未对齐时,会直接产生 panic 进而中断程序,包括在goXadd64中也进行了判断*(*int)(nil) = 0 // crash on unaligned uint64