// Code generated by 'tmplgen'; DO NOT EDIT.

//go:build goexperiment.simd

package archsimd

import "unsafe"

// LoadInt8x16 loads an Int8x16 from a slice of elements.
// If s does not have at least 16 elements, it panics.
func LoadInt8x16(s []int8) Int8x16 {
	return LoadInt8x16Array((*[16]int8)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 16 elements, it panics.
func (x Int8x16) Store(s []int8) {
	x.StoreArray((*[16]int8)(s))
}

// LoadInt16x8 loads an Int16x8 from a slice of elements.
// If s does not have at least 8 elements, it panics.
func LoadInt16x8(s []int16) Int16x8 {
	return LoadInt16x8Array((*[8]int16)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 8 elements, it panics.
func (x Int16x8) Store(s []int16) {
	x.StoreArray((*[8]int16)(s))
}

// LoadInt32x4 loads an Int32x4 from a slice of elements.
// If s does not have at least 4 elements, it panics.
func LoadInt32x4(s []int32) Int32x4 {
	return LoadInt32x4Array((*[4]int32)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 4 elements, it panics.
func (x Int32x4) Store(s []int32) {
	x.StoreArray((*[4]int32)(s))
}

// LoadInt64x2 loads an Int64x2 from a slice of elements.
// If s does not have at least 2 elements, it panics.
func LoadInt64x2(s []int64) Int64x2 {
	return LoadInt64x2Array((*[2]int64)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 2 elements, it panics.
func (x Int64x2) Store(s []int64) {
	x.StoreArray((*[2]int64)(s))
}

// LoadUint8x16 loads an Uint8x16 from a slice of elements.
// If s does not have at least 16 elements, it panics.
func LoadUint8x16(s []uint8) Uint8x16 {
	return LoadUint8x16Array((*[16]uint8)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 16 elements, it panics.
func (x Uint8x16) Store(s []uint8) {
	x.StoreArray((*[16]uint8)(s))
}

// LoadUint16x8 loads an Uint16x8 from a slice of elements.
// If s does not have at least 8 elements, it panics.
func LoadUint16x8(s []uint16) Uint16x8 {
	return LoadUint16x8Array((*[8]uint16)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 8 elements, it panics.
func (x Uint16x8) Store(s []uint16) {
	x.StoreArray((*[8]uint16)(s))
}

// LoadUint32x4 loads an Uint32x4 from a slice of elements.
// If s does not have at least 4 elements, it panics.
func LoadUint32x4(s []uint32) Uint32x4 {
	return LoadUint32x4Array((*[4]uint32)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 4 elements, it panics.
func (x Uint32x4) Store(s []uint32) {
	x.StoreArray((*[4]uint32)(s))
}

// LoadUint64x2 loads an Uint64x2 from a slice of elements.
// If s does not have at least 2 elements, it panics.
func LoadUint64x2(s []uint64) Uint64x2 {
	return LoadUint64x2Array((*[2]uint64)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 2 elements, it panics.
func (x Uint64x2) Store(s []uint64) {
	x.StoreArray((*[2]uint64)(s))
}

// LoadFloat32x4 loads a Float32x4 from a slice of elements.
// If s does not have at least 4 elements, it panics.
func LoadFloat32x4(s []float32) Float32x4 {
	return LoadFloat32x4Array((*[4]float32)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 4 elements, it panics.
func (x Float32x4) Store(s []float32) {
	x.StoreArray((*[4]float32)(s))
}

// LoadFloat64x2 loads a Float64x2 from a slice of elements.
// If s does not have at least 2 elements, it panics.
func LoadFloat64x2(s []float64) Float64x2 {
	return LoadFloat64x2Array((*[2]float64)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 2 elements, it panics.
func (x Float64x2) Store(s []float64) {
	x.StoreArray((*[2]float64)(s))
}

// LoadInt8x32 loads an Int8x32 from a slice of elements.
// If s does not have at least 32 elements, it panics.
func LoadInt8x32(s []int8) Int8x32 {
	return LoadInt8x32Array((*[32]int8)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 32 elements, it panics.
func (x Int8x32) Store(s []int8) {
	x.StoreArray((*[32]int8)(s))
}

// LoadInt16x16 loads an Int16x16 from a slice of elements.
// If s does not have at least 16 elements, it panics.
func LoadInt16x16(s []int16) Int16x16 {
	return LoadInt16x16Array((*[16]int16)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 16 elements, it panics.
func (x Int16x16) Store(s []int16) {
	x.StoreArray((*[16]int16)(s))
}

// LoadInt32x8 loads an Int32x8 from a slice of elements.
// If s does not have at least 8 elements, it panics.
func LoadInt32x8(s []int32) Int32x8 {
	return LoadInt32x8Array((*[8]int32)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 8 elements, it panics.
func (x Int32x8) Store(s []int32) {
	x.StoreArray((*[8]int32)(s))
}

// LoadInt64x4 loads an Int64x4 from a slice of elements.
// If s does not have at least 4 elements, it panics.
func LoadInt64x4(s []int64) Int64x4 {
	return LoadInt64x4Array((*[4]int64)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 4 elements, it panics.
func (x Int64x4) Store(s []int64) {
	x.StoreArray((*[4]int64)(s))
}

// LoadUint8x32 loads an Uint8x32 from a slice of elements.
// If s does not have at least 32 elements, it panics.
func LoadUint8x32(s []uint8) Uint8x32 {
	return LoadUint8x32Array((*[32]uint8)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 32 elements, it panics.
func (x Uint8x32) Store(s []uint8) {
	x.StoreArray((*[32]uint8)(s))
}

// LoadUint16x16 loads an Uint16x16 from a slice of elements.
// If s does not have at least 16 elements, it panics.
func LoadUint16x16(s []uint16) Uint16x16 {
	return LoadUint16x16Array((*[16]uint16)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 16 elements, it panics.
func (x Uint16x16) Store(s []uint16) {
	x.StoreArray((*[16]uint16)(s))
}

// LoadUint32x8 loads an Uint32x8 from a slice of elements.
// If s does not have at least 8 elements, it panics.
func LoadUint32x8(s []uint32) Uint32x8 {
	return LoadUint32x8Array((*[8]uint32)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 8 elements, it panics.
func (x Uint32x8) Store(s []uint32) {
	x.StoreArray((*[8]uint32)(s))
}

// LoadUint64x4 loads an Uint64x4 from a slice of elements.
// If s does not have at least 4 elements, it panics.
func LoadUint64x4(s []uint64) Uint64x4 {
	return LoadUint64x4Array((*[4]uint64)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 4 elements, it panics.
func (x Uint64x4) Store(s []uint64) {
	x.StoreArray((*[4]uint64)(s))
}

// LoadFloat32x8 loads a Float32x8 from a slice of elements.
// If s does not have at least 8 elements, it panics.
func LoadFloat32x8(s []float32) Float32x8 {
	return LoadFloat32x8Array((*[8]float32)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 8 elements, it panics.
func (x Float32x8) Store(s []float32) {
	x.StoreArray((*[8]float32)(s))
}

// LoadFloat64x4 loads a Float64x4 from a slice of elements.
// If s does not have at least 4 elements, it panics.
func LoadFloat64x4(s []float64) Float64x4 {
	return LoadFloat64x4Array((*[4]float64)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 4 elements, it panics.
func (x Float64x4) Store(s []float64) {
	x.StoreArray((*[4]float64)(s))
}

// LoadInt8x64 loads an Int8x64 from a slice of elements.
// If s does not have at least 64 elements, it panics.
func LoadInt8x64(s []int8) Int8x64 {
	return LoadInt8x64Array((*[64]int8)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 64 elements, it panics.
func (x Int8x64) Store(s []int8) {
	x.StoreArray((*[64]int8)(s))
}

// LoadInt16x32 loads an Int16x32 from a slice of elements.
// If s does not have at least 32 elements, it panics.
func LoadInt16x32(s []int16) Int16x32 {
	return LoadInt16x32Array((*[32]int16)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 32 elements, it panics.
func (x Int16x32) Store(s []int16) {
	x.StoreArray((*[32]int16)(s))
}

// LoadInt32x16 loads an Int32x16 from a slice of elements.
// If s does not have at least 16 elements, it panics.
func LoadInt32x16(s []int32) Int32x16 {
	return LoadInt32x16Array((*[16]int32)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 16 elements, it panics.
func (x Int32x16) Store(s []int32) {
	x.StoreArray((*[16]int32)(s))
}

// LoadInt64x8 loads an Int64x8 from a slice of elements.
// If s does not have at least 8 elements, it panics.
func LoadInt64x8(s []int64) Int64x8 {
	return LoadInt64x8Array((*[8]int64)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 8 elements, it panics.
func (x Int64x8) Store(s []int64) {
	x.StoreArray((*[8]int64)(s))
}

// LoadUint8x64 loads an Uint8x64 from a slice of elements.
// If s does not have at least 64 elements, it panics.
func LoadUint8x64(s []uint8) Uint8x64 {
	return LoadUint8x64Array((*[64]uint8)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 64 elements, it panics.
func (x Uint8x64) Store(s []uint8) {
	x.StoreArray((*[64]uint8)(s))
}

// LoadUint16x32 loads an Uint16x32 from a slice of elements.
// If s does not have at least 32 elements, it panics.
func LoadUint16x32(s []uint16) Uint16x32 {
	return LoadUint16x32Array((*[32]uint16)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 32 elements, it panics.
func (x Uint16x32) Store(s []uint16) {
	x.StoreArray((*[32]uint16)(s))
}

// LoadUint32x16 loads an Uint32x16 from a slice of elements.
// If s does not have at least 16 elements, it panics.
func LoadUint32x16(s []uint32) Uint32x16 {
	return LoadUint32x16Array((*[16]uint32)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 16 elements, it panics.
func (x Uint32x16) Store(s []uint32) {
	x.StoreArray((*[16]uint32)(s))
}

// LoadUint64x8 loads an Uint64x8 from a slice of elements.
// If s does not have at least 8 elements, it panics.
func LoadUint64x8(s []uint64) Uint64x8 {
	return LoadUint64x8Array((*[8]uint64)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 8 elements, it panics.
func (x Uint64x8) Store(s []uint64) {
	x.StoreArray((*[8]uint64)(s))
}

// LoadFloat32x16 loads a Float32x16 from a slice of elements.
// If s does not have at least 16 elements, it panics.
func LoadFloat32x16(s []float32) Float32x16 {
	return LoadFloat32x16Array((*[16]float32)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 16 elements, it panics.
func (x Float32x16) Store(s []float32) {
	x.StoreArray((*[16]float32)(s))
}

// LoadFloat64x8 loads a Float64x8 from a slice of elements.
// If s does not have at least 8 elements, it panics.
func LoadFloat64x8(s []float64) Float64x8 {
	return LoadFloat64x8Array((*[8]float64)(s))
}

// Store stores the elements of x into a slice.
// If s does not have at least 8 elements, it panics.
func (x Float64x8) Store(s []float64) {
	x.StoreArray((*[8]float64)(s))
}

// LoadInt8x64Part loads a Int8x64 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 64 elements, the remaining elements of the vector are filled with zeroes.
// If s has 64 or more elements, the function is equivalent to LoadInt8x64Slice.
func LoadInt8x64Part(s []int8) (Int8x64, int) {
	l := len(s)
	if l >= 64 {
		return LoadInt8x64(s), 64
	}
	if l == 0 {
		var x Int8x64
		return x, 0
	}
	mask := Mask8x64FromBits(0xffffffffffffffff >> (64 - l))
	return LoadInt8x64Array(paInt8x64(s)).Masked(mask), l
}

// StorePart stores the 64 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 64 or more elements, the method is equivalent to x.Store.
func (x Int8x64) StorePart(s []int8) {
	l := len(s)
	if l >= 64 {
		x.Store(s)
		return
	}
	if l == 0 {
		return
	}
	mask := Mask8x64FromBits(0xffffffffffffffff >> (64 - l))
	x.StoreArrayMasked(paInt8x64(s), mask)
}

// LoadInt16x32Part loads a Int16x32 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 32 elements, the remaining elements of the vector are filled with zeroes.
// If s has 32 or more elements, the function is equivalent to LoadInt16x32Slice.
func LoadInt16x32Part(s []int16) (Int16x32, int) {
	l := len(s)
	if l >= 32 {
		return LoadInt16x32(s), 32
	}
	if l == 0 {
		var x Int16x32
		return x, 0
	}
	mask := Mask16x32FromBits(0xffffffff >> (32 - l))
	return LoadInt16x32Array(paInt16x32(s)).Masked(mask), l
}

// StorePart stores the 32 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 32 or more elements, the method is equivalent to x.Store.
func (x Int16x32) StorePart(s []int16) {
	l := len(s)
	if l >= 32 {
		x.Store(s)
		return
	}
	if l == 0 {
		return
	}
	mask := Mask16x32FromBits(0xffffffff >> (32 - l))
	x.StoreArrayMasked(paInt16x32(s), mask)
}

// LoadInt32x16Part loads a Int32x16 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 16 elements, the remaining elements of the vector are filled with zeroes.
// If s has 16 or more elements, the function is equivalent to LoadInt32x16Slice.
func LoadInt32x16Part(s []int32) (Int32x16, int) {
	l := len(s)
	if l >= 16 {
		return LoadInt32x16(s), 16
	}
	if l == 0 {
		var x Int32x16
		return x, 0
	}
	mask := Mask32x16FromBits(0xffff >> (16 - l))
	return LoadInt32x16Array(paInt32x16(s)).Masked(mask), l
}

// StorePart stores the 16 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 16 or more elements, the method is equivalent to x.Store.
func (x Int32x16) StorePart(s []int32) {
	l := len(s)
	if l >= 16 {
		x.Store(s)
		return
	}
	if l == 0 {
		return
	}
	mask := Mask32x16FromBits(0xffff >> (16 - l))
	x.StoreArrayMasked(paInt32x16(s), mask)
}

// LoadInt64x8Part loads a Int64x8 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 8 elements, the remaining elements of the vector are filled with zeroes.
// If s has 8 or more elements, the function is equivalent to LoadInt64x8Slice.
func LoadInt64x8Part(s []int64) (Int64x8, int) {
	l := len(s)
	if l >= 8 {
		return LoadInt64x8(s), 8
	}
	if l == 0 {
		var x Int64x8
		return x, 0
	}
	mask := Mask64x8FromBits(0xff >> (8 - l))
	return LoadInt64x8Array(paInt64x8(s)).Masked(mask), l
}

// StorePart stores the 8 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 8 or more elements, the method is equivalent to x.Store.
func (x Int64x8) StorePart(s []int64) {
	l := len(s)
	if l >= 8 {
		x.Store(s)
		return
	}
	if l == 0 {
		return
	}
	mask := Mask64x8FromBits(0xff >> (8 - l))
	x.StoreArrayMasked(paInt64x8(s), mask)
}

// LoadUint8x64Part loads a Uint8x64 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 64 elements, the remaining elements of the vector are filled with zeroes.
// If s has 64 or more elements, the function is equivalent to LoadUint8x64Slice.
func LoadUint8x64Part(s []uint8) (Uint8x64, int) {
	l := len(s)
	if l >= 64 {
		return LoadUint8x64(s), 64
	}
	if l == 0 {
		var x Uint8x64
		return x, 0
	}
	mask := Mask8x64FromBits(0xffffffffffffffff >> (64 - l))
	return LoadUint8x64Array(paUint8x64(s)).Masked(mask), l
}

// StorePart stores the 64 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 64 or more elements, the method is equivalent to x.Store.
func (x Uint8x64) StorePart(s []uint8) {
	l := len(s)
	if l >= 64 {
		x.Store(s)
		return
	}
	if l == 0 {
		return
	}
	mask := Mask8x64FromBits(0xffffffffffffffff >> (64 - l))
	x.StoreArrayMasked(paUint8x64(s), mask)
}

// LoadUint16x32Part loads a Uint16x32 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 32 elements, the remaining elements of the vector are filled with zeroes.
// If s has 32 or more elements, the function is equivalent to LoadUint16x32Slice.
func LoadUint16x32Part(s []uint16) (Uint16x32, int) {
	l := len(s)
	if l >= 32 {
		return LoadUint16x32(s), 32
	}
	if l == 0 {
		var x Uint16x32
		return x, 0
	}
	mask := Mask16x32FromBits(0xffffffff >> (32 - l))
	return LoadUint16x32Array(paUint16x32(s)).Masked(mask), l
}

// StorePart stores the 32 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 32 or more elements, the method is equivalent to x.Store.
func (x Uint16x32) StorePart(s []uint16) {
	l := len(s)
	if l >= 32 {
		x.Store(s)
		return
	}
	if l == 0 {
		return
	}
	mask := Mask16x32FromBits(0xffffffff >> (32 - l))
	x.StoreArrayMasked(paUint16x32(s), mask)
}

// LoadUint32x16Part loads a Uint32x16 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 16 elements, the remaining elements of the vector are filled with zeroes.
// If s has 16 or more elements, the function is equivalent to LoadUint32x16Slice.
func LoadUint32x16Part(s []uint32) (Uint32x16, int) {
	l := len(s)
	if l >= 16 {
		return LoadUint32x16(s), 16
	}
	if l == 0 {
		var x Uint32x16
		return x, 0
	}
	mask := Mask32x16FromBits(0xffff >> (16 - l))
	return LoadUint32x16Array(paUint32x16(s)).Masked(mask), l
}

// StorePart stores the 16 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 16 or more elements, the method is equivalent to x.Store.
func (x Uint32x16) StorePart(s []uint32) {
	l := len(s)
	if l >= 16 {
		x.Store(s)
		return
	}
	if l == 0 {
		return
	}
	mask := Mask32x16FromBits(0xffff >> (16 - l))
	x.StoreArrayMasked(paUint32x16(s), mask)
}

// LoadUint64x8Part loads a Uint64x8 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 8 elements, the remaining elements of the vector are filled with zeroes.
// If s has 8 or more elements, the function is equivalent to LoadUint64x8Slice.
func LoadUint64x8Part(s []uint64) (Uint64x8, int) {
	l := len(s)
	if l >= 8 {
		return LoadUint64x8(s), 8
	}
	if l == 0 {
		var x Uint64x8
		return x, 0
	}
	mask := Mask64x8FromBits(0xff >> (8 - l))
	return LoadUint64x8Array(paUint64x8(s)).Masked(mask), l
}

// StorePart stores the 8 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 8 or more elements, the method is equivalent to x.Store.
func (x Uint64x8) StorePart(s []uint64) {
	l := len(s)
	if l >= 8 {
		x.Store(s)
		return
	}
	if l == 0 {
		return
	}
	mask := Mask64x8FromBits(0xff >> (8 - l))
	x.StoreArrayMasked(paUint64x8(s), mask)
}

// LoadFloat32x16Part loads a Float32x16 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 16 elements, the remaining elements of the vector are filled with zeroes.
// If s has 16 or more elements, the function is equivalent to LoadFloat32x16Slice.
func LoadFloat32x16Part(s []float32) (Float32x16, int) {
	l := len(s)
	if l >= 16 {
		return LoadFloat32x16(s), 16
	}
	if l == 0 {
		var x Float32x16
		return x, 0
	}
	mask := Mask32x16FromBits(0xffff >> (16 - l))
	return LoadFloat32x16Array(paFloat32x16(s)).Masked(mask), l
}

// StorePart stores the 16 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 16 or more elements, the method is equivalent to x.Store.
func (x Float32x16) StorePart(s []float32) {
	l := len(s)
	if l >= 16 {
		x.Store(s)
		return
	}
	if l == 0 {
		return
	}
	mask := Mask32x16FromBits(0xffff >> (16 - l))
	x.StoreArrayMasked(paFloat32x16(s), mask)
}

// LoadFloat64x8Part loads a Float64x8 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 8 elements, the remaining elements of the vector are filled with zeroes.
// If s has 8 or more elements, the function is equivalent to LoadFloat64x8Slice.
func LoadFloat64x8Part(s []float64) (Float64x8, int) {
	l := len(s)
	if l >= 8 {
		return LoadFloat64x8(s), 8
	}
	if l == 0 {
		var x Float64x8
		return x, 0
	}
	mask := Mask64x8FromBits(0xff >> (8 - l))
	return LoadFloat64x8Array(paFloat64x8(s)).Masked(mask), l
}

// StorePart stores the 8 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 8 or more elements, the method is equivalent to x.Store.
func (x Float64x8) StorePart(s []float64) {
	l := len(s)
	if l >= 8 {
		x.Store(s)
		return
	}
	if l == 0 {
		return
	}
	mask := Mask64x8FromBits(0xff >> (8 - l))
	x.StoreArrayMasked(paFloat64x8(s), mask)
}

// LoadInt32x4Part loads a Int32x4 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 4 elements, the remaining elements of the vector are filled with zeroes.
// If s has 4 or more elements, the function is equivalent to LoadInt32x4Slice.
func LoadInt32x4Part(s []int32) (Int32x4, int) {
	l := len(s)
	if l >= 4 {
		return LoadInt32x4(s), 4
	}
	if l == 0 {
		var x Int32x4
		return x, 0
	}
	mask := vecMask32[len(vecMask32)/2-l:]
	return LoadInt32x4Array(paInt32x4(s)).Masked(LoadInt32x4(mask).asMask()), l
}

// StorePart stores the 4 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 4 or more elements, the method is equivalent to x.Store.
func (x Int32x4) StorePart(s []int32) {
	l := len(s)
	if l >= 4 {
		x.Store(s)
		return
	}
	if l == 0 {
		return
	}
	mask := vecMask32[len(vecMask32)/2-l:]
	x.StoreArrayMasked(paInt32x4(s), LoadInt32x4(mask).asMask())
}

// LoadInt64x2Part loads a Int64x2 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 2 elements, the remaining elements of the vector are filled with zeroes.
// If s has 2 or more elements, the function is equivalent to LoadInt64x2Slice.
func LoadInt64x2Part(s []int64) (Int64x2, int) {
	l := len(s)
	if l >= 2 {
		return LoadInt64x2(s), 2
	}
	if l == 0 {
		var x Int64x2
		return x, 0
	}
	mask := vecMask64[len(vecMask64)/2-l:]
	return LoadInt64x2Array(paInt64x2(s)).Masked(LoadInt64x2(mask).asMask()), l
}

// StorePart stores the 2 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 2 or more elements, the method is equivalent to x.Store.
func (x Int64x2) StorePart(s []int64) {
	l := len(s)
	if l >= 2 {
		x.Store(s)
		return
	}
	if l == 0 {
		return
	}
	mask := vecMask64[len(vecMask64)/2-l:]
	x.StoreArrayMasked(paInt64x2(s), LoadInt64x2(mask).asMask())
}

// LoadUint32x4Part loads a Uint32x4 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 4 elements, the remaining elements of the vector are filled with zeroes.
// If s has 4 or more elements, the function is equivalent to LoadUint32x4Slice.
func LoadUint32x4Part(s []uint32) (Uint32x4, int) {
	l := len(s)
	if l >= 4 {
		return LoadUint32x4(s), 4
	}
	if l == 0 {
		var x Uint32x4
		return x, 0
	}
	mask := vecMask32[len(vecMask32)/2-l:]
	return LoadUint32x4Array(paUint32x4(s)).Masked(LoadInt32x4(mask).asMask()), l
}

// StorePart stores the 4 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 4 or more elements, the method is equivalent to x.Store.
func (x Uint32x4) StorePart(s []uint32) {
	l := len(s)
	if l >= 4 {
		x.Store(s)
		return
	}
	if l == 0 {
		return
	}
	mask := vecMask32[len(vecMask32)/2-l:]
	x.StoreArrayMasked(paUint32x4(s), LoadInt32x4(mask).asMask())
}

// LoadUint64x2Part loads a Uint64x2 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 2 elements, the remaining elements of the vector are filled with zeroes.
// If s has 2 or more elements, the function is equivalent to LoadUint64x2Slice.
func LoadUint64x2Part(s []uint64) (Uint64x2, int) {
	l := len(s)
	if l >= 2 {
		return LoadUint64x2(s), 2
	}
	if l == 0 {
		var x Uint64x2
		return x, 0
	}
	mask := vecMask64[len(vecMask64)/2-l:]
	return LoadUint64x2Array(paUint64x2(s)).Masked(LoadInt64x2(mask).asMask()), l
}

// StorePart stores the 2 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 2 or more elements, the method is equivalent to x.Store.
func (x Uint64x2) StorePart(s []uint64) {
	l := len(s)
	if l >= 2 {
		x.Store(s)
		return
	}
	if l == 0 {
		return
	}
	mask := vecMask64[len(vecMask64)/2-l:]
	x.StoreArrayMasked(paUint64x2(s), LoadInt64x2(mask).asMask())
}

// LoadFloat32x4Part loads a Float32x4 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 4 elements, the remaining elements of the vector are filled with zeroes.
// If s has 4 or more elements, the function is equivalent to LoadFloat32x4Slice.
func LoadFloat32x4Part(s []float32) (Float32x4, int) {
	l := len(s)
	if l >= 4 {
		return LoadFloat32x4(s), 4
	}
	if l == 0 {
		var x Float32x4
		return x, 0
	}
	mask := vecMask32[len(vecMask32)/2-l:]
	return LoadFloat32x4Array(paFloat32x4(s)).Masked(LoadInt32x4(mask).asMask()), l
}

// StorePart stores the 4 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 4 or more elements, the method is equivalent to x.Store.
func (x Float32x4) StorePart(s []float32) {
	l := len(s)
	if l >= 4 {
		x.Store(s)
		return
	}
	if l == 0 {
		return
	}
	mask := vecMask32[len(vecMask32)/2-l:]
	x.StoreArrayMasked(paFloat32x4(s), LoadInt32x4(mask).asMask())
}

// LoadFloat64x2Part loads a Float64x2 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 2 elements, the remaining elements of the vector are filled with zeroes.
// If s has 2 or more elements, the function is equivalent to LoadFloat64x2Slice.
func LoadFloat64x2Part(s []float64) (Float64x2, int) {
	l := len(s)
	if l >= 2 {
		return LoadFloat64x2(s), 2
	}
	if l == 0 {
		var x Float64x2
		return x, 0
	}
	mask := vecMask64[len(vecMask64)/2-l:]
	return LoadFloat64x2Array(paFloat64x2(s)).Masked(LoadInt64x2(mask).asMask()), l
}

// StorePart stores the 2 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 2 or more elements, the method is equivalent to x.Store.
func (x Float64x2) StorePart(s []float64) {
	l := len(s)
	if l >= 2 {
		x.Store(s)
		return
	}
	if l == 0 {
		return
	}
	mask := vecMask64[len(vecMask64)/2-l:]
	x.StoreArrayMasked(paFloat64x2(s), LoadInt64x2(mask).asMask())
}

// LoadInt32x8Part loads a Int32x8 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 8 elements, the remaining elements of the vector are filled with zeroes.
// If s has 8 or more elements, the function is equivalent to LoadInt32x8Slice.
func LoadInt32x8Part(s []int32) (Int32x8, int) {
	l := len(s)
	if l >= 8 {
		return LoadInt32x8(s), 8
	}
	if l == 0 {
		var x Int32x8
		return x, 0
	}
	mask := vecMask32[len(vecMask32)/2-l:]
	return LoadInt32x8Array(paInt32x8(s)).Masked(LoadInt32x8(mask).asMask()), l
}

// StorePart stores the 8 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 8 or more elements, the method is equivalent to x.Store.
func (x Int32x8) StorePart(s []int32) {
	l := len(s)
	if l >= 8 {
		x.Store(s)
		return
	}
	if l == 0 {
		return
	}
	mask := vecMask32[len(vecMask32)/2-l:]
	x.StoreArrayMasked(paInt32x8(s), LoadInt32x8(mask).asMask())
}

// LoadInt64x4Part loads a Int64x4 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 4 elements, the remaining elements of the vector are filled with zeroes.
// If s has 4 or more elements, the function is equivalent to LoadInt64x4Slice.
func LoadInt64x4Part(s []int64) (Int64x4, int) {
	l := len(s)
	if l >= 4 {
		return LoadInt64x4(s), 4
	}
	if l == 0 {
		var x Int64x4
		return x, 0
	}
	mask := vecMask64[len(vecMask64)/2-l:]
	return LoadInt64x4Array(paInt64x4(s)).Masked(LoadInt64x4(mask).asMask()), l
}

// StorePart stores the 4 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 4 or more elements, the method is equivalent to x.Store.
func (x Int64x4) StorePart(s []int64) {
	l := len(s)
	if l >= 4 {
		x.Store(s)
		return
	}
	if l == 0 {
		return
	}
	mask := vecMask64[len(vecMask64)/2-l:]
	x.StoreArrayMasked(paInt64x4(s), LoadInt64x4(mask).asMask())
}

// LoadUint32x8Part loads a Uint32x8 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 8 elements, the remaining elements of the vector are filled with zeroes.
// If s has 8 or more elements, the function is equivalent to LoadUint32x8Slice.
func LoadUint32x8Part(s []uint32) (Uint32x8, int) {
	l := len(s)
	if l >= 8 {
		return LoadUint32x8(s), 8
	}
	if l == 0 {
		var x Uint32x8
		return x, 0
	}
	mask := vecMask32[len(vecMask32)/2-l:]
	return LoadUint32x8Array(paUint32x8(s)).Masked(LoadInt32x8(mask).asMask()), l
}

// StorePart stores the 8 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 8 or more elements, the method is equivalent to x.Store.
func (x Uint32x8) StorePart(s []uint32) {
	l := len(s)
	if l >= 8 {
		x.Store(s)
		return
	}
	if l == 0 {
		return
	}
	mask := vecMask32[len(vecMask32)/2-l:]
	x.StoreArrayMasked(paUint32x8(s), LoadInt32x8(mask).asMask())
}

// LoadUint64x4Part loads a Uint64x4 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 4 elements, the remaining elements of the vector are filled with zeroes.
// If s has 4 or more elements, the function is equivalent to LoadUint64x4Slice.
func LoadUint64x4Part(s []uint64) (Uint64x4, int) {
	l := len(s)
	if l >= 4 {
		return LoadUint64x4(s), 4
	}
	if l == 0 {
		var x Uint64x4
		return x, 0
	}
	mask := vecMask64[len(vecMask64)/2-l:]
	return LoadUint64x4Array(paUint64x4(s)).Masked(LoadInt64x4(mask).asMask()), l
}

// StorePart stores the 4 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 4 or more elements, the method is equivalent to x.Store.
func (x Uint64x4) StorePart(s []uint64) {
	l := len(s)
	if l >= 4 {
		x.Store(s)
		return
	}
	if l == 0 {
		return
	}
	mask := vecMask64[len(vecMask64)/2-l:]
	x.StoreArrayMasked(paUint64x4(s), LoadInt64x4(mask).asMask())
}

// LoadFloat32x8Part loads a Float32x8 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 8 elements, the remaining elements of the vector are filled with zeroes.
// If s has 8 or more elements, the function is equivalent to LoadFloat32x8Slice.
func LoadFloat32x8Part(s []float32) (Float32x8, int) {
	l := len(s)
	if l >= 8 {
		return LoadFloat32x8(s), 8
	}
	if l == 0 {
		var x Float32x8
		return x, 0
	}
	mask := vecMask32[len(vecMask32)/2-l:]
	return LoadFloat32x8Array(paFloat32x8(s)).Masked(LoadInt32x8(mask).asMask()), l
}

// StorePart stores the 8 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 8 or more elements, the method is equivalent to x.Store.
func (x Float32x8) StorePart(s []float32) {
	l := len(s)
	if l >= 8 {
		x.Store(s)
		return
	}
	if l == 0 {
		return
	}
	mask := vecMask32[len(vecMask32)/2-l:]
	x.StoreArrayMasked(paFloat32x8(s), LoadInt32x8(mask).asMask())
}

// LoadFloat64x4Part loads a Float64x4 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 4 elements, the remaining elements of the vector are filled with zeroes.
// If s has 4 or more elements, the function is equivalent to LoadFloat64x4Slice.
func LoadFloat64x4Part(s []float64) (Float64x4, int) {
	l := len(s)
	if l >= 4 {
		return LoadFloat64x4(s), 4
	}
	if l == 0 {
		var x Float64x4
		return x, 0
	}
	mask := vecMask64[len(vecMask64)/2-l:]
	return LoadFloat64x4Array(paFloat64x4(s)).Masked(LoadInt64x4(mask).asMask()), l
}

// StorePart stores the 4 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 4 or more elements, the method is equivalent to x.Store.
func (x Float64x4) StorePart(s []float64) {
	l := len(s)
	if l >= 4 {
		x.Store(s)
		return
	}
	if l == 0 {
		return
	}
	mask := vecMask64[len(vecMask64)/2-l:]
	x.StoreArrayMasked(paFloat64x4(s), LoadInt64x4(mask).asMask())
}

// LoadUint8x16Part loads a Uint8x16 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 16 elements, the remaining elements of the vector are filled with zeroes.
// If s has 16 or more elements, the function is equivalent to LoadUint8x16Slice.
func LoadUint8x16Part(s []uint8) (Uint8x16, int) {
	if len(s) == 0 {
		var zero Uint8x16
		return zero, 0
	}
	t := unsafe.Slice((*int8)(unsafe.Pointer(&s[0])), len(s))
	v, l := LoadInt8x16Part(t)
	return v.AsUint8x16(), l
}

// StorePart stores the 16 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 16 or more elements, the method is equivalent to x.Store.
func (x Uint8x16) StorePart(s []uint8) {
	if len(s) == 0 {
		return
	}
	t := unsafe.Slice((*int8)(unsafe.Pointer(&s[0])), len(s))
	x.AsInt8x16().StorePart(t)
}

// LoadUint16x8Part loads a Uint16x8 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 8 elements, the remaining elements of the vector are filled with zeroes.
// If s has 8 or more elements, the function is equivalent to LoadUint16x8Slice.
func LoadUint16x8Part(s []uint16) (Uint16x8, int) {
	if len(s) == 0 {
		var zero Uint16x8
		return zero, 0
	}
	t := unsafe.Slice((*int16)(unsafe.Pointer(&s[0])), len(s))
	v, l := LoadInt16x8Part(t)
	return v.AsUint16x8(), l
}

// StorePart stores the 8 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 8 or more elements, the method is equivalent to x.Store.
func (x Uint16x8) StorePart(s []uint16) {
	if len(s) == 0 {
		return
	}
	t := unsafe.Slice((*int16)(unsafe.Pointer(&s[0])), len(s))
	x.AsInt16x8().StorePart(t)
}

// LoadUint8x32Part loads a Uint8x32 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 32 elements, the remaining elements of the vector are filled with zeroes.
// If s has 32 or more elements, the function is equivalent to LoadUint8x32Slice.
func LoadUint8x32Part(s []uint8) (Uint8x32, int) {
	if len(s) == 0 {
		var zero Uint8x32
		return zero, 0
	}
	t := unsafe.Slice((*int8)(unsafe.Pointer(&s[0])), len(s))
	v, l := LoadInt8x32Part(t)
	return v.AsUint8x32(), l
}

// StorePart stores the 32 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 32 or more elements, the method is equivalent to x.Store.
func (x Uint8x32) StorePart(s []uint8) {
	if len(s) == 0 {
		return
	}
	t := unsafe.Slice((*int8)(unsafe.Pointer(&s[0])), len(s))
	x.AsInt8x32().StorePart(t)
}

// LoadUint16x16Part loads a Uint16x16 from the slice s, it returns the loaded vector and the
// number of elements loaded.
// If s has fewer than 16 elements, the remaining elements of the vector are filled with zeroes.
// If s has 16 or more elements, the function is equivalent to LoadUint16x16Slice.
func LoadUint16x16Part(s []uint16) (Uint16x16, int) {
	if len(s) == 0 {
		var zero Uint16x16
		return zero, 0
	}
	t := unsafe.Slice((*int16)(unsafe.Pointer(&s[0])), len(s))
	v, l := LoadInt16x16Part(t)
	return v.AsUint16x16(), l
}

// StorePart stores the 16 elements of x into the slice s.
// It stores as many elements as will fit in s.
// If s has 16 or more elements, the method is equivalent to x.Store.
func (x Uint16x16) StorePart(s []uint16) {
	if len(s) == 0 {
		return
	}
	t := unsafe.Slice((*int16)(unsafe.Pointer(&s[0])), len(s))
	x.AsInt16x16().StorePart(t)
}
