xref: /llvm-project/flang/module/__ppc_intrinsics.f90 (revision 2de024ef311d082c6a435d638efb99b923cca2d8)
1!===-- module/__ppc_intrinsics.f90 -----------------------------------------===!
2!
3! Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4! See https://llvm.org/LICENSE.txt for license information.
5! SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6!
7!===------------------------------------------------------------------------===!
8
9module __ppc_intrinsics
10
11  private
12
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
21
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 ;
31
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 ;
37
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)
44
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)
51
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 ;
57
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)
65
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
73
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 ;
80
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 ;
86
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)
94
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)
102
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 ;
108
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 ;
115
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 ;
121
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 ;
127
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 ;
133
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 ;
139
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 ;
147
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 ;
155
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 ;
163
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 ;
171
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 ;
179
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 ;
187
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 ;
195
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 ;
204
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 ;
213
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 ;
222
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 ;
231
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 ;
240
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 ;
249
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 ;
258
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;
267
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;
276
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;
285
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;
294
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.
297!
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 ;
306
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 ;
315
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 ;
324
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)
362
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
396
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 ;
403
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)
411
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)
419
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)
427
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 ;
435
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 ;
443
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 ;
451
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 ;
460
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 ;
469
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)
482
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
495
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 ;
506
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 ;
516
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 ;
526
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 ;
536
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 ;
546
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 ;
556
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
565
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;
575
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;
585
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;
595
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
604
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
613
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)
623
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
633
634  end interface
635
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
643
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
651
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
659
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
667
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
677
678  procedure(func_r8r8x) :: __ppc_fctid
679  interface fctid
680    procedure :: __ppc_fctid
681  end interface fctid
682  public :: fctid
683
684  procedure(func_r8r8x) :: __ppc_fctidz
685  interface fctidz
686    procedure :: __ppc_fctidz
687  end interface fctidz
688  public :: fctidz
689
690  procedure(func_r8r8x) :: __ppc_fctiw
691  interface fctiw
692    procedure :: __ppc_fctiw
693  end interface fctiw
694  public :: fctiw
695
696  procedure(func_r8r8x) :: __ppc_fctiwz
697  interface fctiwz
698    procedure :: __ppc_fctiwz
699  end interface fctiwz
700  public :: fctiwz
701
702  procedure(func_r8r8x) :: __ppc_fctudz
703  interface fctudz
704    procedure :: __ppc_fctudz
705  end interface fctudz
706  public :: fctudz
707
708  procedure(func_r8r8x) :: __ppc_fctuwz
709  interface fctuwz
710    procedure :: __ppc_fctuwz
711  end interface fctuwz
712  public :: fctuwz
713
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
720
721  procedure(func_r8r8i) :: __ppc_fcfi
722  interface fcfi
723    procedure :: __ppc_fcfi
724  end interface fcfi
725  public :: fcfi
726
727  procedure(func_r8r8i) :: __ppc_fcfid
728  interface fcfid
729    procedure :: __ppc_fcfid
730  end interface fcfid
731  public :: fcfid
732
733  procedure(func_r8r8i) :: __ppc_fcfud
734  interface fcfud
735    procedure :: __ppc_fcfud
736  end interface fcfud
737  public :: fcfud
738
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
747
748! fre, fres
749  procedure(func_r8r8x) :: __ppc_fre
750  interface fre
751    procedure :: __ppc_fre
752  end interface fre
753  public :: fre
754
755  procedure(func_r4r4x) :: __ppc_fres
756  interface fres
757    procedure :: __ppc_fres
758  end interface fres
759  public :: fres
760
761! frsqrte, frsqrtes
762  procedure(func_r8r8x) :: __ppc_frsqrte
763  interface frsqrte
764    procedure :: __ppc_frsqrte
765  end interface frsqrte
766  public :: frsqrte
767
768  procedure(func_r4r4x) :: __ppc_frsqrtes
769  interface frsqrtes
770    procedure :: __ppc_frsqrtes
771  end interface frsqrtes
772  public :: frsqrtes
773
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
782
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
790
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
801
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);
814
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
823
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
830
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
837
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
844
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
853
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
860
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
875
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
888
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);
905
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
916
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
927
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
938
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
949
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
960
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
971
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
977
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);
984
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
994
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
1001
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
1012
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
1023
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
1034
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
1045
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
1056
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
1067
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
1076
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
1093
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
1108
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
1117
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
1134
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
1149
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
1160
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
1178
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
1184
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);
1189
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
1198
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
1207
1208#undef VEC_VU1_I0_R
1209#undef VEC_VU1_I0_I
1210#undef VU1_I0_R
1211#undef VU1_I0_I
1212
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
1222
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);
1233
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
1248
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
1257
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
1272
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
1287
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
1302
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
1317
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
1332
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
1347
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
1362
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
1373
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
1381
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);
1389
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
1402
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
1411
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
1420
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
1435
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);
1453
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
1460
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
1467
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
1474
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
1481
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
1492
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
1503
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
1514
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
1535
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
1542
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);
1547
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
1556
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
1561
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
1568
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);
1575
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
1586
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
1593
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
1599
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);
1604
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
1613
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
1621
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);
1628
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
1639
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
1650
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
1657
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
1668
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);
1679
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
1688
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
1699
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
1710
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
1722
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);
1735
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
1752
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
1763
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
1780
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
1797
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
1814
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
1831
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
1848
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
1861
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
1868
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);
1875
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
1892
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
1903
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
1910
1911end module __ppc_intrinsics
1912