| // 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 | |
| package archsimd | |
| import "math/bits" | |
| // 128-bit masks | |
| // All returns true when all positions in mask x are true. | |
| // | |
| // Emulated, CPU Feature: AVX | |
| func (x Mask8x16) All() bool { | |
| return x.ToBits() == 0xffff | |
| } | |
| // Any returns true when any position in mask x is true. | |
| // | |
| // Emulated, CPU Feature: AVX | |
| func (x Mask8x16) Any() bool { | |
| return x.ToBits() != 0 | |
| } | |
| // None returns true when no positions in mask x are set. | |
| // | |
| // Emulated, CPU Feature: AVX | |
| func (x Mask8x16) None() bool { | |
| return x.ToBits() == 0 | |
| } | |
| // All returns true when all positions in mask x are true. | |
| // | |
| // Emulated, CPU Feature: AVX | |
| func (x Mask16x8) All() bool { | |
| return x.ToInt16x8().AsInt8x16().asMask().ToBits()&0x5555 == 0x5555 | |
| } | |
| // Any returns true when any position in mask x is true. | |
| // | |
| // Emulated, CPU Feature: AVX | |
| func (x Mask16x8) Any() bool { | |
| return x.ToInt16x8().AsInt8x16().asMask().ToBits()&0x5555 != 0 | |
| } | |
| // None returns true when no positions in mask x are set. | |
| // | |
| // Emulated, CPU Feature: AVX | |
| func (x Mask16x8) None() bool { | |
| return x.ToInt16x8().AsInt8x16().asMask().ToBits()&0x5555 == 0 | |
| } | |
| // All returns true when all positions in mask x are true. | |
| // | |
| // Emulated, CPU Feature: AVX | |
| func (x Mask32x4) All() bool { | |
| return x.ToBits()&0x0f == 0x0f | |
| } | |
| // Any returns true when any position in mask x is true. | |
| // | |
| // Emulated, CPU Feature: AVX | |
| func (x Mask32x4) Any() bool { | |
| return x.ToBits()&0x0f != 0 | |
| } | |
| // None returns true when no positions in mask x are set. | |
| // | |
| // Emulated, CPU Feature: AVX | |
| func (x Mask32x4) None() bool { | |
| return x.ToBits()&0x0f == 0 | |
| } | |
| // All returns true when all positions in mask x are true. | |
| // | |
| // Emulated, CPU Feature: AVX | |
| func (x Mask64x2) All() bool { | |
| return x.ToBits()&0x03 == 0x03 | |
| } | |
| // Any returns true when any position in mask x is true. | |
| // | |
| // Emulated, CPU Feature: AVX | |
| func (x Mask64x2) Any() bool { | |
| return x.ToBits()&0x03 != 0 | |
| } | |
| // None returns true when no positions in mask x are set. | |
| // | |
| // Emulated, CPU Feature: AVX | |
| func (x Mask64x2) None() bool { | |
| return x.ToBits()&0x03 == 0 | |
| } | |
| // 256-bit masks | |
| // All returns true when all positions in mask x are true. | |
| // | |
| // Emulated, CPU Feature: AVX2 | |
| func (x Mask8x32) All() bool { | |
| return x.ToBits() == 0xffffffff | |
| } | |
| // Any returns true when any position in mask x is true. | |
| // | |
| // Emulated, CPU Feature: AVX2 | |
| func (x Mask8x32) Any() bool { | |
| return x.ToBits() != 0 | |
| } | |
| // None returns true when no positions in mask x are set. | |
| // | |
| // Emulated, CPU Feature: AVX2 | |
| func (x Mask8x32) None() bool { | |
| return x.ToBits() == 0 | |
| } | |
| // All returns true when all positions in mask x are true. | |
| // | |
| // Emulated, CPU Feature: AVX2 | |
| func (x Mask16x16) All() bool { | |
| return x.ToInt16x16().AsInt8x32().asMask().ToBits()&0x55555555 == 0x55555555 | |
| } | |
| // Any returns true when any position in mask x is true. | |
| // | |
| // Emulated, CPU Feature: AVX2 | |
| func (x Mask16x16) Any() bool { | |
| return x.ToInt16x16().AsInt8x32().asMask().ToBits()&0x55555555 != 0 | |
| } | |
| // None returns true when no positions in mask x are set. | |
| // | |
| // Emulated, CPU Feature: AVX2 | |
| func (x Mask16x16) None() bool { | |
| return x.ToInt16x16().AsInt8x32().asMask().ToBits()&0x55555555 == 0 | |
| } | |
| // All returns true when all positions in mask x are true. | |
| // | |
| // Emulated, CPU Feature: AVX2 | |
| func (x Mask32x8) All() bool { | |
| return x.ToBits() == 0xff | |
| } | |
| // Any returns true when any position in mask x is true. | |
| // | |
| // Emulated, CPU Feature: AVX2 | |
| func (x Mask32x8) Any() bool { | |
| return x.ToBits() != 0 | |
| } | |
| // None returns true when no positions in mask x are set. | |
| // | |
| // Emulated, CPU Feature: AVX2 | |
| func (x Mask32x8) None() bool { | |
| return x.ToBits() == 0 | |
| } | |
| // All returns true when all positions in mask x are true. | |
| // | |
| // Emulated, CPU Feature: AVX2 | |
| func (x Mask64x4) All() bool { | |
| return x.ToBits()&0x0f == 0x0f | |
| } | |
| // Any returns true when any position in mask x is true. | |
| // | |
| // Emulated, CPU Feature: AVX2 | |
| func (x Mask64x4) Any() bool { | |
| return x.ToBits()&0x0f != 0 | |
| } | |
| // None returns true when no positions in mask x are set. | |
| // | |
| // Emulated, CPU Feature: AVX2 | |
| func (x Mask64x4) None() bool { | |
| return x.ToBits()&0x0f == 0 | |
| } | |
| // 512-bit masks | |
| // All returns true when all positions in mask x are true. | |
| // | |
| // Emulated, CPU Feature: AVX512 | |
| func (x Mask8x64) All() bool { | |
| return ^x.ToBits() == 0 | |
| } | |
| // Any returns true when any position in mask x is true. | |
| // | |
| // Emulated, CPU Feature: AVX512 | |
| func (x Mask8x64) Any() bool { | |
| return x.ToBits() != 0 | |
| } | |
| // None returns true when no positions in mask x are set. | |
| // | |
| // Emulated, CPU Feature: AVX512 | |
| func (x Mask8x64) None() bool { | |
| return x.ToBits() == 0 | |
| } | |
| // All returns true when all positions in mask x are true. | |
| // | |
| // Emulated, CPU Feature: AVX512 | |
| func (x Mask16x32) All() bool { | |
| return ^x.ToBits() == 0 | |
| } | |
| // Any returns true when any position in mask x is true. | |
| // | |
| // Emulated, CPU Feature: AVX512 | |
| func (x Mask16x32) Any() bool { | |
| return x.ToBits() != 0 | |
| } | |
| // None returns true when no positions in mask x are set. | |
| // | |
| // Emulated, CPU Feature: AVX512 | |
| func (x Mask16x32) None() bool { | |
| return x.ToBits() == 0 | |
| } | |
| // All returns true when all positions in mask x are true. | |
| // | |
| // Emulated, CPU Feature: AVX512 | |
| func (x Mask32x16) All() bool { | |
| return ^x.ToBits() == 0 | |
| } | |
| // Any returns true when any position in mask x is true. | |
| // | |
| // Emulated, CPU Feature: AVX512 | |
| func (x Mask32x16) Any() bool { | |
| return x.ToBits() != 0 | |
| } | |
| // None returns true when no positions in mask x are set. | |
| // | |
| // Emulated, CPU Feature: AVX512 | |
| func (x Mask32x16) None() bool { | |
| return x.ToBits() == 0 | |
| } | |
| // All returns true when all positions in mask x are true. | |
| // | |
| // Emulated, CPU Feature: AVX512 | |
| func (x Mask64x8) All() bool { | |
| return ^x.ToBits() == 0 | |
| } | |
| // Any returns true when any position in mask x is true. | |
| // | |
| // Emulated, CPU Feature: AVX512 | |
| func (x Mask64x8) Any() bool { | |
| return x.ToBits() != 0 | |
| } | |
| // None returns true when no positions in mask x are set. | |
| // | |
| // Emulated, CPU Feature: AVX512 | |
| func (x Mask64x8) None() bool { | |
| return x.ToBits() == 0 | |
| } | |
| // TrailingZeros returns the number of low-order false (zero) elements in mask x. | |
| // | |
| // Emulated, CPU Feature: AVX | |
| func (x Mask8x16) TrailingZeros() int { | |
| word := uint64(x.ToBits()) | |
| lane := bits.TrailingZeros64(word) | |
| if lane >= 16 { | |
| return 16 | |
| } | |
| return lane | |
| } | |
| // TrailingZeros returns the number of low-order false (zero) elements in mask x. | |
| // | |
| // Emulated, CPU Feature: AVX2 | |
| func (x Mask8x32) TrailingZeros() int { | |
| word := uint64(x.ToBits()) | |
| lane := bits.TrailingZeros64(word) | |
| if lane >= 32 { | |
| return 32 | |
| } | |
| return lane | |
| } | |
| // TrailingZeros returns the number of low-order false (zero) elements in mask x. | |
| // | |
| // Emulated, CPU Feature: AVX512 | |
| func (x Mask8x64) TrailingZeros() int { | |
| word := uint64(x.ToBits()) | |
| lane := bits.TrailingZeros64(word) | |
| if lane >= 64 { | |
| return 64 | |
| } | |
| return lane | |
| } | |
| // TrailingZeros returns the number of low-order false (zero) elements in mask m. | |
| // | |
| // Emulated, CPU Feature: AVX | |
| func (x Mask16x8) TrailingZeros() int { | |
| word := uint64(x.ToInt16x8().AsInt8x16().asMask().ToBits() & 0x5555) | |
| lane := bits.TrailingZeros64(word) >> 1 | |
| if lane >= 8 { | |
| return 8 | |
| } | |
| return lane | |
| } | |
| // TrailingZeros returns the number of low-order false (zero) elements in mask m. | |
| // | |
| // Emulated, CPU Feature: AVX2 | |
| func (x Mask16x16) TrailingZeros() int { | |
| word := uint64(x.ToInt16x16().AsInt8x32().asMask().ToBits() & 0x55555555) | |
| lane := bits.TrailingZeros64(word) >> 1 | |
| if lane >= 16 { | |
| return 16 | |
| } | |
| return lane | |
| } | |
| // TrailingZeros returns the number of low-order false (zero) elements in mask m. | |
| // | |
| // Emulated, CPU Feature: AVX512 | |
| func (x Mask16x32) TrailingZeros() int { | |
| word := uint64(x.ToBits()) | |
| lane := bits.TrailingZeros64(word) | |
| if lane >= 32 { | |
| return 32 | |
| } | |
| return lane | |
| } | |
| // TrailingZeros returns the number of low-order false (zero) elements in mask m. | |
| // | |
| // Emulated, CPU Feature: AVX | |
| func (x Mask32x4) TrailingZeros() int { | |
| word := uint64(x.ToBits()) | |
| lane := bits.TrailingZeros64(word) | |
| if lane >= 4 { | |
| return 4 | |
| } | |
| return lane | |
| } | |
| // TrailingZeros returns the number of low-order false (zero) elements in mask m. | |
| // | |
| // Emulated, CPU Feature: AVX2 | |
| func (x Mask32x8) TrailingZeros() int { | |
| word := uint64(x.ToBits()) | |
| lane := bits.TrailingZeros64(word) | |
| if lane >= 8 { | |
| return 8 | |
| } | |
| return lane | |
| } | |
| // TrailingZeros returns the number of low-order false (zero) elements in mask m. | |
| // | |
| // Emulated, CPU Feature: AVX512 | |
| func (x Mask32x16) TrailingZeros() int { | |
| word := uint64(x.ToBits()) | |
| lane := bits.TrailingZeros64(word) | |
| if lane >= 16 { | |
| return 16 | |
| } | |
| return lane | |
| } | |
| // TrailingZeros returns the number of low-order false (zero) elements in mask m. | |
| // | |
| // Emulated, CPU Feature: AVX | |
| func (x Mask64x2) TrailingZeros() int { | |
| word := uint64(x.ToBits()) | |
| lane := bits.TrailingZeros64(word) | |
| if lane >= 2 { | |
| return 2 | |
| } | |
| return lane | |
| } | |
| // TrailingZeros returns the number of low-order false (zero) elements in mask m. | |
| // | |
| // Emulated, CPU Feature: AVX2 | |
| func (x Mask64x4) TrailingZeros() int { | |
| word := uint64(x.ToBits()) | |
| lane := bits.TrailingZeros64(word) | |
| if lane >= 4 { | |
| return 4 | |
| } | |
| return lane | |
| } | |
| // TrailingZeros returns the number of low-order false (zero) elements in mask m. | |
| // | |
| // Emulated, CPU Feature: AVX512 | |
| func (x Mask64x8) TrailingZeros() int { | |
| word := uint64(x.ToBits()) | |
| lane := bits.TrailingZeros64(word) | |
| if lane >= 8 { | |
| return 8 | |
| } | |
| return lane | |
| } |