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