llvm-project
1911 строк · 79.7 Кб
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
11private
12
13! fmadd, fmsub, fnmadd, fnmsub
14abstract interface
15elemental real(4) function func_r4r4r4r4(a, x, y)
16real(4), intent(in) :: a, x, y
17end function func_r4r4r4r4
18elemental real(8) function func_r8r8r8r8(a, x, y)
19real(8), intent(in) :: a, x, y
20end 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) \
28elemental vector(integer(VKIND)) function elem_func_vi##VKIND##vi##VKIND(arg1); \
29vector(integer(VKIND)), intent(in) :: arg1; \
30end function ;
31
32! vector(u) function f(vector(u))
33#define ELEM_FUNC_VUVU(VKIND) \
34elemental vector(unsigned(VKIND)) function elem_func_vu##VKIND##vu##VKIND(arg1); \
35vector(unsigned(VKIND)), intent(in) :: arg1; \
36end function ;
37
38! vector(r) function f(vector(r))
39#define ELEM_FUNC_VRVR_2(VKIND1, VKIND2) \
40elemental vector(real(VKIND1)) function elem_func_vr##VKIND1##vr##VKIND2(arg1); \
41vector(real(VKIND2)), intent(in) :: arg1; \
42end 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) \
47elemental vector(integer(RKIND)) function elem_func_vi##RKIND##i##VKIND(arg1); \
48integer(VKIND), intent(in) :: arg1; \
49end 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) \
54elemental vector(real(VKIND)) function elem_func_vr##VKIND##r##VKIND(arg1); \
55real(VKIND), intent(in) :: arg1; \
56end function ;
57
58ELEM_FUNC_VIVI(1) ELEM_FUNC_VIVI(2) ELEM_FUNC_VIVI(4) ELEM_FUNC_VIVI(8)
59ELEM_FUNC_VUVU(1)
60ELEM_FUNC_VRVR_2(4,8) ELEM_FUNC_VRVR_2(8,4)
61ELEM_FUNC_VRVR(4) ELEM_FUNC_VRVR(8)
62ELEM_FUNC_VII_2(4,1) ELEM_FUNC_VII_2(4,2) ELEM_FUNC_VII_2(4,8)
63ELEM_FUNC_VII(1) ELEM_FUNC_VII(2) ELEM_FUNC_VII(4) ELEM_FUNC_VII(8)
64ELEM_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) \
77elemental vector(integer(VKIND)) function elem_func_vi##VKIND##vi##VKIND##vi##VKIND(arg1, arg2); \
78vector(integer(VKIND)), intent(in) :: arg1, arg2; \
79end function ;
80
81! vector(u) function f(vector(i), vector(i))
82#define ELEM_FUNC_VUVIVI(VKIND) \
83elemental vector(unsigned(VKIND)) function elem_func_vu##VKIND##vi##VKIND##vi##VKIND(arg1, arg2); \
84vector(integer(VKIND)), intent(in) :: arg1, arg2; \
85end function ;
86
87! vector(i) function f(vector(i), vector(u))
88#define ELEM_FUNC_VIVIVU_2(VKIND1, VKIND2) \
89elemental vector(integer(VKIND1)) function elem_func_vi##VKIND1##vi##VKIND1##vu##VKIND2(arg1, arg2); \
90vector(integer(VKIND1)), intent(in) :: arg1; \
91vector(unsigned(VKIND2)), intent(in) :: arg2; \
92end 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) \
97elemental vector(unsigned(VKIND1)) function elem_func_vu##VKIND1##vu##VKIND1##vu##VKIND2(arg1, arg2); \
98vector(unsigned(VKIND1)), intent(in) :: arg1; \
99vector(unsigned(VKIND2)), intent(in) :: arg2; \
100end 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) \
105elemental vector(real(VKIND)) function elem_func_vr##VKIND##vr##VKIND##vr##VKIND(arg1, arg2); \
106vector(real(VKIND)), intent(in) :: arg1, arg2; \
107end function ;
108
109! vector(r) function f(vector(r), vector(u))
110#define ELEM_FUNC_VRVRVU_2(VKIND1, VKIND2) \
111elemental vector(real(VKIND1)) function elem_func_vr##VKIND1##vr##VKIND1##vu##VKIND2(arg1, arg2); \
112vector(real(VKIND1)), intent(in) :: arg1; \
113vector(unsigned(VKIND2)), intent(in) :: arg2; \
114end function ;
115
116! vector(u) function f(vector(r), vector(r))
117#define ELEM_FUNC_VUVRVR(VKIND) \
118elemental vector(unsigned(VKIND)) function elem_func_vu##VKIND##vr##VKIND##vr##VKIND(arg1, arg2); \
119vector(real(VKIND)), intent(in) :: arg1, arg2; \
120end function ;
121
122! integer function f(vector(i), vector(i))
123#define ELEM_FUNC_IVIVI(RKIND, VKIND) \
124elemental integer(RKIND) function elem_func_i##RKIND##vi##VKIND##vi##VKIND(arg1, arg2); \
125vector(integer(VKIND)), intent(in) :: arg1, arg2; \
126end function ;
127
128! integer function f(vector(u), vector(u))
129#define ELEM_FUNC_IVUVU(RKIND, VKIND) \
130elemental integer(RKIND) function elem_func_i##RKIND##vu##VKIND##vu##VKIND(arg1, arg2); \
131vector(unsigned(VKIND)), intent(in) :: arg1, arg2; \
132end function ;
133
134! integer function f(vector(r), vector(r))
135#define ELEM_FUNC_IVRVR(RKIND, VKIND) \
136elemental integer(RKIND) function elem_func_i##RKIND##vr##VKIND##vr##VKIND(arg1, arg2); \
137vector(real(VKIND)), intent(in) :: arg1, arg2; \
138end function ;
139
140! vector(r) function f(vector(i), i)
141#define ELEM_FUNC_VRVII(VKIND) \
142elemental vector(real(VKIND)) function elem_func_vr##VKIND##vi##VKIND##i(arg1, arg2); \
143vector(integer(VKIND)), intent(in) :: arg1; \
144integer(8), intent(in) :: arg2; \
145!dir$ ignore_tkr(k) arg2; \
146end function ;
147
148! integer function f(vector(i), i)
149#define ELEM_FUNC_IVII(VKIND) \
150elemental integer(VKIND) function elem_func_i##VKIND##vi##VKIND##i(arg1, arg2); \
151vector(integer(VKIND)), intent(in) :: arg1; \
152integer(8), intent(in) :: arg2; \
153!dir$ ignore_tkr(k) arg2; \
154end function ;
155
156! vector(r) function f(vector(u), i)
157#define ELEM_FUNC_VRVUI(VKIND) \
158elemental vector(real(VKIND)) function elem_func_vr##VKIND##vu##VKIND##i(arg1, arg2); \
159vector(unsigned(VKIND)), intent(in) :: arg1; \
160integer(8), intent(in) :: arg2; \
161!dir$ ignore_tkr(k) arg2; \
162end function ;
163
164! real function f(vector(r), i)
165#define ELEM_FUNC_RVRI(VKIND) \
166elemental real(VKIND) function elem_func_r##VKIND##vr##VKIND##i(arg1, arg2); \
167vector(real(VKIND)), intent(in) :: arg1; \
168integer(8), intent(in) :: arg2; \
169!dir$ ignore_tkr(k) arg2; \
170end function ;
171
172! vector(i) function f(vector(i), i)
173#define ELEM_FUNC_VIVII0(VKIND) \
174elemental vector(integer(VKIND)) function elem_func_vi##VKIND##vi##VKIND##i0(arg1, arg2); \
175vector(integer(VKIND)), intent(in) :: arg1; \
176integer(8), intent(in) :: arg2; \
177!dir$ ignore_tkr(k) arg2; \
178end function ;
179
180! vector(u) function f(vector(u), i)
181#define ELEM_FUNC_VUVUI0(VKIND) \
182elemental vector(unsigned(VKIND)) function elem_func_vu##VKIND##vu##VKIND##i0(arg1, arg2); \
183vector(unsigned(VKIND)), intent(in) :: arg1; \
184integer(8), intent(in) :: arg2; \
185!dir$ ignore_tkr(k) arg2; \
186end function ;
187
188! vector(r) function f(vector(r), i)
189#define ELEM_FUNC_VRVRI0(VKIND) \
190elemental vector(real(VKIND)) function elem_func_vr##VKIND##vr##VKIND##i0(arg1, arg2); \
191vector(real(VKIND)), intent(in) :: arg1; \
192integer(8), intent(in) :: arg2; \
193!dir$ ignore_tkr(k) arg2; \
194end function ;
195
196! vector(i) function f(i, integer)
197#define FUNC_VII0I(VKIND) \
198pure vector(integer(VKIND)) function func_vi##VKIND##i0i##VKIND(arg1, arg2); \
199integer(8), intent(in) :: arg1; \
200!dir$ ignore_tkr(k) arg1; \
201integer(VKIND), intent(in) :: arg2; \
202!dir$ ignore_tkr(r) arg2; \
203end function ;
204
205! vector(r) function f(i, real)
206#define FUNC_VRI0R(VKIND) \
207pure vector(real(VKIND)) function func_vr##VKIND##i0r##VKIND(arg1, arg2); \
208integer(8), intent(in) :: arg1; \
209!dir$ ignore_tkr(k) arg1; \
210real(VKIND), intent(in) :: arg2; \
211!dir$ ignore_tkr(r) arg2; \
212end function ;
213
214! vector(i) function f(i, vector(i))
215#define FUNC_VII0VI(VKIND) \
216pure vector(integer(VKIND)) function func_vi##VKIND##i0vi##VKIND(arg1, arg2); \
217integer(8), intent(in) :: arg1; \
218!dir$ ignore_tkr(k) arg1; \
219vector(integer(VKIND)), intent(in) :: arg2; \
220!dir$ ignore_tkr(r) arg2; \
221end function ;
222
223! vector(u) function f(i, vector(u))
224#define FUNC_VUI0VU(VKIND) \
225pure vector(unsigned(VKIND)) function func_vu##VKIND##i0vu##VKIND(arg1, arg2); \
226integer(8), intent(in) :: arg1; \
227!dir$ ignore_tkr(k) arg1; \
228vector(unsigned(VKIND)), intent(in) :: arg2; \
229!dir$ ignore_tkr(r) arg2; \
230end function ;
231
232! vector(r) function f(i, vector(r))
233#define FUNC_VRI0VR(VKIND) \
234pure vector(real(VKIND)) function func_vr##VKIND##i0vr##VKIND(arg1, arg2); \
235integer(8), intent(in) :: arg1; \
236!dir$ ignore_tkr(k) arg1; \
237vector(real(VKIND)), intent(in) :: arg2; \
238!dir$ ignore_tkr(r) arg2; \
239end function ;
240
241! vector(u(1)) function f(i, i)
242#define FUNC_VU1I0I(KIND) \
243vector(unsigned(1)) function func_vu1i0i##KIND(arg1, arg2); \
244integer(8), intent(in) :: arg1; \
245!dir$ ignore_tkr(k) arg1; \
246integer(KIND), intent(in) :: arg2; \
247!dir$ ignore_tkr(r) arg2; \
248end function ;
249
250! vector(u(1)) function f(i, r)
251#define FUNC_VU1I0R(KIND) \
252vector(unsigned(1)) function func_vu1i0r##KIND(arg1, arg2); \
253integer(8), intent(in) :: arg1; \
254!dir$ ignore_tkr(k) arg1; \
255real(KIND), intent(in) :: arg2; \
256!dir$ ignore_tkr(r) arg2; \
257end function ;
258
259! __vector_pair function f(i, vector(i))
260#define FUNC_VPI0VI(VKIND) \
261pure __vector_pair function func_vpi0vi##VKIND(arg1, arg2); \
262integer(8), intent(in) :: arg1; \
263!dir$ ignore_tkr(k) arg1; \
264vector(integer(VKIND)), intent(in) :: arg2; \
265!dir$ ignore_tkr(r) arg2; \
266end function;
267
268! __vector_pair function f(i, vector(u))
269#define FUNC_VPI0VU(VKIND) \
270pure __vector_pair function func_vpi0vu##VKIND(arg1, arg2); \
271integer(8), intent(in) :: arg1; \
272!dir$ ignore_tkr(k) arg1; \
273vector(unsigned(VKIND)), intent(in) :: arg2; \
274!dir$ ignore_tkr(r) arg2; \
275end function;
276
277! __vector_pair function f(i, vector(r))
278#define FUNC_VPI0VR(VKIND) \
279pure __vector_pair function func_vpi0vr##VKIND(arg1, arg2); \
280integer(8), intent(in) :: arg1; \
281!dir$ ignore_tkr(k) arg1; \
282vector(real(VKIND)), intent(in) :: arg2; \
283!dir$ ignore_tkr(r) arg2; \
284end function;
285
286! __vector_pair function f(i, __vector_pair)
287#define FUNC_VPI0VP \
288pure __vector_pair function func_vpi0vp(arg1, arg2); \
289integer(8), intent(in) :: arg1; \
290!dir$ ignore_tkr(k) arg1; \
291__vector_pair, intent(in) :: arg2; \
292!dir$ ignore_tkr(r) arg2; \
293end 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) \
300pure vector(integer(VKIND)) function func_vec_convert_vi##VKIND##vi##vi##VKIND(v, mold); \
301vector(integer(8)), intent(in) :: v; \
302!dir$ ignore_tkr(tk) v; \
303vector(integer(VKIND)), intent(in) :: mold; \
304!dir$ ignore_tkr(r) mold; \
305end function ;
306
307! vector(u) function f(vector(i), vector(u))
308#define FUNC_VEC_CONVERT_VUVIVU(VKIND) \
309pure vector(unsigned(VKIND)) function func_vec_convert_vu##VKIND##vi##vu##VKIND(v, mold); \
310vector(integer(8)), intent(in) :: v; \
311!dir$ ignore_tkr(tk) v; \
312vector(unsigned(VKIND)), intent(in) :: mold; \
313!dir$ ignore_tkr(r) mold; \
314end function ;
315
316! vector(r) function f(vector(i), vector(r))
317#define FUNC_VEC_CONVERT_VRVIVR(VKIND) \
318pure vector(real(VKIND)) function func_vec_convert_vr##VKIND##vi##vr##VKIND(v, mold); \
319vector(integer(8)), intent(in) :: v; \
320!dir$ ignore_tkr(tk) v; \
321vector(real(VKIND)), intent(in) :: mold; \
322!dir$ ignore_tkr(r) mold; \
323end function ;
324
325FUNC_VEC_CONVERT_VIVIVI(1) FUNC_VEC_CONVERT_VIVIVI(2) FUNC_VEC_CONVERT_VIVIVI(4) FUNC_VEC_CONVERT_VIVIVI(8)
326FUNC_VEC_CONVERT_VUVIVU(1) FUNC_VEC_CONVERT_VUVIVU(2) FUNC_VEC_CONVERT_VUVIVU(4) FUNC_VEC_CONVERT_VUVIVU(8)
327FUNC_VEC_CONVERT_VRVIVR(4) FUNC_VEC_CONVERT_VRVIVR(8)
328ELEM_FUNC_IVII(1) ELEM_FUNC_IVII(2) ELEM_FUNC_IVII(4) ELEM_FUNC_IVII(8)
329ELEM_FUNC_RVRI(4) ELEM_FUNC_RVRI(8)
330ELEM_FUNC_VIVIVI(1) ELEM_FUNC_VIVIVI(2) ELEM_FUNC_VIVIVI(4) ELEM_FUNC_VIVIVI(8)
331ELEM_FUNC_VUVIVI(1) ELEM_FUNC_VUVIVI(2) ELEM_FUNC_VUVIVI(4) ELEM_FUNC_VUVIVI(8)
332ELEM_FUNC_VUVUVU(1) ELEM_FUNC_VUVUVU(2) ELEM_FUNC_VUVUVU(4) ELEM_FUNC_VUVUVU(8)
333ELEM_FUNC_VIVIVU(1) ELEM_FUNC_VIVIVU(2) ELEM_FUNC_VIVIVU(4) ELEM_FUNC_VIVIVU(8)
334ELEM_FUNC_VIVIVU_2(1,2) ELEM_FUNC_VIVIVU_2(1,4)
335ELEM_FUNC_VIVIVU_2(2,1) ELEM_FUNC_VIVIVU_2(2,4)
336ELEM_FUNC_VIVIVU_2(4,1) ELEM_FUNC_VIVIVU_2(4,2)
337ELEM_FUNC_VUVUVU_2(1,2) ELEM_FUNC_VUVUVU_2(1,4)
338ELEM_FUNC_VUVUVU_2(2,1) ELEM_FUNC_VUVUVU_2(2,4)
339ELEM_FUNC_VUVUVU_2(4,1) ELEM_FUNC_VUVUVU_2(4,2)
340ELEM_FUNC_VRVRVU_2(4,1) ELEM_FUNC_VRVRVU_2(4,2)
341ELEM_FUNC_VRVRVR(4) ELEM_FUNC_VRVRVR(8)
342ELEM_FUNC_VUVRVR(4) ELEM_FUNC_VUVRVR(8)
343ELEM_FUNC_IVIVI(4,1) ELEM_FUNC_IVIVI(4,2) ELEM_FUNC_IVIVI(4,4) ELEM_FUNC_IVIVI(4,8)
344ELEM_FUNC_IVUVU(4,1) ELEM_FUNC_IVUVU(4,2) ELEM_FUNC_IVUVU(4,4) ELEM_FUNC_IVUVU(4,8)
345ELEM_FUNC_IVRVR(4,4) ELEM_FUNC_IVRVR(4,8)
346ELEM_FUNC_VRVII(4) ELEM_FUNC_VRVII(8)
347ELEM_FUNC_VRVUI(4) ELEM_FUNC_VRVUI(8)
348ELEM_FUNC_VIVII0(1) ELEM_FUNC_VIVII0(2) ELEM_FUNC_VIVII0(4) ELEM_FUNC_VIVII0(8)
349ELEM_FUNC_VUVUI0(1) ELEM_FUNC_VUVUI0(2) ELEM_FUNC_VUVUI0(4) ELEM_FUNC_VUVUI0(8)
350ELEM_FUNC_VRVRI0(4) ELEM_FUNC_VRVRI0(8)
351FUNC_VII0VI(1) FUNC_VII0VI(2) FUNC_VII0VI(4) FUNC_VII0VI(8)
352FUNC_VUI0VU(1) FUNC_VUI0VU(2) FUNC_VUI0VU(4) FUNC_VUI0VU(8)
353FUNC_VRI0VR(4) FUNC_VRI0VR(8)
354FUNC_VII0I(1) FUNC_VII0I(2) FUNC_VII0I(4) FUNC_VII0I(8)
355FUNC_VRI0R(4) FUNC_VRI0R(8)
356FUNC_VPI0VI(1) FUNC_VPI0VI(2) FUNC_VPI0VI(4) FUNC_VPI0VI(8)
357FUNC_VPI0VU(1) FUNC_VPI0VU(2) FUNC_VPI0VU(4) FUNC_VPI0VU(8)
358FUNC_VPI0VR(4) FUNC_VPI0VR(8)
359FUNC_VPI0VP
360FUNC_VU1I0I(1) FUNC_VU1I0I(2) FUNC_VU1I0I(4)
361FUNC_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) \
400elemental vector(real(VKIND)) function elem_func_vr##VKIND##vr##VKIND##vr##VKIND##vr##VKIND(arg1, arg2, arg3); \
401vector(real(VKIND)), intent(in) :: arg1, arg2, arg3; \
402end function ;
403
404! vector(i) function f(vector(i), vector(i), vector(u))
405#define ELEM_FUNC_VIVIVIVU_2(VKIND, UKIND) \
406elemental vector(integer(VKIND)) function elem_func_vi##VKIND##vi##VKIND##vi##VKIND##vu##UKIND(arg1, arg2, arg3); \
407vector(integer(VKIND)), intent(in) :: arg1, arg2; \
408vector(unsigned(UKIND)), intent(in) :: arg3; \
409end 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) \
414elemental vector(unsigned(VKIND)) function elem_func_vu##VKIND##vu##VKIND##vu##VKIND##vu##UKIND(arg1, arg2, arg3); \
415vector(unsigned(VKIND)), intent(in) :: arg1, arg2; \
416vector(unsigned(UKIND)), intent(in) :: arg3; \
417end 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) \
422elemental vector(real(VKIND)) function elem_func_vr##VKIND##vr##VKIND##vr##VKIND##vu##UKIND(arg1, arg2, arg3); \
423vector(real(VKIND)), intent(in) :: arg1, arg2; \
424vector(unsigned(UKIND)), intent(in) :: arg3; \
425end 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) \
430elemental vector(integer(VKIND)) function elem_func_vi##VKIND##vi##VKIND##vi##VKIND##i(arg1, arg2, arg3); \
431vector(integer(VKIND)), intent(in) :: arg1, arg2; \
432integer(8), intent(in) :: arg3; \
433!dir$ ignore_tkr(k) arg3; \
434end function ;
435
436! vector(u) function f(vector(u), vector(u), i)
437#define ELEM_FUNC_VUVUVUI(VKIND) \
438elemental vector(unsigned(VKIND)) function elem_func_vu##VKIND##vu##VKIND##vu##VKIND##i(arg1, arg2, arg3); \
439vector(unsigned(VKIND)), intent(in) :: arg1, arg2; \
440integer(8), intent(in) :: arg3; \
441!dir$ ignore_tkr(k) arg3; \
442end function ;
443
444! vector(r) function f(vector(r), vector(r), i)
445#define ELEM_FUNC_VRVRVRI(VKIND) \
446elemental vector(real(VKIND)) function elem_func_vr##VKIND##vr##VKIND##vr##VKIND##i(arg1, arg2, arg3); \
447vector(real(VKIND)), intent(in) :: arg1, arg2; \
448integer(8), intent(in) :: arg3; \
449!dir$ ignore_tkr(k) arg3; \
450end function ;
451
452! vector(i) function f(i, vector(i), i)
453#define ELEM_FUNC_VIIVII(VKIND) \
454elemental vector(integer(VKIND)) function elem_func_vi##VKIND##i##VKIND##vi##VKIND##i(arg1, arg2, arg3); \
455integer(VKIND), intent(in) :: arg1; \
456vector(integer(VKIND)), intent(in) :: arg2; \
457integer(8), intent(in) :: arg3; \
458!dir$ ignore_tkr(k) arg3; \
459end function ;
460
461! vector(r) function f(r, vector(r), i)
462#define ELEM_FUNC_VRRVRI(VKIND) \
463elemental vector(real(VKIND)) function elem_func_vr##VKIND##r##VKIND##vr##VKIND##i(arg1, arg2, arg3); \
464real(VKIND), intent(in) :: arg1; \
465vector(real(VKIND)), intent(in) :: arg2; \
466integer(8), intent(in) :: arg3; \
467!dir$ ignore_tkr(k) arg3; \
468end function ;
469
470ELEM_FUNC_VIVIVIVU(1) ELEM_FUNC_VIVIVIVU(2) ELEM_FUNC_VIVIVIVU(4) ELEM_FUNC_VIVIVIVU(8)
471ELEM_FUNC_VUVUVUVU(1) ELEM_FUNC_VUVUVUVU(2) ELEM_FUNC_VUVUVUVU(4) ELEM_FUNC_VUVUVUVU(8)
472ELEM_FUNC_VRVRVRVU(4) ELEM_FUNC_VRVRVRVU(8)
473ELEM_FUNC_VIVIVIVU_2(2,1) ELEM_FUNC_VIVIVIVU_2(4,1) ELEM_FUNC_VIVIVIVU_2(8,1)
474ELEM_FUNC_VUVUVUVU_2(2,1) ELEM_FUNC_VUVUVUVU_2(4,1) ELEM_FUNC_VUVUVUVU_2(8,1)
475ELEM_FUNC_VRVRVRVU_2(4,1) ELEM_FUNC_VRVRVRVU_2(8,1)
476ELEM_FUNC_VIIVII(1) ELEM_FUNC_VIIVII(2) ELEM_FUNC_VIIVII(4) ELEM_FUNC_VIIVII(8)
477ELEM_FUNC_VRRVRI(4) ELEM_FUNC_VRRVRI(8)
478ELEM_FUNC_VRVRVRVR(4) ELEM_FUNC_VRVRVRVR(8)
479ELEM_FUNC_VIVIVII(1) ELEM_FUNC_VIVIVII(2) ELEM_FUNC_VIVIVII(4) ELEM_FUNC_VIVIVII(8)
480ELEM_FUNC_VUVUVUI(1) ELEM_FUNC_VUVUVUI(2) ELEM_FUNC_VUVUVUI(4) ELEM_FUNC_VUVUVUI(8)
481ELEM_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) \
499pure subroutine sub_vi##VKIND##ivi##VKIND(arg1, arg2, arg3); \
500vector(integer(VKIND)), intent(in) :: arg1; \
501integer(8), intent(in) :: arg2; \
502!dir$ ignore_tkr(k) arg2; \
503vector(integer(VKIND)), intent(in) :: arg3; \
504!dir$ ignore_tkr(r) arg3; \
505end subroutine ;
506
507! subroutine(vector(u), i, vector(u))
508#define SUB_VUIVU(VKIND) \
509pure subroutine sub_vu##VKIND##ivu##VKIND(arg1, arg2, arg3); \
510vector(unsigned(VKIND)), intent(in) :: arg1; \
511integer(8), intent(in) :: arg2; \
512!dir$ ignore_tkr(k) arg2; \
513vector(unsigned(VKIND)), intent(in) :: arg3; \
514!dir$ ignore_tkr(r) arg3; \
515end subroutine ;
516
517! subroutine(vector(r), i, vector(r))
518#define SUB_VRIVR(VKIND) \
519pure subroutine sub_vr##VKIND##ivr##VKIND(arg1, arg2, arg3); \
520vector(real(VKIND)), intent(in) :: arg1; \
521integer(8), intent(in) :: arg2; \
522!dir$ ignore_tkr(k) arg2; \
523vector(real(VKIND)), intent(in) :: arg3; \
524!dir$ ignore_tkr(r) arg3; \
525end subroutine ;
526
527! subroutine(vector(i), i, i)
528#define SUB_VIII(VKIND) \
529pure subroutine sub_vi##VKIND##ii##VKIND(arg1, arg2, arg3); \
530vector(integer(VKIND)), intent(in) :: arg1; \
531integer(8), intent(in) :: arg2; \
532!dir$ ignore_tkr(k) arg2; \
533integer(VKIND), intent(out) :: arg3; \
534!dir$ ignore_tkr(r) arg3; \
535end subroutine ;
536
537! subroutine(vector(u), i, i)
538#define SUB_VUII(VKIND) \
539pure subroutine sub_vu##VKIND##ii##VKIND(arg1, arg2, arg3); \
540vector(unsigned(VKIND)), intent(in) :: arg1; \
541integer(8), intent(in) :: arg2; \
542!dir$ ignore_tkr(k) arg2; \
543integer(VKIND), intent(out) :: arg3; \
544!dir$ ignore_tkr(r) arg3; \
545end subroutine ;
546
547! subroutine(vector(r), i, r)
548#define SUB_VRIR(VKIND) \
549pure subroutine sub_vr##VKIND##ir##VKIND(arg1, arg2, arg3); \
550vector(real(VKIND)), intent(in) :: arg1; \
551integer(8), intent(in) :: arg2; \
552!dir$ ignore_tkr(k) arg2; \
553real(VKIND), intent(out) :: arg3; \
554!dir$ ignore_tkr(r) arg3; \
555end subroutine ;
556
557! subroutine(__vector_pair, i, __vector_pair)
558pure subroutine sub_vpi0vp(arg1, arg2, arg3)
559__vector_pair, intent(in) :: arg1
560integer(8), intent(in) :: arg2
561!dir$ ignore_tkr(k) arg2
562__vector_pair, intent(out) :: arg3
563!dir$ ignore_tkr(r) arg3
564end subroutine
565
566! subroutine(__vector_pair, i, vector(i))
567#define SUB_VPI0VI(VKIND) \
568pure subroutine sub_vpi0vi##VKIND(arg1, arg2, arg3); \
569__vector_pair, intent(in) :: arg1; \
570integer(8), intent(in) :: arg2; \
571!dir$ ignore_tkr(k) arg2; \
572vector(integer(VKIND)), intent(out) :: arg3; \
573!dir$ ignore_tkr(r) arg3; \
574end subroutine;
575
576! subroutine(__vector_pair, i, vector(u))
577#define SUB_VPI0VU(VKIND) \
578pure subroutine sub_vpi0vu##VKIND(arg1, arg2, arg3); \
579__vector_pair, intent(in) :: arg1; \
580integer(8), intent(in) :: arg2; \
581!dir$ ignore_tkr(k) arg2; \
582vector(unsigned(VKIND)), intent(out) :: arg3; \
583!dir$ ignore_tkr(r) arg3; \
584end subroutine;
585
586! subroutine(__vector_pair, i, vector(r))
587#define SUB_VPI0VR(VKIND) \
588pure subroutine sub_vpi0vr##VKIND(arg1, arg2, arg3); \
589__vector_pair, intent(in) :: arg1; \
590integer(8), intent(in) :: arg2; \
591!dir$ ignore_tkr(k) arg2; \
592vector(real(VKIND)), intent(out) :: arg3; \
593!dir$ ignore_tkr(r) arg3; \
594end subroutine;
595
596! subroutine(__vector_pair, i, i)
597pure subroutine sub_vpi0i0(arg1, arg2, arg3)
598__vector_pair, intent(in) :: arg1
599integer(8), intent(in) :: arg2
600!dir$ ignore_tkr(k) arg2
601integer(8), intent(out) :: arg3
602!dir$ ignore_tkr(kr) arg3
603end subroutine
604
605! subroutine(__vector_pair, i, r)
606pure subroutine sub_vpi0r0(arg1, arg2, arg3)
607__vector_pair, intent(in) :: arg1
608integer(8), intent(in) :: arg2
609!dir$ ignore_tkr(k) arg2
610real(8), intent(out) :: arg3
611!dir$ ignore_tkr(kr) arg3
612end subroutine
613
614SUB_VIIVI(1) SUB_VIIVI(2) SUB_VIIVI(4) SUB_VIIVI(8)
615SUB_VUIVU(1) SUB_VUIVU(2) SUB_VUIVU(4) SUB_VUIVU(8)
616SUB_VRIVR(4) SUB_VRIVR(8)
617SUB_VIII(1) SUB_VIII(2) SUB_VIII(4) SUB_VIII(8)
618SUB_VUII(1) SUB_VUII(2) SUB_VUII(4) SUB_VUII(8)
619SUB_VRIR(4) SUB_VRIR(8)
620SUB_VPI0VI(1) SUB_VPI0VI(2) SUB_VPI0VI(4) SUB_VPI0VI(8)
621SUB_VPI0VU(1) SUB_VPI0VU(2) SUB_VPI0VU(4) SUB_VPI0VU(8)
622SUB_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
634end interface
635
636procedure(func_r4r4r4r4) :: __ppc_fmadd_r4
637procedure(func_r8r8r8r8) :: __ppc_fmadd_r8
638interface fmadd
639procedure :: __ppc_fmadd_r4
640procedure :: __ppc_fmadd_r8
641end interface fmadd
642public :: fmadd
643
644procedure(func_r4r4r4r4) :: __ppc_fmsub_r4
645procedure(func_r8r8r8r8) :: __ppc_fmsub_r8
646interface fmsub
647procedure :: __ppc_fmsub_r4
648procedure :: __ppc_fmsub_r8
649end interface fmsub
650public :: fmsub
651
652procedure(func_r4r4r4r4) :: __ppc_fnmadd_r4
653procedure(func_r8r8r8r8) :: __ppc_fnmadd_r8
654interface fnmadd
655procedure :: __ppc_fnmadd_r4
656procedure :: __ppc_fnmadd_r8
657end interface fnmadd
658public :: fnmadd
659
660procedure(func_r4r4r4r4) :: __ppc_fnmsub_r4
661procedure(func_r8r8r8r8) :: __ppc_fnmsub_r8
662interface fnmsub
663procedure :: __ppc_fnmsub_r4
664procedure :: __ppc_fnmsub_r8
665end interface fnmsub
666public :: fnmsub
667
668! fctid, fctidz, fctiw, fctiwz, fctudz, fctuwz
669abstract interface
670elemental real(4) function func_r4r4x(x)
671real(4), intent(in) :: x
672end function func_r4r4x
673elemental real(8) function func_r8r8x(x)
674real(8), intent(in) :: x
675end function func_r8r8x
676end interface
677
678procedure(func_r8r8x) :: __ppc_fctid
679interface fctid
680procedure :: __ppc_fctid
681end interface fctid
682public :: fctid
683
684procedure(func_r8r8x) :: __ppc_fctidz
685interface fctidz
686procedure :: __ppc_fctidz
687end interface fctidz
688public :: fctidz
689
690procedure(func_r8r8x) :: __ppc_fctiw
691interface fctiw
692procedure :: __ppc_fctiw
693end interface fctiw
694public :: fctiw
695
696procedure(func_r8r8x) :: __ppc_fctiwz
697interface fctiwz
698procedure :: __ppc_fctiwz
699end interface fctiwz
700public :: fctiwz
701
702procedure(func_r8r8x) :: __ppc_fctudz
703interface fctudz
704procedure :: __ppc_fctudz
705end interface fctudz
706public :: fctudz
707
708procedure(func_r8r8x) :: __ppc_fctuwz
709interface fctuwz
710procedure :: __ppc_fctuwz
711end interface fctuwz
712public :: fctuwz
713
714! fcfi, fcfid, fcfud
715abstract interface
716elemental real(8) function func_r8r8i(i)
717real(8), intent(in) :: i
718end function func_r8r8i
719end interface
720
721procedure(func_r8r8i) :: __ppc_fcfi
722interface fcfi
723procedure :: __ppc_fcfi
724end interface fcfi
725public :: fcfi
726
727procedure(func_r8r8i) :: __ppc_fcfid
728interface fcfid
729procedure :: __ppc_fcfid
730end interface fcfid
731public :: fcfid
732
733procedure(func_r8r8i) :: __ppc_fcfud
734interface fcfud
735procedure :: __ppc_fcfud
736end interface fcfud
737public :: fcfud
738
739! fnabs
740procedure(func_r4r4x) :: __ppc_fnabs_r4
741procedure(func_r8r8x) :: __ppc_fnabs_r8
742interface fnabs
743procedure :: __ppc_fnabs_r4
744procedure :: __ppc_fnabs_r8
745end interface fnabs
746public :: fnabs
747
748! fre, fres
749procedure(func_r8r8x) :: __ppc_fre
750interface fre
751procedure :: __ppc_fre
752end interface fre
753public :: fre
754
755procedure(func_r4r4x) :: __ppc_fres
756interface fres
757procedure :: __ppc_fres
758end interface fres
759public :: fres
760
761! frsqrte, frsqrtes
762procedure(func_r8r8x) :: __ppc_frsqrte
763interface frsqrte
764procedure :: __ppc_frsqrte
765end interface frsqrte
766public :: frsqrte
767
768procedure(func_r4r4x) :: __ppc_frsqrtes
769interface frsqrtes
770procedure :: __ppc_frsqrtes
771end interface frsqrtes
772public :: frsqrtes
773
774! mtfsf, mtfsfi
775interface mtfsf
776subroutine __ppc_mtfsf(mask, r)
777integer(4), intent(in) :: mask
778real(8), intent(in) :: r
779end subroutine __ppc_mtfsf
780end interface mtfsf
781public :: mtfsf
782
783interface mtfsfi
784subroutine __ppc_mtfsfi(bf, i)
785integer(4), intent(in) :: bf
786integer(4), intent(in) :: i
787end subroutine __ppc_mtfsfi
788end interface mtfsfi
789public :: 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) \
803procedure(elem_func_vi##VKIND##vi##VKIND) :: VI_VI(NAME, VKIND);
804#define VEC_VU_VU(NAME, VKIND) \
805procedure(elem_func_vu##VKIND##vu##VKIND) :: VU_VU(NAME, VKIND);
806#define VEC_VR_VR_2(NAME, VKIND1, VKIND2) \
807procedure(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) \
810procedure(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) \
813procedure(elem_func_vr##VKIND##r##VKIND) :: VR_R(NAME, VKIND);
814
815! vec_abs
816VEC_VI_VI(vec_abs,1) VEC_VI_VI(vec_abs,2) VEC_VI_VI(vec_abs,4) VEC_VI_VI(vec_abs,8)
817VEC_VR_VR(vec_abs,4) VEC_VR_VR(vec_abs,8)
818interface vec_abs
819procedure :: VI_VI(vec_abs,1), VI_VI(vec_abs,2), VI_VI(vec_abs,4), VI_VI(vec_abs,8)
820procedure :: VR_VR(vec_abs,4), VR_VR(vec_abs,8)
821end interface vec_abs
822public :: vec_abs
823
824! vec_cvf
825VEC_VR_VR_2(vec_cvf,4,8) VEC_VR_VR_2(vec_cvf,8,4)
826interface vec_cvf
827procedure :: VR_VR_2(vec_cvf,4,8), VR_VR_2(vec_cvf,8,4)
828end interface vec_cvf
829public :: vec_cvf
830
831! vec_cvbf16spn
832VEC_VU_VU(vec_cvbf16spn,1)
833interface vec_cvbf16spn
834procedure :: VU_VU(vec_cvbf16spn,1)
835end interface
836public vec_cvbf16spn
837
838! vec_cvspbf16
839VEC_VU_VU(vec_cvspbf16_,1)
840interface vec_cvspbf16
841procedure :: VU_VU(vec_cvspbf16_,1)
842end interface
843public vec_cvspbf16
844
845! vec_splats
846VEC_VI_I(vec_splats,1) VEC_VI_I(vec_splats,2) VEC_VI_I(vec_splats,4) VEC_VI_I(vec_splats,8)
847VEC_VR_R(vec_splats,4) VEC_VR_R(vec_splats,8)
848interface vec_splats
849procedure :: VI_I(vec_splats,1), VI_I(vec_splats,2), VI_I(vec_splats,4), VI_I(vec_splats,8)
850procedure :: VR_R(vec_splats,4), VR_R(vec_splats,8)
851end interface vec_splats
852public :: vec_splats
853
854! vec_splat_32
855VEC_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)
856interface vec_splat_s32
857procedure :: 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)
858end interface vec_splat_s32
859public :: 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) \
890procedure(elem_func_vi##VKIND##vi##VKIND##vi##VKIND) :: VI_VI_VI(NAME, VKIND);
891#define VEC_VU_VI_VI(NAME, VKIND) \
892procedure(elem_func_vu##VKIND##vi##VKIND##vi##VKIND) :: VU_VI_VI(NAME, VKIND);
893#define VEC_VU_VU_VU_2(NAME, VKIND1, VKIND2) \
894procedure(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) \
897procedure(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) \
900procedure(elem_func_vr##VKIND##vr##VKIND##vr##VKIND) :: VR_VR_VR(NAME, VKIND);
901#define VEC_VU_VR_VR(NAME, VKIND) \
902procedure(elem_func_vu##VKIND##vr##VKIND##vr##VKIND) :: VU_VR_VR(NAME, VKIND);
903#define VEC_VR_VR_VU(NAME, VKIND1, VKIND2) \
904procedure(elem_func_vr##VKIND1##vr##VKIND1##vu##VKIND2) :: VR_VR_VU_2(NAME, VKIND1, VKIND2);
905
906! vec_add
907VEC_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)
908VEC_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)
909VEC_VR_VR_VR(vec_add,4) VEC_VR_VR_VR(vec_add,8)
910interface vec_add
911procedure :: VI_VI_VI(vec_add,1), VI_VI_VI(vec_add,2), VI_VI_VI(vec_add,4), VI_VI_VI(vec_add,8)
912procedure :: VU_VU_VU(vec_add,1), VU_VU_VU(vec_add,2), VU_VU_VU(vec_add,4), VU_VU_VU(vec_add,8)
913procedure :: VR_VR_VR(vec_add,4), VR_VR_VR(vec_add,8)
914end interface vec_add
915public :: vec_add
916
917! vec_and
918VEC_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)
919VEC_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)
920VEC_VR_VR_VR(vec_and,4) VEC_VR_VR_VR(vec_and,8)
921interface vec_and
922procedure :: VI_VI_VI(vec_and,1), VI_VI_VI(vec_and,2), VI_VI_VI(vec_and,4), VI_VI_VI(vec_and,8)
923procedure :: VU_VU_VU(vec_and,1), VU_VU_VU(vec_and,2), VU_VU_VU(vec_and,4), VU_VU_VU(vec_and,8)
924procedure :: VR_VR_VR(vec_and,4), VR_VR_VR(vec_and,8)
925end interface vec_and
926public :: vec_and
927
928! vec_cmpge
929VEC_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)
930VEC_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)
931VEC_VU_VR_VR(vec_cmpge,4) VEC_VU_VR_VR(vec_cmpge,8)
932interface vec_cmpge
933procedure :: VU_VI_VI(vec_cmpge,1), VU_VI_VI(vec_cmpge,2), VU_VI_VI(vec_cmpge,4), VU_VI_VI(vec_cmpge,8)
934procedure :: VU_VU_VU(vec_cmpge,1), VU_VU_VU(vec_cmpge,2), VU_VU_VU(vec_cmpge,4), VU_VU_VU(vec_cmpge,8)
935procedure :: VU_VR_VR(vec_cmpge,4), VU_VR_VR(vec_cmpge,8)
936end interface vec_cmpge
937public :: vec_cmpge
938
939! vec_cmpgt
940VEC_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)
941VEC_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)
942VEC_VU_VR_VR(vec_cmpgt,4) VEC_VU_VR_VR(vec_cmpgt,8)
943interface vec_cmpgt
944procedure :: VU_VI_VI(vec_cmpgt,1), VU_VI_VI(vec_cmpgt,2), VU_VI_VI(vec_cmpgt,4), VU_VI_VI(vec_cmpgt,8)
945procedure :: VU_VU_VU(vec_cmpgt,1), VU_VU_VU(vec_cmpgt,2), VU_VU_VU(vec_cmpgt,4), VU_VU_VU(vec_cmpgt,8)
946procedure :: VU_VR_VR(vec_cmpgt,4), VU_VR_VR(vec_cmpgt,8)
947end interface vec_cmpgt
948public :: vec_cmpgt
949
950! vec_cmple
951VEC_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)
952VEC_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)
953VEC_VU_VR_VR(vec_cmple,4) VEC_VU_VR_VR(vec_cmple,8)
954interface vec_cmple
955procedure :: VU_VI_VI(vec_cmple,1), VU_VI_VI(vec_cmple,2), VU_VI_VI(vec_cmple,4), VU_VI_VI(vec_cmple,8)
956procedure :: VU_VU_VU(vec_cmple,1), VU_VU_VU(vec_cmple,2), VU_VU_VU(vec_cmple,4), VU_VU_VU(vec_cmple,8)
957procedure :: VU_VR_VR(vec_cmple,4), VU_VR_VR(vec_cmple,8)
958end interface vec_cmple
959public :: vec_cmple
960
961! vec_cmplt
962VEC_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)
963VEC_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)
964VEC_VU_VR_VR(vec_cmplt,4) VEC_VU_VR_VR(vec_cmplt,8)
965interface vec_cmplt
966procedure :: VU_VI_VI(vec_cmplt,1), VU_VI_VI(vec_cmplt,2), VU_VI_VI(vec_cmplt,4), VU_VI_VI(vec_cmplt,8)
967procedure :: VU_VU_VU(vec_cmplt,1), VU_VU_VU(vec_cmplt,2), VU_VU_VU(vec_cmplt,4), VU_VU_VU(vec_cmplt,8)
968procedure :: VU_VR_VR(vec_cmplt,4), VU_VR_VR(vec_cmplt,8)
969end interface vec_cmplt
970public :: 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) \
979procedure(func_vec_convert_vi##VKIND##vi##vi##VKIND) :: CONVERT_VI_VI_VI(VKIND);
980#define VEC_CONVERT_VU_VI_VU(VKIND) \
981procedure(func_vec_convert_vu##VKIND##vi##vu##VKIND) :: CONVERT_VU_VI_VU(VKIND);
982#define VEC_CONVERT_VR_VI_VR(VKIND) \
983procedure(func_vec_convert_vr##VKIND##vi##vr##VKIND) :: CONVERT_VR_VI_VR(VKIND);
984
985VEC_CONVERT_VI_VI_VI(1) VEC_CONVERT_VI_VI_VI(2) VEC_CONVERT_VI_VI_VI(4) VEC_CONVERT_VI_VI_VI(8)
986VEC_CONVERT_VU_VI_VU(1) VEC_CONVERT_VU_VI_VU(2) VEC_CONVERT_VU_VI_VU(4) VEC_CONVERT_VU_VI_VU(8)
987VEC_CONVERT_VR_VI_VR(4) VEC_CONVERT_VR_VI_VR(8)
988interface vec_convert
989procedure :: CONVERT_VI_VI_VI(1), CONVERT_VI_VI_VI(2), CONVERT_VI_VI_VI(4), CONVERT_VI_VI_VI(8)
990procedure :: CONVERT_VU_VI_VU(1), CONVERT_VU_VI_VU(2), CONVERT_VU_VI_VU(4), CONVERT_VU_VI_VU(8)
991procedure :: CONVERT_VR_VI_VR(4), CONVERT_VR_VI_VR(8)
992end interface vec_convert
993public :: 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
1003VEC_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)
1004VEC_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)
1005VEC_VR_VR_VR(vec_max,4) VEC_VR_VR_VR(vec_max,8)
1006interface vec_max
1007procedure :: VI_VI_VI(vec_max,1), VI_VI_VI(vec_max,2), VI_VI_VI(vec_max,4), VI_VI_VI(vec_max,8)
1008procedure :: VU_VU_VU(vec_max,1), VU_VU_VU(vec_max,2), VU_VU_VU(vec_max,4), VU_VU_VU(vec_max,8)
1009procedure :: VR_VR_VR(vec_max,4), VR_VR_VR(vec_max,8)
1010end interface vec_max
1011public :: vec_max
1012
1013! vec_mergeh
1014VEC_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)
1015VEC_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)
1016VEC_VR_VR_VR(vec_mergeh,4) VEC_VR_VR_VR(vec_mergeh,8)
1017interface vec_mergeh
1018procedure :: VI_VI_VI(vec_mergeh,1), VI_VI_VI(vec_mergeh,2), VI_VI_VI(vec_mergeh,4), VI_VI_VI(vec_mergeh,8)
1019procedure :: VU_VU_VU(vec_mergeh,1), VU_VU_VU(vec_mergeh,2), VU_VU_VU(vec_mergeh,4), VU_VU_VU(vec_mergeh,8)
1020procedure :: VR_VR_VR(vec_mergeh,4), VR_VR_VR(vec_mergeh,8)
1021end interface vec_mergeh
1022public :: vec_mergeh
1023
1024! vec_mergel
1025VEC_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)
1026VEC_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)
1027VEC_VR_VR_VR(vec_mergel,4) VEC_VR_VR_VR(vec_mergel,8)
1028interface vec_mergel
1029procedure :: VI_VI_VI(vec_mergel,1), VI_VI_VI(vec_mergel,2), VI_VI_VI(vec_mergel,4), VI_VI_VI(vec_mergel,8)
1030procedure :: VU_VU_VU(vec_mergel,1), VU_VU_VU(vec_mergel,2), VU_VU_VU(vec_mergel,4), VU_VU_VU(vec_mergel,8)
1031procedure :: VR_VR_VR(vec_mergel,4), VR_VR_VR(vec_mergel,8)
1032end interface vec_mergel
1033public :: vec_mergel
1034
1035! vec_min
1036VEC_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)
1037VEC_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)
1038VEC_VR_VR_VR(vec_min,4) VEC_VR_VR_VR(vec_min,8)
1039interface vec_min
1040procedure :: VI_VI_VI(vec_min,1), VI_VI_VI(vec_min,2), VI_VI_VI(vec_min,4), VI_VI_VI(vec_min,8)
1041procedure :: VU_VU_VU(vec_min,1), VU_VU_VU(vec_min,2), VU_VU_VU(vec_min,4), VU_VU_VU(vec_min,8)
1042procedure :: VR_VR_VR(vec_min,4), VR_VR_VR(vec_min,8)
1043end interface vec_min
1044public :: vec_min
1045
1046! vec_mul
1047VEC_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)
1048VEC_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)
1049VEC_VR_VR_VR(vec_mul,4) VEC_VR_VR_VR(vec_mul,8)
1050interface vec_mul
1051procedure :: VI_VI_VI(vec_mul,1), VI_VI_VI(vec_mul,2), VI_VI_VI(vec_mul,4), VI_VI_VI(vec_mul,8)
1052procedure :: VU_VU_VU(vec_mul,1), VU_VU_VU(vec_mul,2), VU_VU_VU(vec_mul,4), VU_VU_VU(vec_mul,8)
1053procedure :: VR_VR_VR(vec_mul,4), VR_VR_VR(vec_mul,8)
1054end interface vec_mul
1055public :: vec_mul
1056
1057! vec_sub
1058VEC_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)
1059VEC_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)
1060VEC_VR_VR_VR(vec_sub,4) VEC_VR_VR_VR(vec_sub,8)
1061interface vec_sub
1062procedure :: VI_VI_VI(vec_sub,1), VI_VI_VI(vec_sub,2), VI_VI_VI(vec_sub,4), VI_VI_VI(vec_sub,8)
1063procedure :: VU_VU_VU(vec_sub,1), VU_VU_VU(vec_sub,2), VU_VU_VU(vec_sub,4), VU_VU_VU(vec_sub,8)
1064procedure :: VR_VR_VR(vec_sub,4), VR_VR_VR(vec_sub,8)
1065end interface vec_sub
1066public :: vec_sub
1067
1068! vec_sl
1069VEC_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)
1070VEC_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)
1071interface vec_sl
1072procedure :: VI_VI_VU(vec_sl,1), VI_VI_VU(vec_sl,2), VI_VI_VU(vec_sl,4), VI_VI_VU(vec_sl,8)
1073procedure :: VU_VU_VU(vec_sl,1), VU_VU_VU(vec_sl,2), VU_VU_VU(vec_sl,4), VU_VU_VU(vec_sl,8)
1074end interface vec_sl
1075public :: vec_sl
1076
1077! vec_sll
1078VEC_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)
1079VEC_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)
1080VEC_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)
1081VEC_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)
1082VEC_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)
1083VEC_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)
1084interface vec_sll
1085procedure :: VI_VI_VU_2(vec_sll,1,1), VI_VI_VU_2(vec_sll,2,1), VI_VI_VU_2(vec_sll,4,1)
1086procedure :: VI_VI_VU_2(vec_sll,1,2), VI_VI_VU_2(vec_sll,2,2), VI_VI_VU_2(vec_sll,4,2)
1087procedure :: VI_VI_VU_2(vec_sll,1,4), VI_VI_VU_2(vec_sll,2,4), VI_VI_VU_2(vec_sll,4,4)
1088procedure :: VU_VU_VU_2(vec_sll,1,1), VU_VU_VU_2(vec_sll,2,1), VU_VU_VU_2(vec_sll,4,1)
1089procedure :: VU_VU_VU_2(vec_sll,1,2), VU_VU_VU_2(vec_sll,2,2), VU_VU_VU_2(vec_sll,4,2)
1090procedure :: VU_VU_VU_2(vec_sll,1,4), VU_VU_VU_2(vec_sll,2,4), VU_VU_VU_2(vec_sll,4,4)
1091end interface vec_sll
1092public :: vec_sll
1093
1094! vec_slo
1095VEC_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)
1096VEC_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)
1097VEC_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)
1098VEC_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)
1099VEC_VR_VR_VU(vec_slo,4,1) VEC_VR_VR_VU(vec_slo,4,2)
1100interface vec_slo
1101procedure :: VI_VI_VU_2(vec_slo,1,1), VI_VI_VU_2(vec_slo,2,1), VI_VI_VU_2(vec_slo,4,1)
1102procedure :: VI_VI_VU_2(vec_slo,1,2), VI_VI_VU_2(vec_slo,2,2), VI_VI_VU_2(vec_slo,4,2)
1103procedure :: VU_VU_VU_2(vec_slo,1,1), VU_VU_VU_2(vec_slo,2,1), VU_VU_VU_2(vec_slo,4,1)
1104procedure :: VU_VU_VU_2(vec_slo,1,2), VU_VU_VU_2(vec_slo,2,2), VU_VU_VU_2(vec_slo,4,2)
1105procedure :: VR_VR_VU_2(vec_slo,4,1), VR_VR_VU_2(vec_slo,4,2)
1106end interface vec_slo
1107public :: vec_slo
1108
1109! vec_sr
1110VEC_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)
1111VEC_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)
1112interface vec_sr
1113procedure :: VI_VI_VU(vec_sr,1), VI_VI_VU(vec_sr,2), VI_VI_VU(vec_sr,4), VI_VI_VU(vec_sr,8)
1114procedure :: VU_VU_VU(vec_sr,1), VU_VU_VU(vec_sr,2), VU_VU_VU(vec_sr,4), VU_VU_VU(vec_sr,8)
1115end interface vec_sr
1116public :: vec_sr
1117
1118! vec_srl
1119VEC_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)
1120VEC_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)
1121VEC_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)
1122VEC_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)
1123VEC_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)
1124VEC_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)
1125interface vec_srl
1126procedure :: VI_VI_VU_2(vec_srl,1,1), VI_VI_VU_2(vec_srl,2,1), VI_VI_VU_2(vec_srl,4,1)
1127procedure :: VI_VI_VU_2(vec_srl,1,2), VI_VI_VU_2(vec_srl,2,2), VI_VI_VU_2(vec_srl,4,2)
1128procedure :: VI_VI_VU_2(vec_srl,1,4), VI_VI_VU_2(vec_srl,2,4), VI_VI_VU_2(vec_srl,4,4)
1129procedure :: VU_VU_VU_2(vec_srl,1,1), VU_VU_VU_2(vec_srl,2,1), VU_VU_VU_2(vec_srl,4,1)
1130procedure :: VU_VU_VU_2(vec_srl,1,2), VU_VU_VU_2(vec_srl,2,2), VU_VU_VU_2(vec_srl,4,2)
1131procedure :: VU_VU_VU_2(vec_srl,1,4), VU_VU_VU_2(vec_srl,2,4), VU_VU_VU_2(vec_srl,4,4)
1132end interface vec_srl
1133public :: vec_srl
1134
1135! vec_sro
1136VEC_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)
1137VEC_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)
1138VEC_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)
1139VEC_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)
1140VEC_VR_VR_VU(vec_sro,4,1) VEC_VR_VR_VU(vec_sro,4,2)
1141interface vec_sro
1142procedure :: VI_VI_VU_2(vec_sro,1,1), VI_VI_VU_2(vec_sro,2,1), VI_VI_VU_2(vec_sro,4,1)
1143procedure :: VI_VI_VU_2(vec_sro,1,2), VI_VI_VU_2(vec_sro,2,2), VI_VI_VU_2(vec_sro,4,2)
1144procedure :: VU_VU_VU_2(vec_sro,1,1), VU_VU_VU_2(vec_sro,2,1), VU_VU_VU_2(vec_sro,4,1)
1145procedure :: VU_VU_VU_2(vec_sro,1,2), VU_VU_VU_2(vec_sro,2,2), VU_VU_VU_2(vec_sro,4,2)
1146procedure :: VR_VR_VU_2(vec_sro,4,1), VR_VR_VU_2(vec_sro,4,2)
1147end interface vec_sro
1148public :: vec_sro
1149
1150! vec_xor
1151VEC_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)
1152VEC_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)
1153VEC_VR_VR_VR(vec_xor,4) VEC_VR_VR_VR(vec_xor,8)
1154interface vec_xor
1155procedure :: VI_VI_VI(vec_xor,1), VI_VI_VI(vec_xor,2), VI_VI_VI(vec_xor,4), VI_VI_VI(vec_xor,8)
1156procedure :: VU_VU_VU(vec_xor,1), VU_VU_VU(vec_xor,2), VU_VU_VU(vec_xor,4), VU_VU_VU(vec_xor,8)
1157procedure :: VR_VR_VR(vec_xor,4), VR_VR_VR(vec_xor,8)
1158end interface vec_xor
1159public :: 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) \
1186procedure(func_vu1i0i##KIND) :: VU1_I0_I(NAME, KIND);
1187#define VEC_VU1_I0_R(NAME, KIND) \
1188procedure(func_vu1i0r##KIND) :: VU1_I0_R(NAME, KIND);
1189
1190! vec_lvsl
1191VEC_VU1_I0_I(vec_lvsl,1) VEC_VU1_I0_I(vec_lvsl,2) VEC_VU1_I0_I(vec_lvsl,4)
1192VEC_VU1_I0_R(vec_lvsl,4)
1193interface vec_lvsl
1194procedure :: VU1_I0_I(vec_lvsl,1), VU1_I0_I(vec_lvsl,2), VU1_I0_I(vec_lvsl,4)
1195procedure :: VU1_I0_R(vec_lvsl,4)
1196end interface
1197public :: vec_lvsl
1198
1199! vec_lvsr
1200VEC_VU1_I0_I(vec_lvsr,1) VEC_VU1_I0_I(vec_lvsr,2) VEC_VU1_I0_I(vec_lvsr,4)
1201VEC_VU1_I0_R(vec_lvsr,4)
1202interface vec_lvsr
1203procedure :: VU1_I0_I(vec_lvsr,1), VU1_I0_I(vec_lvsr,2), VU1_I0_I(vec_lvsr,4)
1204procedure :: VU1_I0_R(vec_lvsr,4)
1205end interface
1206public :: 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) \
1224procedure(func_vi##VKIND##i0##vi##VKIND) :: VI_I0_VI(NAME, VKIND);
1225#define VEC_VU_I0_VU(NAME, VKIND) \
1226procedure(func_vu##VKIND##i0##vu##VKIND) :: VU_I0_VU(NAME, VKIND);
1227#define VEC_VR_I0_VR(NAME, VKIND) \
1228procedure(func_vr##VKIND##i0##vr##VKIND) :: VR_I0_VR(NAME, VKIND);
1229#define VEC_VI_I0_I(NAME, VKIND) \
1230procedure(func_vi##VKIND##i0##i##VKIND) :: VI_I0_I(NAME, VKIND);
1231#define VEC_VR_I0_R(NAME, VKIND) \
1232procedure(func_vr##VKIND##i0##r##VKIND) :: VR_I0_R(NAME, VKIND);
1233
1234! vec_ld
1235VEC_VI_I0_VI(vec_ld,1) VEC_VI_I0_VI(vec_ld,2) VEC_VI_I0_VI(vec_ld,4)
1236VEC_VU_I0_VU(vec_ld,1) VEC_VU_I0_VU(vec_ld,2) VEC_VU_I0_VU(vec_ld,4)
1237VEC_VR_I0_VR(vec_ld,4)
1238VEC_VI_I0_I(vec_ld,1) VEC_VI_I0_I(vec_ld,2) VEC_VI_I0_I(vec_ld,4)
1239VEC_VR_I0_R(vec_ld,4)
1240interface vec_ld
1241procedure :: VI_I0_VI(vec_ld,1), VI_I0_VI(vec_ld,2), VI_I0_VI(vec_ld,4)
1242procedure :: VU_I0_VU(vec_ld,1), VU_I0_VU(vec_ld,2), VU_I0_VU(vec_ld,4)
1243procedure :: VR_I0_VR(vec_ld,4)
1244procedure :: VI_I0_I(vec_ld,1), VI_I0_I(vec_ld,2), VI_I0_I(vec_ld,4)
1245procedure :: VR_I0_R(vec_ld,4)
1246end interface
1247public :: vec_ld
1248
1249! vec_lde
1250VEC_VI_I0_I(vec_lde,1) VEC_VI_I0_I(vec_lde,2) VEC_VI_I0_I(vec_lde,4)
1251VEC_VR_I0_R(vec_lde,4)
1252interface vec_lde
1253procedure :: VI_I0_I(vec_lde,1), VI_I0_I(vec_lde,2), VI_I0_I(vec_lde,4)
1254procedure :: VR_I0_R(vec_lde,4)
1255end interface
1256public :: vec_lde
1257
1258! vec_ldl
1259VEC_VI_I0_VI(vec_ldl,1) VEC_VI_I0_VI(vec_ldl,2) VEC_VI_I0_VI(vec_ldl,4)
1260VEC_VU_I0_VU(vec_ldl,1) VEC_VU_I0_VU(vec_ldl,2) VEC_VU_I0_VU(vec_ldl,4)
1261VEC_VR_I0_VR(vec_ldl,4)
1262VEC_VI_I0_I(vec_ldl,1) VEC_VI_I0_I(vec_ldl,2) VEC_VI_I0_I(vec_ldl,4)
1263VEC_VR_I0_R(vec_ldl,4)
1264interface vec_ldl
1265procedure :: VI_I0_VI(vec_ldl,1), VI_I0_VI(vec_ldl,2), VI_I0_VI(vec_ldl,4)
1266procedure :: VU_I0_VU(vec_ldl,1), VU_I0_VU(vec_ldl,2), VU_I0_VU(vec_ldl,4)
1267procedure :: VR_I0_VR(vec_ldl,4)
1268procedure :: VI_I0_I(vec_ldl,1), VI_I0_I(vec_ldl,2), VI_I0_I(vec_ldl,4)
1269procedure :: VR_I0_R(vec_ldl,4)
1270end interface
1271public :: vec_ldl
1272
1273! vec_lxv
1274VEC_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)
1275VEC_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)
1276VEC_VR_I0_VR(vec_lxv,4) VEC_VR_I0_VR(vec_lxv,8)
1277VEC_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)
1278VEC_VR_I0_R(vec_lxv,4) VEC_VR_I0_R(vec_lxv,8)
1279interface vec_lxv
1280procedure :: VI_I0_VI(vec_lxv,1), VI_I0_VI(vec_lxv,2), VI_I0_VI(vec_lxv,4), VI_I0_VI(vec_lxv,8)
1281procedure :: VU_I0_VU(vec_lxv,1), VU_I0_VU(vec_lxv,2), VU_I0_VU(vec_lxv,4), VU_I0_VU(vec_lxv,8)
1282procedure :: VR_I0_VR(vec_lxv,4), VR_I0_VR(vec_lxv,8)
1283procedure :: VI_I0_I(vec_lxv,1), VI_I0_I(vec_lxv,2), VI_I0_I(vec_lxv,4), VI_I0_I(vec_lxv,8)
1284procedure :: VR_I0_R(vec_lxv,4), VR_I0_R(vec_lxv,8)
1285end interface
1286public :: vec_lxv
1287
1288! vec_xl
1289VEC_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)
1290VEC_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)
1291VEC_VR_I0_VR(vec_xl,4) VEC_VR_I0_VR(vec_xl,8)
1292VEC_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)
1293VEC_VR_I0_R(vec_xl,4) VEC_VR_I0_R(vec_xl,8)
1294interface vec_xl
1295procedure :: VI_I0_VI(vec_xl,1), VI_I0_VI(vec_xl,2), VI_I0_VI(vec_xl,4), VI_I0_VI(vec_xl,8)
1296procedure :: VU_I0_VU(vec_xl,1), VU_I0_VU(vec_xl,2), VU_I0_VU(vec_xl,4), VU_I0_VU(vec_xl,8)
1297procedure :: VR_I0_VR(vec_xl,4), VR_I0_VR(vec_xl,8)
1298procedure :: VI_I0_I(vec_xl,1), VI_I0_I(vec_xl,2), VI_I0_I(vec_xl,4), VI_I0_I(vec_xl,8)
1299procedure :: VR_I0_R(vec_xl,4), VR_I0_R(vec_xl,8)
1300end interface
1301public :: vec_xl
1302
1303! vec_xl_be
1304VEC_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)
1305VEC_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)
1306VEC_VR_I0_VR(vec_xl_be,4) VEC_VR_I0_VR(vec_xl_be,8)
1307VEC_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)
1308VEC_VR_I0_R(vec_xl_be,4) VEC_VR_I0_R(vec_xl_be,8)
1309interface vec_xl_be
1310procedure :: 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)
1311procedure :: 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)
1312procedure :: VR_I0_VR(vec_xl_be,4), VR_I0_VR(vec_xl_be,8)
1313procedure :: 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)
1314procedure :: VR_I0_R(vec_xl_be,4), VR_I0_R(vec_xl_be,8)
1315end interface
1316public :: vec_xl_be
1317
1318! vec_xld2
1319VEC_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)
1320VEC_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)
1321VEC_VR_I0_VR(vec_xld2_,4) VEC_VR_I0_VR(vec_xld2_,8)
1322VEC_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)
1323VEC_VR_I0_R(vec_xld2_,4) VEC_VR_I0_R(vec_xld2_,8)
1324interface vec_xld2
1325procedure :: VI_I0_VI(vec_xld2_,1), VI_I0_VI(vec_xld2_,2), VI_I0_VI(vec_xld2_,4), VI_I0_VI(vec_xld2_,8)
1326procedure :: VU_I0_VU(vec_xld2_,1), VU_I0_VU(vec_xld2_,2), VU_I0_VU(vec_xld2_,4), VU_I0_VU(vec_xld2_,8)
1327procedure :: VR_I0_VR(vec_xld2_,4), VR_I0_VR(vec_xld2_,8)
1328procedure :: VI_I0_I(vec_xld2_,1), VI_I0_I(vec_xld2_,2), VI_I0_I(vec_xld2_,4), VI_I0_I(vec_xld2_,8)
1329procedure :: VR_I0_R(vec_xld2_,4), VR_I0_R(vec_xld2_,8)
1330end interface
1331public :: vec_xld2
1332
1333! vec_xlds
1334VEC_VI_I0_VI(vec_xlds,8)
1335VEC_VU_I0_VU(vec_xlds,8)
1336VEC_VR_I0_VR(vec_xlds,8)
1337VEC_VI_I0_I(vec_xlds,8)
1338VEC_VR_I0_R(vec_xlds,8)
1339interface vec_xlds
1340procedure :: VI_I0_VI(vec_xlds,8)
1341procedure :: VU_I0_VU(vec_xlds,8)
1342procedure :: VR_I0_VR(vec_xlds,8)
1343procedure :: VI_I0_I(vec_xlds,8)
1344procedure :: VR_I0_R(vec_xlds,8)
1345end interface
1346public :: vec_xlds
1347
1348! vec_xlw4
1349VEC_VI_I0_VI(vec_xlw4_,1) VEC_VI_I0_VI(vec_xlw4_,2)
1350VEC_VU_I0_VU(vec_xlw4_,1) VEC_VU_I0_VU(vec_xlw4_,2) VEC_VU_I0_VU(vec_xlw4_,4)
1351VEC_VR_I0_VR(vec_xlw4_,4)
1352VEC_VI_I0_I(vec_xlw4_,1) VEC_VI_I0_I(vec_xlw4_,2) VEC_VI_I0_I(vec_xlw4_,4)
1353VEC_VR_I0_R(vec_xlw4_,4)
1354interface vec_xlw4
1355procedure :: VI_I0_VI(vec_xlw4_,1), VI_I0_VI(vec_xlw4_,2)
1356procedure :: VU_I0_VU(vec_xlw4_,1), VU_I0_VU(vec_xlw4_,2), VU_I0_VU(vec_xlw4_,4)
1357procedure :: VR_I0_VR(vec_xlw4_,4)
1358procedure :: VI_I0_I(vec_xlw4_,1), VI_I0_I(vec_xlw4_,2), VI_I0_I(vec_xlw4_,4)
1359procedure :: VR_I0_R(vec_xlw4_,4)
1360end interface
1361public :: 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) \
1383procedure(func_vpi0vi##VKIND) :: VP_I0_VI(NAME, VKIND);
1384#define VEC_VP_I0_VU(NAME, VKIND) \
1385procedure(func_vpi0vu##VKIND) :: VP_I0_VU(NAME, VKIND);
1386#define VEC_VP_I0_VR(NAME, VKIND) \
1387procedure(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
1391VEC_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)
1392VEC_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)
1393VEC_VP_I0_VR(vec_lxvp,4) VEC_VP_I0_VR(vec_lxvp,8)
1394VEC_VP_I0_VP(vec_lxvp)
1395interface vec_lxvp
1396procedure :: VP_I0_VI(vec_lxvp,1), VP_I0_VI(vec_lxvp,2), VP_I0_VI(vec_lxvp,4), VP_I0_VI(vec_lxvp,8)
1397procedure :: VP_I0_VU(vec_lxvp,1), VP_I0_VU(vec_lxvp,2), VP_I0_VU(vec_lxvp,4), VP_I0_VU(vec_lxvp,8)
1398procedure :: VP_I0_VR(vec_lxvp,4), VP_I0_VR(vec_lxvp,8)
1399procedure :: VP_I0_VP(vec_lxvp)
1400end interface vec_lxvp
1401public :: vec_lxvp
1402
1403! vsx_lxvp (alias to vec_lxvp)
1404interface vsx_lxvp
1405procedure :: VP_I0_VI(vec_lxvp,1), VP_I0_VI(vec_lxvp,2), VP_I0_VI(vec_lxvp,4), VP_I0_VI(vec_lxvp,8)
1406procedure :: VP_I0_VU(vec_lxvp,1), VP_I0_VU(vec_lxvp,2), VP_I0_VU(vec_lxvp,4), VP_I0_VU(vec_lxvp,8)
1407procedure :: VP_I0_VR(vec_lxvp,4), VP_I0_VR(vec_lxvp,8)
1408procedure :: VP_I0_VP(vec_lxvp)
1409end interface vsx_lxvp
1410public :: 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) \
1437procedure(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) \
1439procedure(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) \
1442procedure(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) \
1445procedure(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) \
1448procedure(elem_func_vi##VKIND##vi##VKIND##vi##VKIND##i) :: VI_VI_VI_I(NAME, VKIND);
1449#define VEC_VU_VU_VU_I(NAME, VKIND) \
1450procedure(elem_func_vu##VKIND##vu##VKIND##vu##VKIND##i) :: VU_VU_VU_I(NAME, VKIND);
1451#define VEC_VR_VR_VR_I(NAME, VKIND) \
1452procedure(elem_func_vr##VKIND##vr##VKIND##vr##VKIND##i) :: VR_VR_VR_I(NAME, VKIND);
1453
1454! vec_madd
1455VEC_VR_VR_VR_VR(vec_madd,4) VEC_VR_VR_VR_VR(vec_madd,8)
1456interface vec_madd
1457procedure :: VR_VR_VR_VR(vec_madd,4), VR_VR_VR_VR(vec_madd,8)
1458end interface vec_madd
1459public :: vec_madd
1460
1461! vec_msub
1462VEC_VR_VR_VR_VR(vec_msub,4) VEC_VR_VR_VR_VR(vec_msub,8)
1463interface vec_msub
1464procedure :: VR_VR_VR_VR(vec_msub,4), VR_VR_VR_VR(vec_msub,8)
1465end interface vec_msub
1466public :: vec_msub
1467
1468! vec_nmadd
1469VEC_VR_VR_VR_VR(vec_nmadd,4) VEC_VR_VR_VR_VR(vec_nmadd,8)
1470interface vec_nmadd
1471procedure :: VR_VR_VR_VR(vec_nmadd,4), VR_VR_VR_VR(vec_nmadd,8)
1472end interface vec_nmadd
1473public :: vec_nmadd
1474
1475! vec_nmsub
1476VEC_VR_VR_VR_VR(vec_nmsub,4) VEC_VR_VR_VR_VR(vec_nmsub,8)
1477interface vec_nmsub
1478procedure :: VR_VR_VR_VR(vec_nmsub,4), VR_VR_VR_VR(vec_nmsub,8)
1479end interface vec_nmsub
1480public :: vec_nmsub
1481
1482! vec_perm
1483VEC_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)
1484VEC_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)
1485VEC_VR_VR_VR_VU_2(vec_perm,4,1) VEC_VR_VR_VR_VU_2(vec_perm,8,1)
1486interface vec_perm
1487procedure :: 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)
1488procedure :: 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)
1489procedure :: VR_VR_VR_VU_2(vec_perm,4,1), VR_VR_VR_VU_2(vec_perm,8,1)
1490end interface vec_perm
1491public :: vec_perm
1492
1493! vec_permi
1494VEC_VI_VI_VI_I(vec_permi,8)
1495VEC_VU_VU_VU_I(vec_permi,8)
1496VEC_VR_VR_VR_I(vec_permi,4) VEC_VR_VR_VR_I(vec_permi,8)
1497interface vec_permi
1498procedure :: VI_VI_VI_I(vec_permi,8)
1499procedure :: VU_VU_VU_I(vec_permi,8)
1500procedure :: VR_VR_VR_I(vec_permi,4), VR_VR_VR_I(vec_permi,8)
1501end interface vec_permi
1502public :: vec_permi
1503
1504! vec_sel
1505VEC_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)
1506VEC_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)
1507VEC_VR_VR_VR_VU(vec_sel,4) VEC_VR_VR_VR_VU(vec_sel,8)
1508interface vec_sel
1509procedure :: 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)
1510procedure :: 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)
1511procedure :: VR_VR_VR_VU(vec_sel,4), VR_VR_VR_VU(vec_sel,8)
1512end interface vec_sel
1513public :: 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) \
1544procedure(elem_func_vi##VKIND##i##VKIND##vi##VKIND##i) :: VI_I_VI_I(NAME, VKIND);
1545#define VEC_VR_R_VR_I(NAME, VKIND) \
1546procedure(elem_func_vr##VKIND##r##VKIND##vr##VKIND##i) :: VR_R_VR_I(NAME, VKIND);
1547
1548! vec_insert
1549VEC_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)
1550VEC_VR_R_VR_I(vec_insert,4) VEC_VR_R_VR_I(vec_insert,8)
1551interface vec_insert
1552procedure :: 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)
1553procedure :: VR_R_VR_I(vec_insert,4), VR_R_VR_I(vec_insert,8)
1554end interface vec_insert
1555public :: 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) \
1570procedure(elem_func_i##RKIND##vi##VKIND##vi##VKIND) :: I_VI_VI(NAME, RKIND, VKIND);
1571#define VEC_I_VU_VU(NAME, RKIND, VKIND) \
1572procedure(elem_func_i##RKIND##vu##VKIND##vu##VKIND) :: I_VU_VU(NAME, RKIND, VKIND);
1573#define VEC_I_VR_VR(NAME, RKIND, VKIND) \
1574procedure(elem_func_i##RKIND##vr##VKIND##vr##VKIND) :: I_VR_VR(NAME, RKIND, VKIND);
1575
1576! vec_any_ge
1577VEC_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)
1578VEC_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)
1579VEC_I_VR_VR(vec_any_ge,4,4) VEC_I_VR_VR(vec_any_ge,4,8)
1580interface vec_any_ge
1581procedure :: 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)
1582procedure :: 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)
1583procedure :: I_VR_VR(vec_any_ge,4,4), I_VR_VR(vec_any_ge,4,8)
1584end interface vec_any_ge
1585public :: 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) \
1601procedure(elem_func_i##VKIND##vi##VKIND##i) :: I_VI_I(NAME, VKIND);
1602#define VEC_R_VR_I(NAME, VKIND) \
1603procedure(elem_func_r##VKIND##vr##VKIND##i) :: R_VR_I(NAME, VKIND);
1604
1605! vec_extract
1606VEC_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)
1607VEC_R_VR_I(vec_extract,4) VEC_R_VR_I(vec_extract,8)
1608interface vec_extract
1609procedure :: I_VI_I(vec_extract,1), I_VI_I(vec_extract,2), I_VI_I(vec_extract,4), I_VI_I(vec_extract,8)
1610procedure :: R_VR_I(vec_extract,4), R_VR_I(vec_extract,8)
1611end interface
1612public :: 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) \
1623procedure(elem_func_vi##VKIND##vi##VKIND##vi##VKIND##i) :: VI_VI_VI_I(NAME, VKIND);
1624#define VEC_VU_VU_VU_I(NAME, VKIND) \
1625procedure(elem_func_vu##VKIND##vu##VKIND##vu##VKIND##i) :: VU_VU_VU_I(NAME, VKIND);
1626#define VEC_VR_VR_VR_I(NAME, VKIND) \
1627procedure(elem_func_vr##VKIND##vr##VKIND##vr##VKIND##i) :: VR_VR_VR_I(NAME, VKIND);
1628
1629! vec_sld
1630VEC_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)
1631VEC_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)
1632VEC_VR_VR_VR_I(vec_sld,4) VEC_VR_VR_VR_I(vec_sld,8)
1633interface vec_sld
1634procedure :: 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)
1635procedure :: 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)
1636procedure :: VR_VR_VR_I(vec_sld,4), VR_VR_VR_I(vec_sld,8)
1637end interface vec_sld
1638public :: vec_sld
1639
1640! vec_sldw
1641VEC_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)
1642VEC_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)
1643VEC_VR_VR_VR_I(vec_sldw,4) VEC_VR_VR_VR_I(vec_sldw,8)
1644interface vec_sldw
1645procedure :: 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)
1646procedure :: 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)
1647procedure :: VR_VR_VR_I(vec_sldw,4), VR_VR_VR_I(vec_sldw,8)
1648end interface vec_sldw
1649public :: 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) \
1670procedure(elem_func_vr##VKIND##vi##VKIND##i) :: VR_VI_I(NAME, VKIND);
1671#define VEC_VR_VU_I(NAME, VKIND) \
1672procedure(elem_func_vr##VKIND##vu##VKIND##i) :: VR_VU_I(NAME, VKIND);
1673#define VEC_VI_VI_I0(NAME, VKIND) \
1674procedure(elem_func_vi##VKIND##vi##VKIND##i0) :: VI_VI_I0(NAME, VKIND);
1675#define VEC_VU_VU_I0(NAME, VKIND) \
1676procedure(elem_func_vu##VKIND##vu##VKIND##i0) :: VU_VU_I0(NAME, VKIND);
1677#define VEC_VR_VR_I0(NAME, VKIND) \
1678procedure(elem_func_vr##VKIND##vr##VKIND##i0) :: VR_VR_I0(NAME, VKIND);
1679
1680! vec_ctf
1681VEC_VR_VI_I(vec_ctf,4) VEC_VR_VI_I(vec_ctf,8)
1682VEC_VR_VU_I(vec_ctf,4) VEC_VR_VU_I(vec_ctf,8)
1683interface vec_ctf
1684procedure :: VR_VI_I(vec_ctf,4), VR_VI_I(vec_ctf,8)
1685procedure :: VR_VU_I(vec_ctf,4), VR_VU_I(vec_ctf,8)
1686end interface vec_ctf
1687public :: vec_ctf
1688
1689! vec_splat
1690VEC_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)
1691VEC_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)
1692VEC_VR_VR_I0(vec_splat,4) VEC_VR_VR_I0(vec_splat,8)
1693interface vec_splat
1694procedure :: VI_VI_I0(vec_splat,1), VI_VI_I0(vec_splat,2), VI_VI_I0(vec_splat,4), VI_VI_I0(vec_splat,8)
1695procedure :: VU_VU_I0(vec_splat,1), VU_VU_I0(vec_splat,2), VU_VU_I0(vec_splat,4), VU_VU_I0(vec_splat,8)
1696procedure :: VR_VR_I0(vec_splat,4), VR_VR_I0(vec_splat,8)
1697end interface vec_splat
1698public :: 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) \
1724procedure(sub_vi##VKIND##ivi##VKIND) :: SUB_VI_I_VI(NAME, VKIND);
1725#define VEC_SUB_VU_I_VU(NAME, VKIND) \
1726procedure(sub_vu##VKIND##ivu##VKIND) :: SUB_VU_I_VU(NAME, VKIND);
1727#define VEC_SUB_VR_I_VR(NAME, VKIND) \
1728procedure(sub_vr##VKIND##ivr##VKIND) :: SUB_VR_I_VR(NAME, VKIND);
1729#define VEC_SUB_VI_I_I(NAME, VKIND) \
1730procedure(sub_vi##VKIND##ii##VKIND) :: SUB_VI_I_I(NAME, VKIND);
1731#define VEC_SUB_VU_I_I(NAME, VKIND) \
1732procedure(sub_vu##VKIND##ii##VKIND) :: SUB_VU_I_I(NAME, VKIND);
1733#define VEC_SUB_VR_I_R(NAME, VKIND) \
1734procedure(sub_vr##VKIND##ir##VKIND) :: SUB_VR_I_R(NAME, VKIND);
1735
1736! vec_st
1737VEC_SUB_VI_I_VI(vec_st,1) VEC_SUB_VI_I_VI(vec_st,2) VEC_SUB_VI_I_VI(vec_st,4)
1738VEC_SUB_VU_I_VU(vec_st,1) VEC_SUB_VU_I_VU(vec_st,2) VEC_SUB_VU_I_VU(vec_st,4)
1739VEC_SUB_VR_I_VR(vec_st,4)
1740VEC_SUB_VI_I_I(vec_st,1) VEC_SUB_VI_I_I(vec_st,2) VEC_SUB_VI_I_I(vec_st,4)
1741VEC_SUB_VU_I_I(vec_st,1) VEC_SUB_VU_I_I(vec_st,2) VEC_SUB_VU_I_I(vec_st,4)
1742VEC_SUB_VR_I_R(vec_st,4)
1743interface vec_st
1744procedure :: SUB_VI_I_VI(vec_st,1), SUB_VI_I_VI(vec_st,2), SUB_VI_I_VI(vec_st,4)
1745procedure :: SUB_VU_I_VU(vec_st,1), SUB_VU_I_VU(vec_st,2), SUB_VU_I_VU(vec_st,4)
1746procedure :: SUB_VR_I_VR(vec_st,4)
1747procedure :: SUB_VI_I_I(vec_st,1), SUB_VI_I_I(vec_st,2), SUB_VI_I_I(vec_st,4)
1748procedure :: SUB_VU_I_I(vec_st,1), SUB_VU_I_I(vec_st,2), SUB_VU_I_I(vec_st,4)
1749procedure :: SUB_VR_I_R(vec_st,4)
1750end interface vec_st
1751public :: vec_st
1752
1753! vec_ste
1754VEC_SUB_VI_I_I(vec_ste,1) VEC_SUB_VI_I_I(vec_ste,2) VEC_SUB_VI_I_I(vec_ste,4)
1755VEC_SUB_VU_I_I(vec_ste,1) VEC_SUB_VU_I_I(vec_ste,2) VEC_SUB_VU_I_I(vec_ste,4)
1756VEC_SUB_VR_I_R(vec_ste,4)
1757interface vec_ste
1758procedure :: SUB_VI_I_I(vec_ste,1), SUB_VI_I_I(vec_ste,2), SUB_VI_I_I(vec_ste,4)
1759procedure :: SUB_VU_I_I(vec_ste,1), SUB_VU_I_I(vec_ste,2), SUB_VU_I_I(vec_ste,4)
1760procedure :: SUB_VR_I_R(vec_ste,4)
1761end interface vec_ste
1762public :: vec_ste
1763
1764! vec_stxv
1765VEC_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)
1766VEC_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)
1767VEC_SUB_VR_I_VR(vec_stxv,4) VEC_SUB_VR_I_VR(vec_stxv,8)
1768VEC_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)
1769VEC_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)
1770VEC_SUB_VR_I_R(vec_stxv,4) VEC_SUB_VR_I_R(vec_stxv,8)
1771interface vec_stxv
1772procedure :: 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)
1773procedure :: 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)
1774procedure :: SUB_VR_I_VR(vec_stxv,4), SUB_VR_I_VR(vec_stxv,8)
1775procedure :: 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)
1776procedure :: 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)
1777procedure :: SUB_VR_I_R(vec_stxv,4), SUB_VR_I_R(vec_stxv,8)
1778end interface vec_stxv
1779public :: vec_stxv
1780
1781! vec_xst
1782VEC_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)
1783VEC_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)
1784VEC_SUB_VR_I_VR(vec_xst,4) VEC_SUB_VR_I_VR(vec_xst,8)
1785VEC_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)
1786VEC_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)
1787VEC_SUB_VR_I_R(vec_xst,4) VEC_SUB_VR_I_R(vec_xst,8)
1788interface vec_xst
1789procedure :: 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)
1790procedure :: 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)
1791procedure :: SUB_VR_I_VR(vec_xst,4), SUB_VR_I_VR(vec_xst,8)
1792procedure :: 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)
1793procedure :: 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)
1794procedure :: SUB_VR_I_R(vec_xst,4), SUB_VR_I_R(vec_xst,8)
1795end interface vec_xst
1796public :: vec_xst
1797
1798! vec_xst_be
1799VEC_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)
1800VEC_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)
1801VEC_SUB_VR_I_VR(vec_xst_be,4) VEC_SUB_VR_I_VR(vec_xst_be,8)
1802VEC_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)
1803VEC_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)
1804VEC_SUB_VR_I_R(vec_xst_be,4) VEC_SUB_VR_I_R(vec_xst_be,8)
1805interface vec_xst_be
1806procedure :: 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)
1807procedure :: 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)
1808procedure :: SUB_VR_I_VR(vec_xst_be,4), SUB_VR_I_VR(vec_xst_be,8)
1809procedure :: 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)
1810procedure :: 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)
1811procedure :: SUB_VR_I_R(vec_xst_be,4), SUB_VR_I_R(vec_xst_be,8)
1812end interface vec_xst_be
1813public :: vec_xst_be
1814
1815! vec_xstd2
1816VEC_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)
1817VEC_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)
1818VEC_SUB_VR_I_VR(vec_xstd2_,4) VEC_SUB_VR_I_VR(vec_xstd2_,8)
1819VEC_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)
1820VEC_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)
1821VEC_SUB_VR_I_R(vec_xstd2_,4) VEC_SUB_VR_I_R(vec_xstd2_,8)
1822interface vec_xstd2
1823procedure :: 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)
1824procedure :: 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)
1825procedure :: SUB_VR_I_VR(vec_xstd2_,4), SUB_VR_I_VR(vec_xstd2_,8)
1826procedure :: 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)
1827procedure :: 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)
1828procedure :: SUB_VR_I_R(vec_xstd2_,4), SUB_VR_I_R(vec_xstd2_,8)
1829end interface vec_xstd2
1830public :: vec_xstd2
1831
1832! vec_xstw4
1833VEC_SUB_VI_I_VI(vec_xstw4_,1) VEC_SUB_VI_I_VI(vec_xstw4_,2) VEC_SUB_VI_I_VI(vec_xstw4_,4)
1834VEC_SUB_VU_I_VU(vec_xstw4_,1) VEC_SUB_VU_I_VU(vec_xstw4_,2) VEC_SUB_VU_I_VU(vec_xstw4_,4)
1835VEC_SUB_VR_I_VR(vec_xstw4_,4)
1836VEC_SUB_VI_I_I(vec_xstw4_,1) VEC_SUB_VI_I_I(vec_xstw4_,2) VEC_SUB_VI_I_I(vec_xstw4_,4)
1837VEC_SUB_VU_I_I(vec_xstw4_,1) VEC_SUB_VU_I_I(vec_xstw4_,2) VEC_SUB_VU_I_I(vec_xstw4_,4)
1838VEC_SUB_VR_I_R(vec_xstw4_,4)
1839interface vec_xstw4
1840procedure :: SUB_VI_I_VI(vec_xstw4_,1), SUB_VI_I_VI(vec_xstw4_,2), SUB_VI_I_VI(vec_xstw4_,4)
1841procedure :: SUB_VU_I_VU(vec_xstw4_,1), SUB_VU_I_VU(vec_xstw4_,2), SUB_VU_I_VU(vec_xstw4_,4)
1842procedure :: SUB_VR_I_VR(vec_xstw4_,4)
1843procedure :: SUB_VI_I_I(vec_xstw4_,1), SUB_VI_I_I(vec_xstw4_,2), SUB_VI_I_I(vec_xstw4_,4)
1844procedure :: SUB_VU_I_I(vec_xstw4_,1), SUB_VU_I_I(vec_xstw4_,2), SUB_VU_I_I(vec_xstw4_,4)
1845procedure :: SUB_VR_I_R(vec_xstw4_,4)
1846end interface vec_xstw4
1847public :: 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) \
1870procedure(sub_vpi0vi##VKIND) :: VP_I0_VI(NAME, VKIND);
1871#define VEC_VP_I0_VU(NAME, VKIND) \
1872procedure(sub_vpi0vu##VKIND) :: VP_I0_VU(NAME, VKIND);
1873#define VEC_VP_I0_VR(NAME, VKIND) \
1874procedure(sub_vpi0vr##VKIND) :: VP_I0_VR(NAME, VKIND);
1875
1876! vec_stxvp
1877procedure(sub_vpi0vp) :: __ppc_vec_stxvp_vpi0vp0
1878procedure(sub_vpi0i0) :: __ppc_vec_stxvp_vpi0i0
1879procedure(sub_vpi0r0) :: __ppc_vec_stxvp_vpi0r0
1880VEC_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)
1881VEC_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)
1882VEC_VP_I0_VR(vec_stxvp, 4) VEC_VP_I0_VR(vec_stxvp, 8)
1883interface vec_stxvp
1884procedure :: __ppc_vec_stxvp_vpi0vp0
1885procedure :: __ppc_vec_stxvp_vpi0i0
1886procedure :: __ppc_vec_stxvp_vpi0r0
1887procedure :: VP_I0_VI(vec_stxvp, 1), VP_I0_VI(vec_stxvp, 2), VP_I0_VI(vec_stxvp, 4), VP_I0_VI(vec_stxvp, 8)
1888procedure :: VP_I0_VU(vec_stxvp, 1), VP_I0_VU(vec_stxvp, 2), VP_I0_VU(vec_stxvp, 4), VP_I0_VU(vec_stxvp, 8)
1889procedure :: VP_I0_VR(vec_stxvp, 4), VP_I0_VR(vec_stxvp, 8)
1890end interface vec_stxvp
1891public :: vec_stxvp
1892
1893! vsx_stxvp (alias to vec_stxvp)
1894interface vsx_stxvp
1895procedure :: __ppc_vec_stxvp_vpi0vp0
1896procedure :: __ppc_vec_stxvp_vpi0i0
1897procedure :: __ppc_vec_stxvp_vpi0r0
1898procedure :: VP_I0_VI(vec_stxvp, 1), VP_I0_VI(vec_stxvp, 2), VP_I0_VI(vec_stxvp, 4), VP_I0_VI(vec_stxvp, 8)
1899procedure :: VP_I0_VU(vec_stxvp, 1), VP_I0_VU(vec_stxvp, 2), VP_I0_VU(vec_stxvp, 4), VP_I0_VU(vec_stxvp, 8)
1900procedure :: VP_I0_VR(vec_stxvp, 4), VP_I0_VR(vec_stxvp, 8)
1901end interface vsx_stxvp
1902public :: 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