xref: /llvm-project/flang/module/mma.f90 (revision ae1c0645aa7c11f58641d80293f217990b94b328)
1!===-- module/mma.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 mma
10  implicit none
11  private
12
13  abstract interface
14
15!! ========== 1 argument subroutine interface ================================!!
16!! subroutine s(__vector_quad)
17  elemental subroutine sub_vq(acc)
18    __vector_quad, intent(inout) :: acc
19  end subroutine
20
21!! ========== 2 argument subroutine interface ================================!!
22!! __vector_pair function f(i, vector(i))
23#define FUNC_VPI0VI(VKIND) \
24  pure __vector_pair function func_vpi0vi##VKIND(arg1, arg2); \
25    integer(8), intent(in) :: arg1; \
26    !dir$ ignore_tkr(k) arg1; \
27    vector(integer(VKIND)), intent(in) :: arg2; \
28    !dir$ ignore_tkr(r) arg2; \
29  end function;
30
31! __vector_pair function f(i, vector(u))
32#define FUNC_VPI0VU(VKIND) \
33  pure __vector_pair function func_vpi0vu##VKIND(arg1, arg2); \
34    integer(8), intent(in) :: arg1; \
35    !dir$ ignore_tkr(k) arg1; \
36    vector(unsigned(VKIND)), intent(in) :: arg2; \
37    !dir$ ignore_tkr(r) arg2; \
38  end function;
39
40! __vector_pair function f(i, vector(r))
41#define FUNC_VPI0VR(VKIND) \
42  pure __vector_pair function func_vpi0vr##VKIND(arg1, arg2); \
43    integer(8), intent(in) :: arg1; \
44    !dir$ ignore_tkr(k) arg1; \
45    vector(real(VKIND)), intent(in) :: arg2; \
46    !dir$ ignore_tkr(r) arg2; \
47  end function;
48
49! __vector_pair function f(i, __vector_pair)
50#define FUNC_VPI0VP \
51  pure __vector_pair function func_vpi0vp(arg1, arg2); \
52    integer(8), intent(in) :: arg1; \
53    !dir$ ignore_tkr(k) arg1; \
54    __vector_pair, intent(in) :: arg2; \
55    !dir$ ignore_tkr(r) arg2; \
56  end function;
57
58  FUNC_VPI0VI(1) FUNC_VPI0VI(2) FUNC_VPI0VI(4) FUNC_VPI0VI(8)
59  FUNC_VPI0VU(1) FUNC_VPI0VU(2) FUNC_VPI0VU(4) FUNC_VPI0VU(8)
60  FUNC_VPI0VR(4) FUNC_VPI0VR(8)
61  FUNC_VPI0VP
62
63#undef FUNC_VPI0VP
64#undef FUNC_VPI0VR
65#undef FUNC_VPI0VU
66#undef FUNC_VPI0VI
67
68!! ========== 3 arguments subroutine interface ===============================!!
69!! __vector_pair subroutine s(vp, integer, vector(i))
70#define SUB_VPI0VI(VKIND) \
71  pure subroutine sub_vpi0vi##VKIND(arg1, arg2, arg3); \
72    __vector_pair, intent(in) :: arg1; \
73    integer(8), intent(in) :: arg2; \
74    !dir$ ignore_tkr(k) arg2; \
75    vector(integer(VKIND)), intent(out) :: arg3; \
76    !dir$ ignore_tkr(r) arg3; \
77  end subroutine;
78
79! subroutine(__vector_pair, i, vector(u))
80#define SUB_VPI0VU(VKIND) \
81  pure subroutine sub_vpi0vu##VKIND(arg1, arg2, arg3); \
82    __vector_pair, intent(in) :: arg1; \
83    integer(8), intent(in) :: arg2; \
84    !dir$ ignore_tkr(k) arg2; \
85    vector(unsigned(VKIND)), intent(out) :: arg3; \
86    !dir$ ignore_tkr(r) arg3; \
87  end subroutine;
88
89! subroutine(__vector_pair, i, vector(r))
90#define SUB_VPI0VR(VKIND) \
91  pure subroutine sub_vpi0vr##VKIND(arg1, arg2, arg3); \
92    __vector_pair, intent(in) :: arg1; \
93    integer(8), intent(in) :: arg2; \
94    !dir$ ignore_tkr(k) arg2; \
95    vector(real(VKIND)), intent(out) :: arg3; \
96    !dir$ ignore_tkr(r) arg3; \
97  end subroutine;
98
99! subroutine(__vector_pair, i, i)
100  pure subroutine sub_vpi0i0(arg1, arg2, arg3)
101    __vector_pair, intent(in) :: arg1
102    integer(8), intent(in) :: arg2
103    !dir$ ignore_tkr(k) arg2
104    integer(8), intent(out) :: arg3
105    !dir$ ignore_tkr(kr) arg3
106  end subroutine
107
108! subroutine(__vector_pair, i, r)
109  pure subroutine sub_vpi0r0(arg1, arg2, arg3)
110    __vector_pair, intent(in) :: arg1
111    integer(8), intent(in) :: arg2
112    !dir$ ignore_tkr(k) arg2
113    real(8), intent(out) :: arg3
114    !dir$ ignore_tkr(kr) arg3
115  end subroutine
116
117! subroutine(__vector_pair, i, __vector_pair)
118  pure subroutine sub_vpi0vp(arg1, arg2, arg3)
119    __vector_pair, intent(in) :: arg1
120    integer(8), intent(in) :: arg2
121    !dir$ ignore_tkr(k) arg2
122    __vector_pair, intent(out) :: arg3
123    !dir$ ignore_tkr(r) arg3
124  end subroutine
125
126!! subroutine s(__vector_pair, vector(i), vector(i))
127#define ELEM_SUB_VPVIVI(VKIND) \
128  elemental subroutine sub_vpvi##VKIND##vi##VKIND(pair, arg1, arg2); \
129    __vector_pair, intent(out) :: pair ; \
130    vector(integer(VKIND)), intent(in) :: arg1, arg2; \
131  end subroutine ;
132
133!! subroutine s(__vector_pair, vector(u), vector(u))
134#define ELEM_SUB_VPVUVU(VKIND) \
135  elemental subroutine sub_vpvu##VKIND##vu##VKIND(pair, arg1, arg2); \
136    __vector_pair, intent(out) :: pair ; \
137    vector(unsigned(VKIND)), intent(in) :: arg1, arg2; \
138  end subroutine ;
139
140!! subroutine s(__vector_pair, vector(r), vector(r))
141#define ELEM_SUB_VPVRVR(VKIND) \
142  elemental subroutine sub_vpvr##VKIND##vr##VKIND(pair, arg1, arg2); \
143    __vector_pair, intent(out) :: pair ; \
144    vector(real(VKIND)), intent(in) :: arg1, arg2; \
145  end subroutine ;
146
147  ELEM_SUB_VPVIVI(1) ELEM_SUB_VPVIVI(2)
148  ELEM_SUB_VPVIVI(4) ELEM_SUB_VPVIVI(8)
149  ELEM_SUB_VPVUVU(1) ELEM_SUB_VPVUVU(2)
150  ELEM_SUB_VPVUVU(4) ELEM_SUB_VPVUVU(8)
151  ELEM_SUB_VPVRVR(4) ELEM_SUB_VPVRVR(8)
152  SUB_VPI0VI(1) SUB_VPI0VI(2) SUB_VPI0VI(4) SUB_VPI0VI(8)
153  SUB_VPI0VU(1) SUB_VPI0VU(2) SUB_VPI0VU(4) SUB_VPI0VU(8)
154  SUB_VPI0VR(4) SUB_VPI0VR(8)
155
156#undef ELEM_SUB_VPVIVI
157#undef ELEM_SUB_VPVUVU
158#undef ELEM_SUB_VPVRVR
159#undef SUB_VPI0VR
160#undef SUB_VPI0VU
161#undef SUB_VPI0VI
162
163!! subroutine s(__vector_quad, vector(i), vector(i))
164#define ELEM_SUB_VQVIVI(INTENT, VKIND) \
165  elemental subroutine sub_vq##INTENT##vi##VKIND##vi##VKIND(acc, a, b); \
166    __vector_quad, intent(INTENT) :: acc; \
167    vector(integer(VKIND)), intent(in) :: a, b; \
168  end subroutine ;
169
170!! subroutine s(__vector_quad, vector(u), vector(u))
171#define ELEM_SUB_VQVUVU(INTENT, VKIND) \
172  elemental subroutine sub_vq##INTENT##vu##VKIND##vu##VKIND(acc, a, b); \
173    __vector_quad, intent(INTENT) :: acc; \
174    vector(unsigned(VKIND)), intent(in) :: a, b; \
175  end subroutine ;
176
177!! subroutine s(__vector_quad, vector(r), vector(r))
178#define ELEM_SUB_VQVRVR(INTENT, VKIND) \
179  elemental subroutine sub_vq##INTENT##vr##VKIND##vr##VKIND(acc, a, b); \
180    __vector_quad, intent(INTENT) :: acc; \
181    vector(real(VKIND)), intent(in) :: a, b; \
182  end subroutine ;
183
184  ELEM_SUB_VQVIVI(inout,1) ELEM_SUB_VQVIVI(inout,2)
185  ELEM_SUB_VQVUVU(inout,1)
186  ELEM_SUB_VQVRVR(inout,4)
187  ELEM_SUB_VQVIVI(out,1) ELEM_SUB_VQVIVI(out,2)
188  ELEM_SUB_VQVUVU(out,1)
189  ELEM_SUB_VQVRVR(out,4)
190
191#undef ELEM_SUB_VQVRVR
192#undef ELEM_SUB_VQVUVU
193#undef ELEM_SUB_VQVIVI
194
195!! subroutine s(__vector_quad, __vector_pair, vector(u))
196#define ELEM_SUB_VQVPVU(INTENT, VKIND) \
197  elemental subroutine sub_vq##INTENT##vpvu##VKIND(acc, a, b); \
198    __vector_quad, intent(INTENT) :: acc; \
199    __vector_pair, intent(in) :: a; \
200    vector(unsigned(VKIND)), intent(in) :: b; \
201  end subroutine ;
202
203!! subroutine s(__vector_quad, __vector_pair, vector(r))
204#define ELEM_SUB_VQVPVR(INTENT, VKIND) \
205  elemental subroutine sub_vq##INTENT##vpvr##VKIND(acc, a, b); \
206    __vector_quad, intent(INTENT) :: acc; \
207    __vector_pair, intent(in) :: a; \
208    vector(real(VKIND)), intent(in) :: b; \
209  end subroutine ;
210
211  ELEM_SUB_VQVPVU(inout,1)
212  ELEM_SUB_VQVPVR(inout,8)
213  ELEM_SUB_VQVPVU(out,1)
214  ELEM_SUB_VQVPVR(out,8)
215
216#undef ELEM_SUB_VQVPVR
217#undef ELEM_SUB_VQVPVU
218
219!! ========== 5 arguments subroutine interface ===============================!!
220!! subroutine s(__vector_quad, vector(i), vector(i), vector(i), vector(i))
221#define ELEM_SUB_VQVIVIVIVI(VKIND) \
222  elemental subroutine sub_vqvi##VKIND##vi##VKIND##vi##VKIND##vi##VKIND(acc, arg1, arg2, arg3, arg4); \
223    __vector_quad, intent(out) :: acc; \
224    vector(integer(VKIND)), intent(in) :: arg1, arg2, arg3, arg4; \
225  end subroutine ;
226
227!! subroutine s(__vector_quad, vector(u), vector(u), vector(u), vector(u))
228#define ELEM_SUB_VQVUVUVUVU(VKIND) \
229  elemental subroutine sub_vqvu##VKIND##vu##VKIND##vu##VKIND##vu##VKIND(acc, arg1, arg2, arg3, arg4); \
230    __vector_quad, intent(out) :: acc; \
231    vector(unsigned(VKIND)), intent(in) :: arg1, arg2, arg3, arg4; \
232  end subroutine ;
233
234!! subroutine s(__vector_quad, vector(r), vector(r), vector(r), vector(r))
235#define ELEM_SUB_VQVRVRVRVR(VKIND) \
236  elemental subroutine sub_vqvr##VKIND##vr##VKIND##vr##VKIND##vr##VKIND(acc, arg1, arg2, arg3, arg4); \
237    __vector_quad, intent(out) :: acc; \
238    vector(real(VKIND)), intent(in) :: arg1, arg2, arg3, arg4; \
239  end subroutine ;
240
241  ELEM_SUB_VQVIVIVIVI(1) ELEM_SUB_VQVIVIVIVI(2)
242  ELEM_SUB_VQVIVIVIVI(4) ELEM_SUB_VQVIVIVIVI(8)
243  ELEM_SUB_VQVUVUVUVU(1) ELEM_SUB_VQVUVUVUVU(2)
244  ELEM_SUB_VQVUVUVUVU(4) ELEM_SUB_VQVUVUVUVU(8)
245  ELEM_SUB_VQVRVRVRVR(4) ELEM_SUB_VQVRVRVRVR(8)
246
247#undef ELEM_SUB_VQVRVRVRVR
248#undef ELEM_SUB_VQVUVUVUVU
249#undef ELEM_SUB_VQVIVIVIVI
250
251!! subroutine s(__vector_quad, vector(u), vector(u), integer, integer)
252#define ELEM_SUB_VQVUVUII(INTENT, VKIND) \
253  elemental subroutine sub_vq##INTENT##vu##VKIND##vu##VKIND##ii(acc, a, b, xmask, ymask); \
254    __vector_quad, intent(INTENT) :: acc; \
255    vector(unsigned(VKIND)), intent(in) :: a, b; \
256    integer(8), intent(in) :: xmask, ymask; \
257    !dir$ ignore_tkr(k) xmask; \
258    !dir$ ignore_tkr(k) ymask; \
259  end subroutine ;
260
261!! subroutine s(__vector_quad, vector(r), vector(r), integer, integer)
262#define ELEM_SUB_VQVRVRII(INTENT, VKIND) \
263  elemental subroutine sub_vq##INTENT##vr##VKIND##vr##VKIND##ii(acc, a, b, xmask, ymask); \
264    __vector_quad, intent(INTENT) :: acc; \
265    vector(real(VKIND)), intent(in) :: a, b; \
266    integer(8), intent(in) :: xmask, ymask; \
267    !dir$ ignore_tkr(k) xmask; \
268    !dir$ ignore_tkr(k) ymask; \
269  end subroutine ;
270
271  ELEM_SUB_VQVUVUII(inout,1)
272  ELEM_SUB_VQVRVRII(inout,4)
273  ELEM_SUB_VQVUVUII(out,1)
274  ELEM_SUB_VQVRVRII(out,4)
275
276#undef ELEM_SUB_VQVRVRII
277#undef ELEM_SUB_VQVUVUII
278
279!! subroutine s(__vector_quad, __vector_pair, vector(u), integer, integer)
280#define ELEM_SUB_VQVPVUII(INTENT, VKIND) \
281  elemental subroutine sub_vq##INTENT##vpvu##VKIND##ii(acc, a, b, xmask, ymask); \
282    __vector_quad, intent(INTENT) :: acc; \
283    __vector_pair, intent(in) :: a; \
284    vector(unsigned(VKIND)), intent(in) :: b; \
285    integer(8), intent(in) :: xmask, ymask; \
286    !dir$ ignore_tkr(k) xmask; \
287    !dir$ ignore_tkr(k) ymask; \
288  end subroutine ;
289
290!! subroutine s(__vector_quad, __vector_pair, vector(r), integer, integer)
291#define ELEM_SUB_VQVPVRII(INTENT, VKIND) \
292  elemental subroutine sub_vq##INTENT##vpvr##VKIND##ii(acc, a, b, xmask, ymask); \
293    __vector_quad, intent(INTENT) :: acc; \
294    __vector_pair, intent(in) :: a; \
295    vector(real(VKIND)), intent(in) :: b; \
296    integer(8), intent(in) :: xmask, ymask; \
297    !dir$ ignore_tkr(k) xmask; \
298    !dir$ ignore_tkr(k) ymask; \
299  end subroutine ;
300
301  ELEM_SUB_VQVPVUII(inout,1)
302  ELEM_SUB_VQVPVRII(inout,8)
303  ELEM_SUB_VQVPVUII(out,1)
304  ELEM_SUB_VQVPVRII(out,8)
305
306#undef ELEM_SUB_VQVPVRII
307#undef ELEM_SUB_VQVPVUII
308
309!! ========== 6 arguments subroutine interface ===============================!!
310!! subroutine s(__vector_quad, vector(i), vector(i), integer, integer, integer)
311#define ELEM_SUB_VQVIVIIII(INTENT, VKIND) \
312  elemental subroutine sub_vq##INTENT##vi##VKIND##vi##VKIND##iii(acc, a, b, xmask, ymask, pmask); \
313    __vector_quad, intent(INTENT) :: acc; \
314    vector(integer(VKIND)), intent(in) :: a, b; \
315    integer(8), intent(in) :: xmask, ymask, pmask; \
316    !dir$ ignore_tkr(k) xmask; \
317    !dir$ ignore_tkr(k) ymask; \
318    !dir$ ignore_tkr(k) pmask; \
319  end subroutine ;
320
321!! subroutine s(__vector_quad, vector(u), vector(u), integer, integer, integer)
322#define ELEM_SUB_VQVUVUIII(INTENT, VKIND) \
323  elemental subroutine sub_vq##INTENT##vu##VKIND##vu##VKIND##iii(acc, a, b, xmask, ymask, pmask); \
324    __vector_quad, intent(INTENT) :: acc; \
325    vector(unsigned(VKIND)), intent(in) :: a, b; \
326    integer(8), intent(in) :: xmask, ymask, pmask; \
327    !dir$ ignore_tkr(k) xmask; \
328    !dir$ ignore_tkr(k) ymask; \
329    !dir$ ignore_tkr(k) pmask; \
330  end subroutine ;
331
332  ELEM_SUB_VQVIVIIII(inout,1) ELEM_SUB_VQVIVIIII(inout,2)
333  ELEM_SUB_VQVUVUIII(inout,1)
334  ELEM_SUB_VQVIVIIII(out,1) ELEM_SUB_VQVIVIIII(out,2)
335  ELEM_SUB_VQVUVUIII(out,1)
336
337#undef ELEM_SUB_VQVUVUIII
338#undef ELEM_SUB_VQVIVIIII
339
340!! ========== non-macro interface =============================================!!
341  elemental subroutine sub_atvp(data, pair)
342    ! Dummy arg 'data' is supposed to be intent(out) of any type,
343    ! but according to Fortran 2018: C709: Type(*) arguments can not have
344    ! intent(out) attribute. Use intent(inout) instead.
345    type(*), intent(inout) :: data
346    __vector_pair, intent(inout) :: pair
347  end subroutine
348
349  elemental subroutine sub_atvq(data, acc)
350    ! Dummy arg 'data' is supposed to be intent(out) of any type,
351    ! but according to Fortran 2018: C709: Type(*) arguments can not have
352    ! intent(out) attribute. Use intent(inout) instead.
353    type(*), intent(inout) :: data
354    __vector_quad, intent(inout) :: acc
355  end subroutine
356
357  end interface
358
359!-------------------------------------------------------
360! __vector_pair function(integer, vector/__vector_pair)
361!-------------------------------------------------------
362#define VP_I0_VI(NAME, VKIND) __ppc_##NAME##_vpi0##vi##VKIND
363#define VP_I0_VU(NAME, VKIND) __ppc_##NAME##_vpi0##vu##VKIND
364#define VP_I0_VR(NAME, VKIND) __ppc_##NAME##_vpi0##vr##VKIND
365#define VP_I0_VP(NAME) __ppc_##NAME##_vpi0vp0
366
367#define VEC_VP_I0_VI(NAME, VKIND) \
368  procedure(func_vpi0vi##VKIND) :: VP_I0_VI(NAME, VKIND);
369#define VEC_VP_I0_VU(NAME, VKIND) \
370  procedure(func_vpi0vu##VKIND) :: VP_I0_VU(NAME, VKIND);
371#define VEC_VP_I0_VR(NAME, VKIND) \
372  procedure(func_vpi0vr##VKIND) :: VP_I0_VR(NAME, VKIND);
373#define VEC_VP_I0_VP(NAME) procedure(func_vpi0vp) :: VP_I0_VP(NAME);
374
375! mma_lxvp (using vec_lxvp)
376  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)
377  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)
378  VEC_VP_I0_VR(vec_lxvp,4) VEC_VP_I0_VR(vec_lxvp,8)
379  VEC_VP_I0_VP(vec_lxvp)
380  interface mma_lxvp
381     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)
382     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)
383     procedure :: VP_I0_VR(vec_lxvp,4), VP_I0_VR(vec_lxvp,8)
384     procedure :: VP_I0_VP(vec_lxvp)
385  end interface mma_lxvp
386  public :: mma_lxvp
387
388#undef VEC_VP_I0_VP
389#undef VEC_VP_I0_VR
390#undef VEC_VP_I0_VU
391#undef VEC_VP_I0_VI
392#undef VP_I0_VP
393#undef VP_I0_VR
394#undef VP_I0_VU
395#undef VP_I0_VI
396
397!-----------------------------------------------------------------------
398! subroutine(__vector_pair, integer, __vector_pair/vector/integer/real)
399!-----------------------------------------------------------------------
400#define VP_I0_VI(NAME, VKIND) __ppc_##NAME##_vpi0vi##VKIND
401#define VP_I0_VU(NAME, VKIND) __ppc_##NAME##_vpi0vu##VKIND
402#define VP_I0_VR(NAME, VKIND) __ppc_##NAME##_vpi0vr##VKIND
403
404#define VEC_VP_I0_VI(NAME, VKIND) \
405  procedure(sub_vpi0vi##VKIND) :: VP_I0_VI(NAME, VKIND);
406#define VEC_VP_I0_VU(NAME, VKIND) \
407  procedure(sub_vpi0vu##VKIND) :: VP_I0_VU(NAME, VKIND);
408#define VEC_VP_I0_VR(NAME, VKIND) \
409  procedure(sub_vpi0vr##VKIND) :: VP_I0_VR(NAME, VKIND);
410
411! mma_stxvp (using vec_stxvp)
412  procedure(sub_vpi0vp) :: __ppc_vec_stxvp_vpi0vp0
413  procedure(sub_vpi0i0) :: __ppc_vec_stxvp_vpi0i0
414  procedure(sub_vpi0r0) :: __ppc_vec_stxvp_vpi0r0
415  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)
416  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)
417  VEC_VP_I0_VR(vec_stxvp, 4) VEC_VP_I0_VR(vec_stxvp, 8)
418  interface mma_stxvp
419     procedure :: __ppc_vec_stxvp_vpi0vp0
420     procedure :: __ppc_vec_stxvp_vpi0i0
421     procedure :: __ppc_vec_stxvp_vpi0r0
422     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)
423     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)
424     procedure :: VP_I0_VR(vec_stxvp, 4), VP_I0_VR(vec_stxvp, 8)
425  end interface mma_stxvp
426  public :: mma_stxvp
427
428#undef VEC_VP_I0_VR
429#undef VEC_VP_I0_VU
430#undef VEC_VP_I0_VI
431#undef VP_I0_VR
432#undef VP_I0_VU
433#undef VP_I0_VI
434
435#define SUB_VQ_VI_VI_VI_VI(NAME, VKIND) __ppc_##NAME##_vi##VKIND##vi##VKIND##vi##VKIND##vi##VKIND
436#define SUB_VQ_VU_VU_VU_VU(NAME, VKIND) __ppc_##NAME##_vu##VKIND##vu##VKIND##vu##VKIND##vu##VKIND
437#define SUB_VQ_VR_VR_VR_VR(NAME, VKIND) __ppc_##NAME##_vr##VKIND##vr##VKIND##vr##VKIND##vr##VKIND
438
439#define VEC_SUB_VQ_VI_VI_VI_VI(NAME, VKIND) \
440  procedure(sub_vqvi##VKIND##vi##VKIND##vi##VKIND##vi##VKIND) :: SUB_VQ_VI_VI_VI_VI(NAME, VKIND);
441#define VEC_SUB_VQ_VU_VU_VU_VU(NAME, VKIND) \
442  procedure(sub_vqvu##VKIND##vu##VKIND##vu##VKIND##vu##VKIND) :: SUB_VQ_VU_VU_VU_VU(NAME, VKIND);
443#define VEC_SUB_VQ_VR_VR_VR_VR(NAME, VKIND) \
444  procedure(sub_vqvr##VKIND##vr##VKIND##vr##VKIND##vr##VKIND) :: SUB_VQ_VR_VR_VR_VR(NAME, VKIND);
445
446! mma_assemble_acc
447  VEC_SUB_VQ_VI_VI_VI_VI(mma_assemble_acc,1)
448  VEC_SUB_VQ_VI_VI_VI_VI(mma_assemble_acc,2)
449  VEC_SUB_VQ_VI_VI_VI_VI(mma_assemble_acc,4)
450  VEC_SUB_VQ_VI_VI_VI_VI(mma_assemble_acc,8)
451  VEC_SUB_VQ_VU_VU_VU_VU(mma_assemble_acc,1)
452  VEC_SUB_VQ_VU_VU_VU_VU(mma_assemble_acc,2)
453  VEC_SUB_VQ_VU_VU_VU_VU(mma_assemble_acc,4)
454  VEC_SUB_VQ_VU_VU_VU_VU(mma_assemble_acc,8)
455  VEC_SUB_VQ_VR_VR_VR_VR(mma_assemble_acc,4)
456  VEC_SUB_VQ_VR_VR_VR_VR(mma_assemble_acc,8)
457  interface mma_assemble_acc
458    procedure :: SUB_VQ_VI_VI_VI_VI(mma_assemble_acc,1)
459    procedure :: SUB_VQ_VI_VI_VI_VI(mma_assemble_acc,2)
460    procedure :: SUB_VQ_VI_VI_VI_VI(mma_assemble_acc,4)
461    procedure :: SUB_VQ_VI_VI_VI_VI(mma_assemble_acc,8)
462    procedure :: SUB_VQ_VU_VU_VU_VU(mma_assemble_acc,1)
463    procedure :: SUB_VQ_VU_VU_VU_VU(mma_assemble_acc,2)
464    procedure :: SUB_VQ_VU_VU_VU_VU(mma_assemble_acc,4)
465    procedure :: SUB_VQ_VU_VU_VU_VU(mma_assemble_acc,8)
466    procedure :: SUB_VQ_VR_VR_VR_VR(mma_assemble_acc,4)
467    procedure :: SUB_VQ_VR_VR_VR_VR(mma_assemble_acc,8)
468  end interface
469  public mma_assemble_acc
470
471! mma_build_acc
472  VEC_SUB_VQ_VI_VI_VI_VI(mma_build_acc,1)
473  VEC_SUB_VQ_VI_VI_VI_VI(mma_build_acc,2)
474  VEC_SUB_VQ_VI_VI_VI_VI(mma_build_acc,4)
475  VEC_SUB_VQ_VI_VI_VI_VI(mma_build_acc,8)
476  VEC_SUB_VQ_VU_VU_VU_VU(mma_build_acc,1)
477  VEC_SUB_VQ_VU_VU_VU_VU(mma_build_acc,2)
478  VEC_SUB_VQ_VU_VU_VU_VU(mma_build_acc,4)
479  VEC_SUB_VQ_VU_VU_VU_VU(mma_build_acc,8)
480  VEC_SUB_VQ_VR_VR_VR_VR(mma_build_acc,4)
481  VEC_SUB_VQ_VR_VR_VR_VR(mma_build_acc,8)
482  interface mma_build_acc
483    procedure :: SUB_VQ_VI_VI_VI_VI(mma_build_acc,1)
484    procedure :: SUB_VQ_VI_VI_VI_VI(mma_build_acc,2)
485    procedure :: SUB_VQ_VI_VI_VI_VI(mma_build_acc,4)
486    procedure :: SUB_VQ_VI_VI_VI_VI(mma_build_acc,8)
487    procedure :: SUB_VQ_VU_VU_VU_VU(mma_build_acc,1)
488    procedure :: SUB_VQ_VU_VU_VU_VU(mma_build_acc,2)
489    procedure :: SUB_VQ_VU_VU_VU_VU(mma_build_acc,4)
490    procedure :: SUB_VQ_VU_VU_VU_VU(mma_build_acc,8)
491    procedure :: SUB_VQ_VR_VR_VR_VR(mma_build_acc,4)
492    procedure :: SUB_VQ_VR_VR_VR_VR(mma_build_acc,8)
493  end interface
494  public mma_build_acc
495
496#undef VEC_SUB_VQ_VR_VR_VR_VR
497#undef VEC_SUB_VQ_VU_VU_VU_VU
498#undef VEC_SUB_VQ_VI_VI_VI_VI
499#undef SUB_VQ_VR_VR_VR_VR
500#undef SUB_VQ_VU_VU_VU_VU
501#undef SUB_VQ_VI_VI_VI_VI
502
503#define SUB_VP_VI_VI(NAME, VKIND) __ppc_##NAME##_vi##VKIND##vi##VKIND
504#define SUB_VP_VU_VU(NAME, VKIND) __ppc_##NAME##_vu##VKIND##vu##VKIND
505#define SUB_VP_VR_VR(NAME, VKIND) __ppc_##NAME##_vr##VKIND##vr##VKIND
506
507#define VEC_SUB_VP_VI_VI(NAME, VKIND) \
508  procedure(sub_vpvi##VKIND##vi##VKIND) :: SUB_VP_VI_VI(NAME, VKIND);
509#define VEC_SUB_VP_VU_VU(NAME, VKIND) \
510  procedure(sub_vpvu##VKIND##vu##VKIND) :: SUB_VP_VU_VU(NAME, VKIND);
511#define VEC_SUB_VP_VR_VR(NAME, VKIND) \
512  procedure(sub_vpvr##VKIND##vr##VKIND) :: SUB_VP_VR_VR(NAME, VKIND);
513
514! mma_assemble_pair
515  VEC_SUB_VP_VI_VI(mma_assemble_pair,1) VEC_SUB_VP_VI_VI(mma_assemble_pair,2)
516  VEC_SUB_VP_VI_VI(mma_assemble_pair,4) VEC_SUB_VP_VI_VI(mma_assemble_pair,8)
517  VEC_SUB_VP_VU_VU(mma_assemble_pair,1) VEC_SUB_VP_VU_VU(mma_assemble_pair,2)
518  VEC_SUB_VP_VU_VU(mma_assemble_pair,4) VEC_SUB_VP_VU_VU(mma_assemble_pair,8)
519  VEC_SUB_VP_VR_VR(mma_assemble_pair,4) VEC_SUB_VP_VR_VR(mma_assemble_pair,8)
520  interface mma_assemble_pair
521    procedure :: SUB_VP_VI_VI(mma_assemble_pair,1)
522    procedure :: SUB_VP_VI_VI(mma_assemble_pair,2)
523    procedure :: SUB_VP_VI_VI(mma_assemble_pair,4)
524    procedure :: SUB_VP_VI_VI(mma_assemble_pair,8)
525    procedure :: SUB_VP_VU_VU(mma_assemble_pair,1)
526    procedure :: SUB_VP_VU_VU(mma_assemble_pair,2)
527    procedure :: SUB_VP_VU_VU(mma_assemble_pair,4)
528    procedure :: SUB_VP_VU_VU(mma_assemble_pair,8)
529    procedure :: SUB_VP_VR_VR(mma_assemble_pair,4)
530    procedure :: SUB_VP_VR_VR(mma_assemble_pair,8)
531  end interface
532  public mma_assemble_pair
533
534#undef VEC_SUB_VP_VR_VR
535#undef VEC_SUB_VP_VU_VU
536#undef VEC_SUB_VP_VI_VI
537#undef SUB_VP_VR_VR
538#undef SUB_VP_VU_VU
539#undef SUB_VP_VI_VI
540
541#define SUB_VQ_VI_VI_I_I_I(NAME, VKIND) __ppc_##NAME##_vqvi##VKIND##vi##VKINDi0i0i0
542#define SUB_VQ_VU_VU_I_I_I(NAME, VKIND) __ppc_##NAME##_vqvu##VKIND##vu##VKINDi0i0ii0
543
544#define VEC_SUB_VQ_VI_VI_I_I_I(NAME, INTENT, VKIND) \
545  procedure(sub_vq##INTENT##vi##VKIND##vi##VKIND##iii) :: SUB_VQ_VI_VI_I_I_I(NAME, VKIND);
546#define VEC_SUB_VQ_VU_VU_I_I_I(NAME, INTENT, VKIND) \
547  procedure(sub_vq##INTENT##vu##VKIND##vu##VKIND##iii) :: SUB_VQ_VU_VU_I_I_I(NAME, VKIND);
548
549! mma_pmxvbf16ger2
550  VEC_SUB_VQ_VU_VU_I_I_I(mma_pmxvbf16ger2_,out,1)
551  interface mma_pmxvbf16ger2
552    procedure :: SUB_VQ_VU_VU_I_I_I(mma_pmxvbf16ger2_,1)
553  end interface mma_pmxvbf16ger2
554  public mma_pmxvbf16ger2
555
556! mma_pmxvbf16ger2nn
557  VEC_SUB_VQ_VU_VU_I_I_I(mma_pmxvbf16ger2nn,inout,1)
558  interface mma_pmxvbf16ger2nn
559    procedure :: SUB_VQ_VU_VU_I_I_I(mma_pmxvbf16ger2nn,1)
560  end interface mma_pmxvbf16ger2nn
561  public mma_pmxvbf16ger2nn
562
563! mma_pmxvbf16ger2np
564  VEC_SUB_VQ_VU_VU_I_I_I(mma_pmxvbf16ger2np,inout,1)
565  interface mma_pmxvbf16ger2np
566    procedure :: SUB_VQ_VU_VU_I_I_I(mma_pmxvbf16ger2np,1)
567  end interface mma_pmxvbf16ger2np
568  public mma_pmxvbf16ger2np
569
570! mma_pmxvbf16ger2pn
571  VEC_SUB_VQ_VU_VU_I_I_I(mma_pmxvbf16ger2pn,inout,1)
572  interface mma_pmxvbf16ger2pn
573    procedure :: SUB_VQ_VU_VU_I_I_I(mma_pmxvbf16ger2pn,1)
574  end interface mma_pmxvbf16ger2pn
575  public mma_pmxvbf16ger2pn
576
577! mma_pmxvbf16ger2pp
578  VEC_SUB_VQ_VU_VU_I_I_I(mma_pmxvbf16ger2pp,inout,1)
579  interface mma_pmxvbf16ger2pp
580    procedure :: SUB_VQ_VU_VU_I_I_I(mma_pmxvbf16ger2pp,1)
581  end interface mma_pmxvbf16ger2pp
582  public mma_pmxvbf16ger2pp
583
584! mma_pmxvf16ger2
585  VEC_SUB_VQ_VU_VU_I_I_I(mma_pmxvf16ger2_,out,1)
586  interface mma_pmxvf16ger2
587    procedure :: SUB_VQ_VU_VU_I_I_I(mma_pmxvf16ger2_,1)
588  end interface mma_pmxvf16ger2
589  public mma_pmxvf16ger2
590
591! mma_pmxvf16ger2nn
592  VEC_SUB_VQ_VU_VU_I_I_I(mma_pmxvf16ger2nn,inout,1)
593  interface mma_pmxvf16ger2nn
594    procedure :: SUB_VQ_VU_VU_I_I_I(mma_pmxvf16ger2nn,1)
595  end interface mma_pmxvf16ger2nn
596  public mma_pmxvf16ger2nn
597
598! mma_pmxvf16ger2np
599  VEC_SUB_VQ_VU_VU_I_I_I(mma_pmxvf16ger2np,inout,1)
600  interface mma_pmxvf16ger2np
601    procedure :: SUB_VQ_VU_VU_I_I_I(mma_pmxvf16ger2np,1)
602  end interface mma_pmxvf16ger2np
603  public mma_pmxvf16ger2np
604
605! mma_pmxvf16ger2pn
606  VEC_SUB_VQ_VU_VU_I_I_I(mma_pmxvf16ger2pn,inout,1)
607  interface mma_pmxvf16ger2pn
608    procedure :: SUB_VQ_VU_VU_I_I_I(mma_pmxvf16ger2pn,1)
609  end interface mma_pmxvf16ger2pn
610  public mma_pmxvf16ger2pn
611
612! mma_pmxvf16ger2pp
613  VEC_SUB_VQ_VU_VU_I_I_I(mma_pmxvf16ger2pp,inout,1)
614  interface mma_pmxvf16ger2pp
615    procedure :: SUB_VQ_VU_VU_I_I_I(mma_pmxvf16ger2pp,1)
616  end interface mma_pmxvf16ger2pp
617  public mma_pmxvf16ger2pp
618
619! mma_pmxvi16ger2
620  VEC_SUB_VQ_VI_VI_I_I_I(mma_pmxvi16ger2_,out,2)
621  VEC_SUB_VQ_VU_VU_I_I_I(mma_pmxvi16ger2_,out,1)
622  interface mma_pmxvi16ger2
623    procedure :: SUB_VQ_VI_VI_I_I_I(mma_pmxvi16ger2_,2)
624    procedure :: SUB_VQ_VU_VU_I_I_I(mma_pmxvi16ger2_,1)
625  end interface mma_pmxvi16ger2
626  public mma_pmxvi16ger2
627
628! mma_pmxvi16ger2pp
629  VEC_SUB_VQ_VI_VI_I_I_I(mma_pmxvi16ger2pp,inout,2)
630  VEC_SUB_VQ_VU_VU_I_I_I(mma_pmxvi16ger2pp,inout,1)
631  interface mma_pmxvi16ger2pp
632    procedure :: SUB_VQ_VI_VI_I_I_I(mma_pmxvi16ger2pp,2)
633    procedure :: SUB_VQ_VU_VU_I_I_I(mma_pmxvi16ger2pp,1)
634  end interface mma_pmxvi16ger2pp
635  public mma_pmxvi16ger2pp
636
637! mma_pmxvi16ger2s
638  VEC_SUB_VQ_VI_VI_I_I_I(mma_pmxvi16ger2s,out,2)
639  VEC_SUB_VQ_VU_VU_I_I_I(mma_pmxvi16ger2s,out,1)
640  interface mma_pmxvi16ger2s
641    procedure :: SUB_VQ_VI_VI_I_I_I(mma_pmxvi16ger2s,2)
642    procedure :: SUB_VQ_VU_VU_I_I_I(mma_pmxvi16ger2s,1)
643  end interface mma_pmxvi16ger2s
644  public mma_pmxvi16ger2s
645
646! mma_pmxvi16ger2spp
647  VEC_SUB_VQ_VI_VI_I_I_I(mma_pmxvi16ger2spp,inout,2)
648  VEC_SUB_VQ_VU_VU_I_I_I(mma_pmxvi16ger2spp,inout,1)
649  interface mma_pmxvi16ger2spp
650    procedure :: SUB_VQ_VI_VI_I_I_I(mma_pmxvi16ger2spp,2)
651    procedure :: SUB_VQ_VU_VU_I_I_I(mma_pmxvi16ger2spp,1)
652  end interface mma_pmxvi16ger2spp
653  public mma_pmxvi16ger2spp
654
655! mma_pmxvi4ger8
656  VEC_SUB_VQ_VU_VU_I_I_I(mma_pmxvi4ger8_,out,1)
657  interface mma_pmxvi4ger8
658    procedure :: SUB_VQ_VU_VU_I_I_I(mma_pmxvi4ger8_,1)
659  end interface mma_pmxvi4ger8
660  public mma_pmxvi4ger8
661
662! mma_pmxvi4ger8pp
663  VEC_SUB_VQ_VU_VU_I_I_I(mma_pmxvi4ger8pp,inout,1)
664  interface mma_pmxvi4ger8pp
665    procedure :: SUB_VQ_VU_VU_I_I_I(mma_pmxvi4ger8pp,1)
666  end interface mma_pmxvi4ger8pp
667  public mma_pmxvi4ger8pp
668
669! mma_pmxvi8ger4
670  VEC_SUB_VQ_VI_VI_I_I_I(mma_pmxvi8ger4_,out,1)
671  VEC_SUB_VQ_VU_VU_I_I_I(mma_pmxvi8ger4_,out,1)
672  interface mma_pmxvi8ger4
673    procedure :: SUB_VQ_VI_VI_I_I_I(mma_pmxvi8ger4_,1)
674    procedure :: SUB_VQ_VU_VU_I_I_I(mma_pmxvi8ger4_,1)
675  end interface mma_pmxvi8ger4
676  public mma_pmxvi8ger4
677
678! mma_pmxvi8ger4pp
679  VEC_SUB_VQ_VI_VI_I_I_I(mma_pmxvi8ger4pp,inout,1)
680  VEC_SUB_VQ_VU_VU_I_I_I(mma_pmxvi8ger4pp,inout,1)
681  interface mma_pmxvi8ger4pp
682    procedure :: SUB_VQ_VI_VI_I_I_I(mma_pmxvi8ger4pp,1)
683    procedure :: SUB_VQ_VU_VU_I_I_I(mma_pmxvi8ger4pp,1)
684  end interface mma_pmxvi8ger4pp
685  public mma_pmxvi8ger4pp
686
687! mma_pmxvi8ger4spp
688  VEC_SUB_VQ_VI_VI_I_I_I(mma_pmxvi8ger4spp,inout,1)
689  VEC_SUB_VQ_VU_VU_I_I_I(mma_pmxvi8ger4spp,inout,1)
690  interface mma_pmxvi8ger4spp
691    procedure :: SUB_VQ_VI_VI_I_I_I(mma_pmxvi8ger4spp,1)
692    procedure :: SUB_VQ_VU_VU_I_I_I(mma_pmxvi8ger4spp,1)
693  end interface mma_pmxvi8ger4spp
694  public mma_pmxvi8ger4spp
695
696#undef VEC_SUB_VQ_VU_VU_I_I_I
697#undef VEC_SUB_VQ_VI_VI_I_I_I
698#undef SUB_VQ_VU_VU_I_I_I
699#undef SUB_VQ_VI_VI_I_I_I
700
701#define SUB_VQ_VU_VU_I_I(NAME, VKIND) __ppc_##NAME##_vqvu##VKIND##vu##VKINDi0i0
702#define SUB_VQ_VR_VR_I_I(NAME, VKIND) __ppc_##NAME##_vqvr##VKIND##vr##VKINDi0i0
703
704#define VEC_SUB_VQ_VU_VU_I_I(NAME, INTENT, VKIND) \
705  procedure(sub_vq##INTENT##vu##VKIND##vu##VKIND##ii) :: SUB_VQ_VU_VU_I_I(NAME, VKIND);
706#define VEC_SUB_VQ_VR_VR_I_I(NAME, INTENT, VKIND) \
707  procedure(sub_vq##INTENT##vr##VKIND##vr##VKIND##ii) :: SUB_VQ_VR_VR_I_I(NAME, VKIND);
708
709! mma_pmxvf32ger
710  VEC_SUB_VQ_VU_VU_I_I(mma_pmxvf32ger,out,1)
711  VEC_SUB_VQ_VR_VR_I_I(mma_pmxvf32ger,out,4)
712  interface mma_pmxvf32ger
713    procedure :: SUB_VQ_VU_VU_I_I(mma_pmxvf32ger,1)
714    procedure :: SUB_VQ_VR_VR_I_I(mma_pmxvf32ger,4)
715  end interface mma_pmxvf32ger
716  public mma_pmxvf32ger
717
718! mma_pmxvf32gernn
719  VEC_SUB_VQ_VU_VU_I_I(mma_pmxvf32gernn,inout,1)
720  VEC_SUB_VQ_VR_VR_I_I(mma_pmxvf32gernn,inout,4)
721  interface mma_pmxvf32gernn
722    procedure :: SUB_VQ_VU_VU_I_I(mma_pmxvf32gernn,1)
723    procedure :: SUB_VQ_VR_VR_I_I(mma_pmxvf32gernn,4)
724  end interface mma_pmxvf32gernn
725  public mma_pmxvf32gernn
726
727! mma_pmxvf32gernp
728  VEC_SUB_VQ_VU_VU_I_I(mma_pmxvf32gernp,inout,1)
729  VEC_SUB_VQ_VR_VR_I_I(mma_pmxvf32gernp,inout,4)
730  interface mma_pmxvf32gernp
731    procedure :: SUB_VQ_VU_VU_I_I(mma_pmxvf32gernp,1)
732    procedure :: SUB_VQ_VR_VR_I_I(mma_pmxvf32gernp,4)
733  end interface mma_pmxvf32gernp
734  public mma_pmxvf32gernp
735
736! mma_pmxvf32gerpn
737  VEC_SUB_VQ_VU_VU_I_I(mma_pmxvf32gerpn,inout,1)
738  VEC_SUB_VQ_VR_VR_I_I(mma_pmxvf32gerpn,inout,4)
739  interface mma_pmxvf32gerpn
740    procedure :: SUB_VQ_VU_VU_I_I(mma_pmxvf32gerpn,1)
741    procedure :: SUB_VQ_VR_VR_I_I(mma_pmxvf32gerpn,4)
742  end interface mma_pmxvf32gerpn
743  public mma_pmxvf32gerpn
744
745! mma_pmxvf32gerpp
746  VEC_SUB_VQ_VU_VU_I_I(mma_pmxvf32gerpp,inout,1)
747  VEC_SUB_VQ_VR_VR_I_I(mma_pmxvf32gerpp,inout,4)
748  interface mma_pmxvf32gerpp
749    procedure :: SUB_VQ_VU_VU_I_I(mma_pmxvf32gerpp,1)
750    procedure :: SUB_VQ_VR_VR_I_I(mma_pmxvf32gerpp,4)
751  end interface mma_pmxvf32gerpp
752  public mma_pmxvf32gerpp
753
754#undef VEC_SUB_VQ_VR_VR_I_I
755#undef VEC_SUB_VQ_VU_VU_I_I
756#undef SUB_VQ_VR_VR_I_I
757#undef SUB_VQ_VU_VU_I_I
758
759#define SUB_VQ_VP_VU_I_I(NAME, VKIND) __ppc_##NAME##_vqvpvu##VKINDi0i0
760#define SUB_VQ_VP_VR_I_I(NAME, VKIND) __ppc_##NAME##_vqvpvr##VKINDi0i0
761
762#define VEC_SUB_VQ_VP_VU_I_I(NAME, INTENT, VKIND) \
763  procedure(sub_vq##INTENT##vpvu##VKIND##ii) :: SUB_VQ_VP_VU_I_I(NAME, VKIND);
764#define VEC_SUB_VQ_VP_VR_I_I(NAME, INTENT, VKIND) \
765  procedure(sub_vq##INTENT##vpvr##VKIND##ii) :: SUB_VQ_VP_VR_I_I(NAME, VKIND);
766
767! mma_pmxvf64ger
768  VEC_SUB_VQ_VP_VU_I_I(mma_pmxvf64ger,out,1)
769  VEC_SUB_VQ_VP_VR_I_I(mma_pmxvf64ger,out,8)
770  interface mma_pmxvf64ger
771    procedure :: SUB_VQ_VP_VU_I_I(mma_pmxvf64ger,1)
772    procedure :: SUB_VQ_VP_VR_I_I(mma_pmxvf64ger,8)
773  end interface mma_pmxvf64ger
774  public mma_pmxvf64ger
775
776! mma_pmxvf64gernn
777  VEC_SUB_VQ_VP_VU_I_I(mma_pmxvf64gernn,inout,1)
778  VEC_SUB_VQ_VP_VR_I_I(mma_pmxvf64gernn,inout,8)
779  interface mma_pmxvf64gernn
780    procedure :: SUB_VQ_VP_VU_I_I(mma_pmxvf64gernn,1)
781    procedure :: SUB_VQ_VP_VR_I_I(mma_pmxvf64gernn,8)
782  end interface mma_pmxvf64gernn
783  public mma_pmxvf64gernn
784
785! mma_pmxvf64gernp
786  VEC_SUB_VQ_VP_VU_I_I(mma_pmxvf64gernp,inout,1)
787  VEC_SUB_VQ_VP_VR_I_I(mma_pmxvf64gernp,inout,8)
788  interface mma_pmxvf64gernp
789    procedure :: SUB_VQ_VP_VU_I_I(mma_pmxvf64gernp,1)
790    procedure :: SUB_VQ_VP_VR_I_I(mma_pmxvf64gernp,8)
791  end interface mma_pmxvf64gernp
792  public mma_pmxvf64gernp
793
794! mma_pmxvf64gerpn
795  VEC_SUB_VQ_VP_VU_I_I(mma_pmxvf64gerpn,inout,1)
796  VEC_SUB_VQ_VP_VR_I_I(mma_pmxvf64gerpn,inout,8)
797  interface mma_pmxvf64gerpn
798    procedure :: SUB_VQ_VP_VU_I_I(mma_pmxvf64gerpn,1)
799    procedure :: SUB_VQ_VP_VR_I_I(mma_pmxvf64gerpn,8)
800  end interface mma_pmxvf64gerpn
801  public mma_pmxvf64gerpn
802
803! mma_pmxvf64gerpp
804  VEC_SUB_VQ_VP_VU_I_I(mma_pmxvf64gerpp,inout,1)
805  VEC_SUB_VQ_VP_VR_I_I(mma_pmxvf64gerpp,inout,8)
806  interface mma_pmxvf64gerpp
807    procedure :: SUB_VQ_VP_VU_I_I(mma_pmxvf64gerpp,1)
808    procedure :: SUB_VQ_VP_VR_I_I(mma_pmxvf64gerpp,8)
809  end interface mma_pmxvf64gerpp
810  public mma_pmxvf64gerpp
811
812#undef VEC_SUB_VQ_VP_VR_I_I
813#undef VEC_SUB_VQ_VP_VU_I_I
814#undef SUB_VQ_VP_VR_I_I
815#undef SUB_VQ_VP_VU_I_I
816
817#define SUB_VQ_VI_VI(NAME, VKIND) __ppc_##NAME##_vi##VKIND##vi##VKIND
818#define SUB_VQ_VU_VU(NAME, VKIND) __ppc_##NAME##_vu##VKIND##vu##VKIND
819#define SUB_VQ_VR_VR(NAME, VKIND) __ppc_##NAME##_vr##VKIND##vr##VKIND
820
821#define VEC_SUB_VQ_VI_VI(NAME, INTENT, VKIND) \
822  procedure(sub_vq##INTENT##vi##VKIND##vi##VKIND) :: SUB_VQ_VI_VI(NAME, VKIND);
823#define VEC_SUB_VQ_VU_VU(NAME, INTENT, VKIND) \
824  procedure(sub_vq##INTENT##vu##VKIND##vu##VKIND) :: SUB_VQ_VU_VU(NAME, VKIND);
825#define VEC_SUB_VQ_VR_VR(NAME, INTENT, VKIND) \
826  procedure(sub_vq##INTENT##vr##VKIND##vr##VKIND) :: SUB_VQ_VR_VR(NAME, VKIND);
827
828!! First argument with INTENT(INOUT)
829! mma_xvbf16ger2nn
830  VEC_SUB_VQ_VU_VU(mma_xvbf16ger2nn,inout,1)
831  interface mma_xvbf16ger2nn
832    procedure :: SUB_VQ_VU_VU(mma_xvbf16ger2nn,1)
833  end interface
834  public mma_xvbf16ger2nn
835
836! mma_xvbf16ger2np
837  VEC_SUB_VQ_VU_VU(mma_xvbf16ger2np,inout,1)
838  interface mma_xvbf16ger2np
839    procedure :: SUB_VQ_VU_VU(mma_xvbf16ger2np,1)
840  end interface
841  public mma_xvbf16ger2np
842
843! mma_xvbf16ger2pn
844  VEC_SUB_VQ_VU_VU(mma_xvbf16ger2pn,inout,1)
845  interface mma_xvbf16ger2pn
846    procedure :: SUB_VQ_VU_VU(mma_xvbf16ger2pn,1)
847  end interface
848  public mma_xvbf16ger2pn
849
850! mma_xvbf16ger2pp
851  VEC_SUB_VQ_VU_VU(mma_xvbf16ger2pp,inout,1)
852  interface mma_xvbf16ger2pp
853    procedure :: SUB_VQ_VU_VU(mma_xvbf16ger2pp,1)
854  end interface
855  public mma_xvbf16ger2pp
856
857! mma_xvi8ger4pp
858  VEC_SUB_VQ_VI_VI(mma_xvi8ger4pp,inout,1)
859  VEC_SUB_VQ_VU_VU(mma_xvi8ger4pp,inout,1)
860  interface mma_xvi8ger4pp
861    procedure :: SUB_VQ_VI_VI(mma_xvi8ger4pp,1)
862    procedure :: SUB_VQ_VU_VU(mma_xvi8ger4pp,1)
863  end interface
864  public mma_xvi8ger4pp
865
866! mma_xvi8ger4spp
867  VEC_SUB_VQ_VI_VI(mma_xvi8ger4spp,inout,1)
868  VEC_SUB_VQ_VU_VU(mma_xvi8ger4spp,inout,1)
869  interface mma_xvi8ger4spp
870    procedure :: SUB_VQ_VI_VI(mma_xvi8ger4spp,1)
871    procedure :: SUB_VQ_VU_VU(mma_xvi8ger4spp,1)
872  end interface
873  public mma_xvi8ger4spp
874
875! mma_xvi16ger2pp
876  VEC_SUB_VQ_VI_VI(mma_xvi16ger2pp,inout,2)
877  VEC_SUB_VQ_VU_VU(mma_xvi16ger2pp,inout,1)
878  interface mma_xvi16ger2pp
879    procedure :: SUB_VQ_VI_VI(mma_xvi16ger2pp,2)
880    procedure :: SUB_VQ_VU_VU(mma_xvi16ger2pp,1)
881  end interface
882  public mma_xvi16ger2pp
883
884! mma_xvi16ger2s
885  VEC_SUB_VQ_VI_VI(mma_xvi16ger2s,inout,2)
886  VEC_SUB_VQ_VU_VU(mma_xvi16ger2s,inout,1)
887  interface mma_xvi16ger2s
888    procedure :: SUB_VQ_VI_VI(mma_xvi16ger2s,2)
889    procedure :: SUB_VQ_VU_VU(mma_xvi16ger2s,1)
890  end interface
891  public mma_xvi16ger2s
892
893! mma_xvi16ger2spp
894  VEC_SUB_VQ_VI_VI(mma_xvi16ger2spp,inout,2)
895  VEC_SUB_VQ_VU_VU(mma_xvi16ger2spp,inout,1)
896  interface mma_xvi16ger2spp
897    procedure :: SUB_VQ_VI_VI(mma_xvi16ger2spp,2)
898    procedure :: SUB_VQ_VU_VU(mma_xvi16ger2spp,1)
899  end interface
900  public mma_xvi16ger2spp
901
902! mma_xvi4ger8pp
903  VEC_SUB_VQ_VU_VU(mma_xvi4ger8pp,inout,1)
904  interface mma_xvi4ger8pp
905    procedure :: SUB_VQ_VU_VU(mma_xvi4ger8pp,1)
906  end interface
907  public mma_xvi4ger8pp
908
909! mma_xvf16ger2nn
910  VEC_SUB_VQ_VU_VU(mma_xvf16ger2nn,inout,1)
911  interface mma_xvf16ger2nn
912    procedure :: SUB_VQ_VU_VU(mma_xvf16ger2nn,1)
913  end interface
914  public mma_xvf16ger2nn
915
916! mma_xvf16ger2np
917  VEC_SUB_VQ_VU_VU(mma_xvf16ger2np,inout,1)
918  interface mma_xvf16ger2np
919    procedure :: SUB_VQ_VU_VU(mma_xvf16ger2np,1)
920  end interface
921  public mma_xvf16ger2np
922
923! mma_xvf16ger2pn
924  VEC_SUB_VQ_VU_VU(mma_xvf16ger2pn,inout,1)
925  interface mma_xvf16ger2pn
926    procedure :: SUB_VQ_VU_VU(mma_xvf16ger2pn,1)
927  end interface
928  public mma_xvf16ger2pn
929
930! mma_xvf16ger2pp
931  VEC_SUB_VQ_VU_VU(mma_xvf16ger2pp,inout,1)
932  interface mma_xvf16ger2pp
933    procedure :: SUB_VQ_VU_VU(mma_xvf16ger2pp,1)
934  end interface
935  public mma_xvf16ger2pp
936
937! mma_xvf32gernn
938  VEC_SUB_VQ_VU_VU(mma_xvf32gernn,inout,1)
939  VEC_SUB_VQ_VR_VR(mma_xvf32gernn,inout,4)
940  interface mma_xvf32gernn
941    procedure :: SUB_VQ_VU_VU(mma_xvf32gernn,1)
942    procedure :: SUB_VQ_VR_VR(mma_xvf32gernn,4)
943  end interface
944  public mma_xvf32gernn
945
946! mma_xvf32gernp
947  VEC_SUB_VQ_VU_VU(mma_xvf32gernp,inout,1)
948  VEC_SUB_VQ_VR_VR(mma_xvf32gernp,inout,4)
949  interface mma_xvf32gernp
950    procedure :: SUB_VQ_VU_VU(mma_xvf32gernp,1)
951    procedure :: SUB_VQ_VR_VR(mma_xvf32gernp,4)
952  end interface
953  public mma_xvf32gernp
954
955! mma_xvf32gerpn
956  VEC_SUB_VQ_VU_VU(mma_xvf32gerpn,inout,1)
957  VEC_SUB_VQ_VR_VR(mma_xvf32gerpn,inout,4)
958  interface mma_xvf32gerpn
959    procedure :: SUB_VQ_VU_VU(mma_xvf32gerpn,1)
960    procedure :: SUB_VQ_VR_VR(mma_xvf32gerpn,4)
961  end interface
962  public mma_xvf32gerpn
963
964! mma_xvf32gerpp
965  VEC_SUB_VQ_VU_VU(mma_xvf32gerpp,inout,1)
966  VEC_SUB_VQ_VR_VR(mma_xvf32gerpp,inout,4)
967  interface mma_xvf32gerpp
968    procedure :: SUB_VQ_VU_VU(mma_xvf32gerpp,1)
969    procedure :: SUB_VQ_VR_VR(mma_xvf32gerpp,4)
970  end interface
971  public mma_xvf32gerpp
972
973!! First argument with INTENT(OUT)
974! mma_xvbf16ger2
975  VEC_SUB_VQ_VU_VU(mma_xvbf16ger2_,out,1)
976  interface mma_xvbf16ger2
977    procedure :: SUB_VQ_VU_VU(mma_xvbf16ger2_,1)
978  end interface
979  public mma_xvbf16ger2
980
981! mma_xvi16ger2
982  VEC_SUB_VQ_VI_VI(mma_xvi16ger2_,out,2)
983  VEC_SUB_VQ_VU_VU(mma_xvi16ger2_,out,1)
984  interface mma_xvi16ger2
985    procedure :: SUB_VQ_VI_VI(mma_xvi16ger2_,2)
986    procedure :: SUB_VQ_VU_VU(mma_xvi16ger2_,1)
987  end interface
988  public mma_xvi16ger2
989
990! mma_xvi4ger8
991  VEC_SUB_VQ_VU_VU(mma_xvi4ger8_,out,1)
992  interface mma_xvi4ger8
993    procedure :: SUB_VQ_VU_VU(mma_xvi4ger8_,1)
994  end interface
995  public mma_xvi4ger8
996
997! mma_xvi8ger4
998  VEC_SUB_VQ_VI_VI(mma_xvi8ger4_,out,1)
999  VEC_SUB_VQ_VU_VU(mma_xvi8ger4_,out,1)
1000  interface mma_xvi8ger4
1001    procedure :: SUB_VQ_VI_VI(mma_xvi8ger4_,1)
1002    procedure :: SUB_VQ_VU_VU(mma_xvi8ger4_,1)
1003  end interface
1004  public mma_xvi8ger4
1005
1006! mma_xvf16ger2
1007  VEC_SUB_VQ_VU_VU(mma_xvf16ger2_,out,1)
1008  interface mma_xvf16ger2
1009    procedure :: SUB_VQ_VU_VU(mma_xvf16ger2_,1)
1010  end interface
1011  public mma_xvf16ger2
1012
1013! mma_xvf32ger
1014  VEC_SUB_VQ_VU_VU(mma_xvf32ger,out,1)
1015  VEC_SUB_VQ_VR_VR(mma_xvf32ger,out,4)
1016  interface mma_xvf32ger
1017    procedure :: SUB_VQ_VU_VU(mma_xvf32ger,1)
1018    procedure :: SUB_VQ_VR_VR(mma_xvf32ger,4)
1019  end interface
1020  public mma_xvf32ger
1021
1022#undef VEC_SUB_VQ_VR_VR
1023#undef VEC_SUB_VQ_VU_VU
1024#undef VEC_SUB_VQ_VI_VI
1025#undef SUB_VQ_VR_VR
1026#undef SUB_VQ_VU_VU
1027#undef SUB_VQ_VI_VI
1028
1029#define SUB_VQ_VP_VU(NAME, VKIND) __ppc_##NAME##_vu##VKIND
1030#define SUB_VQ_VP_VR(NAME, VKIND) __ppc_##NAME##_vr##VKIND
1031
1032#define VEC_SUB_VQ_VP_VU(NAME, INTENT, VKIND) \
1033  procedure(sub_vq##INTENT##vpvu##VKIND) :: SUB_VQ_VP_VU(NAME, VKIND);
1034#define VEC_SUB_VQ_VP_VR(NAME, INTENT, VKIND) \
1035  procedure(sub_vq##INTENT##vpvr##VKIND) :: SUB_VQ_VP_VR(NAME, VKIND);
1036
1037! mma_xvf64ger
1038  VEC_SUB_VQ_VP_VU(mma_xvf64ger,out,1)
1039  VEC_SUB_VQ_VP_VR(mma_xvf64ger,out,8)
1040  interface mma_xvf64ger
1041    procedure :: SUB_VQ_VP_VU(mma_xvf64ger,1)
1042    procedure :: SUB_VQ_VP_VR(mma_xvf64ger,8)
1043  end interface
1044  public mma_xvf64ger
1045
1046! mma_xvf64gernn
1047  VEC_SUB_VQ_VP_VU(mma_xvf64gernn,inout,1)
1048  VEC_SUB_VQ_VP_VR(mma_xvf64gernn,inout,8)
1049  interface mma_xvf64gernn
1050    procedure :: SUB_VQ_VP_VU(mma_xvf64gernn,1)
1051    procedure :: SUB_VQ_VP_VR(mma_xvf64gernn,8)
1052  end interface
1053  public mma_xvf64gernn
1054
1055! mma_xvf64gernp
1056  VEC_SUB_VQ_VP_VU(mma_xvf64gernp,inout,1)
1057  VEC_SUB_VQ_VP_VR(mma_xvf64gernp,inout,8)
1058  interface mma_xvf64gernp
1059    procedure :: SUB_VQ_VP_VU(mma_xvf64gernp,1)
1060    procedure :: SUB_VQ_VP_VR(mma_xvf64gernp,8)
1061  end interface
1062  public mma_xvf64gernp
1063
1064! mma_xvf64gerpn
1065  VEC_SUB_VQ_VP_VU(mma_xvf64gerpn,inout,1)
1066  VEC_SUB_VQ_VP_VR(mma_xvf64gerpn,inout,8)
1067  interface mma_xvf64gerpn
1068    procedure :: SUB_VQ_VP_VU(mma_xvf64gerpn,1)
1069    procedure :: SUB_VQ_VP_VR(mma_xvf64gerpn,8)
1070  end interface
1071  public mma_xvf64gerpn
1072
1073! mma_xvf64gerpp
1074  VEC_SUB_VQ_VP_VU(mma_xvf64gerpp,inout,1)
1075  VEC_SUB_VQ_VP_VR(mma_xvf64gerpp,inout,8)
1076  interface mma_xvf64gerpp
1077    procedure :: SUB_VQ_VP_VU(mma_xvf64gerpp,1)
1078    procedure :: SUB_VQ_VP_VR(mma_xvf64gerpp,8)
1079  end interface
1080  public mma_xvf64gerpp
1081
1082#undef VEC_SUB_VQ_VP_VR
1083#undef VEC_SUB_VQ_VP_VU
1084#undef SUB_VQ_VP_VR
1085#undef SUB_VQ_VP_VU
1086
1087! mma_disassemble_acc
1088  procedure(sub_atvq) :: __ppc_mma_disassemble_acc
1089  interface mma_disassemble_acc
1090    procedure :: __ppc_mma_disassemble_acc
1091  end interface
1092  public mma_disassemble_acc
1093
1094! mma_disassemble_pair
1095  procedure(sub_atvp) :: __ppc_mma_disassemble_pair
1096  interface mma_disassemble_pair
1097    procedure :: __ppc_mma_disassemble_pair
1098  end interface
1099  public mma_disassemble_pair
1100
1101! mma_xxmfacc
1102  procedure(sub_vq) :: __ppc_mma_xxmfacc
1103  interface mma_xxmfacc
1104    procedure :: __ppc_mma_xxmfacc
1105  end interface
1106  public mma_xxmfacc
1107
1108! mma_xxmtacc
1109  procedure(sub_vq) :: __ppc_mma_xxmtacc
1110  interface mma_xxmtacc
1111    procedure :: __ppc_mma_xxmtacc
1112  end interface
1113  public mma_xxmtacc
1114
1115! mma_xxsetaccz
1116  procedure(sub_vq) :: __ppc_mma_xxsetaccz
1117  interface mma_xxsetaccz
1118    procedure :: __ppc_mma_xxsetaccz
1119  end interface
1120  public mma_xxsetaccz
1121
1122end module
1123