// asmcheck // Copyright 2024 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. // These tests check that atomic instructions without dynamic checks are // generated for architectures that support them package codegen import "sync/atomic" type Counter struct { count int32 } func (c *Counter) Increment() { // Check that ARm64 v8.0 has both atomic instruction (LDADDALW) and a dynamic check // (for arm64HasATOMICS), while ARM64 v8.1 has only atomic and no dynamic check. // arm64/v8.0:"LDADDALW" // arm64/v8.1:"LDADDALW" // arm64/v8.0:".*arm64HasATOMICS" // arm64/v8.1:-".*arm64HasATOMICS" // amd64:"LOCK",-"CMPXCHG" atomic.AddInt32(&c.count, 1) } func atomicLogical64(x *atomic.Uint64) uint64 { var r uint64 // arm64/v8.0:"LDCLRALD" // arm64/v8.1:"LDCLRALD" // arm64/v8.0:".*arm64HasATOMICS" // arm64/v8.1:-".*arm64HasATOMICS" // On amd64, make sure we use LOCK+AND instead of CMPXCHG when we don't use the result. // amd64:"LOCK",-"CMPXCHGQ" x.And(11) // arm64/v8.0:"LDCLRALD" // arm64/v8.1:"LDCLRALD" // arm64/v8.0:".*arm64HasATOMICS" // arm64/v8.1:-".*arm64HasATOMICS" // amd64:"LOCK","CMPXCHGQ" r += x.And(22) // arm64/v8.0:"LDORALD" // arm64/v8.1:"LDORALD" // arm64/v8.0:".*arm64HasATOMICS" // arm64/v8.1:-".*arm64HasATOMICS" // On amd64, make sure we use LOCK+OR instead of CMPXCHG when we don't use the result. // amd64:"LOCK",-"CMPXCHGQ" x.Or(33) // arm64/v8.0:"LDORALD" // arm64/v8.1:"LDORALD" // arm64/v8.0:".*arm64HasATOMICS" // arm64/v8.1:-".*arm64HasATOMICS" // amd64:"LOCK","CMPXCHGQ" r += x.Or(44) return r } func atomicLogical32(x *atomic.Uint32) uint32 { var r uint32 // arm64/v8.0:"LDCLRALW" // arm64/v8.1:"LDCLRALW" // arm64/v8.0:".*arm64HasATOMICS" // arm64/v8.1:-".*arm64HasATOMICS" // On amd64, make sure we use LOCK+AND instead of CMPXCHG when we don't use the result. // amd64:"LOCK",-"CMPXCHGL" x.And(11) // arm64/v8.0:"LDCLRALW" // arm64/v8.1:"LDCLRALW" // arm64/v8.0:".*arm64HasATOMICS" // arm64/v8.1:-".*arm64HasATOMICS" // amd64:"LOCK","CMPXCHGL" r += x.And(22) // arm64/v8.0:"LDORALW" // arm64/v8.1:"LDORALW" // arm64/v8.0:".*arm64HasATOMICS" // arm64/v8.1:-".*arm64HasATOMICS" // On amd64, make sure we use LOCK+OR instead of CMPXCHG when we don't use the result. // amd64:"LOCK",-"CMPXCHGL" x.Or(33) // arm64/v8.0:"LDORALW" // arm64/v8.1:"LDORALW" // arm64/v8.0:".*arm64HasATOMICS" // arm64/v8.1:-".*arm64HasATOMICS" // amd64:"LOCK","CMPXCHGL" r += x.Or(44) return r }