diff --git a/src/cmd/compile/internal/ssa/rewriteARM64.go b/src/cmd/compile/internal/ssa/rewriteARM64.go index ed6974c244907352a96c59fbbe00553478038465..565104cb9be5266ca0ae9fe370cb47fd0324bb9c 100644 --- a/src/cmd/compile/internal/ssa/rewriteARM64.go +++ b/src/cmd/compile/internal/ssa/rewriteARM64.go @@ -2,7 +2,10 @@ package ssa -import "cmd/compile/internal/types" +import ( + "cmd/compile/internal/types" + "internal/goexperiment" +) func rewriteValueARM64(v *Value) bool { switch v.Op { @@ -21360,7 +21363,12 @@ func rewriteValueARM64_OpPubBarrier(v *Value) bool { for { mem := v_0 v.reset(OpARM64DMB) - v.AuxInt = int64ToAuxInt(0xe) + if goexperiment.DmbVar { + v.AuxInt = int64ToAuxInt(0xa) + }else { + v.AuxInt = int64ToAuxInt(0xe) + } + v.AddArg(mem) return true } diff --git a/src/internal/goexperiment/exp_dmbvar_off.go b/src/internal/goexperiment/exp_dmbvar_off.go new file mode 100644 index 0000000000000000000000000000000000000000..bdff57cf225130b8bae023d8d41a18025baaf4f0 --- /dev/null +++ b/src/internal/goexperiment/exp_dmbvar_off.go @@ -0,0 +1,8 @@ +// Code generated by mkconsts.go. DO NOT EDIT. + +//go:build !goexperiment.dmbvar + +package goexperiment + +const DmbVar = false +const DmbVarInt = 0 diff --git a/src/internal/goexperiment/exp_dmbvar_on.go b/src/internal/goexperiment/exp_dmbvar_on.go new file mode 100644 index 0000000000000000000000000000000000000000..c8e4a6e496fa067a5ab5a583c0c7b05b071ca84b --- /dev/null +++ b/src/internal/goexperiment/exp_dmbvar_on.go @@ -0,0 +1,8 @@ +// Code generated by mkconsts.go. DO NOT EDIT. + +//go:build goexperiment.dmbvar + +package goexperiment + +const DmbVar = true +const DmbVarInt = 1 diff --git a/src/internal/goexperiment/flags.go b/src/internal/goexperiment/flags.go index ac85fc800092a40a2090e8f719e5c012b54a682f..dc06fc63dfbcad032d297230113f46596984e2bd 100644 --- a/src/internal/goexperiment/flags.go +++ b/src/internal/goexperiment/flags.go @@ -131,4 +131,7 @@ type Flags struct { // Kunpeng malloc prefetch optimization. PrefetchMalloc bool + + // DMB enable data memory barrier + DmbVar bool } diff --git a/src/runtime/atomic_arm64.s b/src/runtime/atomic_arm64.s index 21b4d8ccd5951c9b0452a848ad0616b3683715d5..78de08369d4dbb97e89c116e5d3997191fab9d6b 100644 --- a/src/runtime/atomic_arm64.s +++ b/src/runtime/atomic_arm64.s @@ -1,6 +1,7 @@ // Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !goexperiment.dmbvar #include "textflag.h" diff --git a/src/runtime/atomic_dmb_arm64.s b/src/runtime/atomic_dmb_arm64.s new file mode 100644 index 0000000000000000000000000000000000000000..d4c3f2866b9caf203653f4e36c59eedc41797893 --- /dev/null +++ b/src/runtime/atomic_dmb_arm64.s @@ -0,0 +1,10 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. +//go:build goexperiment.dmbvar + +#include "textflag.h" + +TEXT ·publicationBarrier(SB),NOSPLIT|NOFRAME,$0-0 + DMB $0xa // DMB ST + RET