2.4 Go's Hidden PragmasNoescape case "go:norace": return Norace case "go:nosplit": return Nosplit case "go:noinline": return Noinline case "go:systemstack": should be removed return (((x << 5) >> 2) << 2) } runtime/atomic_pointer.go //go:nosplit func atomicstorep(ptr unsafe.Pointer, new unsafe.Pointer) { writebarrierptr_prewrite((*uintptr)(ptr) *SysProcAttr, pipe int) (pid int, err Errno) { Should you use /go:norace in your own code? //go:nosplit Function preamble ".fn t=1 size=120 args=0x0 locals=0x80 0x0000 00000 (main.go:5) TEXT ".fn(SB)0 码力 | 58 页 | 605.64 KB | 1 月前3
Better x86 Assembly Generation with Goin add_amd64.s. #include "textflag.h" // func Add(x, y uint64) uint64 TEXT · Add(SB), NOSPLIT, $0-24 MOVQ x+0(FP), AX MOVQ y+8(FP), CX ADDQ CX, AX MOVQ AX, ret+16(FP) RET Implementation in add_amd64.s. #include "textflag.h" // func Add(x, y uint64) uint64 TEXT · Add(SB), NOSPLIT, $0-24 MOVQ x+0(FP), AX MOVQ y+8(FP), CX ADDQ CX, AX MOVQ AX, ret+16(FP) RET Declaration Implementation in add_amd64.s. #include "textflag.h" // func Add(x, y uint64) uint64 TEXT · Add(SB), NOSPLIT, $0-24 MOVQ x+0(FP), AX < Read x from stack frame MOVQ y+8(FP), CX < Read y ADDQ CX, AX MOVQ0 码力 | 155 页 | 13.54 MB | 2 年前3
2.2.3 Go语言的抢占式调度newstack morestack_noctxt ## ↓ morestack ↓ newstack ## ☀️ ☀️ ☁️ TEXT runtime·morestack(SB),NOSPLIT,$0-0 get_tls(CX) MOVQ g(CX), SI // 将 caller g 保存在 SI 寄存器中 // 根据 caller 信息,设置 g.sched 的 pc、g、sp scan g stack -> resumeG M sighandler returned gsignal ☀️ ☁️ ☁️ TEXT ·asyncPreempt(SB),NOSPLIT|NOFRAME,$0-0 PC G local var a // 保存所有通用/非通用寄存器到 goroutine 栈上 CALL ·asyncPreempt2(SB) local gsignal G local var a local var b local var c ctx.PC ctx.SP ●●●● TEXT · asyncPreempt(SB), NOSPLIT|NOFRAME, $0-0 PC // 保存所有通用/非通用寄存器到 goroutine 栈上 CALL ·asyncPreempt2(SB) // 从栈上恢复所有通用/非通用寄存器0 码力 | 44 页 | 7.43 MB | 2 年前3
共 3 条
- 1













