Commit d211c2d3 authored by Austin Clements's avatar Austin Clements

runtime: implement getcallersp in Go

This makes it possible to inline getcallersp. getcallersp is on the
hot path of defers, so this slightly speeds up defer:

name           old time/op  new time/op  delta
Defer-4        78.3ns ± 2%  75.1ns ± 1%  -4.00%   (p=0.000 n=9+8)

Updates #14939.

Change-Id: Icc1cc4cd2f0a81fc4c8344432d0b2e783accacdd
Reviewed-on: https://go-review.googlesource.com/29655
TryBot-Result: Gobot Gobot <gobot@golang.org>
Run-TryBot: Austin Clements <austin@google.com>
Reviewed-by: 's avatarDavid Crawshaw <crawshaw@golang.org>
Reviewed-by: 's avatarKeith Randall <khr@golang.org>
parent aaf4099a
......@@ -808,11 +808,6 @@ setbar:
CALL runtime·setNextBarrierPC(SB)
RET
TEXT runtime·getcallersp(SB), NOSPLIT, $0-8
MOVL argp+0(FP), AX
MOVL AX, ret+4(FP)
RET
// func cputicks() int64
TEXT runtime·cputicks(SB),NOSPLIT,$0-8
TESTL $0x4000000, runtime·cpuid_edx(SB) // no sse2, no mfence
......
......@@ -825,11 +825,6 @@ setbar:
CALL runtime·setNextBarrierPC(SB)
RET
TEXT runtime·getcallersp(SB),NOSPLIT,$0-16
MOVQ argp+0(FP), AX
MOVQ AX, ret+8(FP)
RET
// func cputicks() int64
TEXT runtime·cputicks(SB),NOSPLIT,$0-0
CMPB runtime·lfenceBeforeRdtsc(SB), $1
......
......@@ -521,11 +521,6 @@ setbar:
CALL runtime·setNextBarrierPC(SB)
RET
TEXT runtime·getcallersp(SB),NOSPLIT,$0-12
MOVL argp+0(FP), AX
MOVL AX, ret+8(FP)
RET
// int64 runtime·cputicks(void)
TEXT runtime·cputicks(SB),NOSPLIT,$0-0
RDTSC
......
......@@ -695,12 +695,6 @@ setbar:
BL runtime·setNextBarrierPC(SB)
RET
TEXT runtime·getcallersp(SB),NOSPLIT,$-4-8
MOVW argp+0(FP), R0
MOVW $-4(R0), R0
MOVW R0, ret+4(FP)
RET
TEXT runtime·emptyfunc(SB),0,$0-0
RET
......
......@@ -731,12 +731,6 @@ setbar:
BL runtime·setNextBarrierPC(SB)
RET
TEXT runtime·getcallersp(SB),NOSPLIT,$0-16
MOVD argp+0(FP), R0
SUB $8, R0
MOVD R0, ret+8(FP)
RET
TEXT runtime·abort(SB),NOSPLIT,$-8-0
B (ZR)
UNDEF
......
......@@ -643,12 +643,6 @@ setbar:
JAL runtime·setNextBarrierPC(SB)
RET
TEXT runtime·getcallersp(SB),NOSPLIT,$0-16
MOVV argp+0(FP), R1
ADDV $-8, R1
MOVV R1, ret+8(FP)
RET
TEXT runtime·abort(SB),NOSPLIT,$-8-0
MOVW (R0), R0
UNDEF
......
......@@ -742,12 +742,6 @@ setbar:
BL runtime·setNextBarrierPC(SB)
RET
TEXT runtime·getcallersp(SB),NOSPLIT,$0-16
MOVD argp+0(FP), R3
SUB $FIXED_FRAME, R3
MOVD R3, ret+8(FP)
RET
TEXT runtime·abort(SB),NOSPLIT|NOFRAME,$0-0
MOVW (R0), R0
UNDEF
......
......@@ -715,12 +715,6 @@ setbar:
BL runtime·setNextBarrierPC(SB)
RET
TEXT runtime·getcallersp(SB),NOSPLIT,$0-16
MOVD argp+0(FP), R3
SUB $8, R3
MOVD R3, ret+8(FP)
RET
TEXT runtime·abort(SB),NOSPLIT|NOFRAME,$0-0
MOVW (R0), R0
UNDEF
......
......@@ -4,7 +4,10 @@
package runtime
import "unsafe"
import (
"runtime/internal/sys"
"unsafe"
)
// Should be a built-in for unsafe.Pointer?
//go:nosplit
......@@ -196,8 +199,10 @@ func setcallerpc(argp unsafe.Pointer, pc uintptr)
//go:noescape
func getcallerpc(argp unsafe.Pointer) uintptr
//go:noescape
func getcallersp(argp unsafe.Pointer) uintptr
//go:nosplit
func getcallersp(argp unsafe.Pointer) uintptr {
return uintptr(argp) - sys.MinFrameSize
}
//go:noescape
func asmcgocall(fn, arg unsafe.Pointer) int32
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment