xref: /aosp_15_r20/external/libdav1d/src/loongarch/loongson_asm.S (revision c09093415860a1c2373dacd84c4fde00c507cdfd)
1*c0909341SAndroid Build Coastguard Worker/*********************************************************************
2*c0909341SAndroid Build Coastguard Worker * Copyright (c) 2022 Loongson Technology Corporation Limited
3*c0909341SAndroid Build Coastguard Worker * Contributed by Gu Xiwei([email protected])
4*c0909341SAndroid Build Coastguard Worker *                Shiyou Yin([email protected])
5*c0909341SAndroid Build Coastguard Worker *
6*c0909341SAndroid Build Coastguard Worker * Permission to use, copy, modify, and/or distribute this software for any
7*c0909341SAndroid Build Coastguard Worker * purpose with or without fee is hereby granted, provided that the above
8*c0909341SAndroid Build Coastguard Worker * copyright notice and this permission notice appear in all copies.
9*c0909341SAndroid Build Coastguard Worker *
10*c0909341SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11*c0909341SAndroid Build Coastguard Worker * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12*c0909341SAndroid Build Coastguard Worker * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13*c0909341SAndroid Build Coastguard Worker * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14*c0909341SAndroid Build Coastguard Worker * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15*c0909341SAndroid Build Coastguard Worker * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16*c0909341SAndroid Build Coastguard Worker * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*c0909341SAndroid Build Coastguard Worker *********************************************************************/
18*c0909341SAndroid Build Coastguard Worker
19*c0909341SAndroid Build Coastguard Worker/*
20*c0909341SAndroid Build Coastguard Worker * This file is a LoongArch assembly helper file and available under ISC
21*c0909341SAndroid Build Coastguard Worker * license. It provides a large number of macros and alias to simplify
22*c0909341SAndroid Build Coastguard Worker * writing assembly code, especially for LSX and LASX optimizations.
23*c0909341SAndroid Build Coastguard Worker *
24*c0909341SAndroid Build Coastguard Worker * Any one can modify it or add new features for his/her own purposes.
25*c0909341SAndroid Build Coastguard Worker * Contributing a patch will be appreciated as it might be useful for
26*c0909341SAndroid Build Coastguard Worker * others as well. Send patches to loongson contributor mentioned above.
27*c0909341SAndroid Build Coastguard Worker *
28*c0909341SAndroid Build Coastguard Worker * MAJOR version: Usage changes, incompatible with previous version.
29*c0909341SAndroid Build Coastguard Worker * MINOR version: Add new macros/functions, or bug fixes.
30*c0909341SAndroid Build Coastguard Worker * MICRO version: Comment changes or implementation changes.
31*c0909341SAndroid Build Coastguard Worker */
32*c0909341SAndroid Build Coastguard Worker
33*c0909341SAndroid Build Coastguard Worker#define LML_VERSION_MAJOR 0
34*c0909341SAndroid Build Coastguard Worker#define LML_VERSION_MINOR 4
35*c0909341SAndroid Build Coastguard Worker#define LML_VERSION_MICRO 0
36*c0909341SAndroid Build Coastguard Worker
37*c0909341SAndroid Build Coastguard Worker#define DEFAULT_ALIGN    5
38*c0909341SAndroid Build Coastguard Worker
39*c0909341SAndroid Build Coastguard Worker/* Set prefix as needed. */
40*c0909341SAndroid Build Coastguard Worker#ifndef PRIVATE_PREFIX
41*c0909341SAndroid Build Coastguard Worker#define PRIVATE_PREFIX dav1d_
42*c0909341SAndroid Build Coastguard Worker#endif
43*c0909341SAndroid Build Coastguard Worker
44*c0909341SAndroid Build Coastguard Worker#define PASTE(a,b) a ## b
45*c0909341SAndroid Build Coastguard Worker#define CONCAT(a,b) PASTE(a,b)
46*c0909341SAndroid Build Coastguard Worker
47*c0909341SAndroid Build Coastguard Worker#ifdef PREFIX
48*c0909341SAndroid Build Coastguard Worker#define ASM_PREF CONCAT(_,PRIVATE_PREFIX)
49*c0909341SAndroid Build Coastguard Worker#else
50*c0909341SAndroid Build Coastguard Worker#define ASM_PREF PRIVATE_PREFIX
51*c0909341SAndroid Build Coastguard Worker#endif
52*c0909341SAndroid Build Coastguard Worker
53*c0909341SAndroid Build Coastguard Worker.macro function name, align=DEFAULT_ALIGN
54*c0909341SAndroid Build Coastguard Worker.macro endfunc
55*c0909341SAndroid Build Coastguard Worker    jirl    $r0, $r1, 0x0
56*c0909341SAndroid Build Coastguard Worker    .size ASM_PREF\name, . - ASM_PREF\name
57*c0909341SAndroid Build Coastguard Worker    .purgem endfunc
58*c0909341SAndroid Build Coastguard Worker.endm
59*c0909341SAndroid Build Coastguard Worker.text ;
60*c0909341SAndroid Build Coastguard Worker.align \align ;
61*c0909341SAndroid Build Coastguard Worker.globl ASM_PREF\name ;
62*c0909341SAndroid Build Coastguard Worker.type  ASM_PREF\name, @function ;
63*c0909341SAndroid Build Coastguard WorkerASM_PREF\name: ;
64*c0909341SAndroid Build Coastguard Worker.endm
65*c0909341SAndroid Build Coastguard Worker
66*c0909341SAndroid Build Coastguard Worker.macro  const name, align=DEFAULT_ALIGN
67*c0909341SAndroid Build Coastguard Worker    .macro endconst
68*c0909341SAndroid Build Coastguard Worker    .size  \name, . - \name
69*c0909341SAndroid Build Coastguard Worker    .purgem endconst
70*c0909341SAndroid Build Coastguard Worker    .endm
71*c0909341SAndroid Build Coastguard Worker.section .rodata
72*c0909341SAndroid Build Coastguard Worker.align   \align
73*c0909341SAndroid Build Coastguard Worker\name:
74*c0909341SAndroid Build Coastguard Worker.endm
75*c0909341SAndroid Build Coastguard Worker
76*c0909341SAndroid Build Coastguard Worker/*
77*c0909341SAndroid Build Coastguard Worker *============================================================================
78*c0909341SAndroid Build Coastguard Worker * LoongArch register alias
79*c0909341SAndroid Build Coastguard Worker *============================================================================
80*c0909341SAndroid Build Coastguard Worker */
81*c0909341SAndroid Build Coastguard Worker
82*c0909341SAndroid Build Coastguard Worker#define a0 $a0
83*c0909341SAndroid Build Coastguard Worker#define a1 $a1
84*c0909341SAndroid Build Coastguard Worker#define a2 $a2
85*c0909341SAndroid Build Coastguard Worker#define a3 $a3
86*c0909341SAndroid Build Coastguard Worker#define a4 $a4
87*c0909341SAndroid Build Coastguard Worker#define a5 $a5
88*c0909341SAndroid Build Coastguard Worker#define a6 $a6
89*c0909341SAndroid Build Coastguard Worker#define a7 $a7
90*c0909341SAndroid Build Coastguard Worker
91*c0909341SAndroid Build Coastguard Worker#define t0 $t0
92*c0909341SAndroid Build Coastguard Worker#define t1 $t1
93*c0909341SAndroid Build Coastguard Worker#define t2 $t2
94*c0909341SAndroid Build Coastguard Worker#define t3 $t3
95*c0909341SAndroid Build Coastguard Worker#define t4 $t4
96*c0909341SAndroid Build Coastguard Worker#define t5 $t5
97*c0909341SAndroid Build Coastguard Worker#define t6 $t6
98*c0909341SAndroid Build Coastguard Worker#define t7 $t7
99*c0909341SAndroid Build Coastguard Worker#define t8 $t8
100*c0909341SAndroid Build Coastguard Worker
101*c0909341SAndroid Build Coastguard Worker#define s0 $s0
102*c0909341SAndroid Build Coastguard Worker#define s1 $s1
103*c0909341SAndroid Build Coastguard Worker#define s2 $s2
104*c0909341SAndroid Build Coastguard Worker#define s3 $s3
105*c0909341SAndroid Build Coastguard Worker#define s4 $s4
106*c0909341SAndroid Build Coastguard Worker#define s5 $s5
107*c0909341SAndroid Build Coastguard Worker#define s6 $s6
108*c0909341SAndroid Build Coastguard Worker#define s7 $s7
109*c0909341SAndroid Build Coastguard Worker#define s8 $s8
110*c0909341SAndroid Build Coastguard Worker
111*c0909341SAndroid Build Coastguard Worker#define zero $zero
112*c0909341SAndroid Build Coastguard Worker#define sp   $sp
113*c0909341SAndroid Build Coastguard Worker#define ra   $ra
114*c0909341SAndroid Build Coastguard Worker
115*c0909341SAndroid Build Coastguard Worker#define fa0  $fa0
116*c0909341SAndroid Build Coastguard Worker#define fa1  $fa1
117*c0909341SAndroid Build Coastguard Worker#define fa2  $fa2
118*c0909341SAndroid Build Coastguard Worker#define fa3  $fa3
119*c0909341SAndroid Build Coastguard Worker#define fa4  $fa4
120*c0909341SAndroid Build Coastguard Worker#define fa5  $fa5
121*c0909341SAndroid Build Coastguard Worker#define fa6  $fa6
122*c0909341SAndroid Build Coastguard Worker#define fa7  $fa7
123*c0909341SAndroid Build Coastguard Worker#define ft0  $ft0
124*c0909341SAndroid Build Coastguard Worker#define ft1  $ft1
125*c0909341SAndroid Build Coastguard Worker#define ft2  $ft2
126*c0909341SAndroid Build Coastguard Worker#define ft3  $ft3
127*c0909341SAndroid Build Coastguard Worker#define ft4  $ft4
128*c0909341SAndroid Build Coastguard Worker#define ft5  $ft5
129*c0909341SAndroid Build Coastguard Worker#define ft6  $ft6
130*c0909341SAndroid Build Coastguard Worker#define ft7  $ft7
131*c0909341SAndroid Build Coastguard Worker#define ft8  $ft8
132*c0909341SAndroid Build Coastguard Worker#define ft9  $ft9
133*c0909341SAndroid Build Coastguard Worker#define ft10 $ft10
134*c0909341SAndroid Build Coastguard Worker#define ft11 $ft11
135*c0909341SAndroid Build Coastguard Worker#define ft12 $ft12
136*c0909341SAndroid Build Coastguard Worker#define ft13 $ft13
137*c0909341SAndroid Build Coastguard Worker#define ft14 $ft14
138*c0909341SAndroid Build Coastguard Worker#define ft15 $ft15
139*c0909341SAndroid Build Coastguard Worker#define fs0  $fs0
140*c0909341SAndroid Build Coastguard Worker#define fs1  $fs1
141*c0909341SAndroid Build Coastguard Worker#define fs2  $fs2
142*c0909341SAndroid Build Coastguard Worker#define fs3  $fs3
143*c0909341SAndroid Build Coastguard Worker#define fs4  $fs4
144*c0909341SAndroid Build Coastguard Worker#define fs5  $fs5
145*c0909341SAndroid Build Coastguard Worker#define fs6  $fs6
146*c0909341SAndroid Build Coastguard Worker#define fs7  $fs7
147*c0909341SAndroid Build Coastguard Worker
148*c0909341SAndroid Build Coastguard Worker#define f0  $f0
149*c0909341SAndroid Build Coastguard Worker#define f1  $f1
150*c0909341SAndroid Build Coastguard Worker#define f2  $f2
151*c0909341SAndroid Build Coastguard Worker#define f3  $f3
152*c0909341SAndroid Build Coastguard Worker#define f4  $f4
153*c0909341SAndroid Build Coastguard Worker#define f5  $f5
154*c0909341SAndroid Build Coastguard Worker#define f6  $f6
155*c0909341SAndroid Build Coastguard Worker#define f7  $f7
156*c0909341SAndroid Build Coastguard Worker#define f8  $f8
157*c0909341SAndroid Build Coastguard Worker#define f9  $f9
158*c0909341SAndroid Build Coastguard Worker#define f10 $f10
159*c0909341SAndroid Build Coastguard Worker#define f11 $f11
160*c0909341SAndroid Build Coastguard Worker#define f12 $f12
161*c0909341SAndroid Build Coastguard Worker#define f13 $f13
162*c0909341SAndroid Build Coastguard Worker#define f14 $f14
163*c0909341SAndroid Build Coastguard Worker#define f15 $f15
164*c0909341SAndroid Build Coastguard Worker#define f16 $f16
165*c0909341SAndroid Build Coastguard Worker#define f17 $f17
166*c0909341SAndroid Build Coastguard Worker#define f18 $f18
167*c0909341SAndroid Build Coastguard Worker#define f19 $f19
168*c0909341SAndroid Build Coastguard Worker#define f20 $f20
169*c0909341SAndroid Build Coastguard Worker#define f21 $f21
170*c0909341SAndroid Build Coastguard Worker#define f22 $f22
171*c0909341SAndroid Build Coastguard Worker#define f23 $f23
172*c0909341SAndroid Build Coastguard Worker#define f24 $f24
173*c0909341SAndroid Build Coastguard Worker#define f25 $f25
174*c0909341SAndroid Build Coastguard Worker#define f26 $f26
175*c0909341SAndroid Build Coastguard Worker#define f27 $f27
176*c0909341SAndroid Build Coastguard Worker#define f28 $f28
177*c0909341SAndroid Build Coastguard Worker#define f29 $f29
178*c0909341SAndroid Build Coastguard Worker#define f30 $f30
179*c0909341SAndroid Build Coastguard Worker#define f31 $f31
180*c0909341SAndroid Build Coastguard Worker
181*c0909341SAndroid Build Coastguard Worker#define vr0 $vr0
182*c0909341SAndroid Build Coastguard Worker#define vr1 $vr1
183*c0909341SAndroid Build Coastguard Worker#define vr2 $vr2
184*c0909341SAndroid Build Coastguard Worker#define vr3 $vr3
185*c0909341SAndroid Build Coastguard Worker#define vr4 $vr4
186*c0909341SAndroid Build Coastguard Worker#define vr5 $vr5
187*c0909341SAndroid Build Coastguard Worker#define vr6 $vr6
188*c0909341SAndroid Build Coastguard Worker#define vr7 $vr7
189*c0909341SAndroid Build Coastguard Worker#define vr8 $vr8
190*c0909341SAndroid Build Coastguard Worker#define vr9 $vr9
191*c0909341SAndroid Build Coastguard Worker#define vr10 $vr10
192*c0909341SAndroid Build Coastguard Worker#define vr11 $vr11
193*c0909341SAndroid Build Coastguard Worker#define vr12 $vr12
194*c0909341SAndroid Build Coastguard Worker#define vr13 $vr13
195*c0909341SAndroid Build Coastguard Worker#define vr14 $vr14
196*c0909341SAndroid Build Coastguard Worker#define vr15 $vr15
197*c0909341SAndroid Build Coastguard Worker#define vr16 $vr16
198*c0909341SAndroid Build Coastguard Worker#define vr17 $vr17
199*c0909341SAndroid Build Coastguard Worker#define vr18 $vr18
200*c0909341SAndroid Build Coastguard Worker#define vr19 $vr19
201*c0909341SAndroid Build Coastguard Worker#define vr20 $vr20
202*c0909341SAndroid Build Coastguard Worker#define vr21 $vr21
203*c0909341SAndroid Build Coastguard Worker#define vr22 $vr22
204*c0909341SAndroid Build Coastguard Worker#define vr23 $vr23
205*c0909341SAndroid Build Coastguard Worker#define vr24 $vr24
206*c0909341SAndroid Build Coastguard Worker#define vr25 $vr25
207*c0909341SAndroid Build Coastguard Worker#define vr26 $vr26
208*c0909341SAndroid Build Coastguard Worker#define vr27 $vr27
209*c0909341SAndroid Build Coastguard Worker#define vr28 $vr28
210*c0909341SAndroid Build Coastguard Worker#define vr29 $vr29
211*c0909341SAndroid Build Coastguard Worker#define vr30 $vr30
212*c0909341SAndroid Build Coastguard Worker#define vr31 $vr31
213*c0909341SAndroid Build Coastguard Worker
214*c0909341SAndroid Build Coastguard Worker#define xr0 $xr0
215*c0909341SAndroid Build Coastguard Worker#define xr1 $xr1
216*c0909341SAndroid Build Coastguard Worker#define xr2 $xr2
217*c0909341SAndroid Build Coastguard Worker#define xr3 $xr3
218*c0909341SAndroid Build Coastguard Worker#define xr4 $xr4
219*c0909341SAndroid Build Coastguard Worker#define xr5 $xr5
220*c0909341SAndroid Build Coastguard Worker#define xr6 $xr6
221*c0909341SAndroid Build Coastguard Worker#define xr7 $xr7
222*c0909341SAndroid Build Coastguard Worker#define xr8 $xr8
223*c0909341SAndroid Build Coastguard Worker#define xr9 $xr9
224*c0909341SAndroid Build Coastguard Worker#define xr10 $xr10
225*c0909341SAndroid Build Coastguard Worker#define xr11 $xr11
226*c0909341SAndroid Build Coastguard Worker#define xr12 $xr12
227*c0909341SAndroid Build Coastguard Worker#define xr13 $xr13
228*c0909341SAndroid Build Coastguard Worker#define xr14 $xr14
229*c0909341SAndroid Build Coastguard Worker#define xr15 $xr15
230*c0909341SAndroid Build Coastguard Worker#define xr16 $xr16
231*c0909341SAndroid Build Coastguard Worker#define xr17 $xr17
232*c0909341SAndroid Build Coastguard Worker#define xr18 $xr18
233*c0909341SAndroid Build Coastguard Worker#define xr19 $xr19
234*c0909341SAndroid Build Coastguard Worker#define xr20 $xr20
235*c0909341SAndroid Build Coastguard Worker#define xr21 $xr21
236*c0909341SAndroid Build Coastguard Worker#define xr22 $xr22
237*c0909341SAndroid Build Coastguard Worker#define xr23 $xr23
238*c0909341SAndroid Build Coastguard Worker#define xr24 $xr24
239*c0909341SAndroid Build Coastguard Worker#define xr25 $xr25
240*c0909341SAndroid Build Coastguard Worker#define xr26 $xr26
241*c0909341SAndroid Build Coastguard Worker#define xr27 $xr27
242*c0909341SAndroid Build Coastguard Worker#define xr28 $xr28
243*c0909341SAndroid Build Coastguard Worker#define xr29 $xr29
244*c0909341SAndroid Build Coastguard Worker#define xr30 $xr30
245*c0909341SAndroid Build Coastguard Worker#define xr31 $xr31
246*c0909341SAndroid Build Coastguard Worker
247*c0909341SAndroid Build Coastguard Worker/*
248*c0909341SAndroid Build Coastguard Worker *============================================================================
249*c0909341SAndroid Build Coastguard Worker * LSX/LASX synthesize instructions
250*c0909341SAndroid Build Coastguard Worker *============================================================================
251*c0909341SAndroid Build Coastguard Worker */
252*c0909341SAndroid Build Coastguard Worker
253*c0909341SAndroid Build Coastguard Worker/*
254*c0909341SAndroid Build Coastguard Worker * Description : Dot product of byte vector elements
255*c0909341SAndroid Build Coastguard Worker * Arguments   : Inputs  - vj, vk
256*c0909341SAndroid Build Coastguard Worker *               Outputs - vd
257*c0909341SAndroid Build Coastguard Worker *               Return Type - halfword
258*c0909341SAndroid Build Coastguard Worker */
259*c0909341SAndroid Build Coastguard Worker.macro vdp2.h.bu vd, vj, vk
260*c0909341SAndroid Build Coastguard Worker    vmulwev.h.bu      \vd,    \vj,    \vk
261*c0909341SAndroid Build Coastguard Worker    vmaddwod.h.bu     \vd,    \vj,    \vk
262*c0909341SAndroid Build Coastguard Worker.endm
263*c0909341SAndroid Build Coastguard Worker
264*c0909341SAndroid Build Coastguard Worker.macro vdp2.h.bu.b vd, vj, vk
265*c0909341SAndroid Build Coastguard Worker    vmulwev.h.bu.b    \vd,    \vj,    \vk
266*c0909341SAndroid Build Coastguard Worker    vmaddwod.h.bu.b   \vd,    \vj,    \vk
267*c0909341SAndroid Build Coastguard Worker.endm
268*c0909341SAndroid Build Coastguard Worker
269*c0909341SAndroid Build Coastguard Worker.macro vdp2.w.h vd, vj, vk
270*c0909341SAndroid Build Coastguard Worker    vmulwev.w.h       \vd,    \vj,    \vk
271*c0909341SAndroid Build Coastguard Worker    vmaddwod.w.h      \vd,    \vj,    \vk
272*c0909341SAndroid Build Coastguard Worker.endm
273*c0909341SAndroid Build Coastguard Worker
274*c0909341SAndroid Build Coastguard Worker.macro xvdp2.h.bu xd, xj, xk
275*c0909341SAndroid Build Coastguard Worker    xvmulwev.h.bu    \xd,    \xj,    \xk
276*c0909341SAndroid Build Coastguard Worker    xvmaddwod.h.bu   \xd,    \xj,    \xk
277*c0909341SAndroid Build Coastguard Worker.endm
278*c0909341SAndroid Build Coastguard Worker
279*c0909341SAndroid Build Coastguard Worker.macro xvdp2.h.bu.b xd, xj, xk
280*c0909341SAndroid Build Coastguard Worker    xvmulwev.h.bu.b    \xd,  \xj,    \xk
281*c0909341SAndroid Build Coastguard Worker    xvmaddwod.h.bu.b   \xd,  \xj,    \xk
282*c0909341SAndroid Build Coastguard Worker.endm
283*c0909341SAndroid Build Coastguard Worker
284*c0909341SAndroid Build Coastguard Worker.macro xvdp2.w.h xd, xj, xk
285*c0909341SAndroid Build Coastguard Worker    xvmulwev.w.h       \xd,  \xj,    \xk
286*c0909341SAndroid Build Coastguard Worker    xvmaddwod.w.h      \xd,  \xj,    \xk
287*c0909341SAndroid Build Coastguard Worker.endm
288*c0909341SAndroid Build Coastguard Worker
289*c0909341SAndroid Build Coastguard Worker/*
290*c0909341SAndroid Build Coastguard Worker * Description : Dot product & addition of halfword vector elements
291*c0909341SAndroid Build Coastguard Worker * Arguments   : Inputs  - vj, vk
292*c0909341SAndroid Build Coastguard Worker *               Outputs - vd
293*c0909341SAndroid Build Coastguard Worker *               Return Type - twice size of input
294*c0909341SAndroid Build Coastguard Worker */
295*c0909341SAndroid Build Coastguard Worker.macro vdp2add.h.bu vd, vj, vk
296*c0909341SAndroid Build Coastguard Worker    vmaddwev.h.bu     \vd,    \vj,    \vk
297*c0909341SAndroid Build Coastguard Worker    vmaddwod.h.bu     \vd,    \vj,    \vk
298*c0909341SAndroid Build Coastguard Worker.endm
299*c0909341SAndroid Build Coastguard Worker
300*c0909341SAndroid Build Coastguard Worker.macro vdp2add.h.bu.b vd, vj, vk
301*c0909341SAndroid Build Coastguard Worker    vmaddwev.h.bu.b   \vd,    \vj,    \vk
302*c0909341SAndroid Build Coastguard Worker    vmaddwod.h.bu.b   \vd,    \vj,    \vk
303*c0909341SAndroid Build Coastguard Worker.endm
304*c0909341SAndroid Build Coastguard Worker
305*c0909341SAndroid Build Coastguard Worker.macro vdp2add.w.h vd, vj, vk
306*c0909341SAndroid Build Coastguard Worker    vmaddwev.w.h      \vd,    \vj,    \vk
307*c0909341SAndroid Build Coastguard Worker    vmaddwod.w.h      \vd,    \vj,    \vk
308*c0909341SAndroid Build Coastguard Worker.endm
309*c0909341SAndroid Build Coastguard Worker
310*c0909341SAndroid Build Coastguard Worker.macro xvdp2add.h.bu.b xd, xj, xk
311*c0909341SAndroid Build Coastguard Worker    xvmaddwev.h.bu.b   \xd,  \xj,    \xk
312*c0909341SAndroid Build Coastguard Worker    xvmaddwod.h.bu.b   \xd,  \xj,    \xk
313*c0909341SAndroid Build Coastguard Worker.endm
314*c0909341SAndroid Build Coastguard Worker
315*c0909341SAndroid Build Coastguard Worker.macro xvdp2add.w.h xd, xj, xk
316*c0909341SAndroid Build Coastguard Worker    xvmaddwev.w.h      \xd,  \xj,    \xk
317*c0909341SAndroid Build Coastguard Worker    xvmaddwod.w.h      \xd,  \xj,    \xk
318*c0909341SAndroid Build Coastguard Worker.endm
319*c0909341SAndroid Build Coastguard Worker
320*c0909341SAndroid Build Coastguard Worker/*
321*c0909341SAndroid Build Coastguard Worker * Description : Range element vj[i] to vk[i] ~ vj[i]
322*c0909341SAndroid Build Coastguard Worker * clip: vj > vk ? vj : vk && vj < va ? vj : va
323*c0909341SAndroid Build Coastguard Worker */
324*c0909341SAndroid Build Coastguard Worker.macro vclip.h  vd,  vj, vk, va
325*c0909341SAndroid Build Coastguard Worker    vmax.h    \vd,  \vj,   \vk
326*c0909341SAndroid Build Coastguard Worker    vmin.h    \vd,  \vd,   \va
327*c0909341SAndroid Build Coastguard Worker.endm
328*c0909341SAndroid Build Coastguard Worker
329*c0909341SAndroid Build Coastguard Worker.macro vclip.w  vd,  vj, vk, va
330*c0909341SAndroid Build Coastguard Worker    vmax.w    \vd,  \vj,   \vk
331*c0909341SAndroid Build Coastguard Worker    vmin.w    \vd,  \vd,   \va
332*c0909341SAndroid Build Coastguard Worker.endm
333*c0909341SAndroid Build Coastguard Worker
334*c0909341SAndroid Build Coastguard Worker.macro xvclip.h  xd,  xj, xk, xa
335*c0909341SAndroid Build Coastguard Worker    xvmax.h    \xd,  \xj,   \xk
336*c0909341SAndroid Build Coastguard Worker    xvmin.h    \xd,  \xd,   \xa
337*c0909341SAndroid Build Coastguard Worker.endm
338*c0909341SAndroid Build Coastguard Worker
339*c0909341SAndroid Build Coastguard Worker.macro xvclip.w  xd,  xj, xk, xa
340*c0909341SAndroid Build Coastguard Worker    xvmax.w    \xd,  \xj,   \xk
341*c0909341SAndroid Build Coastguard Worker    xvmin.w    \xd,  \xd,   \xa
342*c0909341SAndroid Build Coastguard Worker.endm
343*c0909341SAndroid Build Coastguard Worker
344*c0909341SAndroid Build Coastguard Worker/*
345*c0909341SAndroid Build Coastguard Worker * Description : Range element vj[i] to 0 ~ 255
346*c0909341SAndroid Build Coastguard Worker * clip255: vj < 255 ? vj : 255 && vj > 0 ? vj : 0
347*c0909341SAndroid Build Coastguard Worker */
348*c0909341SAndroid Build Coastguard Worker.macro vclip255.h  vd, vj
349*c0909341SAndroid Build Coastguard Worker    vmaxi.h   \vd,   \vj,  0
350*c0909341SAndroid Build Coastguard Worker    vsat.hu   \vd,   \vd,  7
351*c0909341SAndroid Build Coastguard Worker.endm
352*c0909341SAndroid Build Coastguard Worker
353*c0909341SAndroid Build Coastguard Worker.macro vclip255.w  vd, vj
354*c0909341SAndroid Build Coastguard Worker    vmaxi.w   \vd,   \vj,  0
355*c0909341SAndroid Build Coastguard Worker    vsat.wu   \vd,   \vd,  7
356*c0909341SAndroid Build Coastguard Worker.endm
357*c0909341SAndroid Build Coastguard Worker
358*c0909341SAndroid Build Coastguard Worker.macro xvclip255.h  xd, xj
359*c0909341SAndroid Build Coastguard Worker    xvmaxi.h   \xd,   \xj,  0
360*c0909341SAndroid Build Coastguard Worker    xvsat.hu   \xd,   \xd,  7
361*c0909341SAndroid Build Coastguard Worker.endm
362*c0909341SAndroid Build Coastguard Worker
363*c0909341SAndroid Build Coastguard Worker.macro xvclip255.w  xd, xj
364*c0909341SAndroid Build Coastguard Worker    xvmaxi.w   \xd,   \xj,  0
365*c0909341SAndroid Build Coastguard Worker    xvsat.wu   \xd,   \xd,  7
366*c0909341SAndroid Build Coastguard Worker.endm
367*c0909341SAndroid Build Coastguard Worker
368*c0909341SAndroid Build Coastguard Worker/*
369*c0909341SAndroid Build Coastguard Worker * Description : Store elements of vector
370*c0909341SAndroid Build Coastguard Worker * vd : Data vector to be stroed
371*c0909341SAndroid Build Coastguard Worker * rk : Address of data storage
372*c0909341SAndroid Build Coastguard Worker * ra : Offset of address
373*c0909341SAndroid Build Coastguard Worker * si : Index of data in vd
374*c0909341SAndroid Build Coastguard Worker */
375*c0909341SAndroid Build Coastguard Worker.macro vstelmx.b vd, rk, ra, si
376*c0909341SAndroid Build Coastguard Worker    add.d      \rk,  \rk,  \ra
377*c0909341SAndroid Build Coastguard Worker    vstelm.b   \vd,  \rk,  0, \si
378*c0909341SAndroid Build Coastguard Worker.endm
379*c0909341SAndroid Build Coastguard Worker
380*c0909341SAndroid Build Coastguard Worker.macro vstelmx.h vd, rk, ra, si
381*c0909341SAndroid Build Coastguard Worker    add.d      \rk,  \rk,  \ra
382*c0909341SAndroid Build Coastguard Worker    vstelm.h   \vd,  \rk,  0, \si
383*c0909341SAndroid Build Coastguard Worker.endm
384*c0909341SAndroid Build Coastguard Worker
385*c0909341SAndroid Build Coastguard Worker.macro vstelmx.w vd, rk, ra, si
386*c0909341SAndroid Build Coastguard Worker    add.d      \rk,  \rk,  \ra
387*c0909341SAndroid Build Coastguard Worker    vstelm.w   \vd,  \rk,  0, \si
388*c0909341SAndroid Build Coastguard Worker.endm
389*c0909341SAndroid Build Coastguard Worker
390*c0909341SAndroid Build Coastguard Worker.macro vstelmx.d  vd, rk, ra, si
391*c0909341SAndroid Build Coastguard Worker    add.d      \rk,  \rk,  \ra
392*c0909341SAndroid Build Coastguard Worker    vstelm.d   \vd,  \rk,  0, \si
393*c0909341SAndroid Build Coastguard Worker.endm
394*c0909341SAndroid Build Coastguard Worker
395*c0909341SAndroid Build Coastguard Worker.macro vmov xd, xj
396*c0909341SAndroid Build Coastguard Worker    vor.v  \xd,  \xj,  \xj
397*c0909341SAndroid Build Coastguard Worker.endm
398*c0909341SAndroid Build Coastguard Worker
399*c0909341SAndroid Build Coastguard Worker.macro xmov xd, xj
400*c0909341SAndroid Build Coastguard Worker    xvor.v  \xd,  \xj,  \xj
401*c0909341SAndroid Build Coastguard Worker.endm
402*c0909341SAndroid Build Coastguard Worker
403*c0909341SAndroid Build Coastguard Worker.macro xvstelmx.d  xd, rk, ra, si
404*c0909341SAndroid Build Coastguard Worker    add.d      \rk, \rk,  \ra
405*c0909341SAndroid Build Coastguard Worker    xvstelm.d  \xd, \rk,  0, \si
406*c0909341SAndroid Build Coastguard Worker.endm
407*c0909341SAndroid Build Coastguard Worker
408*c0909341SAndroid Build Coastguard Worker/*
409*c0909341SAndroid Build Coastguard Worker *============================================================================
410*c0909341SAndroid Build Coastguard Worker * LSX/LASX custom macros
411*c0909341SAndroid Build Coastguard Worker *============================================================================
412*c0909341SAndroid Build Coastguard Worker */
413*c0909341SAndroid Build Coastguard Worker
414*c0909341SAndroid Build Coastguard Worker/*
415*c0909341SAndroid Build Coastguard Worker * Load 4 float, double, V128, v256 elements with stride.
416*c0909341SAndroid Build Coastguard Worker */
417*c0909341SAndroid Build Coastguard Worker.macro FLDS_LOADX_4 src, stride, stride2, stride3, out0, out1, out2, out3
418*c0909341SAndroid Build Coastguard Worker    fld.s     \out0,    \src,    0
419*c0909341SAndroid Build Coastguard Worker    fldx.s    \out1,    \src,    \stride
420*c0909341SAndroid Build Coastguard Worker    fldx.s    \out2,    \src,    \stride2
421*c0909341SAndroid Build Coastguard Worker    fldx.s    \out3,    \src,    \stride3
422*c0909341SAndroid Build Coastguard Worker.endm
423*c0909341SAndroid Build Coastguard Worker
424*c0909341SAndroid Build Coastguard Worker.macro FLDD_LOADX_4 src, stride, stride2, stride3, out0, out1, out2, out3
425*c0909341SAndroid Build Coastguard Worker    fld.d     \out0,    \src,    0
426*c0909341SAndroid Build Coastguard Worker    fldx.d    \out1,    \src,    \stride
427*c0909341SAndroid Build Coastguard Worker    fldx.d    \out2,    \src,    \stride2
428*c0909341SAndroid Build Coastguard Worker    fldx.d    \out3,    \src,    \stride3
429*c0909341SAndroid Build Coastguard Worker.endm
430*c0909341SAndroid Build Coastguard Worker
431*c0909341SAndroid Build Coastguard Worker.macro LSX_LOADX_4 src, stride, stride2, stride3, out0, out1, out2, out3
432*c0909341SAndroid Build Coastguard Worker    vld     \out0,    \src,    0
433*c0909341SAndroid Build Coastguard Worker    vldx    \out1,    \src,    \stride
434*c0909341SAndroid Build Coastguard Worker    vldx    \out2,    \src,    \stride2
435*c0909341SAndroid Build Coastguard Worker    vldx    \out3,    \src,    \stride3
436*c0909341SAndroid Build Coastguard Worker.endm
437*c0909341SAndroid Build Coastguard Worker
438*c0909341SAndroid Build Coastguard Worker.macro LASX_LOADX_4 src, stride, stride2, stride3, out0, out1, out2, out3
439*c0909341SAndroid Build Coastguard Worker    xvld    \out0,    \src,    0
440*c0909341SAndroid Build Coastguard Worker    xvldx   \out1,    \src,    \stride
441*c0909341SAndroid Build Coastguard Worker    xvldx   \out2,    \src,    \stride2
442*c0909341SAndroid Build Coastguard Worker    xvldx   \out3,    \src,    \stride3
443*c0909341SAndroid Build Coastguard Worker.endm
444*c0909341SAndroid Build Coastguard Worker
445*c0909341SAndroid Build Coastguard Worker/*
446*c0909341SAndroid Build Coastguard Worker * Description : Transpose 4x4 block with half-word elements in vectors
447*c0909341SAndroid Build Coastguard Worker * Arguments   : Inputs  - in0, in1, in2, in3
448*c0909341SAndroid Build Coastguard Worker *               Outputs - out0, out1, out2, out3
449*c0909341SAndroid Build Coastguard Worker */
450*c0909341SAndroid Build Coastguard Worker.macro LSX_TRANSPOSE4x4_H in0, in1, in2, in3, out0, out1, out2, out3, \
451*c0909341SAndroid Build Coastguard Worker                          tmp0, tmp1
452*c0909341SAndroid Build Coastguard Worker    vilvl.h   \tmp0,  \in1,   \in0
453*c0909341SAndroid Build Coastguard Worker    vilvl.h   \tmp1,  \in3,   \in2
454*c0909341SAndroid Build Coastguard Worker    vilvl.w   \out0,  \tmp1,  \tmp0
455*c0909341SAndroid Build Coastguard Worker    vilvh.w   \out2,  \tmp1,  \tmp0
456*c0909341SAndroid Build Coastguard Worker    vilvh.d   \out1,  \out0,  \out0
457*c0909341SAndroid Build Coastguard Worker    vilvh.d   \out3,  \out0,  \out2
458*c0909341SAndroid Build Coastguard Worker.endm
459*c0909341SAndroid Build Coastguard Worker
460*c0909341SAndroid Build Coastguard Worker/*
461*c0909341SAndroid Build Coastguard Worker * Description : Transpose 4x4 block with word elements in vectors
462*c0909341SAndroid Build Coastguard Worker * Arguments   : Inputs  - in0, in1, in2, in3
463*c0909341SAndroid Build Coastguard Worker *               Outputs - out0, out1, out2, out3
464*c0909341SAndroid Build Coastguard Worker * Details     :
465*c0909341SAndroid Build Coastguard Worker * Example     :
466*c0909341SAndroid Build Coastguard Worker *               1, 2, 3, 4            1, 5, 9,13
467*c0909341SAndroid Build Coastguard Worker *               5, 6, 7, 8    to      2, 6,10,14
468*c0909341SAndroid Build Coastguard Worker *               9,10,11,12  =====>    3, 7,11,15
469*c0909341SAndroid Build Coastguard Worker *              13,14,15,16            4, 8,12,16
470*c0909341SAndroid Build Coastguard Worker */
471*c0909341SAndroid Build Coastguard Worker.macro LSX_TRANSPOSE4x4_W in0, in1, in2, in3, out0, out1, out2, out3, \
472*c0909341SAndroid Build Coastguard Worker                          tmp0, tmp1
473*c0909341SAndroid Build Coastguard Worker
474*c0909341SAndroid Build Coastguard Worker    vilvl.w    \tmp0,   \in1,    \in0
475*c0909341SAndroid Build Coastguard Worker    vilvh.w    \out1,   \in1,    \in0
476*c0909341SAndroid Build Coastguard Worker    vilvl.w    \tmp1,   \in3,    \in2
477*c0909341SAndroid Build Coastguard Worker    vilvh.w    \out3,   \in3,    \in2
478*c0909341SAndroid Build Coastguard Worker
479*c0909341SAndroid Build Coastguard Worker    vilvl.d    \out0,   \tmp1,   \tmp0
480*c0909341SAndroid Build Coastguard Worker    vilvl.d    \out2,   \out3,   \out1
481*c0909341SAndroid Build Coastguard Worker    vilvh.d    \out3,   \out3,   \out1
482*c0909341SAndroid Build Coastguard Worker    vilvh.d    \out1,   \tmp1,   \tmp0
483*c0909341SAndroid Build Coastguard Worker.endm
484*c0909341SAndroid Build Coastguard Worker
485*c0909341SAndroid Build Coastguard Worker/*
486*c0909341SAndroid Build Coastguard Worker * Description : Transpose 8x8 block with half-word elements in vectors
487*c0909341SAndroid Build Coastguard Worker * Arguments   : Inputs  - in0, in1, in2, in3, in4, in5, in6, in7
488*c0909341SAndroid Build Coastguard Worker *               Outputs - out0, out1, out2, out3, out4, out5, out6, out7
489*c0909341SAndroid Build Coastguard Worker */
490*c0909341SAndroid Build Coastguard Worker.macro LSX_TRANSPOSE8x8_H in0, in1, in2, in3, in4, in5, in6, in7, out0, out1,   \
491*c0909341SAndroid Build Coastguard Worker                          out2, out3, out4, out5, out6, out7, tmp0, tmp1, tmp2, \
492*c0909341SAndroid Build Coastguard Worker                          tmp3, tmp4, tmp5, tmp6, tmp7
493*c0909341SAndroid Build Coastguard Worker    vilvl.h      \tmp0,    \in6,   \in4
494*c0909341SAndroid Build Coastguard Worker    vilvl.h      \tmp1,    \in7,   \in5
495*c0909341SAndroid Build Coastguard Worker    vilvl.h      \tmp2,    \in2,   \in0
496*c0909341SAndroid Build Coastguard Worker    vilvl.h      \tmp3,    \in3,   \in1
497*c0909341SAndroid Build Coastguard Worker
498*c0909341SAndroid Build Coastguard Worker    vilvl.h      \tmp4,    \tmp1,  \tmp0
499*c0909341SAndroid Build Coastguard Worker    vilvh.h      \tmp5,    \tmp1,  \tmp0
500*c0909341SAndroid Build Coastguard Worker    vilvl.h      \tmp6,    \tmp3,  \tmp2
501*c0909341SAndroid Build Coastguard Worker    vilvh.h      \tmp7,    \tmp3,  \tmp2
502*c0909341SAndroid Build Coastguard Worker
503*c0909341SAndroid Build Coastguard Worker    vilvh.h      \tmp0,    \in6,   \in4
504*c0909341SAndroid Build Coastguard Worker    vilvh.h      \tmp1,    \in7,   \in5
505*c0909341SAndroid Build Coastguard Worker    vilvh.h      \tmp2,    \in2,   \in0
506*c0909341SAndroid Build Coastguard Worker    vilvh.h      \tmp3,    \in3,   \in1
507*c0909341SAndroid Build Coastguard Worker
508*c0909341SAndroid Build Coastguard Worker    vpickev.d    \out0,    \tmp4,  \tmp6
509*c0909341SAndroid Build Coastguard Worker    vpickod.d    \out1,    \tmp4,  \tmp6
510*c0909341SAndroid Build Coastguard Worker    vpickev.d    \out2,    \tmp5,  \tmp7
511*c0909341SAndroid Build Coastguard Worker    vpickod.d    \out3,    \tmp5,  \tmp7
512*c0909341SAndroid Build Coastguard Worker
513*c0909341SAndroid Build Coastguard Worker    vilvl.h      \tmp4,    \tmp1,  \tmp0
514*c0909341SAndroid Build Coastguard Worker    vilvh.h      \tmp5,    \tmp1,  \tmp0
515*c0909341SAndroid Build Coastguard Worker    vilvl.h      \tmp6,    \tmp3,  \tmp2
516*c0909341SAndroid Build Coastguard Worker    vilvh.h      \tmp7,    \tmp3,  \tmp2
517*c0909341SAndroid Build Coastguard Worker
518*c0909341SAndroid Build Coastguard Worker    vpickev.d    \out4,    \tmp4,  \tmp6
519*c0909341SAndroid Build Coastguard Worker    vpickod.d    \out5,    \tmp4,  \tmp6
520*c0909341SAndroid Build Coastguard Worker    vpickev.d    \out6,    \tmp5,  \tmp7
521*c0909341SAndroid Build Coastguard Worker    vpickod.d    \out7,    \tmp5,  \tmp7
522*c0909341SAndroid Build Coastguard Worker.endm
523*c0909341SAndroid Build Coastguard Worker
524*c0909341SAndroid Build Coastguard Worker/*
525*c0909341SAndroid Build Coastguard Worker * Description : Transpose 16x8 block with byte elements in vectors
526*c0909341SAndroid Build Coastguard Worker * Arguments   : Inputs  - in0, in1, in2, in3, in4, in5, in6, in7
527*c0909341SAndroid Build Coastguard Worker *               Outputs - out0, out1, out2, out3, out4, out5, out6, out7
528*c0909341SAndroid Build Coastguard Worker */
529*c0909341SAndroid Build Coastguard Worker.macro LASX_TRANSPOSE16X8_B in0, in1, in2, in3, in4, in5, in6, in7,        \
530*c0909341SAndroid Build Coastguard Worker                            in8, in9, in10, in11, in12, in13, in14, in15,  \
531*c0909341SAndroid Build Coastguard Worker                            out0, out1, out2, out3, out4, out5, out6, out7,\
532*c0909341SAndroid Build Coastguard Worker                            tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7
533*c0909341SAndroid Build Coastguard Worker    xvilvl.b   \tmp0,    \in2,     \in0
534*c0909341SAndroid Build Coastguard Worker    xvilvl.b   \tmp1,    \in3,     \in1
535*c0909341SAndroid Build Coastguard Worker    xvilvl.b   \tmp2,    \in6,     \in4
536*c0909341SAndroid Build Coastguard Worker    xvilvl.b   \tmp3,    \in7,     \in5
537*c0909341SAndroid Build Coastguard Worker    xvilvl.b   \tmp4,    \in10,    \in8
538*c0909341SAndroid Build Coastguard Worker    xvilvl.b   \tmp5,    \in11,    \in9
539*c0909341SAndroid Build Coastguard Worker    xvilvl.b   \tmp6,    \in14,    \in12
540*c0909341SAndroid Build Coastguard Worker    xvilvl.b   \tmp7,    \in15,    \in13
541*c0909341SAndroid Build Coastguard Worker    xvilvl.b   \out0,    \tmp1,    \tmp0
542*c0909341SAndroid Build Coastguard Worker    xvilvh.b   \out1,    \tmp1,    \tmp0
543*c0909341SAndroid Build Coastguard Worker    xvilvl.b   \out2,    \tmp3,    \tmp2
544*c0909341SAndroid Build Coastguard Worker    xvilvh.b   \out3,    \tmp3,    \tmp2
545*c0909341SAndroid Build Coastguard Worker    xvilvl.b   \out4,    \tmp5,    \tmp4
546*c0909341SAndroid Build Coastguard Worker    xvilvh.b   \out5,    \tmp5,    \tmp4
547*c0909341SAndroid Build Coastguard Worker    xvilvl.b   \out6,    \tmp7,    \tmp6
548*c0909341SAndroid Build Coastguard Worker    xvilvh.b   \out7,    \tmp7,    \tmp6
549*c0909341SAndroid Build Coastguard Worker    xvilvl.w   \tmp0,    \out2,    \out0
550*c0909341SAndroid Build Coastguard Worker    xvilvh.w   \tmp2,    \out2,    \out0
551*c0909341SAndroid Build Coastguard Worker    xvilvl.w   \tmp4,    \out3,    \out1
552*c0909341SAndroid Build Coastguard Worker    xvilvh.w   \tmp6,    \out3,    \out1
553*c0909341SAndroid Build Coastguard Worker    xvilvl.w   \tmp1,    \out6,    \out4
554*c0909341SAndroid Build Coastguard Worker    xvilvh.w   \tmp3,    \out6,    \out4
555*c0909341SAndroid Build Coastguard Worker    xvilvl.w   \tmp5,    \out7,    \out5
556*c0909341SAndroid Build Coastguard Worker    xvilvh.w   \tmp7,    \out7,    \out5
557*c0909341SAndroid Build Coastguard Worker    xvilvl.d   \out0,    \tmp1,    \tmp0
558*c0909341SAndroid Build Coastguard Worker    xvilvh.d   \out1,    \tmp1,    \tmp0
559*c0909341SAndroid Build Coastguard Worker    xvilvl.d   \out2,    \tmp3,    \tmp2
560*c0909341SAndroid Build Coastguard Worker    xvilvh.d   \out3,    \tmp3,    \tmp2
561*c0909341SAndroid Build Coastguard Worker    xvilvl.d   \out4,    \tmp5,    \tmp4
562*c0909341SAndroid Build Coastguard Worker    xvilvh.d   \out5,    \tmp5,    \tmp4
563*c0909341SAndroid Build Coastguard Worker    xvilvl.d   \out6,    \tmp7,    \tmp6
564*c0909341SAndroid Build Coastguard Worker    xvilvh.d   \out7,    \tmp7,    \tmp6
565*c0909341SAndroid Build Coastguard Worker.endm
566*c0909341SAndroid Build Coastguard Worker
567*c0909341SAndroid Build Coastguard Worker/*
568*c0909341SAndroid Build Coastguard Worker * Description : Transpose 4x4 block with half-word elements in vectors
569*c0909341SAndroid Build Coastguard Worker * Arguments   : Inputs  - in0, in1, in2, in3
570*c0909341SAndroid Build Coastguard Worker *               Outputs - out0, out1, out2, out3
571*c0909341SAndroid Build Coastguard Worker */
572*c0909341SAndroid Build Coastguard Worker.macro LASX_TRANSPOSE4x4_H in0, in1, in2, in3, out0, out1, out2, out3, \
573*c0909341SAndroid Build Coastguard Worker                           tmp0, tmp1
574*c0909341SAndroid Build Coastguard Worker    xvilvl.h   \tmp0,  \in1,   \in0
575*c0909341SAndroid Build Coastguard Worker    xvilvl.h   \tmp1,  \in3,   \in2
576*c0909341SAndroid Build Coastguard Worker    xvilvl.w   \out0,  \tmp1,  \tmp0
577*c0909341SAndroid Build Coastguard Worker    xvilvh.w   \out2,  \tmp1,  \tmp0
578*c0909341SAndroid Build Coastguard Worker    xvilvh.d   \out1,  \out0,  \out0
579*c0909341SAndroid Build Coastguard Worker    xvilvh.d   \out3,  \out0,  \out2
580*c0909341SAndroid Build Coastguard Worker.endm
581*c0909341SAndroid Build Coastguard Worker
582*c0909341SAndroid Build Coastguard Worker/*
583*c0909341SAndroid Build Coastguard Worker * Description : Transpose 4x8 block with half-word elements in vectors
584*c0909341SAndroid Build Coastguard Worker * Arguments   : Inputs  - in0, in1, in2, in3
585*c0909341SAndroid Build Coastguard Worker *               Outputs - out0, out1, out2, out3
586*c0909341SAndroid Build Coastguard Worker */
587*c0909341SAndroid Build Coastguard Worker.macro LASX_TRANSPOSE4x8_H in0, in1, in2, in3, out0, out1, out2, out3, \
588*c0909341SAndroid Build Coastguard Worker                           tmp0, tmp1
589*c0909341SAndroid Build Coastguard Worker    xvilvl.h      \tmp0,    \in2,   \in0
590*c0909341SAndroid Build Coastguard Worker    xvilvl.h      \tmp1,    \in3,   \in1
591*c0909341SAndroid Build Coastguard Worker    xvilvl.h      \out2,    \tmp1,  \tmp0
592*c0909341SAndroid Build Coastguard Worker    xvilvh.h      \out3,    \tmp1,  \tmp0
593*c0909341SAndroid Build Coastguard Worker
594*c0909341SAndroid Build Coastguard Worker    xvilvl.d      \out0,    \out2,  \out2
595*c0909341SAndroid Build Coastguard Worker    xvilvh.d      \out1,    \out2,  \out2
596*c0909341SAndroid Build Coastguard Worker    xvilvl.d      \out2,    \out3,  \out3
597*c0909341SAndroid Build Coastguard Worker    xvilvh.d      \out3,    \out3,  \out3
598*c0909341SAndroid Build Coastguard Worker.endm
599*c0909341SAndroid Build Coastguard Worker
600*c0909341SAndroid Build Coastguard Worker/*
601*c0909341SAndroid Build Coastguard Worker * Description : Transpose 8x8 block with half-word elements in vectors
602*c0909341SAndroid Build Coastguard Worker * Arguments   : Inputs  - in0, in1, in2, in3, in4, in5, in6, in7
603*c0909341SAndroid Build Coastguard Worker *               Outputs - out0, out1, out2, out3, out4, out5, out6, out7
604*c0909341SAndroid Build Coastguard Worker */
605*c0909341SAndroid Build Coastguard Worker.macro LASX_TRANSPOSE8x8_H in0, in1, in2, in3, in4, in5, in6, in7,         \
606*c0909341SAndroid Build Coastguard Worker                           out0, out1, out2, out3, out4, out5, out6, out7, \
607*c0909341SAndroid Build Coastguard Worker                           tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7
608*c0909341SAndroid Build Coastguard Worker    xvilvl.h     \tmp0,   \in6,     \in4
609*c0909341SAndroid Build Coastguard Worker    xvilvl.h     \tmp1,   \in7,     \in5
610*c0909341SAndroid Build Coastguard Worker    xvilvl.h     \tmp2,   \in2,     \in0
611*c0909341SAndroid Build Coastguard Worker    xvilvl.h     \tmp3,   \in3,     \in1
612*c0909341SAndroid Build Coastguard Worker
613*c0909341SAndroid Build Coastguard Worker    xvilvl.h     \tmp4,   \tmp1,    \tmp0
614*c0909341SAndroid Build Coastguard Worker    xvilvh.h     \tmp5,   \tmp1,    \tmp0
615*c0909341SAndroid Build Coastguard Worker    xvilvl.h     \tmp6,   \tmp3,    \tmp2
616*c0909341SAndroid Build Coastguard Worker    xvilvh.h     \tmp7,   \tmp3,    \tmp2
617*c0909341SAndroid Build Coastguard Worker
618*c0909341SAndroid Build Coastguard Worker    xvilvh.h     \tmp0,   \in6,     \in4
619*c0909341SAndroid Build Coastguard Worker    xvilvh.h     \tmp1,   \in7,     \in5
620*c0909341SAndroid Build Coastguard Worker    xvilvh.h     \tmp2,   \in2,     \in0
621*c0909341SAndroid Build Coastguard Worker    xvilvh.h     \tmp3,   \in3,     \in1
622*c0909341SAndroid Build Coastguard Worker
623*c0909341SAndroid Build Coastguard Worker    xvpickev.d   \out0,   \tmp4,    \tmp6
624*c0909341SAndroid Build Coastguard Worker    xvpickod.d   \out1,   \tmp4,    \tmp6
625*c0909341SAndroid Build Coastguard Worker    xvpickev.d   \out2,   \tmp5,    \tmp7
626*c0909341SAndroid Build Coastguard Worker    xvpickod.d   \out3,   \tmp5,    \tmp7
627*c0909341SAndroid Build Coastguard Worker
628*c0909341SAndroid Build Coastguard Worker    xvilvl.h     \tmp4,   \tmp1,    \tmp0
629*c0909341SAndroid Build Coastguard Worker    xvilvh.h     \tmp5,   \tmp1,    \tmp0
630*c0909341SAndroid Build Coastguard Worker    xvilvl.h     \tmp6,   \tmp3,    \tmp2
631*c0909341SAndroid Build Coastguard Worker    xvilvh.h     \tmp7,   \tmp3,    \tmp2
632*c0909341SAndroid Build Coastguard Worker
633*c0909341SAndroid Build Coastguard Worker    xvpickev.d   \out4,   \tmp4,    \tmp6
634*c0909341SAndroid Build Coastguard Worker    xvpickod.d   \out5,   \tmp4,    \tmp6
635*c0909341SAndroid Build Coastguard Worker    xvpickev.d   \out6,   \tmp5,    \tmp7
636*c0909341SAndroid Build Coastguard Worker    xvpickod.d   \out7,   \tmp5,    \tmp7
637*c0909341SAndroid Build Coastguard Worker.endm
638*c0909341SAndroid Build Coastguard Worker
639*c0909341SAndroid Build Coastguard Worker/*
640*c0909341SAndroid Build Coastguard Worker * Description : Transpose 2x4x4 block with half-word elements in vectors
641*c0909341SAndroid Build Coastguard Worker * Arguments   : Inputs  - in0, in1, in2, in3
642*c0909341SAndroid Build Coastguard Worker *               Outputs - out0, out1, out2, out3
643*c0909341SAndroid Build Coastguard Worker */
644*c0909341SAndroid Build Coastguard Worker.macro LASX_TRANSPOSE2x4x4_H in0, in1, in2, in3, out0, out1, out2, out3, \
645*c0909341SAndroid Build Coastguard Worker                             tmp0, tmp1, tmp2
646*c0909341SAndroid Build Coastguard Worker    xvilvh.h   \tmp1,    \in0,     \in1
647*c0909341SAndroid Build Coastguard Worker    xvilvl.h   \out1,    \in0,     \in1
648*c0909341SAndroid Build Coastguard Worker    xvilvh.h   \tmp0,    \in2,     \in3
649*c0909341SAndroid Build Coastguard Worker    xvilvl.h   \out3,    \in2,     \in3
650*c0909341SAndroid Build Coastguard Worker
651*c0909341SAndroid Build Coastguard Worker    xvilvh.w   \tmp2,    \out3,    \out1
652*c0909341SAndroid Build Coastguard Worker    xvilvl.w   \out3,    \out3,    \out1
653*c0909341SAndroid Build Coastguard Worker
654*c0909341SAndroid Build Coastguard Worker    xvilvl.w   \out2,    \tmp0,    \tmp1
655*c0909341SAndroid Build Coastguard Worker    xvilvh.w   \tmp1,    \tmp0,    \tmp1
656*c0909341SAndroid Build Coastguard Worker
657*c0909341SAndroid Build Coastguard Worker    xvilvh.d   \out0,    \out2,    \out3
658*c0909341SAndroid Build Coastguard Worker    xvilvl.d   \out2,    \out2,    \out3
659*c0909341SAndroid Build Coastguard Worker    xvilvh.d   \out1,    \tmp1,    \tmp2
660*c0909341SAndroid Build Coastguard Worker    xvilvl.d   \out3,    \tmp1,    \tmp2
661*c0909341SAndroid Build Coastguard Worker.endm
662*c0909341SAndroid Build Coastguard Worker
663*c0909341SAndroid Build Coastguard Worker/*
664*c0909341SAndroid Build Coastguard Worker * Description : Transpose 4x4 block with word elements in vectors
665*c0909341SAndroid Build Coastguard Worker * Arguments   : Inputs  - in0, in1, in2, in3
666*c0909341SAndroid Build Coastguard Worker *               Outputs - out0, out1, out2, out3
667*c0909341SAndroid Build Coastguard Worker * Details     :
668*c0909341SAndroid Build Coastguard Worker * Example     :
669*c0909341SAndroid Build Coastguard Worker *               1, 2, 3, 4,  1, 2, 3, 4        1,5, 9,13, 1,5, 9,13
670*c0909341SAndroid Build Coastguard Worker *               5, 6, 7, 8,  5, 6, 7, 8   to   2,6,10,14, 2,6,10,14
671*c0909341SAndroid Build Coastguard Worker *               9,10,11,12,  9,10,11,12 =====> 3,7,11,15, 3,7,11,15
672*c0909341SAndroid Build Coastguard Worker *              13,14,15,16, 13,14,15,16        4,8,12,16, 4,8,12,16
673*c0909341SAndroid Build Coastguard Worker */
674*c0909341SAndroid Build Coastguard Worker.macro LASX_TRANSPOSE4x4_W in0, in1, in2, in3, out0, out1, out2, out3, \
675*c0909341SAndroid Build Coastguard Worker                           tmp0, tmp1
676*c0909341SAndroid Build Coastguard Worker
677*c0909341SAndroid Build Coastguard Worker    xvilvl.w    \tmp0,   \in1,    \in0
678*c0909341SAndroid Build Coastguard Worker    xvilvh.w    \out1,   \in1,    \in0
679*c0909341SAndroid Build Coastguard Worker    xvilvl.w    \tmp1,   \in3,    \in2
680*c0909341SAndroid Build Coastguard Worker    xvilvh.w    \out3,   \in3,    \in2
681*c0909341SAndroid Build Coastguard Worker
682*c0909341SAndroid Build Coastguard Worker    xvilvl.d    \out0,   \tmp1,   \tmp0
683*c0909341SAndroid Build Coastguard Worker    xvilvl.d    \out2,   \out3,   \out1
684*c0909341SAndroid Build Coastguard Worker    xvilvh.d    \out3,   \out3,   \out1
685*c0909341SAndroid Build Coastguard Worker    xvilvh.d    \out1,   \tmp1,   \tmp0
686*c0909341SAndroid Build Coastguard Worker.endm
687*c0909341SAndroid Build Coastguard Worker
688*c0909341SAndroid Build Coastguard Worker/*
689*c0909341SAndroid Build Coastguard Worker * Description : Transpose 8x8 block with word elements in vectors
690*c0909341SAndroid Build Coastguard Worker * Arguments   : Inputs  - in0, in1, in2, in3, in4, in5, in6, in7
691*c0909341SAndroid Build Coastguard Worker *               Outputs - out0, out1, out2, out3, out4, out5, out6,
692*c0909341SAndroid Build Coastguard Worker *               _out7
693*c0909341SAndroid Build Coastguard Worker * Example     : LASX_TRANSPOSE8x8_W
694*c0909341SAndroid Build Coastguard Worker *         in0 : 1,2,3,4,5,6,7,8
695*c0909341SAndroid Build Coastguard Worker *         in1 : 2,2,3,4,5,6,7,8
696*c0909341SAndroid Build Coastguard Worker *         in2 : 3,2,3,4,5,6,7,8
697*c0909341SAndroid Build Coastguard Worker *         in3 : 4,2,3,4,5,6,7,8
698*c0909341SAndroid Build Coastguard Worker *         in4 : 5,2,3,4,5,6,7,8
699*c0909341SAndroid Build Coastguard Worker *         in5 : 6,2,3,4,5,6,7,8
700*c0909341SAndroid Build Coastguard Worker *         in6 : 7,2,3,4,5,6,7,8
701*c0909341SAndroid Build Coastguard Worker *         in7 : 8,2,3,4,5,6,7,8
702*c0909341SAndroid Build Coastguard Worker *
703*c0909341SAndroid Build Coastguard Worker *        out0 : 1,2,3,4,5,6,7,8
704*c0909341SAndroid Build Coastguard Worker *        out1 : 2,2,2,2,2,2,2,2
705*c0909341SAndroid Build Coastguard Worker *        out2 : 3,3,3,3,3,3,3,3
706*c0909341SAndroid Build Coastguard Worker *        out3 : 4,4,4,4,4,4,4,4
707*c0909341SAndroid Build Coastguard Worker *        out4 : 5,5,5,5,5,5,5,5
708*c0909341SAndroid Build Coastguard Worker *        out5 : 6,6,6,6,6,6,6,6
709*c0909341SAndroid Build Coastguard Worker *        out6 : 7,7,7,7,7,7,7,7
710*c0909341SAndroid Build Coastguard Worker *        out7 : 8,8,8,8,8,8,8,8
711*c0909341SAndroid Build Coastguard Worker */
712*c0909341SAndroid Build Coastguard Worker.macro LASX_TRANSPOSE8x8_W in0, in1, in2, in3, in4, in5, in6, in7,\
713*c0909341SAndroid Build Coastguard Worker                           out0, out1, out2, out3, out4, out5, out6, out7,\
714*c0909341SAndroid Build Coastguard Worker                           tmp0, tmp1, tmp2, tmp3
715*c0909341SAndroid Build Coastguard Worker    xvilvl.w    \tmp0,   \in2,    \in0
716*c0909341SAndroid Build Coastguard Worker    xvilvl.w    \tmp1,   \in3,    \in1
717*c0909341SAndroid Build Coastguard Worker    xvilvh.w    \tmp2,   \in2,    \in0
718*c0909341SAndroid Build Coastguard Worker    xvilvh.w    \tmp3,   \in3,    \in1
719*c0909341SAndroid Build Coastguard Worker    xvilvl.w    \out0,   \tmp1,   \tmp0
720*c0909341SAndroid Build Coastguard Worker    xvilvh.w    \out1,   \tmp1,   \tmp0
721*c0909341SAndroid Build Coastguard Worker    xvilvl.w    \out2,   \tmp3,   \tmp2
722*c0909341SAndroid Build Coastguard Worker    xvilvh.w    \out3,   \tmp3,   \tmp2
723*c0909341SAndroid Build Coastguard Worker
724*c0909341SAndroid Build Coastguard Worker    xvilvl.w    \tmp0,   \in6,    \in4
725*c0909341SAndroid Build Coastguard Worker    xvilvl.w    \tmp1,   \in7,    \in5
726*c0909341SAndroid Build Coastguard Worker    xvilvh.w    \tmp2,   \in6,    \in4
727*c0909341SAndroid Build Coastguard Worker    xvilvh.w    \tmp3,   \in7,    \in5
728*c0909341SAndroid Build Coastguard Worker    xvilvl.w    \out4,   \tmp1,   \tmp0
729*c0909341SAndroid Build Coastguard Worker    xvilvh.w    \out5,   \tmp1,   \tmp0
730*c0909341SAndroid Build Coastguard Worker    xvilvl.w    \out6,   \tmp3,   \tmp2
731*c0909341SAndroid Build Coastguard Worker    xvilvh.w    \out7,   \tmp3,   \tmp2
732*c0909341SAndroid Build Coastguard Worker
733*c0909341SAndroid Build Coastguard Worker    xmov        \tmp0,   \out0
734*c0909341SAndroid Build Coastguard Worker    xmov        \tmp1,   \out1
735*c0909341SAndroid Build Coastguard Worker    xmov        \tmp2,   \out2
736*c0909341SAndroid Build Coastguard Worker    xmov        \tmp3,   \out3
737*c0909341SAndroid Build Coastguard Worker    xvpermi.q   \out0,   \out4,   0x02
738*c0909341SAndroid Build Coastguard Worker    xvpermi.q   \out1,   \out5,   0x02
739*c0909341SAndroid Build Coastguard Worker    xvpermi.q   \out2,   \out6,   0x02
740*c0909341SAndroid Build Coastguard Worker    xvpermi.q   \out3,   \out7,   0x02
741*c0909341SAndroid Build Coastguard Worker    xvpermi.q   \out4,   \tmp0,   0x31
742*c0909341SAndroid Build Coastguard Worker    xvpermi.q   \out5,   \tmp1,   0x31
743*c0909341SAndroid Build Coastguard Worker    xvpermi.q   \out6,   \tmp2,   0x31
744*c0909341SAndroid Build Coastguard Worker    xvpermi.q   \out7,   \tmp3,   0x31
745*c0909341SAndroid Build Coastguard Worker.endm
746*c0909341SAndroid Build Coastguard Worker
747*c0909341SAndroid Build Coastguard Worker/*
748*c0909341SAndroid Build Coastguard Worker * Description : Transpose 4x4 block with double-word elements in vectors
749*c0909341SAndroid Build Coastguard Worker * Arguments   : Inputs  - in0, in1, in2, in3
750*c0909341SAndroid Build Coastguard Worker *               Outputs - out0, out1, out2, out3
751*c0909341SAndroid Build Coastguard Worker * Example     : LASX_TRANSPOSE4x4_D
752*c0909341SAndroid Build Coastguard Worker *         in0 : 1,2,3,4
753*c0909341SAndroid Build Coastguard Worker *         in1 : 1,2,3,4
754*c0909341SAndroid Build Coastguard Worker *         in2 : 1,2,3,4
755*c0909341SAndroid Build Coastguard Worker *         in3 : 1,2,3,4
756*c0909341SAndroid Build Coastguard Worker *
757*c0909341SAndroid Build Coastguard Worker *        out0 : 1,1,1,1
758*c0909341SAndroid Build Coastguard Worker *        out1 : 2,2,2,2
759*c0909341SAndroid Build Coastguard Worker *        out2 : 3,3,3,3
760*c0909341SAndroid Build Coastguard Worker *        out3 : 4,4,4,4
761*c0909341SAndroid Build Coastguard Worker */
762*c0909341SAndroid Build Coastguard Worker.macro LASX_TRANSPOSE4x4_D in0, in1, in2, in3, out0, out1, out2, out3, \
763*c0909341SAndroid Build Coastguard Worker                           tmp0, tmp1
764*c0909341SAndroid Build Coastguard Worker    xvilvl.d    \tmp0,   \in1,    \in0
765*c0909341SAndroid Build Coastguard Worker    xvilvh.d    \out1,   \in1,    \in0
766*c0909341SAndroid Build Coastguard Worker    xvilvh.d    \tmp1,   \in3,    \in2
767*c0909341SAndroid Build Coastguard Worker    xvilvl.d    \out2,   \in3,    \in2
768*c0909341SAndroid Build Coastguard Worker
769*c0909341SAndroid Build Coastguard Worker    xvor.v      \out0,   \tmp0,   \tmp0
770*c0909341SAndroid Build Coastguard Worker    xvor.v      \out3,   \tmp1,   \tmp1
771*c0909341SAndroid Build Coastguard Worker
772*c0909341SAndroid Build Coastguard Worker    xvpermi.q   \out0,   \out2,   0x02
773*c0909341SAndroid Build Coastguard Worker    xvpermi.q   \out2,   \tmp0,   0x31
774*c0909341SAndroid Build Coastguard Worker    xvpermi.q   \out3,   \out1,   0x31
775*c0909341SAndroid Build Coastguard Worker    xvpermi.q   \out1,   \tmp1,   0x02
776*c0909341SAndroid Build Coastguard Worker.endm
777