1 #ifndef NPY_SIMD 2 #error "Not a standalone header" 3 #endif 4 5 #ifndef _NPY_SIMD_VSX_MISC_H 6 #define _NPY_SIMD_VSX_MISC_H 7 8 // vector with zero lanes 9 #define npyv_zero_u8() ((npyv_u8) npyv_setall_s32(0)) 10 #define npyv_zero_s8() ((npyv_s8) npyv_setall_s32(0)) 11 #define npyv_zero_u16() ((npyv_u16) npyv_setall_s32(0)) 12 #define npyv_zero_s16() ((npyv_s16) npyv_setall_s32(0)) 13 #define npyv_zero_u32() npyv_setall_u32(0) 14 #define npyv_zero_s32() npyv_setall_s32(0) 15 #define npyv_zero_u64() ((npyv_u64) npyv_setall_s32(0)) 16 #define npyv_zero_s64() ((npyv_s64) npyv_setall_s32(0)) 17 #define npyv_zero_f32() npyv_setall_f32(0.0f) 18 #define npyv_zero_f64() npyv_setall_f64(0.0) 19 20 // vector with a specific value set to all lanes 21 // the safest way to generate vsplti* and vsplt* instructions 22 #define NPYV_IMPL_VSX_SPLTB(T_VEC, V) ((T_VEC){V, V, V, V, V, V, V, V, V, V, V, V, V, V, V, V}) 23 #define NPYV_IMPL_VSX_SPLTH(T_VEC, V) ((T_VEC){V, V, V, V, V, V, V, V}) 24 #define NPYV_IMPL_VSX_SPLTW(T_VEC, V) ((T_VEC){V, V, V, V}) 25 #define NPYV_IMPL_VSX_SPLTD(T_VEC, V) ((T_VEC){V, V}) 26 27 #define npyv_setall_u8(VAL) NPYV_IMPL_VSX_SPLTB(npyv_u8, (unsigned char)VAL) 28 #define npyv_setall_s8(VAL) NPYV_IMPL_VSX_SPLTB(npyv_s8, (signed char)VAL) 29 #define npyv_setall_u16(VAL) NPYV_IMPL_VSX_SPLTH(npyv_u16, (unsigned short)VAL) 30 #define npyv_setall_s16(VAL) NPYV_IMPL_VSX_SPLTH(npyv_s16, (short)VAL) 31 #define npyv_setall_u32(VAL) NPYV_IMPL_VSX_SPLTW(npyv_u32, (unsigned int)VAL) 32 #define npyv_setall_s32(VAL) NPYV_IMPL_VSX_SPLTW(npyv_s32, (int)VAL) 33 #define npyv_setall_f32(VAL) NPYV_IMPL_VSX_SPLTW(npyv_f32, VAL) 34 #define npyv_setall_u64(VAL) NPYV_IMPL_VSX_SPLTD(npyv_u64, (npy_uint64)VAL) 35 #define npyv_setall_s64(VAL) NPYV_IMPL_VSX_SPLTD(npyv_s64, (npy_int64)VAL) 36 #define npyv_setall_f64(VAL) NPYV_IMPL_VSX_SPLTD(npyv_f64, VAL) 37 38 // vector with specific values set to each lane and 39 // set a specific value to all remained lanes 40 #define npyv_setf_u8(FILL, ...) ((npyv_u8){NPYV__SET_FILL_16(char, FILL, __VA_ARGS__)}) 41 #define npyv_setf_s8(FILL, ...) ((npyv_s8){NPYV__SET_FILL_16(char, FILL, __VA_ARGS__)}) 42 #define npyv_setf_u16(FILL, ...) ((npyv_u16){NPYV__SET_FILL_8(short, FILL, __VA_ARGS__)}) 43 #define npyv_setf_s16(FILL, ...) ((npyv_s16){NPYV__SET_FILL_8(short, FILL, __VA_ARGS__)}) 44 #define npyv_setf_u32(FILL, ...) ((npyv_u32){NPYV__SET_FILL_4(int, FILL, __VA_ARGS__)}) 45 #define npyv_setf_s32(FILL, ...) ((npyv_s32){NPYV__SET_FILL_4(int, FILL, __VA_ARGS__)}) 46 #define npyv_setf_u64(FILL, ...) ((npyv_u64){NPYV__SET_FILL_2(npy_int64, FILL, __VA_ARGS__)}) 47 #define npyv_setf_s64(FILL, ...) ((npyv_s64){NPYV__SET_FILL_2(npy_int64, FILL, __VA_ARGS__)}) 48 #define npyv_setf_f32(FILL, ...) ((npyv_f32){NPYV__SET_FILL_4(float, FILL, __VA_ARGS__)}) 49 #define npyv_setf_f64(FILL, ...) ((npyv_f64){NPYV__SET_FILL_2(double, FILL, __VA_ARGS__)}) 50 51 // vector with specific values set to each lane and 52 // set zero to all remained lanes 53 #define npyv_set_u8(...) npyv_setf_u8(0, __VA_ARGS__) 54 #define npyv_set_s8(...) npyv_setf_s8(0, __VA_ARGS__) 55 #define npyv_set_u16(...) npyv_setf_u16(0, __VA_ARGS__) 56 #define npyv_set_s16(...) npyv_setf_s16(0, __VA_ARGS__) 57 #define npyv_set_u32(...) npyv_setf_u32(0, __VA_ARGS__) 58 #define npyv_set_s32(...) npyv_setf_s32(0, __VA_ARGS__) 59 #define npyv_set_u64(...) npyv_setf_u64(0, __VA_ARGS__) 60 #define npyv_set_s64(...) npyv_setf_s64(0, __VA_ARGS__) 61 #define npyv_set_f32(...) npyv_setf_f32(0, __VA_ARGS__) 62 #define npyv_set_f64(...) npyv_setf_f64(0, __VA_ARGS__) 63 64 // Per lane select 65 #define npyv_select_u8(MASK, A, B) vec_sel(B, A, MASK) 66 #define npyv_select_s8 npyv_select_u8 67 #define npyv_select_u16 npyv_select_u8 68 #define npyv_select_s16 npyv_select_u8 69 #define npyv_select_u32 npyv_select_u8 70 #define npyv_select_s32 npyv_select_u8 71 #define npyv_select_u64 npyv_select_u8 72 #define npyv_select_s64 npyv_select_u8 73 #define npyv_select_f32 npyv_select_u8 74 #define npyv_select_f64 npyv_select_u8 75 76 // Reinterpret 77 #define npyv_reinterpret_u8_u8(X) X 78 #define npyv_reinterpret_u8_s8(X) ((npyv_u8)X) 79 #define npyv_reinterpret_u8_u16 npyv_reinterpret_u8_s8 80 #define npyv_reinterpret_u8_s16 npyv_reinterpret_u8_s8 81 #define npyv_reinterpret_u8_u32 npyv_reinterpret_u8_s8 82 #define npyv_reinterpret_u8_s32 npyv_reinterpret_u8_s8 83 #define npyv_reinterpret_u8_u64 npyv_reinterpret_u8_s8 84 #define npyv_reinterpret_u8_s64 npyv_reinterpret_u8_s8 85 #define npyv_reinterpret_u8_f32 npyv_reinterpret_u8_s8 86 #define npyv_reinterpret_u8_f64 npyv_reinterpret_u8_s8 87 88 #define npyv_reinterpret_s8_s8(X) X 89 #define npyv_reinterpret_s8_u8(X) ((npyv_s8)X) 90 #define npyv_reinterpret_s8_u16 npyv_reinterpret_s8_u8 91 #define npyv_reinterpret_s8_s16 npyv_reinterpret_s8_u8 92 #define npyv_reinterpret_s8_u32 npyv_reinterpret_s8_u8 93 #define npyv_reinterpret_s8_s32 npyv_reinterpret_s8_u8 94 #define npyv_reinterpret_s8_u64 npyv_reinterpret_s8_u8 95 #define npyv_reinterpret_s8_s64 npyv_reinterpret_s8_u8 96 #define npyv_reinterpret_s8_f32 npyv_reinterpret_s8_u8 97 #define npyv_reinterpret_s8_f64 npyv_reinterpret_s8_u8 98 99 #define npyv_reinterpret_u16_u16(X) X 100 #define npyv_reinterpret_u16_u8(X) ((npyv_u16)X) 101 #define npyv_reinterpret_u16_s8 npyv_reinterpret_u16_u8 102 #define npyv_reinterpret_u16_s16 npyv_reinterpret_u16_u8 103 #define npyv_reinterpret_u16_u32 npyv_reinterpret_u16_u8 104 #define npyv_reinterpret_u16_s32 npyv_reinterpret_u16_u8 105 #define npyv_reinterpret_u16_u64 npyv_reinterpret_u16_u8 106 #define npyv_reinterpret_u16_s64 npyv_reinterpret_u16_u8 107 #define npyv_reinterpret_u16_f32 npyv_reinterpret_u16_u8 108 #define npyv_reinterpret_u16_f64 npyv_reinterpret_u16_u8 109 110 #define npyv_reinterpret_s16_s16(X) X 111 #define npyv_reinterpret_s16_u8(X) ((npyv_s16)X) 112 #define npyv_reinterpret_s16_s8 npyv_reinterpret_s16_u8 113 #define npyv_reinterpret_s16_u16 npyv_reinterpret_s16_u8 114 #define npyv_reinterpret_s16_u32 npyv_reinterpret_s16_u8 115 #define npyv_reinterpret_s16_s32 npyv_reinterpret_s16_u8 116 #define npyv_reinterpret_s16_u64 npyv_reinterpret_s16_u8 117 #define npyv_reinterpret_s16_s64 npyv_reinterpret_s16_u8 118 #define npyv_reinterpret_s16_f32 npyv_reinterpret_s16_u8 119 #define npyv_reinterpret_s16_f64 npyv_reinterpret_s16_u8 120 121 #define npyv_reinterpret_u32_u32(X) X 122 #define npyv_reinterpret_u32_u8(X) ((npyv_u32)X) 123 #define npyv_reinterpret_u32_s8 npyv_reinterpret_u32_u8 124 #define npyv_reinterpret_u32_u16 npyv_reinterpret_u32_u8 125 #define npyv_reinterpret_u32_s16 npyv_reinterpret_u32_u8 126 #define npyv_reinterpret_u32_s32 npyv_reinterpret_u32_u8 127 #define npyv_reinterpret_u32_u64 npyv_reinterpret_u32_u8 128 #define npyv_reinterpret_u32_s64 npyv_reinterpret_u32_u8 129 #define npyv_reinterpret_u32_f32 npyv_reinterpret_u32_u8 130 #define npyv_reinterpret_u32_f64 npyv_reinterpret_u32_u8 131 132 #define npyv_reinterpret_s32_s32(X) X 133 #define npyv_reinterpret_s32_u8(X) ((npyv_s32)X) 134 #define npyv_reinterpret_s32_s8 npyv_reinterpret_s32_u8 135 #define npyv_reinterpret_s32_u16 npyv_reinterpret_s32_u8 136 #define npyv_reinterpret_s32_s16 npyv_reinterpret_s32_u8 137 #define npyv_reinterpret_s32_u32 npyv_reinterpret_s32_u8 138 #define npyv_reinterpret_s32_u64 npyv_reinterpret_s32_u8 139 #define npyv_reinterpret_s32_s64 npyv_reinterpret_s32_u8 140 #define npyv_reinterpret_s32_f32 npyv_reinterpret_s32_u8 141 #define npyv_reinterpret_s32_f64 npyv_reinterpret_s32_u8 142 143 #define npyv_reinterpret_u64_u64(X) X 144 #define npyv_reinterpret_u64_u8(X) ((npyv_u64)X) 145 #define npyv_reinterpret_u64_s8 npyv_reinterpret_u64_u8 146 #define npyv_reinterpret_u64_u16 npyv_reinterpret_u64_u8 147 #define npyv_reinterpret_u64_s16 npyv_reinterpret_u64_u8 148 #define npyv_reinterpret_u64_u32 npyv_reinterpret_u64_u8 149 #define npyv_reinterpret_u64_s32 npyv_reinterpret_u64_u8 150 #define npyv_reinterpret_u64_s64 npyv_reinterpret_u64_u8 151 #define npyv_reinterpret_u64_f32 npyv_reinterpret_u64_u8 152 #define npyv_reinterpret_u64_f64 npyv_reinterpret_u64_u8 153 154 #define npyv_reinterpret_s64_s64(X) X 155 #define npyv_reinterpret_s64_u8(X) ((npyv_s64)X) 156 #define npyv_reinterpret_s64_s8 npyv_reinterpret_s64_u8 157 #define npyv_reinterpret_s64_u16 npyv_reinterpret_s64_u8 158 #define npyv_reinterpret_s64_s16 npyv_reinterpret_s64_u8 159 #define npyv_reinterpret_s64_u32 npyv_reinterpret_s64_u8 160 #define npyv_reinterpret_s64_s32 npyv_reinterpret_s64_u8 161 #define npyv_reinterpret_s64_u64 npyv_reinterpret_s64_u8 162 #define npyv_reinterpret_s64_f32 npyv_reinterpret_s64_u8 163 #define npyv_reinterpret_s64_f64 npyv_reinterpret_s64_u8 164 165 #define npyv_reinterpret_f32_f32(X) X 166 #define npyv_reinterpret_f32_u8(X) ((npyv_f32)X) 167 #define npyv_reinterpret_f32_s8 npyv_reinterpret_f32_u8 168 #define npyv_reinterpret_f32_u16 npyv_reinterpret_f32_u8 169 #define npyv_reinterpret_f32_s16 npyv_reinterpret_f32_u8 170 #define npyv_reinterpret_f32_u32 npyv_reinterpret_f32_u8 171 #define npyv_reinterpret_f32_s32 npyv_reinterpret_f32_u8 172 #define npyv_reinterpret_f32_u64 npyv_reinterpret_f32_u8 173 #define npyv_reinterpret_f32_s64 npyv_reinterpret_f32_u8 174 #define npyv_reinterpret_f32_f64 npyv_reinterpret_f32_u8 175 176 #define npyv_reinterpret_f64_f64(X) X 177 #define npyv_reinterpret_f64_u8(X) ((npyv_f64)X) 178 #define npyv_reinterpret_f64_s8 npyv_reinterpret_f64_u8 179 #define npyv_reinterpret_f64_u16 npyv_reinterpret_f64_u8 180 #define npyv_reinterpret_f64_s16 npyv_reinterpret_f64_u8 181 #define npyv_reinterpret_f64_u32 npyv_reinterpret_f64_u8 182 #define npyv_reinterpret_f64_s32 npyv_reinterpret_f64_u8 183 #define npyv_reinterpret_f64_u64 npyv_reinterpret_f64_u8 184 #define npyv_reinterpret_f64_s64 npyv_reinterpret_f64_u8 185 #define npyv_reinterpret_f64_f32 npyv_reinterpret_f64_u8 186 187 // Only required by AVX2/AVX512 188 #define npyv_cleanup() ((void)0) 189 190 #endif // _NPY_SIMD_VSX_MISC_H 191