// Code generated by 'go run genfiles.go'; DO NOT EDIT.

//go:build goexperiment.simd

package archsimd

import "unsafe"

// paInt8x16 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paInt8x16(s []int8) *[16]int8 {
	return (*[16]int8)(unsafe.Pointer(&s[0]))
}

// paInt16x8 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paInt16x8(s []int16) *[8]int16 {
	return (*[8]int16)(unsafe.Pointer(&s[0]))
}

// paInt32x4 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paInt32x4(s []int32) *[4]int32 {
	return (*[4]int32)(unsafe.Pointer(&s[0]))
}

// paInt64x2 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paInt64x2(s []int64) *[2]int64 {
	return (*[2]int64)(unsafe.Pointer(&s[0]))
}

// paUint8x16 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paUint8x16(s []uint8) *[16]uint8 {
	return (*[16]uint8)(unsafe.Pointer(&s[0]))
}

// paUint16x8 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paUint16x8(s []uint16) *[8]uint16 {
	return (*[8]uint16)(unsafe.Pointer(&s[0]))
}

// paUint32x4 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paUint32x4(s []uint32) *[4]uint32 {
	return (*[4]uint32)(unsafe.Pointer(&s[0]))
}

// paUint64x2 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paUint64x2(s []uint64) *[2]uint64 {
	return (*[2]uint64)(unsafe.Pointer(&s[0]))
}

// paFloat32x4 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paFloat32x4(s []float32) *[4]float32 {
	return (*[4]float32)(unsafe.Pointer(&s[0]))
}

// paFloat64x2 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paFloat64x2(s []float64) *[2]float64 {
	return (*[2]float64)(unsafe.Pointer(&s[0]))
}

// paInt8x32 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paInt8x32(s []int8) *[32]int8 {
	return (*[32]int8)(unsafe.Pointer(&s[0]))
}

// paInt16x16 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paInt16x16(s []int16) *[16]int16 {
	return (*[16]int16)(unsafe.Pointer(&s[0]))
}

// paInt32x8 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paInt32x8(s []int32) *[8]int32 {
	return (*[8]int32)(unsafe.Pointer(&s[0]))
}

// paInt64x4 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paInt64x4(s []int64) *[4]int64 {
	return (*[4]int64)(unsafe.Pointer(&s[0]))
}

// paUint8x32 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paUint8x32(s []uint8) *[32]uint8 {
	return (*[32]uint8)(unsafe.Pointer(&s[0]))
}

// paUint16x16 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paUint16x16(s []uint16) *[16]uint16 {
	return (*[16]uint16)(unsafe.Pointer(&s[0]))
}

// paUint32x8 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paUint32x8(s []uint32) *[8]uint32 {
	return (*[8]uint32)(unsafe.Pointer(&s[0]))
}

// paUint64x4 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paUint64x4(s []uint64) *[4]uint64 {
	return (*[4]uint64)(unsafe.Pointer(&s[0]))
}

// paFloat32x8 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paFloat32x8(s []float32) *[8]float32 {
	return (*[8]float32)(unsafe.Pointer(&s[0]))
}

// paFloat64x4 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paFloat64x4(s []float64) *[4]float64 {
	return (*[4]float64)(unsafe.Pointer(&s[0]))
}

// paInt8x64 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paInt8x64(s []int8) *[64]int8 {
	return (*[64]int8)(unsafe.Pointer(&s[0]))
}

// paInt16x32 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paInt16x32(s []int16) *[32]int16 {
	return (*[32]int16)(unsafe.Pointer(&s[0]))
}

// paInt32x16 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paInt32x16(s []int32) *[16]int32 {
	return (*[16]int32)(unsafe.Pointer(&s[0]))
}

// paInt64x8 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paInt64x8(s []int64) *[8]int64 {
	return (*[8]int64)(unsafe.Pointer(&s[0]))
}

// paUint8x64 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paUint8x64(s []uint8) *[64]uint8 {
	return (*[64]uint8)(unsafe.Pointer(&s[0]))
}

// paUint16x32 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paUint16x32(s []uint16) *[32]uint16 {
	return (*[32]uint16)(unsafe.Pointer(&s[0]))
}

// paUint32x16 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paUint32x16(s []uint32) *[16]uint32 {
	return (*[16]uint32)(unsafe.Pointer(&s[0]))
}

// paUint64x8 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paUint64x8(s []uint64) *[8]uint64 {
	return (*[8]uint64)(unsafe.Pointer(&s[0]))
}

// paFloat32x16 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paFloat32x16(s []float32) *[16]float32 {
	return (*[16]float32)(unsafe.Pointer(&s[0]))
}

// paFloat64x8 returns a type-unsafe pointer to array that can
// only be used with partial load/store operations that only
// access the known-safe portions of the array.
func paFloat64x8(s []float64) *[8]float64 {
	return (*[8]float64)(unsafe.Pointer(&s[0]))
}
