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