| // Copyright 2026 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.simd && (arm64 || wasm) | |
| package archsimd | |
| import "math/bits" | |
| // All returns true when all positions in mask x are true. | |
| // | |
| // Emulated | |
| func (x Mask8x16) All() bool { | |
| word := x.ToInt8x16().ToBits().ReshapeToUint64s() | |
| a0 := word.GetElem(0) | |
| b0 := word.GetElem(1) | |
| return (a0&b0)&0x0101010101010101 == 0x0101010101010101 | |
| } | |
| // Any returns true when any position in mask x is true. | |
| // | |
| // Emulated | |
| func (x Mask8x16) Any() bool { | |
| word := x.ToInt8x16().ToBits().ReshapeToUint64s() | |
| a0 := word.GetElem(0) | |
| b0 := word.GetElem(1) | |
| return (a0|b0)&0x0101010101010101 != 0 | |
| } | |
| // None returns true when no positions in mask x are set. | |
| // | |
| // Emulated | |
| func (x Mask8x16) None() bool { | |
| word := x.ToInt8x16().ToBits().ReshapeToUint64s() | |
| a0 := word.GetElem(0) | |
| b0 := word.GetElem(1) | |
| return (a0|b0)&0x0101010101010101 == 0 | |
| } | |
| // All returns true when all positions in mask x are true. | |
| // | |
| // Emulated | |
| func (x Mask16x8) All() bool { | |
| word := x.ToInt16x8().ToBits().ReshapeToUint64s() | |
| a0 := word.GetElem(0) | |
| b0 := word.GetElem(1) | |
| return (a0&b0)&0x0001000100010001 == 0x0001000100010001 | |
| } | |
| // Any returns true when any position in mask x is true. | |
| // | |
| // Emulated | |
| func (x Mask16x8) Any() bool { | |
| word := x.ToInt16x8().ToBits().ReshapeToUint64s() | |
| a0 := word.GetElem(0) | |
| b0 := word.GetElem(1) | |
| return (a0|b0)&0x0001000100010001 != 0 | |
| } | |
| // None returns true when no positions in mask x are set. | |
| // | |
| // Emulated | |
| func (x Mask16x8) None() bool { | |
| word := x.ToInt16x8().ToBits().ReshapeToUint64s() | |
| a0 := word.GetElem(0) | |
| b0 := word.GetElem(1) | |
| return (a0|b0)&0x0001000100010001 == 0 | |
| } | |
| // All returns true when all positions in mask x are true. | |
| // | |
| // Emulated | |
| func (x Mask32x4) All() bool { | |
| word := x.ToInt32x4().ToBits().ReshapeToUint64s() | |
| a0 := word.GetElem(0) | |
| b0 := word.GetElem(1) | |
| return (a0&b0)&0x0000000100000001 == 0x0000000100000001 | |
| } | |
| // Any returns true when any position in mask x is true. | |
| // | |
| // Emulated | |
| func (x Mask32x4) Any() bool { | |
| word := x.ToInt32x4().ToBits().ReshapeToUint64s() | |
| a0 := word.GetElem(0) | |
| b0 := word.GetElem(1) | |
| return (a0|b0)&0x0000000100000001 != 0 | |
| } | |
| // None returns true when no positions in mask x are set. | |
| // | |
| // Emulated | |
| func (x Mask32x4) None() bool { | |
| word := x.ToInt32x4().ToBits().ReshapeToUint64s() | |
| a0 := word.GetElem(0) | |
| b0 := word.GetElem(1) | |
| return (a0|b0)&0x0000000100000001 == 0 | |
| } | |
| // All returns true when all positions in mask x are true. | |
| // | |
| // Emulated | |
| func (x Mask64x2) All() bool { | |
| word := x.ToInt64x2().ToBits() | |
| a0 := word.GetElem(0) | |
| b0 := word.GetElem(1) | |
| return a0 != 0 && b0 != 0 | |
| } | |
| // Any returns true when any position in mask x is true. | |
| // | |
| // Emulated | |
| func (x Mask64x2) Any() bool { | |
| word := x.ToInt64x2().ToBits() | |
| a0 := word.GetElem(0) | |
| b0 := word.GetElem(1) | |
| return a0 != 0 || b0 != 0 | |
| } | |
| // None returns true when no positions in mask x are set. | |
| // | |
| // Emulated | |
| func (x Mask64x2) None() bool { | |
| word := x.ToInt64x2().ToBits() | |
| a0 := word.GetElem(0) | |
| b0 := word.GetElem(1) | |
| return a0 == 0 && b0 == 0 | |
| } | |
| // TrailingZeros returns the number of low-order false (zero) elements in mask x | |
| // | |
| // Emulated | |
| func (x Mask8x16) TrailingZeros() int { | |
| word := x.ToInt8x16().ToBits().ReshapeToUint64s() | |
| a0 := word.GetElem(0) | |
| a := a0 & 0x0101010101010101 | |
| lane := bits.TrailingZeros64(a) | |
| if lane < 64 { | |
| return lane >> 3 | |
| } | |
| a0 = word.GetElem(1) | |
| a = a0 & 0x0101010101010101 | |
| lane = bits.TrailingZeros64(a) | |
| return lane>>3 + 8 | |
| } | |
| // TrailingZeros returns the number of trailing (low-order) zeroes in mask x | |
| // | |
| // Emulated | |
| func (x Mask16x8) TrailingZeros() int { | |
| word := x.ToInt16x8().ToBits().ReshapeToUint64s() | |
| a0 := word.GetElem(0) | |
| a := a0 & 0x0001000100010001 | |
| lane := bits.TrailingZeros64(a) | |
| if lane < 64 { | |
| return lane >> 4 | |
| } | |
| a0 = word.GetElem(1) | |
| a = a0 & 0x0001000100010001 | |
| lane = bits.TrailingZeros64(a) | |
| return lane>>4 + 4 | |
| } | |
| // TrailingZeros returns the number of trailing (low-order) zeroes in mask x | |
| // | |
| // Emulated | |
| func (x Mask32x4) TrailingZeros() int { | |
| word := x.ToInt32x4().ToBits().ReshapeToUint64s() | |
| a0 := word.GetElem(0) | |
| a := a0 & 0x0000000100000001 | |
| lane := bits.TrailingZeros64(a) | |
| if lane < 64 { | |
| return lane >> 5 | |
| } | |
| a0 = word.GetElem(1) | |
| a = a0 & 0x0000000100000001 | |
| lane = bits.TrailingZeros64(a) | |
| return lane>>5 + 2 | |
| } | |
| // TrailingZeros returns the number of trailing (low-order) zeroes in mask x | |
| // | |
| // Emulated | |
| func (x Mask64x2) TrailingZeros() int { | |
| word := x.ToInt64x2().ToBits() | |
| if word.GetElem(0) != 0 { | |
| return 0 | |
| } | |
| if word.GetElem(1) != 0 { | |
| return 1 | |
| } | |
| return 2 | |
| } |