CALLFN(·call536870912, 536870912)
CALLFN(·call1073741824, 1073741824)
-TEXT runtime·procyield(SB),NOSPLIT,$0-0
+TEXT runtime·procyieldAsm(SB),NOSPLIT,$0-0
MOVL cycles+0(FP), AX
again:
PAUSE
CALLFN(·call536870912, 536870912)
CALLFN(·call1073741824, 1073741824)
-TEXT runtime·procyield(SB),NOSPLIT,$0-0
+TEXT runtime·procyieldAsm(SB),NOSPLIT,$0-0
MOVL cycles+0(FP), AX
again:
PAUSE
TEXT runtime·memhash64(SB),NOSPLIT|NOFRAME,$0-12
JMP runtime·memhash64Fallback(SB)
-TEXT runtime·procyield(SB),NOSPLIT|NOFRAME,$0
+TEXT runtime·procyieldAsm(SB),NOSPLIT|NOFRAME,$0
MOVW cycles+0(FP), R1
MOVW $0, R0
yieldloop:
VMOV V0.D[0], R0
RET
-TEXT runtime·procyield(SB),NOSPLIT,$0-0
+TEXT runtime·procyieldAsm(SB),NOSPLIT,$0-0
MOVWU cycles+0(FP), R0
again:
YIELD
CALLFN(·call536870912, 536870912)
CALLFN(·call1073741824, 1073741824)
-TEXT runtime·procyield(SB),NOSPLIT,$0-0
+TEXT runtime·procyieldAsm(SB),NOSPLIT,$0-0
RET
// Save state of caller into g->sched.
CALLFN(·call536870912, 536870912)
CALLFN(·call1073741824, 1073741824)
-TEXT runtime·procyield(SB),NOSPLIT,$0-0
+TEXT runtime·procyieldAsm(SB),NOSPLIT,$0-0
RET
// Save state of caller into g->sched,
CALLFN(·call536870912, 536870912)
CALLFN(·call1073741824, 1073741824)
-TEXT runtime·procyield(SB),NOSPLIT,$0-4
+TEXT runtime·procyieldAsm(SB),NOSPLIT,$0-4
RET
// Save state of caller into g->sched,
CALLFN(·call536870912, 536870912)
CALLFN(·call1073741824, 1073741824)
-TEXT runtime·procyield(SB),NOSPLIT|NOFRAME,$0-4
+TEXT runtime·procyieldAsm(SB),NOSPLIT|NOFRAME,$0-4
MOVW cycles+0(FP), R7
// POWER does not have a pause/yield instruction equivalent.
// Instead, we can lower the program priority by setting the
MOV gobuf_pc(T0), T0
JALR ZERO, T0
-// func procyield(cycles uint32)
-TEXT runtime·procyield(SB),NOSPLIT,$0-0
+// func procyieldAsm(cycles uint32)
+TEXT runtime·procyieldAsm(SB),NOSPLIT,$0-0
RET
// Switch to m->g0's stack, call fn(g).
TEXT callfnMVC<>(SB),NOSPLIT|NOFRAME,$0-0
MVC $1, 0(R4), 0(R6)
-TEXT runtime·procyield(SB),NOSPLIT,$0-0
+TEXT runtime·procyieldAsm(SB),NOSPLIT,$0-0
RET
// Save state of caller into g->sched,
TEXT ·publicationBarrier(SB), NOSPLIT, $0-0
RET
-TEXT runtime·procyield(SB), NOSPLIT, $0-0 // FIXME
+TEXT runtime·procyieldAsm(SB), NOSPLIT, $0-0 // FIXME
RET
TEXT runtime·breakpoint(SB), NOSPLIT, $0-0
// See go.dev/issue/67401.
//
//go:linkname procyield
-func procyield(cycles uint32)
+//go:nosplit
+func procyield(cycles uint32) {
+ if cycles == 0 {
+ return
+ }
+ procyieldAsm(cycles)
+}
+
+// procyieldAsm is the assembly implementation of procyield.
+//
+// It may loop infinitely if called with cycles == 0. Prefer
+// procyield, which will compile down to nothing in such cases,
+// instead.
+//
+// FIXME: The implementation really should not loop infinitely if
+// the number of cycles is 0.
+func procyieldAsm(cycles uint32)
type neverCallThisFunction struct{}