181ad6265SDimitry Andric /*===---- velintrin.h - VEL intrinsics for VE ------------------------------===
281ad6265SDimitry Andric *
381ad6265SDimitry Andric * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
481ad6265SDimitry Andric * See https://llvm.org/LICENSE.txt for license information.
581ad6265SDimitry Andric * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
681ad6265SDimitry Andric *
781ad6265SDimitry Andric *===-----------------------------------------------------------------------===
881ad6265SDimitry Andric */
981ad6265SDimitry Andric #ifndef __VEL_INTRIN_H__
1081ad6265SDimitry Andric #define __VEL_INTRIN_H__
1181ad6265SDimitry Andric
1281ad6265SDimitry Andric // Vector registers
1381ad6265SDimitry Andric typedef double __vr __attribute__((__vector_size__(2048)));
1481ad6265SDimitry Andric
1581ad6265SDimitry Andric // Vector mask registers
16*bdd1243dSDimitry Andric #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
1781ad6265SDimitry Andric // For C99
1881ad6265SDimitry Andric typedef _Bool __vm __attribute__((ext_vector_type(256)));
1981ad6265SDimitry Andric typedef _Bool __vm256 __attribute__((ext_vector_type(256)));
2081ad6265SDimitry Andric typedef _Bool __vm512 __attribute__((ext_vector_type(512)));
2181ad6265SDimitry Andric #else
2281ad6265SDimitry Andric #ifdef __cplusplus
2381ad6265SDimitry Andric // For C++
2481ad6265SDimitry Andric typedef bool __vm __attribute__((ext_vector_type(256)));
2581ad6265SDimitry Andric typedef bool __vm256 __attribute__((ext_vector_type(256)));
2681ad6265SDimitry Andric typedef bool __vm512 __attribute__((ext_vector_type(512)));
2781ad6265SDimitry Andric #else
2881ad6265SDimitry Andric #error need C++ or C99 to use vector intrinsics for VE
2981ad6265SDimitry Andric #endif
3081ad6265SDimitry Andric #endif
3181ad6265SDimitry Andric
3281ad6265SDimitry Andric enum VShuffleCodes {
3381ad6265SDimitry Andric VE_VSHUFFLE_YUYU = 0,
3481ad6265SDimitry Andric VE_VSHUFFLE_YUYL = 1,
3581ad6265SDimitry Andric VE_VSHUFFLE_YUZU = 2,
3681ad6265SDimitry Andric VE_VSHUFFLE_YUZL = 3,
3781ad6265SDimitry Andric VE_VSHUFFLE_YLYU = 4,
3881ad6265SDimitry Andric VE_VSHUFFLE_YLYL = 5,
3981ad6265SDimitry Andric VE_VSHUFFLE_YLZU = 6,
4081ad6265SDimitry Andric VE_VSHUFFLE_YLZL = 7,
4181ad6265SDimitry Andric VE_VSHUFFLE_ZUYU = 8,
4281ad6265SDimitry Andric VE_VSHUFFLE_ZUYL = 9,
4381ad6265SDimitry Andric VE_VSHUFFLE_ZUZU = 10,
4481ad6265SDimitry Andric VE_VSHUFFLE_ZUZL = 11,
4581ad6265SDimitry Andric VE_VSHUFFLE_ZLYU = 12,
4681ad6265SDimitry Andric VE_VSHUFFLE_ZLYL = 13,
4781ad6265SDimitry Andric VE_VSHUFFLE_ZLZU = 14,
4881ad6265SDimitry Andric VE_VSHUFFLE_ZLZL = 15,
4981ad6265SDimitry Andric };
5081ad6265SDimitry Andric
5181ad6265SDimitry Andric // Use generated intrinsic name definitions
5281ad6265SDimitry Andric #include <velintrin_gen.h>
5381ad6265SDimitry Andric
5481ad6265SDimitry Andric // Use helper functions
5581ad6265SDimitry Andric #include <velintrin_approx.h>
5681ad6265SDimitry Andric
5781ad6265SDimitry Andric // pack
5881ad6265SDimitry Andric
5981ad6265SDimitry Andric #define _vel_pack_f32p __builtin_ve_vl_pack_f32p
6081ad6265SDimitry Andric #define _vel_pack_f32a __builtin_ve_vl_pack_f32a
6181ad6265SDimitry Andric
_vel_pack_i32(unsigned int a,unsigned int b)6281ad6265SDimitry Andric static inline unsigned long int _vel_pack_i32(unsigned int a, unsigned int b) {
6381ad6265SDimitry Andric return (((unsigned long int)a) << 32) | b;
6481ad6265SDimitry Andric }
6581ad6265SDimitry Andric
6681ad6265SDimitry Andric #define _vel_extract_vm512u(vm) __builtin_ve_vl_extract_vm512u(vm)
6781ad6265SDimitry Andric #define _vel_extract_vm512l(vm) __builtin_ve_vl_extract_vm512l(vm)
6881ad6265SDimitry Andric #define _vel_insert_vm512u(vm512, vm) __builtin_ve_vl_insert_vm512u(vm512, vm)
6981ad6265SDimitry Andric #define _vel_insert_vm512l(vm512, vm) __builtin_ve_vl_insert_vm512l(vm512, vm)
7081ad6265SDimitry Andric
7181ad6265SDimitry Andric #endif
72