Skip to content

Commit 1caa062

Browse files
ceseobradfitz
authored andcommitted
runtime: implement procyield properly for ppc64x
The procyield() function should yield the processor as in other architectures. On ppc64x, this is achieved by setting the Program Priority Register to 'low priority' prior to the spin loop, and setting it back to 'medium-low priority' afterwards. benchmark old ns/op new ns/op delta BenchmarkMakeChan/Byte-8 87.7 86.6 -1.25% BenchmarkMakeChan/Int-8 107 106 -0.93% BenchmarkMakeChan/Ptr-8 201 204 +1.49% BenchmarkMakeChan/Struct/0-8 78.2 79.7 +1.92% BenchmarkMakeChan/Struct/32-8 196 200 +2.04% BenchmarkMakeChan/Struct/40-8 236 230 -2.54% BenchmarkChanNonblocking-8 8.64 8.85 +2.43% BenchmarkChanUncontended-8 5577 5598 +0.38% BenchmarkChanContended-8 66106 51529 -22.05% BenchmarkChanSync-8 451 441 -2.22% BenchmarkChanSyncWork-8 9155 9170 +0.16% BenchmarkChanProdCons0-8 1585 1083 -31.67% BenchmarkChanProdCons10-8 1094 838 -23.40% BenchmarkChanProdCons100-8 831 657 -20.94% BenchmarkChanProdConsWork0-8 1471 941 -36.03% BenchmarkChanProdConsWork10-8 1033 721 -30.20% BenchmarkChanProdConsWork100-8 730 511 -30.00% BenchmarkChanCreation-8 135 128 -5.19% BenchmarkChanSem-8 602 463 -23.09% BenchmarkChanPopular-8 3017466 2188441 -27.47% Fixes #25625 Change-Id: Iacb1c888d3c066902152b8367500348fb631c5f9 Reviewed-on: https://go-review.googlesource.com/115376 Run-TryBot: Lynn Boger <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Brad Fitzpatrick <[email protected]>
1 parent f125052 commit 1caa062

File tree

2 files changed

+13
-2
lines changed

2 files changed

+13
-2
lines changed

src/cmd/vet/all/whitelist/linux_ppc64x.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,3 @@
22

33
runtime/sys_linux_ppc64x.s: [GOARCH] _sigtramp: function _sigtramp missing Go declaration
44
runtime/sys_linux_ppc64x.s: [GOARCH] _cgoSigtramp: function _cgoSigtramp missing Go declaration
5-
runtime/asm_ppc64x.s: [GOARCH] procyield: use of 24(R1) points beyond argument frame

src/runtime/asm_ppc64x.s

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,19 @@ CALLFN(·call268435456, 268435456)
457457
CALLFN(·call536870912, 536870912)
458458
CALLFN(·call1073741824, 1073741824)
459459

460-
TEXT runtime·procyield(SB),NOSPLIT,$0-0
460+
TEXT runtime·procyield(SB),NOSPLIT|NOFRAME,$0-4
461+
MOVW cycles+0(FP), R7
462+
// POWER does not have a pause/yield instruction equivalent.
463+
// Instead, we can lower the program priority by setting the
464+
// Program Priority Register prior to the wait loop and set it
465+
// back to default afterwards. On Linux, the default priority is
466+
// medium-low. For details, see page 837 of the ISA 3.0.
467+
OR R1, R1, R1 // Set PPR priority to low
468+
again:
469+
SUB $1, R7
470+
CMP $0, R7
471+
BNE again
472+
OR R6, R6, R6 // Set PPR priority back to medium-low
461473
RET
462474

463475
// void jmpdefer(fv, sp);

0 commit comments

Comments
 (0)