// 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
}
