[Support] Remove unused includes (NFC) (#116752)
[llvm-project.git] / flang / module / __ppc_intrinsics.f90
blobb3ff33b0619ffa9b7e57747d950750b0624f6b3f
1 !===-- module/__ppc_intrinsics.f90 -----------------------------------------===!
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
7 !===------------------------------------------------------------------------===!
9 module __ppc_intrinsics
11 private
13 ! fmadd, fmsub, fnmadd, fnmsub
14 abstract interface
15 elemental real(4) function func_r4r4r4r4(a, x, y)
16 real(4), intent(in) :: a, x, y
17 end function func_r4r4r4r4
18 elemental real(8) function func_r8r8r8r8(a, x, y)
19 real(8), intent(in) :: a, x, y
20 end function func_r8r8r8r8
22 !--------------------
23 ! Vector intrinsic
24 !--------------------
25 !! ================ 1 argument function interface ================
26 ! vector(i) function f(vector(i))
27 #define ELEM_FUNC_VIVI(VKIND) \
28 elemental vector(integer(VKIND)) function elem_func_vi##VKIND##vi##VKIND(arg1); \
29 vector(integer(VKIND)), intent(in) :: arg1; \
30 end function ;
32 ! vector(u) function f(vector(u))
33 #define ELEM_FUNC_VUVU(VKIND) \
34 elemental vector(unsigned(VKIND)) function elem_func_vu##VKIND##vu##VKIND(arg1); \
35 vector(unsigned(VKIND)), intent(in) :: arg1; \
36 end function ;
38 ! vector(r) function f(vector(r))
39 #define ELEM_FUNC_VRVR_2(VKIND1, VKIND2) \
40 elemental vector(real(VKIND1)) function elem_func_vr##VKIND1##vr##VKIND2(arg1); \
41 vector(real(VKIND2)), intent(in) :: arg1; \
42 end function ;
43 #define ELEM_FUNC_VRVR(VKIND) ELEM_FUNC_VRVR_2(VKIND, VKIND)
45 ! vector(i) function f(i)
46 #define ELEM_FUNC_VII_2(RKIND, VKIND) \
47 elemental vector(integer(RKIND)) function elem_func_vi##RKIND##i##VKIND(arg1); \
48 integer(VKIND), intent(in) :: arg1; \
49 end function ;
50 #define ELEM_FUNC_VII(VKIND) ELEM_FUNC_VII_2(VKIND, VKIND)
52 ! vector(r) function f(r)
53 #define ELEM_FUNC_VRR(VKIND) \
54 elemental vector(real(VKIND)) function elem_func_vr##VKIND##r##VKIND(arg1); \
55 real(VKIND), intent(in) :: arg1; \
56 end function ;
58 ELEM_FUNC_VIVI(1) ELEM_FUNC_VIVI(2) ELEM_FUNC_VIVI(4) ELEM_FUNC_VIVI(8)
59 ELEM_FUNC_VUVU(1)
60 ELEM_FUNC_VRVR_2(4,8) ELEM_FUNC_VRVR_2(8,4)
61 ELEM_FUNC_VRVR(4) ELEM_FUNC_VRVR(8)
62 ELEM_FUNC_VII_2(4,1) ELEM_FUNC_VII_2(4,2) ELEM_FUNC_VII_2(4,8)
63 ELEM_FUNC_VII(1) ELEM_FUNC_VII(2) ELEM_FUNC_VII(4) ELEM_FUNC_VII(8)
64 ELEM_FUNC_VRR(4) ELEM_FUNC_VRR(8)
66 #undef ELEM_FUNC_VRR
67 #undef ELEM_FUNC_VII
68 #undef ELEM_FUNC_VII_2
69 #undef ELEM_FUNC_VRVR
70 #undef ELEM_FUNC_VRVR_2
71 #undef ELEM_FUNC_VUVU
72 #undef ELEM_FUNC_VIVI
74 !! ================ 2 arguments function interface ================
75 ! vector(i) function f(vector(i), vector(i))
76 #define ELEM_FUNC_VIVIVI(VKIND) \
77 elemental vector(integer(VKIND)) function elem_func_vi##VKIND##vi##VKIND##vi##VKIND(arg1, arg2); \
78 vector(integer(VKIND)), intent(in) :: arg1, arg2; \
79 end function ;
81 ! vector(u) function f(vector(i), vector(i))
82 #define ELEM_FUNC_VUVIVI(VKIND) \
83 elemental vector(unsigned(VKIND)) function elem_func_vu##VKIND##vi##VKIND##vi##VKIND(arg1, arg2); \
84 vector(integer(VKIND)), intent(in) :: arg1, arg2; \
85 end function ;
87 ! vector(i) function f(vector(i), vector(u))
88 #define ELEM_FUNC_VIVIVU_2(VKIND1, VKIND2) \
89 elemental vector(integer(VKIND1)) function elem_func_vi##VKIND1##vi##VKIND1##vu##VKIND2(arg1, arg2); \
90 vector(integer(VKIND1)), intent(in) :: arg1; \
91 vector(unsigned(VKIND2)), intent(in) :: arg2; \
92 end function ;
93 #define ELEM_FUNC_VIVIVU(VKIND) ELEM_FUNC_VIVIVU_2(VKIND, VKIND)
95 ! vector(u) function f(vector(u), vector(u))
96 #define ELEM_FUNC_VUVUVU_2(VKIND1, VKIND2) \
97 elemental vector(unsigned(VKIND1)) function elem_func_vu##VKIND1##vu##VKIND1##vu##VKIND2(arg1, arg2); \
98 vector(unsigned(VKIND1)), intent(in) :: arg1; \
99 vector(unsigned(VKIND2)), intent(in) :: arg2; \
100 end function ;
101 #define ELEM_FUNC_VUVUVU(VKIND) ELEM_FUNC_VUVUVU_2(VKIND, VKIND)
103 ! vector(r) function f(vector(r), vector(r))
104 #define ELEM_FUNC_VRVRVR(VKIND) \
105 elemental vector(real(VKIND)) function elem_func_vr##VKIND##vr##VKIND##vr##VKIND(arg1, arg2); \
106 vector(real(VKIND)), intent(in) :: arg1, arg2; \
107 end function ;
109 ! vector(r) function f(vector(r), vector(u))
110 #define ELEM_FUNC_VRVRVU_2(VKIND1, VKIND2) \
111 elemental vector(real(VKIND1)) function elem_func_vr##VKIND1##vr##VKIND1##vu##VKIND2(arg1, arg2); \
112 vector(real(VKIND1)), intent(in) :: arg1; \
113 vector(unsigned(VKIND2)), intent(in) :: arg2; \
114 end function ;
116 ! vector(u) function f(vector(r), vector(r))
117 #define ELEM_FUNC_VUVRVR(VKIND) \
118 elemental vector(unsigned(VKIND)) function elem_func_vu##VKIND##vr##VKIND##vr##VKIND(arg1, arg2); \
119 vector(real(VKIND)), intent(in) :: arg1, arg2; \
120 end function ;
122 ! integer function f(vector(i), vector(i))
123 #define ELEM_FUNC_IVIVI(RKIND, VKIND) \
124 elemental integer(RKIND) function elem_func_i##RKIND##vi##VKIND##vi##VKIND(arg1, arg2); \
125 vector(integer(VKIND)), intent(in) :: arg1, arg2; \
126 end function ;
128 ! integer function f(vector(u), vector(u))
129 #define ELEM_FUNC_IVUVU(RKIND, VKIND) \
130 elemental integer(RKIND) function elem_func_i##RKIND##vu##VKIND##vu##VKIND(arg1, arg2); \
131 vector(unsigned(VKIND)), intent(in) :: arg1, arg2; \
132 end function ;
134 ! integer function f(vector(r), vector(r))
135 #define ELEM_FUNC_IVRVR(RKIND, VKIND) \
136 elemental integer(RKIND) function elem_func_i##RKIND##vr##VKIND##vr##VKIND(arg1, arg2); \
137 vector(real(VKIND)), intent(in) :: arg1, arg2; \
138 end function ;
140 ! vector(r) function f(vector(i), i)
141 #define ELEM_FUNC_VRVII(VKIND) \
142 elemental vector(real(VKIND)) function elem_func_vr##VKIND##vi##VKIND##i(arg1, arg2); \
143 vector(integer(VKIND)), intent(in) :: arg1; \
144 integer(8), intent(in) :: arg2; \
145 !dir$ ignore_tkr(k) arg2; \
146 end function ;
148 ! integer function f(vector(i), i)
149 #define ELEM_FUNC_IVII(VKIND) \
150 elemental integer(VKIND) function elem_func_i##VKIND##vi##VKIND##i(arg1, arg2); \
151 vector(integer(VKIND)), intent(in) :: arg1; \
152 integer(8), intent(in) :: arg2; \
153 !dir$ ignore_tkr(k) arg2; \
154 end function ;
156 ! vector(r) function f(vector(u), i)
157 #define ELEM_FUNC_VRVUI(VKIND) \
158 elemental vector(real(VKIND)) function elem_func_vr##VKIND##vu##VKIND##i(arg1, arg2); \
159 vector(unsigned(VKIND)), intent(in) :: arg1; \
160 integer(8), intent(in) :: arg2; \
161 !dir$ ignore_tkr(k) arg2; \
162 end function ;
164 ! real function f(vector(r), i)
165 #define ELEM_FUNC_RVRI(VKIND) \
166 elemental real(VKIND) function elem_func_r##VKIND##vr##VKIND##i(arg1, arg2); \
167 vector(real(VKIND)), intent(in) :: arg1; \
168 integer(8), intent(in) :: arg2; \
169 !dir$ ignore_tkr(k) arg2; \
170 end function ;
172 ! vector(i) function f(vector(i), i)
173 #define ELEM_FUNC_VIVII0(VKIND) \
174 elemental vector(integer(VKIND)) function elem_func_vi##VKIND##vi##VKIND##i0(arg1, arg2); \
175 vector(integer(VKIND)), intent(in) :: arg1; \
176 integer(8), intent(in) :: arg2; \
177 !dir$ ignore_tkr(k) arg2; \
178 end function ;
180 ! vector(u) function f(vector(u), i)
181 #define ELEM_FUNC_VUVUI0(VKIND) \
182 elemental vector(unsigned(VKIND)) function elem_func_vu##VKIND##vu##VKIND##i0(arg1, arg2); \
183 vector(unsigned(VKIND)), intent(in) :: arg1; \
184 integer(8), intent(in) :: arg2; \
185 !dir$ ignore_tkr(k) arg2; \
186 end function ;
188 ! vector(r) function f(vector(r), i)
189 #define ELEM_FUNC_VRVRI0(VKIND) \
190 elemental vector(real(VKIND)) function elem_func_vr##VKIND##vr##VKIND##i0(arg1, arg2); \
191 vector(real(VKIND)), intent(in) :: arg1; \
192 integer(8), intent(in) :: arg2; \
193 !dir$ ignore_tkr(k) arg2; \
194 end function ;
196 ! vector(i) function f(i, integer)
197 #define FUNC_VII0I(VKIND) \
198 pure vector(integer(VKIND)) function func_vi##VKIND##i0i##VKIND(arg1, arg2); \
199 integer(8), intent(in) :: arg1; \
200 !dir$ ignore_tkr(k) arg1; \
201 integer(VKIND), intent(in) :: arg2; \
202 !dir$ ignore_tkr(r) arg2; \
203 end function ;
205 ! vector(r) function f(i, real)
206 #define FUNC_VRI0R(VKIND) \
207 pure vector(real(VKIND)) function func_vr##VKIND##i0r##VKIND(arg1, arg2); \
208 integer(8), intent(in) :: arg1; \
209 !dir$ ignore_tkr(k) arg1; \
210 real(VKIND), intent(in) :: arg2; \
211 !dir$ ignore_tkr(r) arg2; \
212 end function ;
214 ! vector(i) function f(i, vector(i))
215 #define FUNC_VII0VI(VKIND) \
216 pure vector(integer(VKIND)) function func_vi##VKIND##i0vi##VKIND(arg1, arg2); \
217 integer(8), intent(in) :: arg1; \
218 !dir$ ignore_tkr(k) arg1; \
219 vector(integer(VKIND)), intent(in) :: arg2; \
220 !dir$ ignore_tkr(r) arg2; \
221 end function ;
223 ! vector(u) function f(i, vector(u))
224 #define FUNC_VUI0VU(VKIND) \
225 pure vector(unsigned(VKIND)) function func_vu##VKIND##i0vu##VKIND(arg1, arg2); \
226 integer(8), intent(in) :: arg1; \
227 !dir$ ignore_tkr(k) arg1; \
228 vector(unsigned(VKIND)), intent(in) :: arg2; \
229 !dir$ ignore_tkr(r) arg2; \
230 end function ;
232 ! vector(r) function f(i, vector(r))
233 #define FUNC_VRI0VR(VKIND) \
234 pure vector(real(VKIND)) function func_vr##VKIND##i0vr##VKIND(arg1, arg2); \
235 integer(8), intent(in) :: arg1; \
236 !dir$ ignore_tkr(k) arg1; \
237 vector(real(VKIND)), intent(in) :: arg2; \
238 !dir$ ignore_tkr(r) arg2; \
239 end function ;
241 ! vector(u(1)) function f(i, i)
242 #define FUNC_VU1I0I(KIND) \
243 vector(unsigned(1)) function func_vu1i0i##KIND(arg1, arg2); \
244 integer(8), intent(in) :: arg1; \
245 !dir$ ignore_tkr(k) arg1; \
246 integer(KIND), intent(in) :: arg2; \
247 !dir$ ignore_tkr(r) arg2; \
248 end function ;
250 ! vector(u(1)) function f(i, r)
251 #define FUNC_VU1I0R(KIND) \
252 vector(unsigned(1)) function func_vu1i0r##KIND(arg1, arg2); \
253 integer(8), intent(in) :: arg1; \
254 !dir$ ignore_tkr(k) arg1; \
255 real(KIND), intent(in) :: arg2; \
256 !dir$ ignore_tkr(r) arg2; \
257 end function ;
259 ! __vector_pair function f(i, vector(i))
260 #define FUNC_VPI0VI(VKIND) \
261 pure __vector_pair function func_vpi0vi##VKIND(arg1, arg2); \
262 integer(8), intent(in) :: arg1; \
263 !dir$ ignore_tkr(k) arg1; \
264 vector(integer(VKIND)), intent(in) :: arg2; \
265 !dir$ ignore_tkr(r) arg2; \
266 end function;
268 ! __vector_pair function f(i, vector(u))
269 #define FUNC_VPI0VU(VKIND) \
270 pure __vector_pair function func_vpi0vu##VKIND(arg1, arg2); \
271 integer(8), intent(in) :: arg1; \
272 !dir$ ignore_tkr(k) arg1; \
273 vector(unsigned(VKIND)), intent(in) :: arg2; \
274 !dir$ ignore_tkr(r) arg2; \
275 end function;
277 ! __vector_pair function f(i, vector(r))
278 #define FUNC_VPI0VR(VKIND) \
279 pure __vector_pair function func_vpi0vr##VKIND(arg1, arg2); \
280 integer(8), intent(in) :: arg1; \
281 !dir$ ignore_tkr(k) arg1; \
282 vector(real(VKIND)), intent(in) :: arg2; \
283 !dir$ ignore_tkr(r) arg2; \
284 end function;
286 ! __vector_pair function f(i, __vector_pair)
287 #define FUNC_VPI0VP \
288 pure __vector_pair function func_vpi0vp(arg1, arg2); \
289 integer(8), intent(in) :: arg1; \
290 !dir$ ignore_tkr(k) arg1; \
291 __vector_pair, intent(in) :: arg2; \
292 !dir$ ignore_tkr(r) arg2; \
293 end function;
295 ! The following macros are specific for the vec_convert(v, mold) intrinsics as
296 ! the argument keywords are different from the other vector intrinsics.
298 ! vector(i) function f(vector(i), vector(i))
299 #define FUNC_VEC_CONVERT_VIVIVI(VKIND) \
300 pure vector(integer(VKIND)) function func_vec_convert_vi##VKIND##vi##vi##VKIND(v, mold); \
301 vector(integer(8)), intent(in) :: v; \
302 !dir$ ignore_tkr(tk) v; \
303 vector(integer(VKIND)), intent(in) :: mold; \
304 !dir$ ignore_tkr(r) mold; \
305 end function ;
307 ! vector(u) function f(vector(i), vector(u))
308 #define FUNC_VEC_CONVERT_VUVIVU(VKIND) \
309 pure vector(unsigned(VKIND)) function func_vec_convert_vu##VKIND##vi##vu##VKIND(v, mold); \
310 vector(integer(8)), intent(in) :: v; \
311 !dir$ ignore_tkr(tk) v; \
312 vector(unsigned(VKIND)), intent(in) :: mold; \
313 !dir$ ignore_tkr(r) mold; \
314 end function ;
316 ! vector(r) function f(vector(i), vector(r))
317 #define FUNC_VEC_CONVERT_VRVIVR(VKIND) \
318 pure vector(real(VKIND)) function func_vec_convert_vr##VKIND##vi##vr##VKIND(v, mold); \
319 vector(integer(8)), intent(in) :: v; \
320 !dir$ ignore_tkr(tk) v; \
321 vector(real(VKIND)), intent(in) :: mold; \
322 !dir$ ignore_tkr(r) mold; \
323 end function ;
325 FUNC_VEC_CONVERT_VIVIVI(1) FUNC_VEC_CONVERT_VIVIVI(2) FUNC_VEC_CONVERT_VIVIVI(4) FUNC_VEC_CONVERT_VIVIVI(8)
326 FUNC_VEC_CONVERT_VUVIVU(1) FUNC_VEC_CONVERT_VUVIVU(2) FUNC_VEC_CONVERT_VUVIVU(4) FUNC_VEC_CONVERT_VUVIVU(8)
327 FUNC_VEC_CONVERT_VRVIVR(4) FUNC_VEC_CONVERT_VRVIVR(8)
328 ELEM_FUNC_IVII(1) ELEM_FUNC_IVII(2) ELEM_FUNC_IVII(4) ELEM_FUNC_IVII(8)
329 ELEM_FUNC_RVRI(4) ELEM_FUNC_RVRI(8)
330 ELEM_FUNC_VIVIVI(1) ELEM_FUNC_VIVIVI(2) ELEM_FUNC_VIVIVI(4) ELEM_FUNC_VIVIVI(8)
331 ELEM_FUNC_VUVIVI(1) ELEM_FUNC_VUVIVI(2) ELEM_FUNC_VUVIVI(4) ELEM_FUNC_VUVIVI(8)
332 ELEM_FUNC_VUVUVU(1) ELEM_FUNC_VUVUVU(2) ELEM_FUNC_VUVUVU(4) ELEM_FUNC_VUVUVU(8)
333 ELEM_FUNC_VIVIVU(1) ELEM_FUNC_VIVIVU(2) ELEM_FUNC_VIVIVU(4) ELEM_FUNC_VIVIVU(8)
334 ELEM_FUNC_VIVIVU_2(1,2) ELEM_FUNC_VIVIVU_2(1,4)
335 ELEM_FUNC_VIVIVU_2(2,1) ELEM_FUNC_VIVIVU_2(2,4)
336 ELEM_FUNC_VIVIVU_2(4,1) ELEM_FUNC_VIVIVU_2(4,2)
337 ELEM_FUNC_VUVUVU_2(1,2) ELEM_FUNC_VUVUVU_2(1,4)
338 ELEM_FUNC_VUVUVU_2(2,1) ELEM_FUNC_VUVUVU_2(2,4)
339 ELEM_FUNC_VUVUVU_2(4,1) ELEM_FUNC_VUVUVU_2(4,2)
340 ELEM_FUNC_VRVRVU_2(4,1) ELEM_FUNC_VRVRVU_2(4,2)
341 ELEM_FUNC_VRVRVR(4) ELEM_FUNC_VRVRVR(8)
342 ELEM_FUNC_VUVRVR(4) ELEM_FUNC_VUVRVR(8)
343 ELEM_FUNC_IVIVI(4,1) ELEM_FUNC_IVIVI(4,2) ELEM_FUNC_IVIVI(4,4) ELEM_FUNC_IVIVI(4,8)
344 ELEM_FUNC_IVUVU(4,1) ELEM_FUNC_IVUVU(4,2) ELEM_FUNC_IVUVU(4,4) ELEM_FUNC_IVUVU(4,8)
345 ELEM_FUNC_IVRVR(4,4) ELEM_FUNC_IVRVR(4,8)
346 ELEM_FUNC_VRVII(4) ELEM_FUNC_VRVII(8)
347 ELEM_FUNC_VRVUI(4) ELEM_FUNC_VRVUI(8)
348 ELEM_FUNC_VIVII0(1) ELEM_FUNC_VIVII0(2) ELEM_FUNC_VIVII0(4) ELEM_FUNC_VIVII0(8)
349 ELEM_FUNC_VUVUI0(1) ELEM_FUNC_VUVUI0(2) ELEM_FUNC_VUVUI0(4) ELEM_FUNC_VUVUI0(8)
350 ELEM_FUNC_VRVRI0(4) ELEM_FUNC_VRVRI0(8)
351 FUNC_VII0VI(1) FUNC_VII0VI(2) FUNC_VII0VI(4) FUNC_VII0VI(8)
352 FUNC_VUI0VU(1) FUNC_VUI0VU(2) FUNC_VUI0VU(4) FUNC_VUI0VU(8)
353 FUNC_VRI0VR(4) FUNC_VRI0VR(8)
354 FUNC_VII0I(1) FUNC_VII0I(2) FUNC_VII0I(4) FUNC_VII0I(8)
355 FUNC_VRI0R(4) FUNC_VRI0R(8)
356 FUNC_VPI0VI(1) FUNC_VPI0VI(2) FUNC_VPI0VI(4) FUNC_VPI0VI(8)
357 FUNC_VPI0VU(1) FUNC_VPI0VU(2) FUNC_VPI0VU(4) FUNC_VPI0VU(8)
358 FUNC_VPI0VR(4) FUNC_VPI0VR(8)
359 FUNC_VPI0VP
360 FUNC_VU1I0I(1) FUNC_VU1I0I(2) FUNC_VU1I0I(4)
361 FUNC_VU1I0R(4)
363 #undef FUNC_VEC_CONVERT_VRVIVR
364 #undef FUNC_VEC_CONVERT_VUVIVU
365 #undef FUNC_VEC_CONVERT_VIVIVI
366 #undef FUNC_VPI0VP
367 #undef FUNC_VPI0VR
368 #undef FUNC_VPI0VU
369 #undef FUNC_VPI0VI
370 #undef FUNC_VU1I0R
371 #undef FUNC_VU1I0I
372 #undef FUNC_VRI0VR
373 #undef FUNC_VUI0VU
374 #undef FUNC_VII0VI
375 #undef FUNC_VRI0R
376 #undef FUNC_VII0I
377 #undef ELEM_FUNC_VRVRI0
378 #undef ELEM_FUNC_VUVUI0
379 #undef ELEM_FUNC_VIVII0
380 #undef ELEM_FUNC_RVRI
381 #undef ELEM_FUNC_VRVUI
382 #undef ELEM_FUNC_IVII
383 #undef ELEM_FUNC_VRVII
384 #undef ELEM_FUNC_IVRVR
385 #undef ELEM_FUNC_IVUVU
386 #undef ELEM_FUNC_IVIVI
387 #undef ELEM_FUNC_VUVRVR
388 #undef ELEM_FUNC_VRVRVU_2
389 #undef ELEM_FUNC_VRVRVR
390 #undef ELEM_FUNC_VUVUVU
391 #undef ELEM_FUNC_VUVUVU_2
392 #undef ELEM_FUNC_VIVIVU
393 #undef ELEM_FUNC_VIVIVU_2
394 #undef ELEM_FUNC_VUVIVI
395 #undef ELEM_FUNC_VIVIVI
397 !! ================ 3 arguments function interface ================
398 ! vector(r) function f(vector(r), vector(r), vector(r))
399 #define ELEM_FUNC_VRVRVRVR(VKIND) \
400 elemental vector(real(VKIND)) function elem_func_vr##VKIND##vr##VKIND##vr##VKIND##vr##VKIND(arg1, arg2, arg3); \
401 vector(real(VKIND)), intent(in) :: arg1, arg2, arg3; \
402 end function ;
404 ! vector(i) function f(vector(i), vector(i), vector(u))
405 #define ELEM_FUNC_VIVIVIVU_2(VKIND, UKIND) \
406 elemental vector(integer(VKIND)) function elem_func_vi##VKIND##vi##VKIND##vi##VKIND##vu##UKIND(arg1, arg2, arg3); \
407 vector(integer(VKIND)), intent(in) :: arg1, arg2; \
408 vector(unsigned(UKIND)), intent(in) :: arg3; \
409 end function ;
410 #define ELEM_FUNC_VIVIVIVU(VKIND) ELEM_FUNC_VIVIVIVU_2(VKIND, VKIND)
412 ! vector(u) function f(vector(u), vector(u), vector(u))
413 #define ELEM_FUNC_VUVUVUVU_2(VKIND, UKIND) \
414 elemental vector(unsigned(VKIND)) function elem_func_vu##VKIND##vu##VKIND##vu##VKIND##vu##UKIND(arg1, arg2, arg3); \
415 vector(unsigned(VKIND)), intent(in) :: arg1, arg2; \
416 vector(unsigned(UKIND)), intent(in) :: arg3; \
417 end function ;
418 #define ELEM_FUNC_VUVUVUVU(VKIND) ELEM_FUNC_VUVUVUVU_2(VKIND, VKIND)
420 ! vector(r) function f(vector(r), vector(r), vector(u))
421 #define ELEM_FUNC_VRVRVRVU_2(VKIND, UKIND) \
422 elemental vector(real(VKIND)) function elem_func_vr##VKIND##vr##VKIND##vr##VKIND##vu##UKIND(arg1, arg2, arg3); \
423 vector(real(VKIND)), intent(in) :: arg1, arg2; \
424 vector(unsigned(UKIND)), intent(in) :: arg3; \
425 end function ;
426 #define ELEM_FUNC_VRVRVRVU(VKIND) ELEM_FUNC_VRVRVRVU_2(VKIND, VKIND)
428 ! vector(i) function f(vector(i), vector(i), i)
429 #define ELEM_FUNC_VIVIVII(VKIND) \
430 elemental vector(integer(VKIND)) function elem_func_vi##VKIND##vi##VKIND##vi##VKIND##i(arg1, arg2, arg3); \
431 vector(integer(VKIND)), intent(in) :: arg1, arg2; \
432 integer(8), intent(in) :: arg3; \
433 !dir$ ignore_tkr(k) arg3; \
434 end function ;
436 ! vector(u) function f(vector(u), vector(u), i)
437 #define ELEM_FUNC_VUVUVUI(VKIND) \
438 elemental vector(unsigned(VKIND)) function elem_func_vu##VKIND##vu##VKIND##vu##VKIND##i(arg1, arg2, arg3); \
439 vector(unsigned(VKIND)), intent(in) :: arg1, arg2; \
440 integer(8), intent(in) :: arg3; \
441 !dir$ ignore_tkr(k) arg3; \
442 end function ;
444 ! vector(r) function f(vector(r), vector(r), i)
445 #define ELEM_FUNC_VRVRVRI(VKIND) \
446 elemental vector(real(VKIND)) function elem_func_vr##VKIND##vr##VKIND##vr##VKIND##i(arg1, arg2, arg3); \
447 vector(real(VKIND)), intent(in) :: arg1, arg2; \
448 integer(8), intent(in) :: arg3; \
449 !dir$ ignore_tkr(k) arg3; \
450 end function ;
452 ! vector(i) function f(i, vector(i), i)
453 #define ELEM_FUNC_VIIVII(VKIND) \
454 elemental vector(integer(VKIND)) function elem_func_vi##VKIND##i##VKIND##vi##VKIND##i(arg1, arg2, arg3); \
455 integer(VKIND), intent(in) :: arg1; \
456 vector(integer(VKIND)), intent(in) :: arg2; \
457 integer(8), intent(in) :: arg3; \
458 !dir$ ignore_tkr(k) arg3; \
459 end function ;
461 ! vector(r) function f(r, vector(r), i)
462 #define ELEM_FUNC_VRRVRI(VKIND) \
463 elemental vector(real(VKIND)) function elem_func_vr##VKIND##r##VKIND##vr##VKIND##i(arg1, arg2, arg3); \
464 real(VKIND), intent(in) :: arg1; \
465 vector(real(VKIND)), intent(in) :: arg2; \
466 integer(8), intent(in) :: arg3; \
467 !dir$ ignore_tkr(k) arg3; \
468 end function ;
470 ELEM_FUNC_VIVIVIVU(1) ELEM_FUNC_VIVIVIVU(2) ELEM_FUNC_VIVIVIVU(4) ELEM_FUNC_VIVIVIVU(8)
471 ELEM_FUNC_VUVUVUVU(1) ELEM_FUNC_VUVUVUVU(2) ELEM_FUNC_VUVUVUVU(4) ELEM_FUNC_VUVUVUVU(8)
472 ELEM_FUNC_VRVRVRVU(4) ELEM_FUNC_VRVRVRVU(8)
473 ELEM_FUNC_VIVIVIVU_2(2,1) ELEM_FUNC_VIVIVIVU_2(4,1) ELEM_FUNC_VIVIVIVU_2(8,1)
474 ELEM_FUNC_VUVUVUVU_2(2,1) ELEM_FUNC_VUVUVUVU_2(4,1) ELEM_FUNC_VUVUVUVU_2(8,1)
475 ELEM_FUNC_VRVRVRVU_2(4,1) ELEM_FUNC_VRVRVRVU_2(8,1)
476 ELEM_FUNC_VIIVII(1) ELEM_FUNC_VIIVII(2) ELEM_FUNC_VIIVII(4) ELEM_FUNC_VIIVII(8)
477 ELEM_FUNC_VRRVRI(4) ELEM_FUNC_VRRVRI(8)
478 ELEM_FUNC_VRVRVRVR(4) ELEM_FUNC_VRVRVRVR(8)
479 ELEM_FUNC_VIVIVII(1) ELEM_FUNC_VIVIVII(2) ELEM_FUNC_VIVIVII(4) ELEM_FUNC_VIVIVII(8)
480 ELEM_FUNC_VUVUVUI(1) ELEM_FUNC_VUVUVUI(2) ELEM_FUNC_VUVUVUI(4) ELEM_FUNC_VUVUVUI(8)
481 ELEM_FUNC_VRVRVRI(4) ELEM_FUNC_VRVRVRI(8)
483 #undef ELEM_FUNC_VRRVRI
484 #undef ELEM_FUNC_VIIVII
485 #undef ELEM_FUNC_VRVRVRI
486 #undef ELEM_FUNC_VUVUVUI
487 #undef ELEM_FUNC_VIVIVII
488 #undef ELEM_FUNC_VRVRVRVU
489 #undef ELEM_FUNC_VRVRVRVU_2
490 #undef ELEM_FUNC_VUVUVUVU
491 #undef ELEM_FUNC_VUVUVUVU_2
492 #undef ELEM_FUNC_VIVIVIVU
493 #undef ELEM_FUNC_VIVIVIVU_2
494 #undef ELEM_FUNC_VRVRVRVR
496 !! ================ 3 argument subroutine interfaces =================================
497 ! subroutine(vector(i), i, vector(i))
498 #define SUB_VIIVI(VKIND) \
499 pure subroutine sub_vi##VKIND##ivi##VKIND(arg1, arg2, arg3); \
500 vector(integer(VKIND)), intent(in) :: arg1; \
501 integer(8), intent(in) :: arg2; \
502 !dir$ ignore_tkr(k) arg2; \
503 vector(integer(VKIND)), intent(in) :: arg3; \
504 !dir$ ignore_tkr(r) arg3; \
505 end subroutine ;
507 ! subroutine(vector(u), i, vector(u))
508 #define SUB_VUIVU(VKIND) \
509 pure subroutine sub_vu##VKIND##ivu##VKIND(arg1, arg2, arg3); \
510 vector(unsigned(VKIND)), intent(in) :: arg1; \
511 integer(8), intent(in) :: arg2; \
512 !dir$ ignore_tkr(k) arg2; \
513 vector(unsigned(VKIND)), intent(in) :: arg3; \
514 !dir$ ignore_tkr(r) arg3; \
515 end subroutine ;
517 ! subroutine(vector(r), i, vector(r))
518 #define SUB_VRIVR(VKIND) \
519 pure subroutine sub_vr##VKIND##ivr##VKIND(arg1, arg2, arg3); \
520 vector(real(VKIND)), intent(in) :: arg1; \
521 integer(8), intent(in) :: arg2; \
522 !dir$ ignore_tkr(k) arg2; \
523 vector(real(VKIND)), intent(in) :: arg3; \
524 !dir$ ignore_tkr(r) arg3; \
525 end subroutine ;
527 ! subroutine(vector(i), i, i)
528 #define SUB_VIII(VKIND) \
529 pure subroutine sub_vi##VKIND##ii##VKIND(arg1, arg2, arg3); \
530 vector(integer(VKIND)), intent(in) :: arg1; \
531 integer(8), intent(in) :: arg2; \
532 !dir$ ignore_tkr(k) arg2; \
533 integer(VKIND), intent(out) :: arg3; \
534 !dir$ ignore_tkr(r) arg3; \
535 end subroutine ;
537 ! subroutine(vector(u), i, i)
538 #define SUB_VUII(VKIND) \
539 pure subroutine sub_vu##VKIND##ii##VKIND(arg1, arg2, arg3); \
540 vector(unsigned(VKIND)), intent(in) :: arg1; \
541 integer(8), intent(in) :: arg2; \
542 !dir$ ignore_tkr(k) arg2; \
543 integer(VKIND), intent(out) :: arg3; \
544 !dir$ ignore_tkr(r) arg3; \
545 end subroutine ;
547 ! subroutine(vector(r), i, r)
548 #define SUB_VRIR(VKIND) \
549 pure subroutine sub_vr##VKIND##ir##VKIND(arg1, arg2, arg3); \
550 vector(real(VKIND)), intent(in) :: arg1; \
551 integer(8), intent(in) :: arg2; \
552 !dir$ ignore_tkr(k) arg2; \
553 real(VKIND), intent(out) :: arg3; \
554 !dir$ ignore_tkr(r) arg3; \
555 end subroutine ;
557 ! subroutine(__vector_pair, i, __vector_pair)
558 pure subroutine sub_vpi0vp(arg1, arg2, arg3)
559 __vector_pair, intent(in) :: arg1
560 integer(8), intent(in) :: arg2
561 !dir$ ignore_tkr(k) arg2
562 __vector_pair, intent(out) :: arg3
563 !dir$ ignore_tkr(r) arg3
564 end subroutine
566 ! subroutine(__vector_pair, i, vector(i))
567 #define SUB_VPI0VI(VKIND) \
568 pure subroutine sub_vpi0vi##VKIND(arg1, arg2, arg3); \
569 __vector_pair, intent(in) :: arg1; \
570 integer(8), intent(in) :: arg2; \
571 !dir$ ignore_tkr(k) arg2; \
572 vector(integer(VKIND)), intent(out) :: arg3; \
573 !dir$ ignore_tkr(r) arg3; \
574 end subroutine;
576 ! subroutine(__vector_pair, i, vector(u))
577 #define SUB_VPI0VU(VKIND) \
578 pure subroutine sub_vpi0vu##VKIND(arg1, arg2, arg3); \
579 __vector_pair, intent(in) :: arg1; \
580 integer(8), intent(in) :: arg2; \
581 !dir$ ignore_tkr(k) arg2; \
582 vector(unsigned(VKIND)), intent(out) :: arg3; \
583 !dir$ ignore_tkr(r) arg3; \
584 end subroutine;
586 ! subroutine(__vector_pair, i, vector(r))
587 #define SUB_VPI0VR(VKIND) \
588 pure subroutine sub_vpi0vr##VKIND(arg1, arg2, arg3); \
589 __vector_pair, intent(in) :: arg1; \
590 integer(8), intent(in) :: arg2; \
591 !dir$ ignore_tkr(k) arg2; \
592 vector(real(VKIND)), intent(out) :: arg3; \
593 !dir$ ignore_tkr(r) arg3; \
594 end subroutine;
596 ! subroutine(__vector_pair, i, i)
597 pure subroutine sub_vpi0i0(arg1, arg2, arg3)
598 __vector_pair, intent(in) :: arg1
599 integer(8), intent(in) :: arg2
600 !dir$ ignore_tkr(k) arg2
601 integer(8), intent(out) :: arg3
602 !dir$ ignore_tkr(kr) arg3
603 end subroutine
605 ! subroutine(__vector_pair, i, r)
606 pure subroutine sub_vpi0r0(arg1, arg2, arg3)
607 __vector_pair, intent(in) :: arg1
608 integer(8), intent(in) :: arg2
609 !dir$ ignore_tkr(k) arg2
610 real(8), intent(out) :: arg3
611 !dir$ ignore_tkr(kr) arg3
612 end subroutine
614 SUB_VIIVI(1) SUB_VIIVI(2) SUB_VIIVI(4) SUB_VIIVI(8)
615 SUB_VUIVU(1) SUB_VUIVU(2) SUB_VUIVU(4) SUB_VUIVU(8)
616 SUB_VRIVR(4) SUB_VRIVR(8)
617 SUB_VIII(1) SUB_VIII(2) SUB_VIII(4) SUB_VIII(8)
618 SUB_VUII(1) SUB_VUII(2) SUB_VUII(4) SUB_VUII(8)
619 SUB_VRIR(4) SUB_VRIR(8)
620 SUB_VPI0VI(1) SUB_VPI0VI(2) SUB_VPI0VI(4) SUB_VPI0VI(8)
621 SUB_VPI0VU(1) SUB_VPI0VU(2) SUB_VPI0VU(4) SUB_VPI0VU(8)
622 SUB_VPI0VR(4) SUB_VPI0VR(8)
624 #undef SUB_VPI0VR
625 #undef SUB_VPI0VU
626 #undef SUB_VPI0VI
627 #undef SUB_VRIR
628 #undef SUB_VUII
629 #undef SUB_VIII
630 #undef SUB_VRIVR
631 #undef SUB_VUIVU
632 #undef SUB_VIIVI
634 end interface
636 procedure(func_r4r4r4r4) :: __ppc_fmadd_r4
637 procedure(func_r8r8r8r8) :: __ppc_fmadd_r8
638 interface fmadd
639 procedure :: __ppc_fmadd_r4
640 procedure :: __ppc_fmadd_r8
641 end interface fmadd
642 public :: fmadd
644 procedure(func_r4r4r4r4) :: __ppc_fmsub_r4
645 procedure(func_r8r8r8r8) :: __ppc_fmsub_r8
646 interface fmsub
647 procedure :: __ppc_fmsub_r4
648 procedure :: __ppc_fmsub_r8
649 end interface fmsub
650 public :: fmsub
652 procedure(func_r4r4r4r4) :: __ppc_fnmadd_r4
653 procedure(func_r8r8r8r8) :: __ppc_fnmadd_r8
654 interface fnmadd
655 procedure :: __ppc_fnmadd_r4
656 procedure :: __ppc_fnmadd_r8
657 end interface fnmadd
658 public :: fnmadd
660 procedure(func_r4r4r4r4) :: __ppc_fnmsub_r4
661 procedure(func_r8r8r8r8) :: __ppc_fnmsub_r8
662 interface fnmsub
663 procedure :: __ppc_fnmsub_r4
664 procedure :: __ppc_fnmsub_r8
665 end interface fnmsub
666 public :: fnmsub
668 ! fctid, fctidz, fctiw, fctiwz, fctudz, fctuwz
669 abstract interface
670 elemental real(4) function func_r4r4x(x)
671 real(4), intent(in) :: x
672 end function func_r4r4x
673 elemental real(8) function func_r8r8x(x)
674 real(8), intent(in) :: x
675 end function func_r8r8x
676 end interface
678 procedure(func_r8r8x) :: __ppc_fctid
679 interface fctid
680 procedure :: __ppc_fctid
681 end interface fctid
682 public :: fctid
684 procedure(func_r8r8x) :: __ppc_fctidz
685 interface fctidz
686 procedure :: __ppc_fctidz
687 end interface fctidz
688 public :: fctidz
690 procedure(func_r8r8x) :: __ppc_fctiw
691 interface fctiw
692 procedure :: __ppc_fctiw
693 end interface fctiw
694 public :: fctiw
696 procedure(func_r8r8x) :: __ppc_fctiwz
697 interface fctiwz
698 procedure :: __ppc_fctiwz
699 end interface fctiwz
700 public :: fctiwz
702 procedure(func_r8r8x) :: __ppc_fctudz
703 interface fctudz
704 procedure :: __ppc_fctudz
705 end interface fctudz
706 public :: fctudz
708 procedure(func_r8r8x) :: __ppc_fctuwz
709 interface fctuwz
710 procedure :: __ppc_fctuwz
711 end interface fctuwz
712 public :: fctuwz
714 ! fcfi, fcfid, fcfud
715 abstract interface
716 elemental real(8) function func_r8r8i(i)
717 real(8), intent(in) :: i
718 end function func_r8r8i
719 end interface
721 procedure(func_r8r8i) :: __ppc_fcfi
722 interface fcfi
723 procedure :: __ppc_fcfi
724 end interface fcfi
725 public :: fcfi
727 procedure(func_r8r8i) :: __ppc_fcfid
728 interface fcfid
729 procedure :: __ppc_fcfid
730 end interface fcfid
731 public :: fcfid
733 procedure(func_r8r8i) :: __ppc_fcfud
734 interface fcfud
735 procedure :: __ppc_fcfud
736 end interface fcfud
737 public :: fcfud
739 ! fnabs
740 procedure(func_r4r4x) :: __ppc_fnabs_r4
741 procedure(func_r8r8x) :: __ppc_fnabs_r8
742 interface fnabs
743 procedure :: __ppc_fnabs_r4
744 procedure :: __ppc_fnabs_r8
745 end interface fnabs
746 public :: fnabs
748 ! fre, fres
749 procedure(func_r8r8x) :: __ppc_fre
750 interface fre
751 procedure :: __ppc_fre
752 end interface fre
753 public :: fre
755 procedure(func_r4r4x) :: __ppc_fres
756 interface fres
757 procedure :: __ppc_fres
758 end interface fres
759 public :: fres
761 ! frsqrte, frsqrtes
762 procedure(func_r8r8x) :: __ppc_frsqrte
763 interface frsqrte
764 procedure :: __ppc_frsqrte
765 end interface frsqrte
766 public :: frsqrte
768 procedure(func_r4r4x) :: __ppc_frsqrtes
769 interface frsqrtes
770 procedure :: __ppc_frsqrtes
771 end interface frsqrtes
772 public :: frsqrtes
774 ! mtfsf, mtfsfi
775 interface mtfsf
776 subroutine __ppc_mtfsf(mask, r)
777 integer(4), intent(in) :: mask
778 real(8), intent(in) :: r
779 end subroutine __ppc_mtfsf
780 end interface mtfsf
781 public :: mtfsf
783 interface mtfsfi
784 subroutine __ppc_mtfsfi(bf, i)
785 integer(4), intent(in) :: bf
786 integer(4), intent(in) :: i
787 end subroutine __ppc_mtfsfi
788 end interface mtfsfi
789 public :: mtfsfi
791 !-----------------------------
792 ! vector function(vector/i/r)
793 !-----------------------------
794 #define VI_VI(NAME, VKIND) __ppc_##NAME##_vi##VKIND##vi##VKIND
795 #define VU_VU(NAME, VKIND) __ppc_##NAME##_vu##VKIND##vu##VKIND
796 #define VR_VR_2(NAME, VKIND1, VKIND2) __ppc_##NAME##_vr##VKIND1##vr##VKIND2
797 #define VR_VR(NAME, VKIND) VR_VR_2(NAME, VKIND, VKIND)
798 #define VI_I_2(NAME, RKIND, VKIND) __ppc_##NAME##_vi##RKIND##i##VKIND
799 #define VI_I(NAME, VKIND) VI_I_2(NAME, VKIND, VKIND)
800 #define VR_R(NAME, VKIND) __ppc_##NAME##_vr##VKIND##r##VKIND
802 #define VEC_VI_VI(NAME, VKIND) \
803 procedure(elem_func_vi##VKIND##vi##VKIND) :: VI_VI(NAME, VKIND);
804 #define VEC_VU_VU(NAME, VKIND) \
805 procedure(elem_func_vu##VKIND##vu##VKIND) :: VU_VU(NAME, VKIND);
806 #define VEC_VR_VR_2(NAME, VKIND1, VKIND2) \
807 procedure(elem_func_vr##VKIND1##vr##VKIND2) :: VR_VR_2(NAME, VKIND1, VKIND2);
808 #define VEC_VR_VR(NAME, VKIND) VEC_VR_VR_2(NAME, VKIND, VKIND)
809 #define VEC_VI_I_2(NAME, RKIND, VKIND) \
810 procedure(elem_func_vi##RKIND##i##VKIND) :: VI_I_2(NAME, RKIND, VKIND);
811 #define VEC_VI_I(NAME, VKIND) VEC_VI_I_2(NAME, VKIND, VKIND)
812 #define VEC_VR_R(NAME, VKIND) \
813 procedure(elem_func_vr##VKIND##r##VKIND) :: VR_R(NAME, VKIND);
815 ! vec_abs
816 VEC_VI_VI(vec_abs,1) VEC_VI_VI(vec_abs,2) VEC_VI_VI(vec_abs,4) VEC_VI_VI(vec_abs,8)
817 VEC_VR_VR(vec_abs,4) VEC_VR_VR(vec_abs,8)
818 interface vec_abs
819 procedure :: VI_VI(vec_abs,1), VI_VI(vec_abs,2), VI_VI(vec_abs,4), VI_VI(vec_abs,8)
820 procedure :: VR_VR(vec_abs,4), VR_VR(vec_abs,8)
821 end interface vec_abs
822 public :: vec_abs
824 ! vec_cvf
825 VEC_VR_VR_2(vec_cvf,4,8) VEC_VR_VR_2(vec_cvf,8,4)
826 interface vec_cvf
827 procedure :: VR_VR_2(vec_cvf,4,8), VR_VR_2(vec_cvf,8,4)
828 end interface vec_cvf
829 public :: vec_cvf
831 ! vec_cvbf16spn
832 VEC_VU_VU(vec_cvbf16spn,1)
833 interface vec_cvbf16spn
834 procedure :: VU_VU(vec_cvbf16spn,1)
835 end interface
836 public vec_cvbf16spn
838 ! vec_cvspbf16
839 VEC_VU_VU(vec_cvspbf16_,1)
840 interface vec_cvspbf16
841 procedure :: VU_VU(vec_cvspbf16_,1)
842 end interface
843 public vec_cvspbf16
845 ! vec_splats
846 VEC_VI_I(vec_splats,1) VEC_VI_I(vec_splats,2) VEC_VI_I(vec_splats,4) VEC_VI_I(vec_splats,8)
847 VEC_VR_R(vec_splats,4) VEC_VR_R(vec_splats,8)
848 interface vec_splats
849 procedure :: VI_I(vec_splats,1), VI_I(vec_splats,2), VI_I(vec_splats,4), VI_I(vec_splats,8)
850 procedure :: VR_R(vec_splats,4), VR_R(vec_splats,8)
851 end interface vec_splats
852 public :: vec_splats
854 ! vec_splat_32
855 VEC_VI_I_2(vec_splat_s32_,4,1) VEC_VI_I_2(vec_splat_s32_,4,2) VEC_VI_I_2(vec_splat_s32_,4,4) VEC_VI_I_2(vec_splat_s32_,4,8)
856 interface vec_splat_s32
857 procedure :: VI_I_2(vec_splat_s32_,4,1), VI_I_2(vec_splat_s32_,4,2), VI_I_2(vec_splat_s32_,4,4), VI_I_2(vec_splat_s32_,4,8)
858 end interface vec_splat_s32
859 public :: vec_splat_s32
861 #undef VEC_VR_R
862 #undef VEC_VI_I
863 #undef VEC_VI_I_2
864 #undef VEC_VR_VR
865 #undef VEC_VR_VR_2
866 #undef VEC_VU_VU
867 #undef VEC_VI_VI
868 #undef VR_R
869 #undef VI_I
870 #undef VI_I_2
871 #undef VR_VR
872 #undef VR_VR_2
873 #undef VU_VU
874 #undef VI_VI
876 !---------------------------------
877 ! vector function(vector, vector)
878 !---------------------------------
879 #define VI_VI_VI(NAME, VKIND) __ppc_##NAME##_vi##VKIND##vi##VKIND##vi##VKIND
880 #define VU_VI_VI(NAME, VKIND) __ppc_##NAME##_vu##VKIND##vi##VKIND##vi##VKIND
881 #define VU_VU_VU_2(NAME, VKIND1, VKIND2) __ppc_##NAME##_vu##VKIND1##vu##VKIND1##vu##VKIND2
882 #define VU_VU_VU(NAME, VKIND) VU_VU_VU_2(NAME, VKIND, VKIND)
883 #define VI_VI_VU_2(NAME, VKIND1, VKIND2) __ppc_##NAME##_vi##VKIND1##vi##VKIND1##vu##VKIND2
884 #define VI_VI_VU(NAME, VKIND) VI_VI_VU_2(NAME, VKIND, VKIND)
885 #define VR_VR_VR(NAME, VKIND) __ppc_##NAME##_vr##VKIND##vr##VKIND##vr##VKIND
886 #define VR_VR_VU_2(NAME, VKIND1, VKIND2) __ppc_##NAME##_vr##VKIND1##vr##VKIND1##vu##VKIND2
887 #define VU_VR_VR(NAME, VKIND) __ppc_##NAME##_vu##VKIND##vr##VKIND##vr##VKIND
889 #define VEC_VI_VI_VI(NAME, VKIND) \
890 procedure(elem_func_vi##VKIND##vi##VKIND##vi##VKIND) :: VI_VI_VI(NAME, VKIND);
891 #define VEC_VU_VI_VI(NAME, VKIND) \
892 procedure(elem_func_vu##VKIND##vi##VKIND##vi##VKIND) :: VU_VI_VI(NAME, VKIND);
893 #define VEC_VU_VU_VU_2(NAME, VKIND1, VKIND2) \
894 procedure(elem_func_vu##VKIND1##vu##VKIND1##vu##VKIND2) :: VU_VU_VU_2(NAME, VKIND1, VKIND2);
895 #define VEC_VU_VU_VU(NAME, VKIND) VEC_VU_VU_VU_2(NAME, VKIND, VKIND)
896 #define VEC_VI_VI_VU_2(NAME, VKIND1, VKIND2) \
897 procedure(elem_func_vi##VKIND1##vi##VKIND1##vu##VKIND2) :: VI_VI_VU_2(NAME, VKIND1, VKIND2);
898 #define VEC_VI_VI_VU(NAME, VKIND) VEC_VI_VI_VU_2(NAME, VKIND, VKIND)
899 #define VEC_VR_VR_VR(NAME, VKIND) \
900 procedure(elem_func_vr##VKIND##vr##VKIND##vr##VKIND) :: VR_VR_VR(NAME, VKIND);
901 #define VEC_VU_VR_VR(NAME, VKIND) \
902 procedure(elem_func_vu##VKIND##vr##VKIND##vr##VKIND) :: VU_VR_VR(NAME, VKIND);
903 #define VEC_VR_VR_VU(NAME, VKIND1, VKIND2) \
904 procedure(elem_func_vr##VKIND1##vr##VKIND1##vu##VKIND2) :: VR_VR_VU_2(NAME, VKIND1, VKIND2);
906 ! vec_add
907 VEC_VI_VI_VI(vec_add,1) VEC_VI_VI_VI(vec_add,2) VEC_VI_VI_VI(vec_add,4) VEC_VI_VI_VI(vec_add,8)
908 VEC_VU_VU_VU(vec_add,1) VEC_VU_VU_VU(vec_add,2) VEC_VU_VU_VU(vec_add,4) VEC_VU_VU_VU(vec_add,8)
909 VEC_VR_VR_VR(vec_add,4) VEC_VR_VR_VR(vec_add,8)
910 interface vec_add
911 procedure :: VI_VI_VI(vec_add,1), VI_VI_VI(vec_add,2), VI_VI_VI(vec_add,4), VI_VI_VI(vec_add,8)
912 procedure :: VU_VU_VU(vec_add,1), VU_VU_VU(vec_add,2), VU_VU_VU(vec_add,4), VU_VU_VU(vec_add,8)
913 procedure :: VR_VR_VR(vec_add,4), VR_VR_VR(vec_add,8)
914 end interface vec_add
915 public :: vec_add
917 ! vec_and
918 VEC_VI_VI_VI(vec_and,1) VEC_VI_VI_VI(vec_and,2) VEC_VI_VI_VI(vec_and,4) VEC_VI_VI_VI(vec_and,8)
919 VEC_VU_VU_VU(vec_and,1) VEC_VU_VU_VU(vec_and,2) VEC_VU_VU_VU(vec_and,4) VEC_VU_VU_VU(vec_and,8)
920 VEC_VR_VR_VR(vec_and,4) VEC_VR_VR_VR(vec_and,8)
921 interface vec_and
922 procedure :: VI_VI_VI(vec_and,1), VI_VI_VI(vec_and,2), VI_VI_VI(vec_and,4), VI_VI_VI(vec_and,8)
923 procedure :: VU_VU_VU(vec_and,1), VU_VU_VU(vec_and,2), VU_VU_VU(vec_and,4), VU_VU_VU(vec_and,8)
924 procedure :: VR_VR_VR(vec_and,4), VR_VR_VR(vec_and,8)
925 end interface vec_and
926 public :: vec_and
928 ! vec_cmpge
929 VEC_VU_VI_VI(vec_cmpge,1) VEC_VU_VI_VI(vec_cmpge,2) VEC_VU_VI_VI(vec_cmpge,4) VEC_VU_VI_VI(vec_cmpge,8)
930 VEC_VU_VU_VU(vec_cmpge,1) VEC_VU_VU_VU(vec_cmpge,2) VEC_VU_VU_VU(vec_cmpge,4) VEC_VU_VU_VU(vec_cmpge,8)
931 VEC_VU_VR_VR(vec_cmpge,4) VEC_VU_VR_VR(vec_cmpge,8)
932 interface vec_cmpge
933 procedure :: VU_VI_VI(vec_cmpge,1), VU_VI_VI(vec_cmpge,2), VU_VI_VI(vec_cmpge,4), VU_VI_VI(vec_cmpge,8)
934 procedure :: VU_VU_VU(vec_cmpge,1), VU_VU_VU(vec_cmpge,2), VU_VU_VU(vec_cmpge,4), VU_VU_VU(vec_cmpge,8)
935 procedure :: VU_VR_VR(vec_cmpge,4), VU_VR_VR(vec_cmpge,8)
936 end interface vec_cmpge
937 public :: vec_cmpge
939 ! vec_cmpgt
940 VEC_VU_VI_VI(vec_cmpgt,1) VEC_VU_VI_VI(vec_cmpgt,2) VEC_VU_VI_VI(vec_cmpgt,4) VEC_VU_VI_VI(vec_cmpgt,8)
941 VEC_VU_VU_VU(vec_cmpgt,1) VEC_VU_VU_VU(vec_cmpgt,2) VEC_VU_VU_VU(vec_cmpgt,4) VEC_VU_VU_VU(vec_cmpgt,8)
942 VEC_VU_VR_VR(vec_cmpgt,4) VEC_VU_VR_VR(vec_cmpgt,8)
943 interface vec_cmpgt
944 procedure :: VU_VI_VI(vec_cmpgt,1), VU_VI_VI(vec_cmpgt,2), VU_VI_VI(vec_cmpgt,4), VU_VI_VI(vec_cmpgt,8)
945 procedure :: VU_VU_VU(vec_cmpgt,1), VU_VU_VU(vec_cmpgt,2), VU_VU_VU(vec_cmpgt,4), VU_VU_VU(vec_cmpgt,8)
946 procedure :: VU_VR_VR(vec_cmpgt,4), VU_VR_VR(vec_cmpgt,8)
947 end interface vec_cmpgt
948 public :: vec_cmpgt
950 ! vec_cmple
951 VEC_VU_VI_VI(vec_cmple,1) VEC_VU_VI_VI(vec_cmple,2) VEC_VU_VI_VI(vec_cmple,4) VEC_VU_VI_VI(vec_cmple,8)
952 VEC_VU_VU_VU(vec_cmple,1) VEC_VU_VU_VU(vec_cmple,2) VEC_VU_VU_VU(vec_cmple,4) VEC_VU_VU_VU(vec_cmple,8)
953 VEC_VU_VR_VR(vec_cmple,4) VEC_VU_VR_VR(vec_cmple,8)
954 interface vec_cmple
955 procedure :: VU_VI_VI(vec_cmple,1), VU_VI_VI(vec_cmple,2), VU_VI_VI(vec_cmple,4), VU_VI_VI(vec_cmple,8)
956 procedure :: VU_VU_VU(vec_cmple,1), VU_VU_VU(vec_cmple,2), VU_VU_VU(vec_cmple,4), VU_VU_VU(vec_cmple,8)
957 procedure :: VU_VR_VR(vec_cmple,4), VU_VR_VR(vec_cmple,8)
958 end interface vec_cmple
959 public :: vec_cmple
961 ! vec_cmplt
962 VEC_VU_VI_VI(vec_cmplt,1) VEC_VU_VI_VI(vec_cmplt,2) VEC_VU_VI_VI(vec_cmplt,4) VEC_VU_VI_VI(vec_cmplt,8)
963 VEC_VU_VU_VU(vec_cmplt,1) VEC_VU_VU_VU(vec_cmplt,2) VEC_VU_VU_VU(vec_cmplt,4) VEC_VU_VU_VU(vec_cmplt,8)
964 VEC_VU_VR_VR(vec_cmplt,4) VEC_VU_VR_VR(vec_cmplt,8)
965 interface vec_cmplt
966 procedure :: VU_VI_VI(vec_cmplt,1), VU_VI_VI(vec_cmplt,2), VU_VI_VI(vec_cmplt,4), VU_VI_VI(vec_cmplt,8)
967 procedure :: VU_VU_VU(vec_cmplt,1), VU_VU_VU(vec_cmplt,2), VU_VU_VU(vec_cmplt,4), VU_VU_VU(vec_cmplt,8)
968 procedure :: VU_VR_VR(vec_cmplt,4), VU_VR_VR(vec_cmplt,8)
969 end interface vec_cmplt
970 public :: vec_cmplt
972 ! vec_convert
973 ! Argument 'v' has the `ignore_tkr` directive
974 #define CONVERT_VI_VI_VI(VKIND) __ppc_vec_convert_vi##VKIND##vi##vi##VKIND
975 #define CONVERT_VU_VI_VU(VKIND) __ppc_vec_convert_vu##VKIND##vi##vu##VKIND
976 #define CONVERT_VR_VI_VR(VKIND) __ppc_vec_convert_vr##VKIND##vi##vr##VKIND
978 #define VEC_CONVERT_VI_VI_VI(VKIND) \
979 procedure(func_vec_convert_vi##VKIND##vi##vi##VKIND) :: CONVERT_VI_VI_VI(VKIND);
980 #define VEC_CONVERT_VU_VI_VU(VKIND) \
981 procedure(func_vec_convert_vu##VKIND##vi##vu##VKIND) :: CONVERT_VU_VI_VU(VKIND);
982 #define VEC_CONVERT_VR_VI_VR(VKIND) \
983 procedure(func_vec_convert_vr##VKIND##vi##vr##VKIND) :: CONVERT_VR_VI_VR(VKIND);
985 VEC_CONVERT_VI_VI_VI(1) VEC_CONVERT_VI_VI_VI(2) VEC_CONVERT_VI_VI_VI(4) VEC_CONVERT_VI_VI_VI(8)
986 VEC_CONVERT_VU_VI_VU(1) VEC_CONVERT_VU_VI_VU(2) VEC_CONVERT_VU_VI_VU(4) VEC_CONVERT_VU_VI_VU(8)
987 VEC_CONVERT_VR_VI_VR(4) VEC_CONVERT_VR_VI_VR(8)
988 interface vec_convert
989 procedure :: CONVERT_VI_VI_VI(1), CONVERT_VI_VI_VI(2), CONVERT_VI_VI_VI(4), CONVERT_VI_VI_VI(8)
990 procedure :: CONVERT_VU_VI_VU(1), CONVERT_VU_VI_VU(2), CONVERT_VU_VI_VU(4), CONVERT_VU_VI_VU(8)
991 procedure :: CONVERT_VR_VI_VR(4), CONVERT_VR_VI_VR(8)
992 end interface vec_convert
993 public :: vec_convert
995 #undef VEC_CONVERT_VR_VI_VR
996 #undef VEC_CONVERT_VU_VI_VU
997 #undef VEC_CONVERT_VI_VI_VI
998 #undef CONVERT_VR_VI_VR
999 #undef CONVERT_VU_VI_VU
1000 #undef CONVERT_VI_VI_VI
1002 ! vec_max
1003 VEC_VI_VI_VI(vec_max,1) VEC_VI_VI_VI(vec_max,2) VEC_VI_VI_VI(vec_max,4) VEC_VI_VI_VI(vec_max,8)
1004 VEC_VU_VU_VU(vec_max,1) VEC_VU_VU_VU(vec_max,2) VEC_VU_VU_VU(vec_max,4) VEC_VU_VU_VU(vec_max,8)
1005 VEC_VR_VR_VR(vec_max,4) VEC_VR_VR_VR(vec_max,8)
1006 interface vec_max
1007 procedure :: VI_VI_VI(vec_max,1), VI_VI_VI(vec_max,2), VI_VI_VI(vec_max,4), VI_VI_VI(vec_max,8)
1008 procedure :: VU_VU_VU(vec_max,1), VU_VU_VU(vec_max,2), VU_VU_VU(vec_max,4), VU_VU_VU(vec_max,8)
1009 procedure :: VR_VR_VR(vec_max,4), VR_VR_VR(vec_max,8)
1010 end interface vec_max
1011 public :: vec_max
1013 ! vec_mergeh
1014 VEC_VI_VI_VI(vec_mergeh,1) VEC_VI_VI_VI(vec_mergeh,2) VEC_VI_VI_VI(vec_mergeh,4) VEC_VI_VI_VI(vec_mergeh,8)
1015 VEC_VU_VU_VU(vec_mergeh,1) VEC_VU_VU_VU(vec_mergeh,2) VEC_VU_VU_VU(vec_mergeh,4) VEC_VU_VU_VU(vec_mergeh,8)
1016 VEC_VR_VR_VR(vec_mergeh,4) VEC_VR_VR_VR(vec_mergeh,8)
1017 interface vec_mergeh
1018 procedure :: VI_VI_VI(vec_mergeh,1), VI_VI_VI(vec_mergeh,2), VI_VI_VI(vec_mergeh,4), VI_VI_VI(vec_mergeh,8)
1019 procedure :: VU_VU_VU(vec_mergeh,1), VU_VU_VU(vec_mergeh,2), VU_VU_VU(vec_mergeh,4), VU_VU_VU(vec_mergeh,8)
1020 procedure :: VR_VR_VR(vec_mergeh,4), VR_VR_VR(vec_mergeh,8)
1021 end interface vec_mergeh
1022 public :: vec_mergeh
1024 ! vec_mergel
1025 VEC_VI_VI_VI(vec_mergel,1) VEC_VI_VI_VI(vec_mergel,2) VEC_VI_VI_VI(vec_mergel,4) VEC_VI_VI_VI(vec_mergel,8)
1026 VEC_VU_VU_VU(vec_mergel,1) VEC_VU_VU_VU(vec_mergel,2) VEC_VU_VU_VU(vec_mergel,4) VEC_VU_VU_VU(vec_mergel,8)
1027 VEC_VR_VR_VR(vec_mergel,4) VEC_VR_VR_VR(vec_mergel,8)
1028 interface vec_mergel
1029 procedure :: VI_VI_VI(vec_mergel,1), VI_VI_VI(vec_mergel,2), VI_VI_VI(vec_mergel,4), VI_VI_VI(vec_mergel,8)
1030 procedure :: VU_VU_VU(vec_mergel,1), VU_VU_VU(vec_mergel,2), VU_VU_VU(vec_mergel,4), VU_VU_VU(vec_mergel,8)
1031 procedure :: VR_VR_VR(vec_mergel,4), VR_VR_VR(vec_mergel,8)
1032 end interface vec_mergel
1033 public :: vec_mergel
1035 ! vec_min
1036 VEC_VI_VI_VI(vec_min,1) VEC_VI_VI_VI(vec_min,2) VEC_VI_VI_VI(vec_min,4) VEC_VI_VI_VI(vec_min,8)
1037 VEC_VU_VU_VU(vec_min,1) VEC_VU_VU_VU(vec_min,2) VEC_VU_VU_VU(vec_min,4) VEC_VU_VU_VU(vec_min,8)
1038 VEC_VR_VR_VR(vec_min,4) VEC_VR_VR_VR(vec_min,8)
1039 interface vec_min
1040 procedure :: VI_VI_VI(vec_min,1), VI_VI_VI(vec_min,2), VI_VI_VI(vec_min,4), VI_VI_VI(vec_min,8)
1041 procedure :: VU_VU_VU(vec_min,1), VU_VU_VU(vec_min,2), VU_VU_VU(vec_min,4), VU_VU_VU(vec_min,8)
1042 procedure :: VR_VR_VR(vec_min,4), VR_VR_VR(vec_min,8)
1043 end interface vec_min
1044 public :: vec_min
1046 ! vec_mul
1047 VEC_VI_VI_VI(vec_mul,1) VEC_VI_VI_VI(vec_mul,2) VEC_VI_VI_VI(vec_mul,4) VEC_VI_VI_VI(vec_mul,8)
1048 VEC_VU_VU_VU(vec_mul,1) VEC_VU_VU_VU(vec_mul,2) VEC_VU_VU_VU(vec_mul,4) VEC_VU_VU_VU(vec_mul,8)
1049 VEC_VR_VR_VR(vec_mul,4) VEC_VR_VR_VR(vec_mul,8)
1050 interface vec_mul
1051 procedure :: VI_VI_VI(vec_mul,1), VI_VI_VI(vec_mul,2), VI_VI_VI(vec_mul,4), VI_VI_VI(vec_mul,8)
1052 procedure :: VU_VU_VU(vec_mul,1), VU_VU_VU(vec_mul,2), VU_VU_VU(vec_mul,4), VU_VU_VU(vec_mul,8)
1053 procedure :: VR_VR_VR(vec_mul,4), VR_VR_VR(vec_mul,8)
1054 end interface vec_mul
1055 public :: vec_mul
1057 ! vec_sub
1058 VEC_VI_VI_VI(vec_sub,1) VEC_VI_VI_VI(vec_sub,2) VEC_VI_VI_VI(vec_sub,4) VEC_VI_VI_VI(vec_sub,8)
1059 VEC_VU_VU_VU(vec_sub,1) VEC_VU_VU_VU(vec_sub,2) VEC_VU_VU_VU(vec_sub,4) VEC_VU_VU_VU(vec_sub,8)
1060 VEC_VR_VR_VR(vec_sub,4) VEC_VR_VR_VR(vec_sub,8)
1061 interface vec_sub
1062 procedure :: VI_VI_VI(vec_sub,1), VI_VI_VI(vec_sub,2), VI_VI_VI(vec_sub,4), VI_VI_VI(vec_sub,8)
1063 procedure :: VU_VU_VU(vec_sub,1), VU_VU_VU(vec_sub,2), VU_VU_VU(vec_sub,4), VU_VU_VU(vec_sub,8)
1064 procedure :: VR_VR_VR(vec_sub,4), VR_VR_VR(vec_sub,8)
1065 end interface vec_sub
1066 public :: vec_sub
1068 ! vec_sl
1069 VEC_VI_VI_VU(vec_sl,1) VEC_VI_VI_VU(vec_sl,2) VEC_VI_VI_VU(vec_sl,4) VEC_VI_VI_VU(vec_sl,8)
1070 VEC_VU_VU_VU(vec_sl,1) VEC_VU_VU_VU(vec_sl,2) VEC_VU_VU_VU(vec_sl,4) VEC_VU_VU_VU(vec_sl,8)
1071 interface vec_sl
1072 procedure :: VI_VI_VU(vec_sl,1), VI_VI_VU(vec_sl,2), VI_VI_VU(vec_sl,4), VI_VI_VU(vec_sl,8)
1073 procedure :: VU_VU_VU(vec_sl,1), VU_VU_VU(vec_sl,2), VU_VU_VU(vec_sl,4), VU_VU_VU(vec_sl,8)
1074 end interface vec_sl
1075 public :: vec_sl
1077 ! vec_sll
1078 VEC_VI_VI_VU_2(vec_sll,1,1) VEC_VI_VI_VU_2(vec_sll,2,1) VEC_VI_VI_VU_2(vec_sll,4,1)
1079 VEC_VI_VI_VU_2(vec_sll,1,2) VEC_VI_VI_VU_2(vec_sll,2,2) VEC_VI_VI_VU_2(vec_sll,4,2)
1080 VEC_VI_VI_VU_2(vec_sll,1,4) VEC_VI_VI_VU_2(vec_sll,2,4) VEC_VI_VI_VU_2(vec_sll,4,4)
1081 VEC_VU_VU_VU_2(vec_sll,1,1) VEC_VU_VU_VU_2(vec_sll,2,1) VEC_VU_VU_VU_2(vec_sll,4,1)
1082 VEC_VU_VU_VU_2(vec_sll,1,2) VEC_VU_VU_VU_2(vec_sll,2,2) VEC_VU_VU_VU_2(vec_sll,4,2)
1083 VEC_VU_VU_VU_2(vec_sll,1,4) VEC_VU_VU_VU_2(vec_sll,2,4) VEC_VU_VU_VU_2(vec_sll,4,4)
1084 interface vec_sll
1085 procedure :: VI_VI_VU_2(vec_sll,1,1), VI_VI_VU_2(vec_sll,2,1), VI_VI_VU_2(vec_sll,4,1)
1086 procedure :: VI_VI_VU_2(vec_sll,1,2), VI_VI_VU_2(vec_sll,2,2), VI_VI_VU_2(vec_sll,4,2)
1087 procedure :: VI_VI_VU_2(vec_sll,1,4), VI_VI_VU_2(vec_sll,2,4), VI_VI_VU_2(vec_sll,4,4)
1088 procedure :: VU_VU_VU_2(vec_sll,1,1), VU_VU_VU_2(vec_sll,2,1), VU_VU_VU_2(vec_sll,4,1)
1089 procedure :: VU_VU_VU_2(vec_sll,1,2), VU_VU_VU_2(vec_sll,2,2), VU_VU_VU_2(vec_sll,4,2)
1090 procedure :: VU_VU_VU_2(vec_sll,1,4), VU_VU_VU_2(vec_sll,2,4), VU_VU_VU_2(vec_sll,4,4)
1091 end interface vec_sll
1092 public :: vec_sll
1094 ! vec_slo
1095 VEC_VI_VI_VU_2(vec_slo,1,1) VEC_VI_VI_VU_2(vec_slo,2,1) VEC_VI_VI_VU_2(vec_slo,4,1)
1096 VEC_VI_VI_VU_2(vec_slo,1,2) VEC_VI_VI_VU_2(vec_slo,2,2) VEC_VI_VI_VU_2(vec_slo,4,2)
1097 VEC_VU_VU_VU_2(vec_slo,1,1) VEC_VU_VU_VU_2(vec_slo,2,1) VEC_VU_VU_VU_2(vec_slo,4,1)
1098 VEC_VU_VU_VU_2(vec_slo,1,2) VEC_VU_VU_VU_2(vec_slo,2,2) VEC_VU_VU_VU_2(vec_slo,4,2)
1099 VEC_VR_VR_VU(vec_slo,4,1) VEC_VR_VR_VU(vec_slo,4,2)
1100 interface vec_slo
1101 procedure :: VI_VI_VU_2(vec_slo,1,1), VI_VI_VU_2(vec_slo,2,1), VI_VI_VU_2(vec_slo,4,1)
1102 procedure :: VI_VI_VU_2(vec_slo,1,2), VI_VI_VU_2(vec_slo,2,2), VI_VI_VU_2(vec_slo,4,2)
1103 procedure :: VU_VU_VU_2(vec_slo,1,1), VU_VU_VU_2(vec_slo,2,1), VU_VU_VU_2(vec_slo,4,1)
1104 procedure :: VU_VU_VU_2(vec_slo,1,2), VU_VU_VU_2(vec_slo,2,2), VU_VU_VU_2(vec_slo,4,2)
1105 procedure :: VR_VR_VU_2(vec_slo,4,1), VR_VR_VU_2(vec_slo,4,2)
1106 end interface vec_slo
1107 public :: vec_slo
1109 ! vec_sr
1110 VEC_VI_VI_VU(vec_sr,1) VEC_VI_VI_VU(vec_sr,2) VEC_VI_VI_VU(vec_sr,4) VEC_VI_VI_VU(vec_sr,8)
1111 VEC_VU_VU_VU(vec_sr,1) VEC_VU_VU_VU(vec_sr,2) VEC_VU_VU_VU(vec_sr,4) VEC_VU_VU_VU(vec_sr,8)
1112 interface vec_sr
1113 procedure :: VI_VI_VU(vec_sr,1), VI_VI_VU(vec_sr,2), VI_VI_VU(vec_sr,4), VI_VI_VU(vec_sr,8)
1114 procedure :: VU_VU_VU(vec_sr,1), VU_VU_VU(vec_sr,2), VU_VU_VU(vec_sr,4), VU_VU_VU(vec_sr,8)
1115 end interface vec_sr
1116 public :: vec_sr
1118 ! vec_srl
1119 VEC_VI_VI_VU_2(vec_srl,1,1) VEC_VI_VI_VU_2(vec_srl,2,1) VEC_VI_VI_VU_2(vec_srl,4,1)
1120 VEC_VI_VI_VU_2(vec_srl,1,2) VEC_VI_VI_VU_2(vec_srl,2,2) VEC_VI_VI_VU_2(vec_srl,4,2)
1121 VEC_VI_VI_VU_2(vec_srl,1,4) VEC_VI_VI_VU_2(vec_srl,2,4) VEC_VI_VI_VU_2(vec_srl,4,4)
1122 VEC_VU_VU_VU_2(vec_srl,1,1) VEC_VU_VU_VU_2(vec_srl,2,1) VEC_VU_VU_VU_2(vec_srl,4,1)
1123 VEC_VU_VU_VU_2(vec_srl,1,2) VEC_VU_VU_VU_2(vec_srl,2,2) VEC_VU_VU_VU_2(vec_srl,4,2)
1124 VEC_VU_VU_VU_2(vec_srl,1,4) VEC_VU_VU_VU_2(vec_srl,2,4) VEC_VU_VU_VU_2(vec_srl,4,4)
1125 interface vec_srl
1126 procedure :: VI_VI_VU_2(vec_srl,1,1), VI_VI_VU_2(vec_srl,2,1), VI_VI_VU_2(vec_srl,4,1)
1127 procedure :: VI_VI_VU_2(vec_srl,1,2), VI_VI_VU_2(vec_srl,2,2), VI_VI_VU_2(vec_srl,4,2)
1128 procedure :: VI_VI_VU_2(vec_srl,1,4), VI_VI_VU_2(vec_srl,2,4), VI_VI_VU_2(vec_srl,4,4)
1129 procedure :: VU_VU_VU_2(vec_srl,1,1), VU_VU_VU_2(vec_srl,2,1), VU_VU_VU_2(vec_srl,4,1)
1130 procedure :: VU_VU_VU_2(vec_srl,1,2), VU_VU_VU_2(vec_srl,2,2), VU_VU_VU_2(vec_srl,4,2)
1131 procedure :: VU_VU_VU_2(vec_srl,1,4), VU_VU_VU_2(vec_srl,2,4), VU_VU_VU_2(vec_srl,4,4)
1132 end interface vec_srl
1133 public :: vec_srl
1135 ! vec_sro
1136 VEC_VI_VI_VU_2(vec_sro,1,1) VEC_VI_VI_VU_2(vec_sro,2,1) VEC_VI_VI_VU_2(vec_sro,4,1)
1137 VEC_VI_VI_VU_2(vec_sro,1,2) VEC_VI_VI_VU_2(vec_sro,2,2) VEC_VI_VI_VU_2(vec_sro,4,2)
1138 VEC_VU_VU_VU_2(vec_sro,1,1) VEC_VU_VU_VU_2(vec_sro,2,1) VEC_VU_VU_VU_2(vec_sro,4,1)
1139 VEC_VU_VU_VU_2(vec_sro,1,2) VEC_VU_VU_VU_2(vec_sro,2,2) VEC_VU_VU_VU_2(vec_sro,4,2)
1140 VEC_VR_VR_VU(vec_sro,4,1) VEC_VR_VR_VU(vec_sro,4,2)
1141 interface vec_sro
1142 procedure :: VI_VI_VU_2(vec_sro,1,1), VI_VI_VU_2(vec_sro,2,1), VI_VI_VU_2(vec_sro,4,1)
1143 procedure :: VI_VI_VU_2(vec_sro,1,2), VI_VI_VU_2(vec_sro,2,2), VI_VI_VU_2(vec_sro,4,2)
1144 procedure :: VU_VU_VU_2(vec_sro,1,1), VU_VU_VU_2(vec_sro,2,1), VU_VU_VU_2(vec_sro,4,1)
1145 procedure :: VU_VU_VU_2(vec_sro,1,2), VU_VU_VU_2(vec_sro,2,2), VU_VU_VU_2(vec_sro,4,2)
1146 procedure :: VR_VR_VU_2(vec_sro,4,1), VR_VR_VU_2(vec_sro,4,2)
1147 end interface vec_sro
1148 public :: vec_sro
1150 ! vec_xor
1151 VEC_VI_VI_VI(vec_xor,1) VEC_VI_VI_VI(vec_xor,2) VEC_VI_VI_VI(vec_xor,4) VEC_VI_VI_VI(vec_xor,8)
1152 VEC_VU_VU_VU(vec_xor,1) VEC_VU_VU_VU(vec_xor,2) VEC_VU_VU_VU(vec_xor,4) VEC_VU_VU_VU(vec_xor,8)
1153 VEC_VR_VR_VR(vec_xor,4) VEC_VR_VR_VR(vec_xor,8)
1154 interface vec_xor
1155 procedure :: VI_VI_VI(vec_xor,1), VI_VI_VI(vec_xor,2), VI_VI_VI(vec_xor,4), VI_VI_VI(vec_xor,8)
1156 procedure :: VU_VU_VU(vec_xor,1), VU_VU_VU(vec_xor,2), VU_VU_VU(vec_xor,4), VU_VU_VU(vec_xor,8)
1157 procedure :: VR_VR_VR(vec_xor,4), VR_VR_VR(vec_xor,8)
1158 end interface vec_xor
1159 public :: vec_xor
1161 #undef VEC_VU_VR_VR
1162 #undef VEC_VR_VR_VR
1163 #undef VEC_VU_VU_VU
1164 #undef VEC_VU_VU_VU_2
1165 #undef VEC_VI_VI_VI
1166 #undef VEC_VU_VI_VI
1167 #undef VEC_VI_VI_VU
1168 #undef VEC_VI_VI_VU_2
1169 #undef VU_VR_VR
1170 #undef VR_VR_VU_2
1171 #undef VR_VR_VR
1172 #undef VU_VU_VU
1173 #undef VU_VU_VU_2
1174 #undef VI_VI_VU
1175 #undef VI_VI_VU_2
1176 #undef VU_VI_VI
1177 #undef VI_VI_VI
1179 !-------------------------------------------------------
1180 ! vector(unsigned(1)) function(integer, i/r)
1181 !-------------------------------------------------------
1182 #define VU1_I0_I(NAME, KIND) __ppc_##NAME##_vu1i0i##KIND
1183 #define VU1_I0_R(NAME, KIND) __ppc_##NAME##_vu1i0r##KIND
1185 #define VEC_VU1_I0_I(NAME, KIND) \
1186 procedure(func_vu1i0i##KIND) :: VU1_I0_I(NAME, KIND);
1187 #define VEC_VU1_I0_R(NAME, KIND) \
1188 procedure(func_vu1i0r##KIND) :: VU1_I0_R(NAME, KIND);
1190 ! vec_lvsl
1191 VEC_VU1_I0_I(vec_lvsl,1) VEC_VU1_I0_I(vec_lvsl,2) VEC_VU1_I0_I(vec_lvsl,4)
1192 VEC_VU1_I0_R(vec_lvsl,4)
1193 interface vec_lvsl
1194 procedure :: VU1_I0_I(vec_lvsl,1), VU1_I0_I(vec_lvsl,2), VU1_I0_I(vec_lvsl,4)
1195 procedure :: VU1_I0_R(vec_lvsl,4)
1196 end interface
1197 public :: vec_lvsl
1199 ! vec_lvsr
1200 VEC_VU1_I0_I(vec_lvsr,1) VEC_VU1_I0_I(vec_lvsr,2) VEC_VU1_I0_I(vec_lvsr,4)
1201 VEC_VU1_I0_R(vec_lvsr,4)
1202 interface vec_lvsr
1203 procedure :: VU1_I0_I(vec_lvsr,1), VU1_I0_I(vec_lvsr,2), VU1_I0_I(vec_lvsr,4)
1204 procedure :: VU1_I0_R(vec_lvsr,4)
1205 end interface
1206 public :: vec_lvsr
1208 #undef VEC_VU1_I0_R
1209 #undef VEC_VU1_I0_I
1210 #undef VU1_I0_R
1211 #undef VU1_I0_I
1213 !-------------------------------------------------------
1214 ! vector function(integer, i/u/r/vector)
1215 !-------------------------------------------------------
1216 ! i0 means the integer argument has ignore_tkr(k)
1217 #define VI_I0_VI(NAME, VKIND) __ppc_##NAME##_vi##VKIND##i0##vi##VKIND
1218 #define VU_I0_VU(NAME, VKIND) __ppc_##NAME##_vu##VKIND##i0##vu##VKIND
1219 #define VR_I0_VR(NAME, VKIND) __ppc_##NAME##_vr##VKIND##i0##vr##VKIND
1220 #define VI_I0_I(NAME, VKIND) __ppc_##NAME##_vi##VKIND##i0##i##VKIND
1221 #define VR_I0_R(NAME, VKIND) __ppc_##NAME##_vr##VKIND##i0##r##VKIND
1223 #define VEC_VI_I0_VI(NAME, VKIND) \
1224 procedure(func_vi##VKIND##i0##vi##VKIND) :: VI_I0_VI(NAME, VKIND);
1225 #define VEC_VU_I0_VU(NAME, VKIND) \
1226 procedure(func_vu##VKIND##i0##vu##VKIND) :: VU_I0_VU(NAME, VKIND);
1227 #define VEC_VR_I0_VR(NAME, VKIND) \
1228 procedure(func_vr##VKIND##i0##vr##VKIND) :: VR_I0_VR(NAME, VKIND);
1229 #define VEC_VI_I0_I(NAME, VKIND) \
1230 procedure(func_vi##VKIND##i0##i##VKIND) :: VI_I0_I(NAME, VKIND);
1231 #define VEC_VR_I0_R(NAME, VKIND) \
1232 procedure(func_vr##VKIND##i0##r##VKIND) :: VR_I0_R(NAME, VKIND);
1234 ! vec_ld
1235 VEC_VI_I0_VI(vec_ld,1) VEC_VI_I0_VI(vec_ld,2) VEC_VI_I0_VI(vec_ld,4)
1236 VEC_VU_I0_VU(vec_ld,1) VEC_VU_I0_VU(vec_ld,2) VEC_VU_I0_VU(vec_ld,4)
1237 VEC_VR_I0_VR(vec_ld,4)
1238 VEC_VI_I0_I(vec_ld,1) VEC_VI_I0_I(vec_ld,2) VEC_VI_I0_I(vec_ld,4)
1239 VEC_VR_I0_R(vec_ld,4)
1240 interface vec_ld
1241 procedure :: VI_I0_VI(vec_ld,1), VI_I0_VI(vec_ld,2), VI_I0_VI(vec_ld,4)
1242 procedure :: VU_I0_VU(vec_ld,1), VU_I0_VU(vec_ld,2), VU_I0_VU(vec_ld,4)
1243 procedure :: VR_I0_VR(vec_ld,4)
1244 procedure :: VI_I0_I(vec_ld,1), VI_I0_I(vec_ld,2), VI_I0_I(vec_ld,4)
1245 procedure :: VR_I0_R(vec_ld,4)
1246 end interface
1247 public :: vec_ld
1249 ! vec_lde
1250 VEC_VI_I0_I(vec_lde,1) VEC_VI_I0_I(vec_lde,2) VEC_VI_I0_I(vec_lde,4)
1251 VEC_VR_I0_R(vec_lde,4)
1252 interface vec_lde
1253 procedure :: VI_I0_I(vec_lde,1), VI_I0_I(vec_lde,2), VI_I0_I(vec_lde,4)
1254 procedure :: VR_I0_R(vec_lde,4)
1255 end interface
1256 public :: vec_lde
1258 ! vec_ldl
1259 VEC_VI_I0_VI(vec_ldl,1) VEC_VI_I0_VI(vec_ldl,2) VEC_VI_I0_VI(vec_ldl,4)
1260 VEC_VU_I0_VU(vec_ldl,1) VEC_VU_I0_VU(vec_ldl,2) VEC_VU_I0_VU(vec_ldl,4)
1261 VEC_VR_I0_VR(vec_ldl,4)
1262 VEC_VI_I0_I(vec_ldl,1) VEC_VI_I0_I(vec_ldl,2) VEC_VI_I0_I(vec_ldl,4)
1263 VEC_VR_I0_R(vec_ldl,4)
1264 interface vec_ldl
1265 procedure :: VI_I0_VI(vec_ldl,1), VI_I0_VI(vec_ldl,2), VI_I0_VI(vec_ldl,4)
1266 procedure :: VU_I0_VU(vec_ldl,1), VU_I0_VU(vec_ldl,2), VU_I0_VU(vec_ldl,4)
1267 procedure :: VR_I0_VR(vec_ldl,4)
1268 procedure :: VI_I0_I(vec_ldl,1), VI_I0_I(vec_ldl,2), VI_I0_I(vec_ldl,4)
1269 procedure :: VR_I0_R(vec_ldl,4)
1270 end interface
1271 public :: vec_ldl
1273 ! vec_lxv
1274 VEC_VI_I0_VI(vec_lxv,1) VEC_VI_I0_VI(vec_lxv,2) VEC_VI_I0_VI(vec_lxv,4) VEC_VI_I0_VI(vec_lxv,8)
1275 VEC_VU_I0_VU(vec_lxv,1) VEC_VU_I0_VU(vec_lxv,2) VEC_VU_I0_VU(vec_lxv,4) VEC_VU_I0_VU(vec_lxv,8)
1276 VEC_VR_I0_VR(vec_lxv,4) VEC_VR_I0_VR(vec_lxv,8)
1277 VEC_VI_I0_I(vec_lxv,1) VEC_VI_I0_I(vec_lxv,2) VEC_VI_I0_I(vec_lxv,4) VEC_VI_I0_I(vec_lxv,8)
1278 VEC_VR_I0_R(vec_lxv,4) VEC_VR_I0_R(vec_lxv,8)
1279 interface vec_lxv
1280 procedure :: VI_I0_VI(vec_lxv,1), VI_I0_VI(vec_lxv,2), VI_I0_VI(vec_lxv,4), VI_I0_VI(vec_lxv,8)
1281 procedure :: VU_I0_VU(vec_lxv,1), VU_I0_VU(vec_lxv,2), VU_I0_VU(vec_lxv,4), VU_I0_VU(vec_lxv,8)
1282 procedure :: VR_I0_VR(vec_lxv,4), VR_I0_VR(vec_lxv,8)
1283 procedure :: VI_I0_I(vec_lxv,1), VI_I0_I(vec_lxv,2), VI_I0_I(vec_lxv,4), VI_I0_I(vec_lxv,8)
1284 procedure :: VR_I0_R(vec_lxv,4), VR_I0_R(vec_lxv,8)
1285 end interface
1286 public :: vec_lxv
1288 ! vec_xl
1289 VEC_VI_I0_VI(vec_xl,1) VEC_VI_I0_VI(vec_xl,2) VEC_VI_I0_VI(vec_xl,4) VEC_VI_I0_VI(vec_xl,8)
1290 VEC_VU_I0_VU(vec_xl,1) VEC_VU_I0_VU(vec_xl,2) VEC_VU_I0_VU(vec_xl,4) VEC_VU_I0_VU(vec_xl,8)
1291 VEC_VR_I0_VR(vec_xl,4) VEC_VR_I0_VR(vec_xl,8)
1292 VEC_VI_I0_I(vec_xl,1) VEC_VI_I0_I(vec_xl,2) VEC_VI_I0_I(vec_xl,4) VEC_VI_I0_I(vec_xl,8)
1293 VEC_VR_I0_R(vec_xl,4) VEC_VR_I0_R(vec_xl,8)
1294 interface vec_xl
1295 procedure :: VI_I0_VI(vec_xl,1), VI_I0_VI(vec_xl,2), VI_I0_VI(vec_xl,4), VI_I0_VI(vec_xl,8)
1296 procedure :: VU_I0_VU(vec_xl,1), VU_I0_VU(vec_xl,2), VU_I0_VU(vec_xl,4), VU_I0_VU(vec_xl,8)
1297 procedure :: VR_I0_VR(vec_xl,4), VR_I0_VR(vec_xl,8)
1298 procedure :: VI_I0_I(vec_xl,1), VI_I0_I(vec_xl,2), VI_I0_I(vec_xl,4), VI_I0_I(vec_xl,8)
1299 procedure :: VR_I0_R(vec_xl,4), VR_I0_R(vec_xl,8)
1300 end interface
1301 public :: vec_xl
1303 ! vec_xl_be
1304 VEC_VI_I0_VI(vec_xl_be,1) VEC_VI_I0_VI(vec_xl_be,2) VEC_VI_I0_VI(vec_xl_be,4) VEC_VI_I0_VI(vec_xl_be,8)
1305 VEC_VU_I0_VU(vec_xl_be,1) VEC_VU_I0_VU(vec_xl_be,2) VEC_VU_I0_VU(vec_xl_be,4) VEC_VU_I0_VU(vec_xl_be,8)
1306 VEC_VR_I0_VR(vec_xl_be,4) VEC_VR_I0_VR(vec_xl_be,8)
1307 VEC_VI_I0_I(vec_xl_be,1) VEC_VI_I0_I(vec_xl_be,2) VEC_VI_I0_I(vec_xl_be,4) VEC_VI_I0_I(vec_xl_be,8)
1308 VEC_VR_I0_R(vec_xl_be,4) VEC_VR_I0_R(vec_xl_be,8)
1309 interface vec_xl_be
1310 procedure :: VI_I0_VI(vec_xl_be,1), VI_I0_VI(vec_xl_be,2), VI_I0_VI(vec_xl_be,4), VI_I0_VI(vec_xl_be,8)
1311 procedure :: VU_I0_VU(vec_xl_be,1), VU_I0_VU(vec_xl_be,2), VU_I0_VU(vec_xl_be,4), VU_I0_VU(vec_xl_be,8)
1312 procedure :: VR_I0_VR(vec_xl_be,4), VR_I0_VR(vec_xl_be,8)
1313 procedure :: VI_I0_I(vec_xl_be,1), VI_I0_I(vec_xl_be,2), VI_I0_I(vec_xl_be,4) , VI_I0_I(vec_xl_be,8)
1314 procedure :: VR_I0_R(vec_xl_be,4), VR_I0_R(vec_xl_be,8)
1315 end interface
1316 public :: vec_xl_be
1318 ! vec_xld2
1319 VEC_VI_I0_VI(vec_xld2_,1) VEC_VI_I0_VI(vec_xld2_,2) VEC_VI_I0_VI(vec_xld2_,4) VEC_VI_I0_VI(vec_xld2_,8)
1320 VEC_VU_I0_VU(vec_xld2_,1) VEC_VU_I0_VU(vec_xld2_,2) VEC_VU_I0_VU(vec_xld2_,4) VEC_VU_I0_VU(vec_xld2_,8)
1321 VEC_VR_I0_VR(vec_xld2_,4) VEC_VR_I0_VR(vec_xld2_,8)
1322 VEC_VI_I0_I(vec_xld2_,1) VEC_VI_I0_I(vec_xld2_,2) VEC_VI_I0_I(vec_xld2_,4) VEC_VI_I0_I(vec_xld2_,8)
1323 VEC_VR_I0_R(vec_xld2_,4) VEC_VR_I0_R(vec_xld2_,8)
1324 interface vec_xld2
1325 procedure :: VI_I0_VI(vec_xld2_,1), VI_I0_VI(vec_xld2_,2), VI_I0_VI(vec_xld2_,4), VI_I0_VI(vec_xld2_,8)
1326 procedure :: VU_I0_VU(vec_xld2_,1), VU_I0_VU(vec_xld2_,2), VU_I0_VU(vec_xld2_,4), VU_I0_VU(vec_xld2_,8)
1327 procedure :: VR_I0_VR(vec_xld2_,4), VR_I0_VR(vec_xld2_,8)
1328 procedure :: VI_I0_I(vec_xld2_,1), VI_I0_I(vec_xld2_,2), VI_I0_I(vec_xld2_,4), VI_I0_I(vec_xld2_,8)
1329 procedure :: VR_I0_R(vec_xld2_,4), VR_I0_R(vec_xld2_,8)
1330 end interface
1331 public :: vec_xld2
1333 ! vec_xlds
1334 VEC_VI_I0_VI(vec_xlds,8)
1335 VEC_VU_I0_VU(vec_xlds,8)
1336 VEC_VR_I0_VR(vec_xlds,8)
1337 VEC_VI_I0_I(vec_xlds,8)
1338 VEC_VR_I0_R(vec_xlds,8)
1339 interface vec_xlds
1340 procedure :: VI_I0_VI(vec_xlds,8)
1341 procedure :: VU_I0_VU(vec_xlds,8)
1342 procedure :: VR_I0_VR(vec_xlds,8)
1343 procedure :: VI_I0_I(vec_xlds,8)
1344 procedure :: VR_I0_R(vec_xlds,8)
1345 end interface
1346 public :: vec_xlds
1348 ! vec_xlw4
1349 VEC_VI_I0_VI(vec_xlw4_,1) VEC_VI_I0_VI(vec_xlw4_,2)
1350 VEC_VU_I0_VU(vec_xlw4_,1) VEC_VU_I0_VU(vec_xlw4_,2) VEC_VU_I0_VU(vec_xlw4_,4)
1351 VEC_VR_I0_VR(vec_xlw4_,4)
1352 VEC_VI_I0_I(vec_xlw4_,1) VEC_VI_I0_I(vec_xlw4_,2) VEC_VI_I0_I(vec_xlw4_,4)
1353 VEC_VR_I0_R(vec_xlw4_,4)
1354 interface vec_xlw4
1355 procedure :: VI_I0_VI(vec_xlw4_,1), VI_I0_VI(vec_xlw4_,2)
1356 procedure :: VU_I0_VU(vec_xlw4_,1), VU_I0_VU(vec_xlw4_,2), VU_I0_VU(vec_xlw4_,4)
1357 procedure :: VR_I0_VR(vec_xlw4_,4)
1358 procedure :: VI_I0_I(vec_xlw4_,1), VI_I0_I(vec_xlw4_,2), VI_I0_I(vec_xlw4_,4)
1359 procedure :: VR_I0_R(vec_xlw4_,4)
1360 end interface
1361 public :: vec_xlw4
1363 #undef VEC_VR_I0_R
1364 #undef VEC_VI_I0_I
1365 #undef VEC_VR_I0_VR
1366 #undef VEC_VU_I0_VU
1367 #undef VEC_VI_I0_VI
1368 #undef VR_I0_R
1369 #undef VI_I0_I
1370 #undef VR_I0_VR
1371 #undef VU_I0_VU
1372 #undef VI_I0_VI
1374 !-------------------------------------------------------
1375 ! __vector_pair function(integer, vector/__vector_pair)
1376 !-------------------------------------------------------
1377 #define VP_I0_VI(NAME, VKIND) __ppc_##NAME##_vpi0##vi##VKIND
1378 #define VP_I0_VU(NAME, VKIND) __ppc_##NAME##_vpi0##vu##VKIND
1379 #define VP_I0_VR(NAME, VKIND) __ppc_##NAME##_vpi0##vr##VKIND
1380 #define VP_I0_VP(NAME) __ppc_##NAME##_vpi0vp0
1382 #define VEC_VP_I0_VI(NAME, VKIND) \
1383 procedure(func_vpi0vi##VKIND) :: VP_I0_VI(NAME, VKIND);
1384 #define VEC_VP_I0_VU(NAME, VKIND) \
1385 procedure(func_vpi0vu##VKIND) :: VP_I0_VU(NAME, VKIND);
1386 #define VEC_VP_I0_VR(NAME, VKIND) \
1387 procedure(func_vpi0vr##VKIND) :: VP_I0_VR(NAME, VKIND);
1388 #define VEC_VP_I0_VP(NAME) procedure(func_vpi0vp) :: VP_I0_VP(NAME);
1390 ! vec_lxvp
1391 VEC_VP_I0_VI(vec_lxvp,1) VEC_VP_I0_VI(vec_lxvp,2) VEC_VP_I0_VI(vec_lxvp,4) VEC_VP_I0_VI(vec_lxvp,8)
1392 VEC_VP_I0_VU(vec_lxvp,1) VEC_VP_I0_VU(vec_lxvp,2) VEC_VP_I0_VU(vec_lxvp,4) VEC_VP_I0_VU(vec_lxvp,8)
1393 VEC_VP_I0_VR(vec_lxvp,4) VEC_VP_I0_VR(vec_lxvp,8)
1394 VEC_VP_I0_VP(vec_lxvp)
1395 interface vec_lxvp
1396 procedure :: VP_I0_VI(vec_lxvp,1), VP_I0_VI(vec_lxvp,2), VP_I0_VI(vec_lxvp,4), VP_I0_VI(vec_lxvp,8)
1397 procedure :: VP_I0_VU(vec_lxvp,1), VP_I0_VU(vec_lxvp,2), VP_I0_VU(vec_lxvp,4), VP_I0_VU(vec_lxvp,8)
1398 procedure :: VP_I0_VR(vec_lxvp,4), VP_I0_VR(vec_lxvp,8)
1399 procedure :: VP_I0_VP(vec_lxvp)
1400 end interface vec_lxvp
1401 public :: vec_lxvp
1403 ! vsx_lxvp (alias to vec_lxvp)
1404 interface vsx_lxvp
1405 procedure :: VP_I0_VI(vec_lxvp,1), VP_I0_VI(vec_lxvp,2), VP_I0_VI(vec_lxvp,4), VP_I0_VI(vec_lxvp,8)
1406 procedure :: VP_I0_VU(vec_lxvp,1), VP_I0_VU(vec_lxvp,2), VP_I0_VU(vec_lxvp,4), VP_I0_VU(vec_lxvp,8)
1407 procedure :: VP_I0_VR(vec_lxvp,4), VP_I0_VR(vec_lxvp,8)
1408 procedure :: VP_I0_VP(vec_lxvp)
1409 end interface vsx_lxvp
1410 public :: vsx_lxvp
1412 #undef VEC_VP_I0_VP
1413 #undef VEC_VP_I0_VR
1414 #undef VEC_VP_I0_VU
1415 #undef VEC_VP_I0_VI
1416 #undef VP_I0_VP
1417 #undef VP_I0_VR
1418 #undef VP_I0_VU
1419 #undef VP_I0_VI
1421 !-----------------------------------------
1422 ! vector function(vector, vector, vector)
1423 !-----------------------------------------
1424 #define VR_VR_VR_VR(NAME, VKIND) __ppc_##NAME##_vr##VKIND##vr##VKIND##vr##VKIND##vr##VKIND
1425 #define VI_VI_VI_VU_2(NAME, VKIND, UKIND) __ppc_##NAME##_vi##VKIND##vi##VKIND##vi##VKIND##vu##UKIND
1426 #define VI_VI_VI_VU(NAME, VKIND) VI_VI_VI_VU_2(NAME, VKIND, VKIND)
1427 #define VU_VU_VU_VU_2(NAME, VKIND, UKIND) __ppc_##NAME##_vu##VKIND##vu##VKIND##vu##VKIND##vu##UKIND
1428 #define VU_VU_VU_VU(NAME, VKIND) VU_VU_VU_VU_2(NAME, VKIND, VKIND)
1429 #define VR_VR_VR_VU_2(NAME, VKIND, UKIND) __ppc_##NAME##_vr##VKIND##vr##VKIND##vr##VKIND##vu##UKIND
1430 #define VR_VR_VR_VU(NAME, VKIND) VR_VR_VR_VU_2(NAME, VKIND, VKIND)
1431 ! i0 indicates "!dir$ ignore_tkr(k) arg3"
1432 #define VI_VI_VI_I(NAME, VKIND) __ppc_##NAME##_vi##VKIND##vi##VKIND##vi##VKIND##i0
1433 #define VU_VU_VU_I(NAME, VKIND) __ppc_##NAME##_vu##VKIND##vu##VKIND##vu##VKIND##i0
1434 #define VR_VR_VR_I(NAME, VKIND) __ppc_##NAME##_vr##VKIND##vr##VKIND##vr##VKIND##i0
1436 #define VEC_VR_VR_VR_VR(NAME, VKIND) \
1437 procedure(elem_func_vr##VKIND##vr##VKIND##vr##VKIND##vr##VKIND) :: VR_VR_VR_VR(NAME, VKIND);
1438 #define VEC_VI_VI_VI_VU_2(NAME, VKIND, UKIND) \
1439 procedure(elem_func_vi##VKIND##vi##VKIND##vi##VKIND##vu##UKIND) :: VI_VI_VI_VU_2(NAME, VKIND, UKIND);
1440 #define VEC_VI_VI_VI_VU(NAME, VKIND) VEC_VI_VI_VI_VU_2(NAME, VKIND, VKIND)
1441 #define VEC_VU_VU_VU_VU_2(NAME, VKIND, UKIND) \
1442 procedure(elem_func_vu##VKIND##vu##VKIND##vu##VKIND##vu##UKIND) :: VU_VU_VU_VU_2(NAME, VKIND, UKIND);
1443 #define VEC_VU_VU_VU_VU(NAME, VKIND) VEC_VU_VU_VU_VU_2(NAME, VKIND, VKIND)
1444 #define VEC_VR_VR_VR_VU_2(NAME, VKIND, UKIND) \
1445 procedure(elem_func_vr##VKIND##vr##VKIND##vr##VKIND##vu##UKIND) :: VR_VR_VR_VU_2(NAME, VKIND, UKIND);
1446 #define VEC_VR_VR_VR_VU(NAME, VKIND) VEC_VR_VR_VR_VU_2(NAME, VKIND, VKIND)
1447 #define VEC_VI_VI_VI_I(NAME, VKIND) \
1448 procedure(elem_func_vi##VKIND##vi##VKIND##vi##VKIND##i) :: VI_VI_VI_I(NAME, VKIND);
1449 #define VEC_VU_VU_VU_I(NAME, VKIND) \
1450 procedure(elem_func_vu##VKIND##vu##VKIND##vu##VKIND##i) :: VU_VU_VU_I(NAME, VKIND);
1451 #define VEC_VR_VR_VR_I(NAME, VKIND) \
1452 procedure(elem_func_vr##VKIND##vr##VKIND##vr##VKIND##i) :: VR_VR_VR_I(NAME, VKIND);
1454 ! vec_madd
1455 VEC_VR_VR_VR_VR(vec_madd,4) VEC_VR_VR_VR_VR(vec_madd,8)
1456 interface vec_madd
1457 procedure :: VR_VR_VR_VR(vec_madd,4), VR_VR_VR_VR(vec_madd,8)
1458 end interface vec_madd
1459 public :: vec_madd
1461 ! vec_msub
1462 VEC_VR_VR_VR_VR(vec_msub,4) VEC_VR_VR_VR_VR(vec_msub,8)
1463 interface vec_msub
1464 procedure :: VR_VR_VR_VR(vec_msub,4), VR_VR_VR_VR(vec_msub,8)
1465 end interface vec_msub
1466 public :: vec_msub
1468 ! vec_nmadd
1469 VEC_VR_VR_VR_VR(vec_nmadd,4) VEC_VR_VR_VR_VR(vec_nmadd,8)
1470 interface vec_nmadd
1471 procedure :: VR_VR_VR_VR(vec_nmadd,4), VR_VR_VR_VR(vec_nmadd,8)
1472 end interface vec_nmadd
1473 public :: vec_nmadd
1475 ! vec_nmsub
1476 VEC_VR_VR_VR_VR(vec_nmsub,4) VEC_VR_VR_VR_VR(vec_nmsub,8)
1477 interface vec_nmsub
1478 procedure :: VR_VR_VR_VR(vec_nmsub,4), VR_VR_VR_VR(vec_nmsub,8)
1479 end interface vec_nmsub
1480 public :: vec_nmsub
1482 ! vec_perm
1483 VEC_VI_VI_VI_VU_2(vec_perm,1,1) VEC_VI_VI_VI_VU_2(vec_perm,2,1) VEC_VI_VI_VI_VU_2(vec_perm,4,1) VEC_VI_VI_VI_VU_2(vec_perm,8,1)
1484 VEC_VU_VU_VU_VU_2(vec_perm,1,1) VEC_VU_VU_VU_VU_2(vec_perm,2,1) VEC_VU_VU_VU_VU_2(vec_perm,4,1) VEC_VU_VU_VU_VU_2(vec_perm,8,1)
1485 VEC_VR_VR_VR_VU_2(vec_perm,4,1) VEC_VR_VR_VR_VU_2(vec_perm,8,1)
1486 interface vec_perm
1487 procedure :: VI_VI_VI_VU_2(vec_perm,1,1), VI_VI_VI_VU_2(vec_perm,2,1), VI_VI_VI_VU_2(vec_perm,4,1), VI_VI_VI_VU_2(vec_perm,8,1)
1488 procedure :: VU_VU_VU_VU_2(vec_perm,1,1), VU_VU_VU_VU_2(vec_perm,2,1), VU_VU_VU_VU_2(vec_perm,4,1), VU_VU_VU_VU_2(vec_perm,8,1)
1489 procedure :: VR_VR_VR_VU_2(vec_perm,4,1), VR_VR_VR_VU_2(vec_perm,8,1)
1490 end interface vec_perm
1491 public :: vec_perm
1493 ! vec_permi
1494 VEC_VI_VI_VI_I(vec_permi,8)
1495 VEC_VU_VU_VU_I(vec_permi,8)
1496 VEC_VR_VR_VR_I(vec_permi,4) VEC_VR_VR_VR_I(vec_permi,8)
1497 interface vec_permi
1498 procedure :: VI_VI_VI_I(vec_permi,8)
1499 procedure :: VU_VU_VU_I(vec_permi,8)
1500 procedure :: VR_VR_VR_I(vec_permi,4), VR_VR_VR_I(vec_permi,8)
1501 end interface vec_permi
1502 public :: vec_permi
1504 ! vec_sel
1505 VEC_VI_VI_VI_VU(vec_sel,1) VEC_VI_VI_VI_VU(vec_sel,2) VEC_VI_VI_VI_VU(vec_sel,4) VEC_VI_VI_VI_VU(vec_sel,8)
1506 VEC_VU_VU_VU_VU(vec_sel,1) VEC_VU_VU_VU_VU(vec_sel,2) VEC_VU_VU_VU_VU(vec_sel,4) VEC_VU_VU_VU_VU(vec_sel,8)
1507 VEC_VR_VR_VR_VU(vec_sel,4) VEC_VR_VR_VR_VU(vec_sel,8)
1508 interface vec_sel
1509 procedure :: VI_VI_VI_VU(vec_sel,1), VI_VI_VI_VU(vec_sel,2), VI_VI_VI_VU(vec_sel,4), VI_VI_VI_VU(vec_sel,8)
1510 procedure :: VU_VU_VU_VU(vec_sel,1), VU_VU_VU_VU(vec_sel,2), VU_VU_VU_VU(vec_sel,4), VU_VU_VU_VU(vec_sel,8)
1511 procedure :: VR_VR_VR_VU(vec_sel,4), VR_VR_VR_VU(vec_sel,8)
1512 end interface vec_sel
1513 public :: vec_sel
1515 #undef VEC_VR_VR_VR_I
1516 #undef VEC_VU_VU_VU_I
1517 #undef VEC_VI_VI_VI_I
1518 #undef VEC_VI_VI_VI_VU_2
1519 #undef VEC_VI_VI_VI_VU
1520 #undef VEC_VU_VU_VU_VU_2
1521 #undef VEC_VU_VU_VU_VU
1522 #undef VEC_VR_VR_VR_VU_2
1523 #undef VEC_VR_VR_VR_VU
1524 #undef VEC_VR_VR_VR_VR
1525 #undef VR_VR_VR_I
1526 #undef VU_VU_VU_I
1527 #undef VI_VI_VI_I
1528 #undef VI_VI_VI_VU
1529 #undef VI_VI_VI_VU_2
1530 #undef VU_VU_VU_VU
1531 #undef VU_VU_VU_VU_2
1532 #undef VR_VR_VR_VU
1533 #undef VR_VR_VR_VU_2
1534 #undef VR_VR_VR_VR
1536 !------------------------------------------
1537 ! vector function(integer, vector, integer)
1538 ! vector function(real, vector, integer)
1539 !------------------------------------------
1540 #define VI_I_VI_I(NAME, VKIND) __ppc_##NAME##_vi##VKIND##i##VKIND##vi##VKIND##i0
1541 #define VR_R_VR_I(NAME, VKIND) __ppc_##NAME##_vr##VKIND##r##VKIND##vr##VKIND##i0
1543 #define VEC_VI_I_VI_I(NAME, VKIND) \
1544 procedure(elem_func_vi##VKIND##i##VKIND##vi##VKIND##i) :: VI_I_VI_I(NAME, VKIND);
1545 #define VEC_VR_R_VR_I(NAME, VKIND) \
1546 procedure(elem_func_vr##VKIND##r##VKIND##vr##VKIND##i) :: VR_R_VR_I(NAME, VKIND);
1548 ! vec_insert
1549 VEC_VI_I_VI_I(vec_insert,1) VEC_VI_I_VI_I(vec_insert,2) VEC_VI_I_VI_I(vec_insert,4) VEC_VI_I_VI_I(vec_insert,8)
1550 VEC_VR_R_VR_I(vec_insert,4) VEC_VR_R_VR_I(vec_insert,8)
1551 interface vec_insert
1552 procedure :: VI_I_VI_I(vec_insert,1), VI_I_VI_I(vec_insert,2), VI_I_VI_I(vec_insert,4), VI_I_VI_I(vec_insert,8)
1553 procedure :: VR_R_VR_I(vec_insert,4), VR_R_VR_I(vec_insert,8)
1554 end interface vec_insert
1555 public :: vec_insert
1557 #undef VEC_VR_R_VR_I
1558 #undef VEC_VI_I_VI_I
1559 #undef VR_R_VR_I
1560 #undef VI_I_VI_I
1562 !----------------------------------
1563 ! integer function(vector, vector)
1564 !----------------------------------
1565 #define I_VI_VI(NAME, RKIND, VKIND) __ppc_##NAME##_i##RKIND##vi##VKIND##vi##VKIND
1566 #define I_VU_VU(NAME, RKIND, VKIND) __ppc_##NAME##_i##RKIND##vu##VKIND##vu##VKIND
1567 #define I_VR_VR(NAME, RKIND, VKIND) __ppc_##NAME##_i##RKIND##vr##VKIND##vr##VKIND
1569 #define VEC_I_VI_VI(NAME, RKIND, VKIND) \
1570 procedure(elem_func_i##RKIND##vi##VKIND##vi##VKIND) :: I_VI_VI(NAME, RKIND, VKIND);
1571 #define VEC_I_VU_VU(NAME, RKIND, VKIND) \
1572 procedure(elem_func_i##RKIND##vu##VKIND##vu##VKIND) :: I_VU_VU(NAME, RKIND, VKIND);
1573 #define VEC_I_VR_VR(NAME, RKIND, VKIND) \
1574 procedure(elem_func_i##RKIND##vr##VKIND##vr##VKIND) :: I_VR_VR(NAME, RKIND, VKIND);
1576 ! vec_any_ge
1577 VEC_I_VI_VI(vec_any_ge,4,1) VEC_I_VI_VI(vec_any_ge,4,2) VEC_I_VI_VI(vec_any_ge,4,4) VEC_I_VI_VI(vec_any_ge,4,8)
1578 VEC_I_VU_VU(vec_any_ge,4,1) VEC_I_VU_VU(vec_any_ge,4,2) VEC_I_VU_VU(vec_any_ge,4,4) VEC_I_VU_VU(vec_any_ge,4,8)
1579 VEC_I_VR_VR(vec_any_ge,4,4) VEC_I_VR_VR(vec_any_ge,4,8)
1580 interface vec_any_ge
1581 procedure :: I_VI_VI(vec_any_ge,4,1), I_VI_VI(vec_any_ge,4,2), I_VI_VI(vec_any_ge,4,4), I_VI_VI(vec_any_ge,4,8)
1582 procedure :: I_VU_VU(vec_any_ge,4,1), I_VU_VU(vec_any_ge,4,2), I_VU_VU(vec_any_ge,4,4), I_VU_VU(vec_any_ge,4,8)
1583 procedure :: I_VR_VR(vec_any_ge,4,4), I_VR_VR(vec_any_ge,4,8)
1584 end interface vec_any_ge
1585 public :: vec_any_ge
1587 #undef VEC_I_VR_VR
1588 #undef VEC_I_VU_VU
1589 #undef VEC_I_VI_VI
1590 #undef I_VR_VR
1591 #undef I_VU_VU
1592 #undef I_VI_VI
1594 !----------------------------------------
1595 ! integer/real function(vector, integer)
1596 !----------------------------------------
1597 #define I_VI_I(NAME, VKIND) __ppc_##NAME##_i##VKIND##vi##VKIND##i0
1598 #define R_VR_I(NAME, VKIND) __ppc_##NAME##_r##VKIND##vr##VKIND##i0
1600 #define VEC_I_VI_I(NAME, VKIND) \
1601 procedure(elem_func_i##VKIND##vi##VKIND##i) :: I_VI_I(NAME, VKIND);
1602 #define VEC_R_VR_I(NAME, VKIND) \
1603 procedure(elem_func_r##VKIND##vr##VKIND##i) :: R_VR_I(NAME, VKIND);
1605 ! vec_extract
1606 VEC_I_VI_I(vec_extract,1) VEC_I_VI_I(vec_extract,2) VEC_I_VI_I(vec_extract,4) VEC_I_VI_I(vec_extract,8)
1607 VEC_R_VR_I(vec_extract,4) VEC_R_VR_I(vec_extract,8)
1608 interface vec_extract
1609 procedure :: I_VI_I(vec_extract,1), I_VI_I(vec_extract,2), I_VI_I(vec_extract,4), I_VI_I(vec_extract,8)
1610 procedure :: R_VR_I(vec_extract,4), R_VR_I(vec_extract,8)
1611 end interface
1612 public :: vec_extract
1614 !------------------------------------------
1615 ! vector function(vector, vector, integer)
1616 !------------------------------------------
1617 ! i0 means the integer argument has ignore_tkr(k)
1618 #define VI_VI_VI_I(NAME, VKIND) __ppc_##NAME##_vi##VKIND##vi##VKIND##vi##VKIND##i0
1619 #define VU_VU_VU_I(NAME, VKIND) __ppc_##NAME##_vu##VKIND##vu##VKIND##vu##VKIND##i0
1620 #define VR_VR_VR_I(NAME, VKIND) __ppc_##NAME##_vr##VKIND##vr##VKIND##vr##VKIND##i0
1622 #define VEC_VI_VI_VI_I(NAME, VKIND) \
1623 procedure(elem_func_vi##VKIND##vi##VKIND##vi##VKIND##i) :: VI_VI_VI_I(NAME, VKIND);
1624 #define VEC_VU_VU_VU_I(NAME, VKIND) \
1625 procedure(elem_func_vu##VKIND##vu##VKIND##vu##VKIND##i) :: VU_VU_VU_I(NAME, VKIND);
1626 #define VEC_VR_VR_VR_I(NAME, VKIND) \
1627 procedure(elem_func_vr##VKIND##vr##VKIND##vr##VKIND##i) :: VR_VR_VR_I(NAME, VKIND);
1629 ! vec_sld
1630 VEC_VI_VI_VI_I(vec_sld,1) VEC_VI_VI_VI_I(vec_sld,2) VEC_VI_VI_VI_I(vec_sld,4) VEC_VI_VI_VI_I(vec_sld,8)
1631 VEC_VU_VU_VU_I(vec_sld,1) VEC_VU_VU_VU_I(vec_sld,2) VEC_VU_VU_VU_I(vec_sld,4) VEC_VU_VU_VU_I(vec_sld,8)
1632 VEC_VR_VR_VR_I(vec_sld,4) VEC_VR_VR_VR_I(vec_sld,8)
1633 interface vec_sld
1634 procedure :: VI_VI_VI_I(vec_sld,1), VI_VI_VI_I(vec_sld,2), VI_VI_VI_I(vec_sld,4), VI_VI_VI_I(vec_sld,8)
1635 procedure :: VU_VU_VU_I(vec_sld,1), VU_VU_VU_I(vec_sld,2), VU_VU_VU_I(vec_sld,4), VU_VU_VU_I(vec_sld,8)
1636 procedure :: VR_VR_VR_I(vec_sld,4), VR_VR_VR_I(vec_sld,8)
1637 end interface vec_sld
1638 public :: vec_sld
1640 ! vec_sldw
1641 VEC_VI_VI_VI_I(vec_sldw,1) VEC_VI_VI_VI_I(vec_sldw,2) VEC_VI_VI_VI_I(vec_sldw,4) VEC_VI_VI_VI_I(vec_sldw,8)
1642 VEC_VU_VU_VU_I(vec_sldw,1) VEC_VU_VU_VU_I(vec_sldw,2) VEC_VU_VU_VU_I(vec_sldw,4) VEC_VU_VU_VU_I(vec_sldw,8)
1643 VEC_VR_VR_VR_I(vec_sldw,4) VEC_VR_VR_VR_I(vec_sldw,8)
1644 interface vec_sldw
1645 procedure :: VI_VI_VI_I(vec_sldw,1), VI_VI_VI_I(vec_sldw,2), VI_VI_VI_I(vec_sldw,4), VI_VI_VI_I(vec_sldw,8)
1646 procedure :: VU_VU_VU_I(vec_sldw,1), VU_VU_VU_I(vec_sldw,2), VU_VU_VU_I(vec_sldw,4), VU_VU_VU_I(vec_sldw,8)
1647 procedure :: VR_VR_VR_I(vec_sldw,4), VR_VR_VR_I(vec_sldw,8)
1648 end interface vec_sldw
1649 public :: vec_sldw
1651 #undef VEC_VR_VR_VR_I
1652 #undef VEC_VU_VU_VU_I
1653 #undef VEC_VI_VI_VI_I
1654 #undef VR_VR_VR_I
1655 #undef VU_VU_VU_I
1656 #undef VI_VI_VI_I
1658 !----------------------------------
1659 ! vector function(vector, integer)
1660 !----------------------------------
1661 ! 'i0' stands for the integer argument being ignored via
1662 ! the `ignore_tkr' directive.
1663 #define VR_VI_I(NAME, VKIND) __ppc_##NAME##_vr##VKIND##vi##VKIND##i0
1664 #define VR_VU_I(NAME, VKIND) __ppc_##NAME##_vr##VKIND##vu##VKIND##i0
1665 #define VI_VI_I0(NAME, VKIND) __ppc_##NAME##_vi##VKIND##vi##VKIND##i0
1666 #define VU_VU_I0(NAME, VKIND) __ppc_##NAME##_vu##VKIND##vu##VKIND##i0
1667 #define VR_VR_I0(NAME, VKIND) __ppc_##NAME##_vr##VKIND##vr##VKIND##i0
1669 #define VEC_VR_VI_I(NAME, VKIND) \
1670 procedure(elem_func_vr##VKIND##vi##VKIND##i) :: VR_VI_I(NAME, VKIND);
1671 #define VEC_VR_VU_I(NAME, VKIND) \
1672 procedure(elem_func_vr##VKIND##vu##VKIND##i) :: VR_VU_I(NAME, VKIND);
1673 #define VEC_VI_VI_I0(NAME, VKIND) \
1674 procedure(elem_func_vi##VKIND##vi##VKIND##i0) :: VI_VI_I0(NAME, VKIND);
1675 #define VEC_VU_VU_I0(NAME, VKIND) \
1676 procedure(elem_func_vu##VKIND##vu##VKIND##i0) :: VU_VU_I0(NAME, VKIND);
1677 #define VEC_VR_VR_I0(NAME, VKIND) \
1678 procedure(elem_func_vr##VKIND##vr##VKIND##i0) :: VR_VR_I0(NAME, VKIND);
1680 ! vec_ctf
1681 VEC_VR_VI_I(vec_ctf,4) VEC_VR_VI_I(vec_ctf,8)
1682 VEC_VR_VU_I(vec_ctf,4) VEC_VR_VU_I(vec_ctf,8)
1683 interface vec_ctf
1684 procedure :: VR_VI_I(vec_ctf,4), VR_VI_I(vec_ctf,8)
1685 procedure :: VR_VU_I(vec_ctf,4), VR_VU_I(vec_ctf,8)
1686 end interface vec_ctf
1687 public :: vec_ctf
1689 ! vec_splat
1690 VEC_VI_VI_I0(vec_splat,1) VEC_VI_VI_I0(vec_splat,2) VEC_VI_VI_I0(vec_splat,4) VEC_VI_VI_I0(vec_splat,8)
1691 VEC_VU_VU_I0(vec_splat,1) VEC_VU_VU_I0(vec_splat,2) VEC_VU_VU_I0(vec_splat,4) VEC_VU_VU_I0(vec_splat,8)
1692 VEC_VR_VR_I0(vec_splat,4) VEC_VR_VR_I0(vec_splat,8)
1693 interface vec_splat
1694 procedure :: VI_VI_I0(vec_splat,1), VI_VI_I0(vec_splat,2), VI_VI_I0(vec_splat,4), VI_VI_I0(vec_splat,8)
1695 procedure :: VU_VU_I0(vec_splat,1), VU_VU_I0(vec_splat,2), VU_VU_I0(vec_splat,4), VU_VU_I0(vec_splat,8)
1696 procedure :: VR_VR_I0(vec_splat,4), VR_VR_I0(vec_splat,8)
1697 end interface vec_splat
1698 public :: vec_splat
1700 #undef VEC_VR_VR_I0
1701 #undef VEC_VU_VU_I0
1702 #undef VEC_VI_VI_I0
1703 #undef VEC_VR_VU_I
1704 #undef VEC_VR_VI_I
1705 #undef VR_VR_I0
1706 #undef VU_VU_I0
1707 #undef VI_VI_I0
1708 #undef VR_VU_I
1709 #undef VR_VI_I
1711 !--------------------------------------------------
1712 ! subroutine(vector, integer, vector/integer/real)
1713 !--------------------------------------------------
1714 ! 'i0' stands for the integer argument being ignored via
1715 ! the `ignore_tkr' directive.
1716 #define SUB_VI_I_VI(NAME, VKIND) __ppc_##NAME##_vi##VKIND##i0vi##VKIND
1717 #define SUB_VU_I_VU(NAME, VKIND) __ppc_##NAME##_vu##VKIND##i0vu##VKIND
1718 #define SUB_VR_I_VR(NAME, VKIND) __ppc_##NAME##_vr##VKIND##i0vr##VKIND
1719 #define SUB_VI_I_I(NAME, VKIND) __ppc_##NAME##_vi##VKIND##i0i##VKIND
1720 #define SUB_VU_I_I(NAME, VKIND) __ppc_##NAME##_vu##VKIND##i0u##VKIND
1721 #define SUB_VR_I_R(NAME, VKIND) __ppc_##NAME##_vr##VKIND##i0r##VKIND
1723 #define VEC_SUB_VI_I_VI(NAME, VKIND) \
1724 procedure(sub_vi##VKIND##ivi##VKIND) :: SUB_VI_I_VI(NAME, VKIND);
1725 #define VEC_SUB_VU_I_VU(NAME, VKIND) \
1726 procedure(sub_vu##VKIND##ivu##VKIND) :: SUB_VU_I_VU(NAME, VKIND);
1727 #define VEC_SUB_VR_I_VR(NAME, VKIND) \
1728 procedure(sub_vr##VKIND##ivr##VKIND) :: SUB_VR_I_VR(NAME, VKIND);
1729 #define VEC_SUB_VI_I_I(NAME, VKIND) \
1730 procedure(sub_vi##VKIND##ii##VKIND) :: SUB_VI_I_I(NAME, VKIND);
1731 #define VEC_SUB_VU_I_I(NAME, VKIND) \
1732 procedure(sub_vu##VKIND##ii##VKIND) :: SUB_VU_I_I(NAME, VKIND);
1733 #define VEC_SUB_VR_I_R(NAME, VKIND) \
1734 procedure(sub_vr##VKIND##ir##VKIND) :: SUB_VR_I_R(NAME, VKIND);
1736 ! vec_st
1737 VEC_SUB_VI_I_VI(vec_st,1) VEC_SUB_VI_I_VI(vec_st,2) VEC_SUB_VI_I_VI(vec_st,4)
1738 VEC_SUB_VU_I_VU(vec_st,1) VEC_SUB_VU_I_VU(vec_st,2) VEC_SUB_VU_I_VU(vec_st,4)
1739 VEC_SUB_VR_I_VR(vec_st,4)
1740 VEC_SUB_VI_I_I(vec_st,1) VEC_SUB_VI_I_I(vec_st,2) VEC_SUB_VI_I_I(vec_st,4)
1741 VEC_SUB_VU_I_I(vec_st,1) VEC_SUB_VU_I_I(vec_st,2) VEC_SUB_VU_I_I(vec_st,4)
1742 VEC_SUB_VR_I_R(vec_st,4)
1743 interface vec_st
1744 procedure :: SUB_VI_I_VI(vec_st,1), SUB_VI_I_VI(vec_st,2), SUB_VI_I_VI(vec_st,4)
1745 procedure :: SUB_VU_I_VU(vec_st,1), SUB_VU_I_VU(vec_st,2), SUB_VU_I_VU(vec_st,4)
1746 procedure :: SUB_VR_I_VR(vec_st,4)
1747 procedure :: SUB_VI_I_I(vec_st,1), SUB_VI_I_I(vec_st,2), SUB_VI_I_I(vec_st,4)
1748 procedure :: SUB_VU_I_I(vec_st,1), SUB_VU_I_I(vec_st,2), SUB_VU_I_I(vec_st,4)
1749 procedure :: SUB_VR_I_R(vec_st,4)
1750 end interface vec_st
1751 public :: vec_st
1753 ! vec_ste
1754 VEC_SUB_VI_I_I(vec_ste,1) VEC_SUB_VI_I_I(vec_ste,2) VEC_SUB_VI_I_I(vec_ste,4)
1755 VEC_SUB_VU_I_I(vec_ste,1) VEC_SUB_VU_I_I(vec_ste,2) VEC_SUB_VU_I_I(vec_ste,4)
1756 VEC_SUB_VR_I_R(vec_ste,4)
1757 interface vec_ste
1758 procedure :: SUB_VI_I_I(vec_ste,1), SUB_VI_I_I(vec_ste,2), SUB_VI_I_I(vec_ste,4)
1759 procedure :: SUB_VU_I_I(vec_ste,1), SUB_VU_I_I(vec_ste,2), SUB_VU_I_I(vec_ste,4)
1760 procedure :: SUB_VR_I_R(vec_ste,4)
1761 end interface vec_ste
1762 public :: vec_ste
1764 ! vec_stxv
1765 VEC_SUB_VI_I_VI(vec_stxv,1) VEC_SUB_VI_I_VI(vec_stxv,2) VEC_SUB_VI_I_VI(vec_stxv,4) VEC_SUB_VI_I_VI(vec_stxv,8)
1766 VEC_SUB_VU_I_VU(vec_stxv,1) VEC_SUB_VU_I_VU(vec_stxv,2) VEC_SUB_VU_I_VU(vec_stxv,4) VEC_SUB_VU_I_VU(vec_stxv,8)
1767 VEC_SUB_VR_I_VR(vec_stxv,4) VEC_SUB_VR_I_VR(vec_stxv,8)
1768 VEC_SUB_VI_I_I(vec_stxv,1) VEC_SUB_VI_I_I(vec_stxv,2) VEC_SUB_VI_I_I(vec_stxv,4) VEC_SUB_VI_I_I(vec_stxv,8)
1769 VEC_SUB_VU_I_I(vec_stxv,1) VEC_SUB_VU_I_I(vec_stxv,2) VEC_SUB_VU_I_I(vec_stxv,4) VEC_SUB_VU_I_I(vec_stxv,8)
1770 VEC_SUB_VR_I_R(vec_stxv,4) VEC_SUB_VR_I_R(vec_stxv,8)
1771 interface vec_stxv
1772 procedure :: SUB_VI_I_VI(vec_stxv,1), SUB_VI_I_VI(vec_stxv,2), SUB_VI_I_VI(vec_stxv,4), SUB_VI_I_VI(vec_stxv,8)
1773 procedure :: SUB_VU_I_VU(vec_stxv,1), SUB_VU_I_VU(vec_stxv,2), SUB_VU_I_VU(vec_stxv,4), SUB_VU_I_VU(vec_stxv,8)
1774 procedure :: SUB_VR_I_VR(vec_stxv,4), SUB_VR_I_VR(vec_stxv,8)
1775 procedure :: SUB_VI_I_I(vec_stxv,1), SUB_VI_I_I(vec_stxv,2), SUB_VI_I_I(vec_stxv,4), SUB_VI_I_I(vec_stxv,8)
1776 procedure :: SUB_VU_I_I(vec_stxv,1), SUB_VU_I_I(vec_stxv,2), SUB_VU_I_I(vec_stxv,4), SUB_VU_I_I(vec_stxv,8)
1777 procedure :: SUB_VR_I_R(vec_stxv,4), SUB_VR_I_R(vec_stxv,8)
1778 end interface vec_stxv
1779 public :: vec_stxv
1781 ! vec_xst
1782 VEC_SUB_VI_I_VI(vec_xst,1) VEC_SUB_VI_I_VI(vec_xst,2) VEC_SUB_VI_I_VI(vec_xst,4) VEC_SUB_VI_I_VI(vec_xst,8)
1783 VEC_SUB_VU_I_VU(vec_xst,1) VEC_SUB_VU_I_VU(vec_xst,2) VEC_SUB_VU_I_VU(vec_xst,4) VEC_SUB_VU_I_VU(vec_xst,8)
1784 VEC_SUB_VR_I_VR(vec_xst,4) VEC_SUB_VR_I_VR(vec_xst,8)
1785 VEC_SUB_VI_I_I(vec_xst,1) VEC_SUB_VI_I_I(vec_xst,2) VEC_SUB_VI_I_I(vec_xst,4) VEC_SUB_VI_I_I(vec_xst,8)
1786 VEC_SUB_VU_I_I(vec_xst,1) VEC_SUB_VU_I_I(vec_xst,2) VEC_SUB_VU_I_I(vec_xst,4) VEC_SUB_VU_I_I(vec_xst,8)
1787 VEC_SUB_VR_I_R(vec_xst,4) VEC_SUB_VR_I_R(vec_xst,8)
1788 interface vec_xst
1789 procedure :: SUB_VI_I_VI(vec_xst,1), SUB_VI_I_VI(vec_xst,2), SUB_VI_I_VI(vec_xst,4), SUB_VI_I_VI(vec_xst,8)
1790 procedure :: SUB_VU_I_VU(vec_xst,1), SUB_VU_I_VU(vec_xst,2), SUB_VU_I_VU(vec_xst,4), SUB_VU_I_VU(vec_xst,8)
1791 procedure :: SUB_VR_I_VR(vec_xst,4), SUB_VR_I_VR(vec_xst,8)
1792 procedure :: SUB_VI_I_I(vec_xst,1), SUB_VI_I_I(vec_xst,2), SUB_VI_I_I(vec_xst,4), SUB_VI_I_I(vec_xst,8)
1793 procedure :: SUB_VU_I_I(vec_xst,1), SUB_VU_I_I(vec_xst,2), SUB_VU_I_I(vec_xst,4), SUB_VU_I_I(vec_xst,8)
1794 procedure :: SUB_VR_I_R(vec_xst,4), SUB_VR_I_R(vec_xst,8)
1795 end interface vec_xst
1796 public :: vec_xst
1798 ! vec_xst_be
1799 VEC_SUB_VI_I_VI(vec_xst_be,1) VEC_SUB_VI_I_VI(vec_xst_be,2) VEC_SUB_VI_I_VI(vec_xst_be,4) VEC_SUB_VI_I_VI(vec_xst_be,8)
1800 VEC_SUB_VU_I_VU(vec_xst_be,1) VEC_SUB_VU_I_VU(vec_xst_be,2) VEC_SUB_VU_I_VU(vec_xst_be,4) VEC_SUB_VU_I_VU(vec_xst_be,8)
1801 VEC_SUB_VR_I_VR(vec_xst_be,4) VEC_SUB_VR_I_VR(vec_xst_be,8)
1802 VEC_SUB_VI_I_I(vec_xst_be,1) VEC_SUB_VI_I_I(vec_xst_be,2) VEC_SUB_VI_I_I(vec_xst_be,4) VEC_SUB_VI_I_I(vec_xst_be,8)
1803 VEC_SUB_VU_I_I(vec_xst_be,1) VEC_SUB_VU_I_I(vec_xst_be,2) VEC_SUB_VU_I_I(vec_xst_be,4) VEC_SUB_VU_I_I(vec_xst_be,8)
1804 VEC_SUB_VR_I_R(vec_xst_be,4) VEC_SUB_VR_I_R(vec_xst_be,8)
1805 interface vec_xst_be
1806 procedure :: SUB_VI_I_VI(vec_xst_be,1), SUB_VI_I_VI(vec_xst_be,2), SUB_VI_I_VI(vec_xst_be,4), SUB_VI_I_VI(vec_xst_be,8)
1807 procedure :: SUB_VU_I_VU(vec_xst_be,1), SUB_VU_I_VU(vec_xst_be,2), SUB_VU_I_VU(vec_xst_be,4), SUB_VU_I_VU(vec_xst_be,8)
1808 procedure :: SUB_VR_I_VR(vec_xst_be,4), SUB_VR_I_VR(vec_xst_be,8)
1809 procedure :: SUB_VI_I_I(vec_xst_be,1), SUB_VI_I_I(vec_xst_be,2), SUB_VI_I_I(vec_xst_be,4), SUB_VI_I_I(vec_xst_be,8)
1810 procedure :: SUB_VU_I_I(vec_xst_be,1), SUB_VU_I_I(vec_xst_be,2), SUB_VU_I_I(vec_xst_be,4), SUB_VU_I_I(vec_xst_be,8)
1811 procedure :: SUB_VR_I_R(vec_xst_be,4), SUB_VR_I_R(vec_xst_be,8)
1812 end interface vec_xst_be
1813 public :: vec_xst_be
1815 ! vec_xstd2
1816 VEC_SUB_VI_I_VI(vec_xstd2_,1) VEC_SUB_VI_I_VI(vec_xstd2_,2) VEC_SUB_VI_I_VI(vec_xstd2_,4) VEC_SUB_VI_I_VI(vec_xstd2_,8)
1817 VEC_SUB_VU_I_VU(vec_xstd2_,1) VEC_SUB_VU_I_VU(vec_xstd2_,2) VEC_SUB_VU_I_VU(vec_xstd2_,4) VEC_SUB_VU_I_VU(vec_xstd2_,8)
1818 VEC_SUB_VR_I_VR(vec_xstd2_,4) VEC_SUB_VR_I_VR(vec_xstd2_,8)
1819 VEC_SUB_VI_I_I(vec_xstd2_,1) VEC_SUB_VI_I_I(vec_xstd2_,2) VEC_SUB_VI_I_I(vec_xstd2_,4) VEC_SUB_VI_I_I(vec_xstd2_,8)
1820 VEC_SUB_VU_I_I(vec_xstd2_,1) VEC_SUB_VU_I_I(vec_xstd2_,2) VEC_SUB_VU_I_I(vec_xstd2_,4) VEC_SUB_VU_I_I(vec_xstd2_,8)
1821 VEC_SUB_VR_I_R(vec_xstd2_,4) VEC_SUB_VR_I_R(vec_xstd2_,8)
1822 interface vec_xstd2
1823 procedure :: SUB_VI_I_VI(vec_xstd2_,1), SUB_VI_I_VI(vec_xstd2_,2), SUB_VI_I_VI(vec_xstd2_,4), SUB_VI_I_VI(vec_xstd2_,8)
1824 procedure :: SUB_VU_I_VU(vec_xstd2_,1), SUB_VU_I_VU(vec_xstd2_,2), SUB_VU_I_VU(vec_xstd2_,4), SUB_VU_I_VU(vec_xstd2_,8)
1825 procedure :: SUB_VR_I_VR(vec_xstd2_,4), SUB_VR_I_VR(vec_xstd2_,8)
1826 procedure :: SUB_VI_I_I(vec_xstd2_,1), SUB_VI_I_I(vec_xstd2_,2), SUB_VI_I_I(vec_xstd2_,4), SUB_VI_I_I(vec_xstd2_,8)
1827 procedure :: SUB_VU_I_I(vec_xstd2_,1), SUB_VU_I_I(vec_xstd2_,2), SUB_VU_I_I(vec_xstd2_,4), SUB_VU_I_I(vec_xstd2_,8)
1828 procedure :: SUB_VR_I_R(vec_xstd2_,4), SUB_VR_I_R(vec_xstd2_,8)
1829 end interface vec_xstd2
1830 public :: vec_xstd2
1832 ! vec_xstw4
1833 VEC_SUB_VI_I_VI(vec_xstw4_,1) VEC_SUB_VI_I_VI(vec_xstw4_,2) VEC_SUB_VI_I_VI(vec_xstw4_,4)
1834 VEC_SUB_VU_I_VU(vec_xstw4_,1) VEC_SUB_VU_I_VU(vec_xstw4_,2) VEC_SUB_VU_I_VU(vec_xstw4_,4)
1835 VEC_SUB_VR_I_VR(vec_xstw4_,4)
1836 VEC_SUB_VI_I_I(vec_xstw4_,1) VEC_SUB_VI_I_I(vec_xstw4_,2) VEC_SUB_VI_I_I(vec_xstw4_,4)
1837 VEC_SUB_VU_I_I(vec_xstw4_,1) VEC_SUB_VU_I_I(vec_xstw4_,2) VEC_SUB_VU_I_I(vec_xstw4_,4)
1838 VEC_SUB_VR_I_R(vec_xstw4_,4)
1839 interface vec_xstw4
1840 procedure :: SUB_VI_I_VI(vec_xstw4_,1), SUB_VI_I_VI(vec_xstw4_,2), SUB_VI_I_VI(vec_xstw4_,4)
1841 procedure :: SUB_VU_I_VU(vec_xstw4_,1), SUB_VU_I_VU(vec_xstw4_,2), SUB_VU_I_VU(vec_xstw4_,4)
1842 procedure :: SUB_VR_I_VR(vec_xstw4_,4)
1843 procedure :: SUB_VI_I_I(vec_xstw4_,1), SUB_VI_I_I(vec_xstw4_,2), SUB_VI_I_I(vec_xstw4_,4)
1844 procedure :: SUB_VU_I_I(vec_xstw4_,1), SUB_VU_I_I(vec_xstw4_,2), SUB_VU_I_I(vec_xstw4_,4)
1845 procedure :: SUB_VR_I_R(vec_xstw4_,4)
1846 end interface vec_xstw4
1847 public :: vec_xstw4
1849 #undef VEC_SUB_VI_I_VI
1850 #undef VEC_SUB_VU_I_VU
1851 #undef VEC_SUB_VR_I_VR
1852 #undef VEC_SUB_VI_I_I
1853 #undef VEC_SUB_VU_I_I
1854 #undef VEC_SUB_VR_I_R
1855 #undef SUB_VI_I_VI
1856 #undef SUB_VU_I_VU
1857 #undef SUB_VR_I_VR
1858 #undef SUB_VI_I_I
1859 #undef SUB_VU_I_I
1860 #undef SUB_VR_Ik_R
1862 !-----------------------------------------------------------------------
1863 ! subroutine(__vector_pair, integer, __vector_pair/vector/integer/real)
1864 !-----------------------------------------------------------------------
1865 #define VP_I0_VI(NAME, VKIND) __ppc_##NAME##_vpi0vi##VKIND
1866 #define VP_I0_VU(NAME, VKIND) __ppc_##NAME##_vpi0vu##VKIND
1867 #define VP_I0_VR(NAME, VKIND) __ppc_##NAME##_vpi0vr##VKIND
1869 #define VEC_VP_I0_VI(NAME, VKIND) \
1870 procedure(sub_vpi0vi##VKIND) :: VP_I0_VI(NAME, VKIND);
1871 #define VEC_VP_I0_VU(NAME, VKIND) \
1872 procedure(sub_vpi0vu##VKIND) :: VP_I0_VU(NAME, VKIND);
1873 #define VEC_VP_I0_VR(NAME, VKIND) \
1874 procedure(sub_vpi0vr##VKIND) :: VP_I0_VR(NAME, VKIND);
1876 ! vec_stxvp
1877 procedure(sub_vpi0vp) :: __ppc_vec_stxvp_vpi0vp0
1878 procedure(sub_vpi0i0) :: __ppc_vec_stxvp_vpi0i0
1879 procedure(sub_vpi0r0) :: __ppc_vec_stxvp_vpi0r0
1880 VEC_VP_I0_VI(vec_stxvp, 1) VEC_VP_I0_VI(vec_stxvp, 2) VEC_VP_I0_VI(vec_stxvp, 4) VEC_VP_I0_VI(vec_stxvp, 8)
1881 VEC_VP_I0_VU(vec_stxvp, 1) VEC_VP_I0_VU(vec_stxvp, 2) VEC_VP_I0_VU(vec_stxvp, 4) VEC_VP_I0_VU(vec_stxvp, 8)
1882 VEC_VP_I0_VR(vec_stxvp, 4) VEC_VP_I0_VR(vec_stxvp, 8)
1883 interface vec_stxvp
1884 procedure :: __ppc_vec_stxvp_vpi0vp0
1885 procedure :: __ppc_vec_stxvp_vpi0i0
1886 procedure :: __ppc_vec_stxvp_vpi0r0
1887 procedure :: VP_I0_VI(vec_stxvp, 1), VP_I0_VI(vec_stxvp, 2), VP_I0_VI(vec_stxvp, 4), VP_I0_VI(vec_stxvp, 8)
1888 procedure :: VP_I0_VU(vec_stxvp, 1), VP_I0_VU(vec_stxvp, 2), VP_I0_VU(vec_stxvp, 4), VP_I0_VU(vec_stxvp, 8)
1889 procedure :: VP_I0_VR(vec_stxvp, 4), VP_I0_VR(vec_stxvp, 8)
1890 end interface vec_stxvp
1891 public :: vec_stxvp
1893 ! vsx_stxvp (alias to vec_stxvp)
1894 interface vsx_stxvp
1895 procedure :: __ppc_vec_stxvp_vpi0vp0
1896 procedure :: __ppc_vec_stxvp_vpi0i0
1897 procedure :: __ppc_vec_stxvp_vpi0r0
1898 procedure :: VP_I0_VI(vec_stxvp, 1), VP_I0_VI(vec_stxvp, 2), VP_I0_VI(vec_stxvp, 4), VP_I0_VI(vec_stxvp, 8)
1899 procedure :: VP_I0_VU(vec_stxvp, 1), VP_I0_VU(vec_stxvp, 2), VP_I0_VU(vec_stxvp, 4), VP_I0_VU(vec_stxvp, 8)
1900 procedure :: VP_I0_VR(vec_stxvp, 4), VP_I0_VR(vec_stxvp, 8)
1901 end interface vsx_stxvp
1902 public :: vsx_stxvp
1904 #undef VEC_VP_I0_VR
1905 #undef VEC_VP_I0_VU
1906 #undef VEC_VP_I0_VI
1907 #undef VP_I0_VR
1908 #undef VP_I0_VU
1909 #undef VP_I0_VI
1911 end module __ppc_intrinsics