From 2b7505e28a50f49e85c3e0812a4c4f287b8dfa30 Mon Sep 17 00:00:00 2001 From: Shenghou Ma Date: Tue, 28 Apr 2015 19:44:00 -0400 Subject: [PATCH] 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 Reviewed-on: https://go-review.googlesource.com/9453 Reviewed-by: Dave Cheney --- src/cmd/internal/gc/cgen.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/cmd/internal/gc/cgen.go b/src/cmd/internal/gc/cgen.go index 3fea97e0a6..574d24f302 100644 --- a/src/cmd/internal/gc/cgen.go +++ b/src/cmd/internal/gc/cgen.go @@ -803,7 +803,19 @@ func cgen_wbptr(n, res *Node) { 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) -- 2.51.0