1 /*===---- velintrin.h - VEL intrinsics for VE ------------------------------=== 2 * 3 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 * See https://llvm.org/LICENSE.txt for license information. 5 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 * 7 *===-----------------------------------------------------------------------=== 8 */ 9 #ifndef __VEL_INTRIN_H__ 10 #define __VEL_INTRIN_H__ 11 12 // Vector registers 13 typedef double __vr __attribute__((__vector_size__(2048))); 14 15 // Vector mask registers 16 #if __STDC_VERSION__ >= 199901L 17 // For C99 18 typedef _Bool __vm __attribute__((ext_vector_type(256))); 19 typedef _Bool __vm256 __attribute__((ext_vector_type(256))); 20 typedef _Bool __vm512 __attribute__((ext_vector_type(512))); 21 #else 22 #ifdef __cplusplus 23 // For C++ 24 typedef bool __vm __attribute__((ext_vector_type(256))); 25 typedef bool __vm256 __attribute__((ext_vector_type(256))); 26 typedef bool __vm512 __attribute__((ext_vector_type(512))); 27 #else 28 #error need C++ or C99 to use vector intrinsics for VE 29 #endif 30 #endif 31 32 enum VShuffleCodes { 33 VE_VSHUFFLE_YUYU = 0, 34 VE_VSHUFFLE_YUYL = 1, 35 VE_VSHUFFLE_YUZU = 2, 36 VE_VSHUFFLE_YUZL = 3, 37 VE_VSHUFFLE_YLYU = 4, 38 VE_VSHUFFLE_YLYL = 5, 39 VE_VSHUFFLE_YLZU = 6, 40 VE_VSHUFFLE_YLZL = 7, 41 VE_VSHUFFLE_ZUYU = 8, 42 VE_VSHUFFLE_ZUYL = 9, 43 VE_VSHUFFLE_ZUZU = 10, 44 VE_VSHUFFLE_ZUZL = 11, 45 VE_VSHUFFLE_ZLYU = 12, 46 VE_VSHUFFLE_ZLYL = 13, 47 VE_VSHUFFLE_ZLZU = 14, 48 VE_VSHUFFLE_ZLZL = 15, 49 }; 50 51 // Use generated intrinsic name definitions 52 #include <velintrin_gen.h> 53 54 // Use helper functions 55 #include <velintrin_approx.h> 56 57 // pack 58 59 #define _vel_pack_f32p __builtin_ve_vl_pack_f32p 60 #define _vel_pack_f32a __builtin_ve_vl_pack_f32a 61 62 static inline unsigned long int _vel_pack_i32(unsigned int a, unsigned int b) { 63 return (((unsigned long int)a) << 32) | b; 64 } 65 66 #define _vel_extract_vm512u(vm) __builtin_ve_vl_extract_vm512u(vm) 67 #define _vel_extract_vm512l(vm) __builtin_ve_vl_extract_vm512l(vm) 68 #define _vel_insert_vm512u(vm512, vm) __builtin_ve_vl_insert_vm512u(vm512, vm) 69 #define _vel_insert_vm512l(vm512, vm) __builtin_ve_vl_insert_vm512l(vm512, vm) 70 71 #endif 72