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

//go:build goexperiment.simd

package simd

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]))
}
