cmd/internal/gc: fix write barrier fast path on RISC architectures
They have to read the boolean into a register first and then do
the comparison.
Fixes #10598.
Change-Id: I2b808837a8c6393e1e0778296b6592aaab2b04bf
Signed-off-by: Shenghou Ma <minux@golang.org>
Reviewed-on: https://go-review.googlesource.com/9453
Reviewed-by: Dave Cheney <dave@cheney.net>
diff --git a/src/cmd/internal/gc/cgen.go b/src/cmd/internal/gc/cgen.go
index 3fea97e..574d24f 100644
--- a/src/cmd/internal/gc/cgen.go
+++ b/src/cmd/internal/gc/cgen.go
@@ -803,7 +803,19 @@
Cgenr(n, &src, nil)
}
- Thearch.Gins(Thearch.Optoas(OCMP, Types[TUINT8]), syslook("writeBarrierEnabled", 0), Nodintconst(0))
+ wbEnabled := syslook("writeBarrierEnabled", 0)
+ switch Ctxt.Arch.Thechar {
+ default:
+ Fatal("cgen_wbptr: unknown architecture")
+ case '5', '7', '9':
+ var tmp Node
+ Regalloc(&tmp, Types[TUINT8], nil)
+ Thearch.Gmove(wbEnabled, &tmp)
+ Thearch.Gins(Thearch.Optoas(OCMP, Types[TUINT8]), &tmp, Nodintconst(0))
+ Regfree(&tmp)
+ case '6', '8':
+ Thearch.Gins(Thearch.Optoas(OCMP, Types[TUINT8]), wbEnabled, Nodintconst(0))
+ }
pbr := Gbranch(Thearch.Optoas(ONE, Types[TUINT8]), nil, -1)
Thearch.Gins(Thearch.Optoas(OAS, Types[Tptr]), &src, &dst)
pjmp := Gbranch(obj.AJMP, nil, 0)