1*706f2adaSHeiko Carstens /* SPDX-License-Identifier: GPL-2.0 */ 2*706f2adaSHeiko Carstens /* 3*706f2adaSHeiko Carstens * Support for Vector Instructions 4*706f2adaSHeiko Carstens * 5*706f2adaSHeiko Carstens * Assembler macros to generate .byte/.word code for particular 6*706f2adaSHeiko Carstens * vector instructions that are supported by recent binutils (>= 2.26) only. 7*706f2adaSHeiko Carstens * 8*706f2adaSHeiko Carstens * Copyright IBM Corp. 2015 9*706f2adaSHeiko Carstens * Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com> 10*706f2adaSHeiko Carstens */ 11*706f2adaSHeiko Carstens 12*706f2adaSHeiko Carstens #ifndef __ASM_S390_VX_INSN_INTERNAL_H 13*706f2adaSHeiko Carstens #define __ASM_S390_VX_INSN_INTERNAL_H 14*706f2adaSHeiko Carstens 15*706f2adaSHeiko Carstens #ifndef __ASM_S390_VX_INSN_H 16*706f2adaSHeiko Carstens #error only <asm/vx-insn.h> can be included directly 17*706f2adaSHeiko Carstens #endif 18*706f2adaSHeiko Carstens 19*706f2adaSHeiko Carstens #ifdef __ASSEMBLY__ 20*706f2adaSHeiko Carstens 21*706f2adaSHeiko Carstens /* Macros to generate vector instruction byte code */ 22*706f2adaSHeiko Carstens 23*706f2adaSHeiko Carstens /* GR_NUM - Retrieve general-purpose register number 24*706f2adaSHeiko Carstens * 25*706f2adaSHeiko Carstens * @opd: Operand to store register number 26*706f2adaSHeiko Carstens * @r64: String designation register in the format "%rN" 27*706f2adaSHeiko Carstens */ 28*706f2adaSHeiko Carstens .macro GR_NUM opd gr 29*706f2adaSHeiko Carstens \opd = 255 30*706f2adaSHeiko Carstens .ifc \gr,%r0 31*706f2adaSHeiko Carstens \opd = 0 32*706f2adaSHeiko Carstens .endif 33*706f2adaSHeiko Carstens .ifc \gr,%r1 34*706f2adaSHeiko Carstens \opd = 1 35*706f2adaSHeiko Carstens .endif 36*706f2adaSHeiko Carstens .ifc \gr,%r2 37*706f2adaSHeiko Carstens \opd = 2 38*706f2adaSHeiko Carstens .endif 39*706f2adaSHeiko Carstens .ifc \gr,%r3 40*706f2adaSHeiko Carstens \opd = 3 41*706f2adaSHeiko Carstens .endif 42*706f2adaSHeiko Carstens .ifc \gr,%r4 43*706f2adaSHeiko Carstens \opd = 4 44*706f2adaSHeiko Carstens .endif 45*706f2adaSHeiko Carstens .ifc \gr,%r5 46*706f2adaSHeiko Carstens \opd = 5 47*706f2adaSHeiko Carstens .endif 48*706f2adaSHeiko Carstens .ifc \gr,%r6 49*706f2adaSHeiko Carstens \opd = 6 50*706f2adaSHeiko Carstens .endif 51*706f2adaSHeiko Carstens .ifc \gr,%r7 52*706f2adaSHeiko Carstens \opd = 7 53*706f2adaSHeiko Carstens .endif 54*706f2adaSHeiko Carstens .ifc \gr,%r8 55*706f2adaSHeiko Carstens \opd = 8 56*706f2adaSHeiko Carstens .endif 57*706f2adaSHeiko Carstens .ifc \gr,%r9 58*706f2adaSHeiko Carstens \opd = 9 59*706f2adaSHeiko Carstens .endif 60*706f2adaSHeiko Carstens .ifc \gr,%r10 61*706f2adaSHeiko Carstens \opd = 10 62*706f2adaSHeiko Carstens .endif 63*706f2adaSHeiko Carstens .ifc \gr,%r11 64*706f2adaSHeiko Carstens \opd = 11 65*706f2adaSHeiko Carstens .endif 66*706f2adaSHeiko Carstens .ifc \gr,%r12 67*706f2adaSHeiko Carstens \opd = 12 68*706f2adaSHeiko Carstens .endif 69*706f2adaSHeiko Carstens .ifc \gr,%r13 70*706f2adaSHeiko Carstens \opd = 13 71*706f2adaSHeiko Carstens .endif 72*706f2adaSHeiko Carstens .ifc \gr,%r14 73*706f2adaSHeiko Carstens \opd = 14 74*706f2adaSHeiko Carstens .endif 75*706f2adaSHeiko Carstens .ifc \gr,%r15 76*706f2adaSHeiko Carstens \opd = 15 77*706f2adaSHeiko Carstens .endif 78*706f2adaSHeiko Carstens .if \opd == 255 79*706f2adaSHeiko Carstens \opd = \gr 80*706f2adaSHeiko Carstens .endif 81*706f2adaSHeiko Carstens .endm 82*706f2adaSHeiko Carstens 83*706f2adaSHeiko Carstens /* VX_NUM - Retrieve vector register number 84*706f2adaSHeiko Carstens * 85*706f2adaSHeiko Carstens * @opd: Operand to store register number 86*706f2adaSHeiko Carstens * @vxr: String designation register in the format "%vN" 87*706f2adaSHeiko Carstens * 88*706f2adaSHeiko Carstens * The vector register number is used for as input number to the 89*706f2adaSHeiko Carstens * instruction and, as well as, to compute the RXB field of the 90*706f2adaSHeiko Carstens * instruction. 91*706f2adaSHeiko Carstens */ 92*706f2adaSHeiko Carstens .macro VX_NUM opd vxr 93*706f2adaSHeiko Carstens \opd = 255 94*706f2adaSHeiko Carstens .ifc \vxr,%v0 95*706f2adaSHeiko Carstens \opd = 0 96*706f2adaSHeiko Carstens .endif 97*706f2adaSHeiko Carstens .ifc \vxr,%v1 98*706f2adaSHeiko Carstens \opd = 1 99*706f2adaSHeiko Carstens .endif 100*706f2adaSHeiko Carstens .ifc \vxr,%v2 101*706f2adaSHeiko Carstens \opd = 2 102*706f2adaSHeiko Carstens .endif 103*706f2adaSHeiko Carstens .ifc \vxr,%v3 104*706f2adaSHeiko Carstens \opd = 3 105*706f2adaSHeiko Carstens .endif 106*706f2adaSHeiko Carstens .ifc \vxr,%v4 107*706f2adaSHeiko Carstens \opd = 4 108*706f2adaSHeiko Carstens .endif 109*706f2adaSHeiko Carstens .ifc \vxr,%v5 110*706f2adaSHeiko Carstens \opd = 5 111*706f2adaSHeiko Carstens .endif 112*706f2adaSHeiko Carstens .ifc \vxr,%v6 113*706f2adaSHeiko Carstens \opd = 6 114*706f2adaSHeiko Carstens .endif 115*706f2adaSHeiko Carstens .ifc \vxr,%v7 116*706f2adaSHeiko Carstens \opd = 7 117*706f2adaSHeiko Carstens .endif 118*706f2adaSHeiko Carstens .ifc \vxr,%v8 119*706f2adaSHeiko Carstens \opd = 8 120*706f2adaSHeiko Carstens .endif 121*706f2adaSHeiko Carstens .ifc \vxr,%v9 122*706f2adaSHeiko Carstens \opd = 9 123*706f2adaSHeiko Carstens .endif 124*706f2adaSHeiko Carstens .ifc \vxr,%v10 125*706f2adaSHeiko Carstens \opd = 10 126*706f2adaSHeiko Carstens .endif 127*706f2adaSHeiko Carstens .ifc \vxr,%v11 128*706f2adaSHeiko Carstens \opd = 11 129*706f2adaSHeiko Carstens .endif 130*706f2adaSHeiko Carstens .ifc \vxr,%v12 131*706f2adaSHeiko Carstens \opd = 12 132*706f2adaSHeiko Carstens .endif 133*706f2adaSHeiko Carstens .ifc \vxr,%v13 134*706f2adaSHeiko Carstens \opd = 13 135*706f2adaSHeiko Carstens .endif 136*706f2adaSHeiko Carstens .ifc \vxr,%v14 137*706f2adaSHeiko Carstens \opd = 14 138*706f2adaSHeiko Carstens .endif 139*706f2adaSHeiko Carstens .ifc \vxr,%v15 140*706f2adaSHeiko Carstens \opd = 15 141*706f2adaSHeiko Carstens .endif 142*706f2adaSHeiko Carstens .ifc \vxr,%v16 143*706f2adaSHeiko Carstens \opd = 16 144*706f2adaSHeiko Carstens .endif 145*706f2adaSHeiko Carstens .ifc \vxr,%v17 146*706f2adaSHeiko Carstens \opd = 17 147*706f2adaSHeiko Carstens .endif 148*706f2adaSHeiko Carstens .ifc \vxr,%v18 149*706f2adaSHeiko Carstens \opd = 18 150*706f2adaSHeiko Carstens .endif 151*706f2adaSHeiko Carstens .ifc \vxr,%v19 152*706f2adaSHeiko Carstens \opd = 19 153*706f2adaSHeiko Carstens .endif 154*706f2adaSHeiko Carstens .ifc \vxr,%v20 155*706f2adaSHeiko Carstens \opd = 20 156*706f2adaSHeiko Carstens .endif 157*706f2adaSHeiko Carstens .ifc \vxr,%v21 158*706f2adaSHeiko Carstens \opd = 21 159*706f2adaSHeiko Carstens .endif 160*706f2adaSHeiko Carstens .ifc \vxr,%v22 161*706f2adaSHeiko Carstens \opd = 22 162*706f2adaSHeiko Carstens .endif 163*706f2adaSHeiko Carstens .ifc \vxr,%v23 164*706f2adaSHeiko Carstens \opd = 23 165*706f2adaSHeiko Carstens .endif 166*706f2adaSHeiko Carstens .ifc \vxr,%v24 167*706f2adaSHeiko Carstens \opd = 24 168*706f2adaSHeiko Carstens .endif 169*706f2adaSHeiko Carstens .ifc \vxr,%v25 170*706f2adaSHeiko Carstens \opd = 25 171*706f2adaSHeiko Carstens .endif 172*706f2adaSHeiko Carstens .ifc \vxr,%v26 173*706f2adaSHeiko Carstens \opd = 26 174*706f2adaSHeiko Carstens .endif 175*706f2adaSHeiko Carstens .ifc \vxr,%v27 176*706f2adaSHeiko Carstens \opd = 27 177*706f2adaSHeiko Carstens .endif 178*706f2adaSHeiko Carstens .ifc \vxr,%v28 179*706f2adaSHeiko Carstens \opd = 28 180*706f2adaSHeiko Carstens .endif 181*706f2adaSHeiko Carstens .ifc \vxr,%v29 182*706f2adaSHeiko Carstens \opd = 29 183*706f2adaSHeiko Carstens .endif 184*706f2adaSHeiko Carstens .ifc \vxr,%v30 185*706f2adaSHeiko Carstens \opd = 30 186*706f2adaSHeiko Carstens .endif 187*706f2adaSHeiko Carstens .ifc \vxr,%v31 188*706f2adaSHeiko Carstens \opd = 31 189*706f2adaSHeiko Carstens .endif 190*706f2adaSHeiko Carstens .if \opd == 255 191*706f2adaSHeiko Carstens \opd = \vxr 192*706f2adaSHeiko Carstens .endif 193*706f2adaSHeiko Carstens .endm 194*706f2adaSHeiko Carstens 195*706f2adaSHeiko Carstens /* RXB - Compute most significant bit used vector registers 196*706f2adaSHeiko Carstens * 197*706f2adaSHeiko Carstens * @rxb: Operand to store computed RXB value 198*706f2adaSHeiko Carstens * @v1: First vector register designated operand 199*706f2adaSHeiko Carstens * @v2: Second vector register designated operand 200*706f2adaSHeiko Carstens * @v3: Third vector register designated operand 201*706f2adaSHeiko Carstens * @v4: Fourth vector register designated operand 202*706f2adaSHeiko Carstens */ 203*706f2adaSHeiko Carstens .macro RXB rxb v1 v2=0 v3=0 v4=0 204*706f2adaSHeiko Carstens \rxb = 0 205*706f2adaSHeiko Carstens .if \v1 & 0x10 206*706f2adaSHeiko Carstens \rxb = \rxb | 0x08 207*706f2adaSHeiko Carstens .endif 208*706f2adaSHeiko Carstens .if \v2 & 0x10 209*706f2adaSHeiko Carstens \rxb = \rxb | 0x04 210*706f2adaSHeiko Carstens .endif 211*706f2adaSHeiko Carstens .if \v3 & 0x10 212*706f2adaSHeiko Carstens \rxb = \rxb | 0x02 213*706f2adaSHeiko Carstens .endif 214*706f2adaSHeiko Carstens .if \v4 & 0x10 215*706f2adaSHeiko Carstens \rxb = \rxb | 0x01 216*706f2adaSHeiko Carstens .endif 217*706f2adaSHeiko Carstens .endm 218*706f2adaSHeiko Carstens 219*706f2adaSHeiko Carstens /* MRXB - Generate Element Size Control and RXB value 220*706f2adaSHeiko Carstens * 221*706f2adaSHeiko Carstens * @m: Element size control 222*706f2adaSHeiko Carstens * @v1: First vector register designated operand (for RXB) 223*706f2adaSHeiko Carstens * @v2: Second vector register designated operand (for RXB) 224*706f2adaSHeiko Carstens * @v3: Third vector register designated operand (for RXB) 225*706f2adaSHeiko Carstens * @v4: Fourth vector register designated operand (for RXB) 226*706f2adaSHeiko Carstens */ 227*706f2adaSHeiko Carstens .macro MRXB m v1 v2=0 v3=0 v4=0 228*706f2adaSHeiko Carstens rxb = 0 229*706f2adaSHeiko Carstens RXB rxb, \v1, \v2, \v3, \v4 230*706f2adaSHeiko Carstens .byte (\m << 4) | rxb 231*706f2adaSHeiko Carstens .endm 232*706f2adaSHeiko Carstens 233*706f2adaSHeiko Carstens /* MRXBOPC - Generate Element Size Control, RXB, and final Opcode fields 234*706f2adaSHeiko Carstens * 235*706f2adaSHeiko Carstens * @m: Element size control 236*706f2adaSHeiko Carstens * @opc: Opcode 237*706f2adaSHeiko Carstens * @v1: First vector register designated operand (for RXB) 238*706f2adaSHeiko Carstens * @v2: Second vector register designated operand (for RXB) 239*706f2adaSHeiko Carstens * @v3: Third vector register designated operand (for RXB) 240*706f2adaSHeiko Carstens * @v4: Fourth vector register designated operand (for RXB) 241*706f2adaSHeiko Carstens */ 242*706f2adaSHeiko Carstens .macro MRXBOPC m opc v1 v2=0 v3=0 v4=0 243*706f2adaSHeiko Carstens MRXB \m, \v1, \v2, \v3, \v4 244*706f2adaSHeiko Carstens .byte \opc 245*706f2adaSHeiko Carstens .endm 246*706f2adaSHeiko Carstens 247*706f2adaSHeiko Carstens /* Vector support instructions */ 248*706f2adaSHeiko Carstens 249*706f2adaSHeiko Carstens /* VECTOR GENERATE BYTE MASK */ 250*706f2adaSHeiko Carstens .macro VGBM vr imm2 251*706f2adaSHeiko Carstens VX_NUM v1, \vr 252*706f2adaSHeiko Carstens .word (0xE700 | ((v1&15) << 4)) 253*706f2adaSHeiko Carstens .word \imm2 254*706f2adaSHeiko Carstens MRXBOPC 0, 0x44, v1 255*706f2adaSHeiko Carstens .endm 256*706f2adaSHeiko Carstens .macro VZERO vxr 257*706f2adaSHeiko Carstens VGBM \vxr, 0 258*706f2adaSHeiko Carstens .endm 259*706f2adaSHeiko Carstens .macro VONE vxr 260*706f2adaSHeiko Carstens VGBM \vxr, 0xFFFF 261*706f2adaSHeiko Carstens .endm 262*706f2adaSHeiko Carstens 263*706f2adaSHeiko Carstens /* VECTOR LOAD VR ELEMENT FROM GR */ 264*706f2adaSHeiko Carstens .macro VLVG v, gr, disp, m 265*706f2adaSHeiko Carstens VX_NUM v1, \v 266*706f2adaSHeiko Carstens GR_NUM b2, "%r0" 267*706f2adaSHeiko Carstens GR_NUM r3, \gr 268*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) | r3 269*706f2adaSHeiko Carstens .word (b2 << 12) | (\disp) 270*706f2adaSHeiko Carstens MRXBOPC \m, 0x22, v1 271*706f2adaSHeiko Carstens .endm 272*706f2adaSHeiko Carstens .macro VLVGB v, gr, index, base 273*706f2adaSHeiko Carstens VLVG \v, \gr, \index, \base, 0 274*706f2adaSHeiko Carstens .endm 275*706f2adaSHeiko Carstens .macro VLVGH v, gr, index 276*706f2adaSHeiko Carstens VLVG \v, \gr, \index, 1 277*706f2adaSHeiko Carstens .endm 278*706f2adaSHeiko Carstens .macro VLVGF v, gr, index 279*706f2adaSHeiko Carstens VLVG \v, \gr, \index, 2 280*706f2adaSHeiko Carstens .endm 281*706f2adaSHeiko Carstens .macro VLVGG v, gr, index 282*706f2adaSHeiko Carstens VLVG \v, \gr, \index, 3 283*706f2adaSHeiko Carstens .endm 284*706f2adaSHeiko Carstens 285*706f2adaSHeiko Carstens /* VECTOR LOAD REGISTER */ 286*706f2adaSHeiko Carstens .macro VLR v1, v2 287*706f2adaSHeiko Carstens VX_NUM v1, \v1 288*706f2adaSHeiko Carstens VX_NUM v2, \v2 289*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) | (v2&15) 290*706f2adaSHeiko Carstens .word 0 291*706f2adaSHeiko Carstens MRXBOPC 0, 0x56, v1, v2 292*706f2adaSHeiko Carstens .endm 293*706f2adaSHeiko Carstens 294*706f2adaSHeiko Carstens /* VECTOR LOAD */ 295*706f2adaSHeiko Carstens .macro VL v, disp, index="%r0", base 296*706f2adaSHeiko Carstens VX_NUM v1, \v 297*706f2adaSHeiko Carstens GR_NUM x2, \index 298*706f2adaSHeiko Carstens GR_NUM b2, \base 299*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) | x2 300*706f2adaSHeiko Carstens .word (b2 << 12) | (\disp) 301*706f2adaSHeiko Carstens MRXBOPC 0, 0x06, v1 302*706f2adaSHeiko Carstens .endm 303*706f2adaSHeiko Carstens 304*706f2adaSHeiko Carstens /* VECTOR LOAD ELEMENT */ 305*706f2adaSHeiko Carstens .macro VLEx vr1, disp, index="%r0", base, m3, opc 306*706f2adaSHeiko Carstens VX_NUM v1, \vr1 307*706f2adaSHeiko Carstens GR_NUM x2, \index 308*706f2adaSHeiko Carstens GR_NUM b2, \base 309*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) | x2 310*706f2adaSHeiko Carstens .word (b2 << 12) | (\disp) 311*706f2adaSHeiko Carstens MRXBOPC \m3, \opc, v1 312*706f2adaSHeiko Carstens .endm 313*706f2adaSHeiko Carstens .macro VLEB vr1, disp, index="%r0", base, m3 314*706f2adaSHeiko Carstens VLEx \vr1, \disp, \index, \base, \m3, 0x00 315*706f2adaSHeiko Carstens .endm 316*706f2adaSHeiko Carstens .macro VLEH vr1, disp, index="%r0", base, m3 317*706f2adaSHeiko Carstens VLEx \vr1, \disp, \index, \base, \m3, 0x01 318*706f2adaSHeiko Carstens .endm 319*706f2adaSHeiko Carstens .macro VLEF vr1, disp, index="%r0", base, m3 320*706f2adaSHeiko Carstens VLEx \vr1, \disp, \index, \base, \m3, 0x03 321*706f2adaSHeiko Carstens .endm 322*706f2adaSHeiko Carstens .macro VLEG vr1, disp, index="%r0", base, m3 323*706f2adaSHeiko Carstens VLEx \vr1, \disp, \index, \base, \m3, 0x02 324*706f2adaSHeiko Carstens .endm 325*706f2adaSHeiko Carstens 326*706f2adaSHeiko Carstens /* VECTOR LOAD ELEMENT IMMEDIATE */ 327*706f2adaSHeiko Carstens .macro VLEIx vr1, imm2, m3, opc 328*706f2adaSHeiko Carstens VX_NUM v1, \vr1 329*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) 330*706f2adaSHeiko Carstens .word \imm2 331*706f2adaSHeiko Carstens MRXBOPC \m3, \opc, v1 332*706f2adaSHeiko Carstens .endm 333*706f2adaSHeiko Carstens .macro VLEIB vr1, imm2, index 334*706f2adaSHeiko Carstens VLEIx \vr1, \imm2, \index, 0x40 335*706f2adaSHeiko Carstens .endm 336*706f2adaSHeiko Carstens .macro VLEIH vr1, imm2, index 337*706f2adaSHeiko Carstens VLEIx \vr1, \imm2, \index, 0x41 338*706f2adaSHeiko Carstens .endm 339*706f2adaSHeiko Carstens .macro VLEIF vr1, imm2, index 340*706f2adaSHeiko Carstens VLEIx \vr1, \imm2, \index, 0x43 341*706f2adaSHeiko Carstens .endm 342*706f2adaSHeiko Carstens .macro VLEIG vr1, imm2, index 343*706f2adaSHeiko Carstens VLEIx \vr1, \imm2, \index, 0x42 344*706f2adaSHeiko Carstens .endm 345*706f2adaSHeiko Carstens 346*706f2adaSHeiko Carstens /* VECTOR LOAD GR FROM VR ELEMENT */ 347*706f2adaSHeiko Carstens .macro VLGV gr, vr, disp, base="%r0", m 348*706f2adaSHeiko Carstens GR_NUM r1, \gr 349*706f2adaSHeiko Carstens GR_NUM b2, \base 350*706f2adaSHeiko Carstens VX_NUM v3, \vr 351*706f2adaSHeiko Carstens .word 0xE700 | (r1 << 4) | (v3&15) 352*706f2adaSHeiko Carstens .word (b2 << 12) | (\disp) 353*706f2adaSHeiko Carstens MRXBOPC \m, 0x21, v3 354*706f2adaSHeiko Carstens .endm 355*706f2adaSHeiko Carstens .macro VLGVB gr, vr, disp, base="%r0" 356*706f2adaSHeiko Carstens VLGV \gr, \vr, \disp, \base, 0 357*706f2adaSHeiko Carstens .endm 358*706f2adaSHeiko Carstens .macro VLGVH gr, vr, disp, base="%r0" 359*706f2adaSHeiko Carstens VLGV \gr, \vr, \disp, \base, 1 360*706f2adaSHeiko Carstens .endm 361*706f2adaSHeiko Carstens .macro VLGVF gr, vr, disp, base="%r0" 362*706f2adaSHeiko Carstens VLGV \gr, \vr, \disp, \base, 2 363*706f2adaSHeiko Carstens .endm 364*706f2adaSHeiko Carstens .macro VLGVG gr, vr, disp, base="%r0" 365*706f2adaSHeiko Carstens VLGV \gr, \vr, \disp, \base, 3 366*706f2adaSHeiko Carstens .endm 367*706f2adaSHeiko Carstens 368*706f2adaSHeiko Carstens /* VECTOR LOAD MULTIPLE */ 369*706f2adaSHeiko Carstens .macro VLM vfrom, vto, disp, base, hint=3 370*706f2adaSHeiko Carstens VX_NUM v1, \vfrom 371*706f2adaSHeiko Carstens VX_NUM v3, \vto 372*706f2adaSHeiko Carstens GR_NUM b2, \base 373*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) | (v3&15) 374*706f2adaSHeiko Carstens .word (b2 << 12) | (\disp) 375*706f2adaSHeiko Carstens MRXBOPC \hint, 0x36, v1, v3 376*706f2adaSHeiko Carstens .endm 377*706f2adaSHeiko Carstens 378*706f2adaSHeiko Carstens /* VECTOR STORE */ 379*706f2adaSHeiko Carstens .macro VST vr1, disp, index="%r0", base 380*706f2adaSHeiko Carstens VX_NUM v1, \vr1 381*706f2adaSHeiko Carstens GR_NUM x2, \index 382*706f2adaSHeiko Carstens GR_NUM b2, \base 383*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) | (x2&15) 384*706f2adaSHeiko Carstens .word (b2 << 12) | (\disp) 385*706f2adaSHeiko Carstens MRXBOPC 0, 0x0E, v1 386*706f2adaSHeiko Carstens .endm 387*706f2adaSHeiko Carstens 388*706f2adaSHeiko Carstens /* VECTOR STORE MULTIPLE */ 389*706f2adaSHeiko Carstens .macro VSTM vfrom, vto, disp, base, hint=3 390*706f2adaSHeiko Carstens VX_NUM v1, \vfrom 391*706f2adaSHeiko Carstens VX_NUM v3, \vto 392*706f2adaSHeiko Carstens GR_NUM b2, \base 393*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) | (v3&15) 394*706f2adaSHeiko Carstens .word (b2 << 12) | (\disp) 395*706f2adaSHeiko Carstens MRXBOPC \hint, 0x3E, v1, v3 396*706f2adaSHeiko Carstens .endm 397*706f2adaSHeiko Carstens 398*706f2adaSHeiko Carstens /* VECTOR PERMUTE */ 399*706f2adaSHeiko Carstens .macro VPERM vr1, vr2, vr3, vr4 400*706f2adaSHeiko Carstens VX_NUM v1, \vr1 401*706f2adaSHeiko Carstens VX_NUM v2, \vr2 402*706f2adaSHeiko Carstens VX_NUM v3, \vr3 403*706f2adaSHeiko Carstens VX_NUM v4, \vr4 404*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) | (v2&15) 405*706f2adaSHeiko Carstens .word ((v3&15) << 12) 406*706f2adaSHeiko Carstens MRXBOPC (v4&15), 0x8C, v1, v2, v3, v4 407*706f2adaSHeiko Carstens .endm 408*706f2adaSHeiko Carstens 409*706f2adaSHeiko Carstens /* VECTOR UNPACK LOGICAL LOW */ 410*706f2adaSHeiko Carstens .macro VUPLL vr1, vr2, m3 411*706f2adaSHeiko Carstens VX_NUM v1, \vr1 412*706f2adaSHeiko Carstens VX_NUM v2, \vr2 413*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) | (v2&15) 414*706f2adaSHeiko Carstens .word 0x0000 415*706f2adaSHeiko Carstens MRXBOPC \m3, 0xD4, v1, v2 416*706f2adaSHeiko Carstens .endm 417*706f2adaSHeiko Carstens .macro VUPLLB vr1, vr2 418*706f2adaSHeiko Carstens VUPLL \vr1, \vr2, 0 419*706f2adaSHeiko Carstens .endm 420*706f2adaSHeiko Carstens .macro VUPLLH vr1, vr2 421*706f2adaSHeiko Carstens VUPLL \vr1, \vr2, 1 422*706f2adaSHeiko Carstens .endm 423*706f2adaSHeiko Carstens .macro VUPLLF vr1, vr2 424*706f2adaSHeiko Carstens VUPLL \vr1, \vr2, 2 425*706f2adaSHeiko Carstens .endm 426*706f2adaSHeiko Carstens 427*706f2adaSHeiko Carstens /* VECTOR PERMUTE DOUBLEWORD IMMEDIATE */ 428*706f2adaSHeiko Carstens .macro VPDI vr1, vr2, vr3, m4 429*706f2adaSHeiko Carstens VX_NUM v1, \vr1 430*706f2adaSHeiko Carstens VX_NUM v2, \vr2 431*706f2adaSHeiko Carstens VX_NUM v3, \vr3 432*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) | (v2&15) 433*706f2adaSHeiko Carstens .word ((v3&15) << 12) 434*706f2adaSHeiko Carstens MRXBOPC \m4, 0x84, v1, v2, v3 435*706f2adaSHeiko Carstens .endm 436*706f2adaSHeiko Carstens 437*706f2adaSHeiko Carstens /* VECTOR REPLICATE */ 438*706f2adaSHeiko Carstens .macro VREP vr1, vr3, imm2, m4 439*706f2adaSHeiko Carstens VX_NUM v1, \vr1 440*706f2adaSHeiko Carstens VX_NUM v3, \vr3 441*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) | (v3&15) 442*706f2adaSHeiko Carstens .word \imm2 443*706f2adaSHeiko Carstens MRXBOPC \m4, 0x4D, v1, v3 444*706f2adaSHeiko Carstens .endm 445*706f2adaSHeiko Carstens .macro VREPB vr1, vr3, imm2 446*706f2adaSHeiko Carstens VREP \vr1, \vr3, \imm2, 0 447*706f2adaSHeiko Carstens .endm 448*706f2adaSHeiko Carstens .macro VREPH vr1, vr3, imm2 449*706f2adaSHeiko Carstens VREP \vr1, \vr3, \imm2, 1 450*706f2adaSHeiko Carstens .endm 451*706f2adaSHeiko Carstens .macro VREPF vr1, vr3, imm2 452*706f2adaSHeiko Carstens VREP \vr1, \vr3, \imm2, 2 453*706f2adaSHeiko Carstens .endm 454*706f2adaSHeiko Carstens .macro VREPG vr1, vr3, imm2 455*706f2adaSHeiko Carstens VREP \vr1, \vr3, \imm2, 3 456*706f2adaSHeiko Carstens .endm 457*706f2adaSHeiko Carstens 458*706f2adaSHeiko Carstens /* VECTOR MERGE HIGH */ 459*706f2adaSHeiko Carstens .macro VMRH vr1, vr2, vr3, m4 460*706f2adaSHeiko Carstens VX_NUM v1, \vr1 461*706f2adaSHeiko Carstens VX_NUM v2, \vr2 462*706f2adaSHeiko Carstens VX_NUM v3, \vr3 463*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) | (v2&15) 464*706f2adaSHeiko Carstens .word ((v3&15) << 12) 465*706f2adaSHeiko Carstens MRXBOPC \m4, 0x61, v1, v2, v3 466*706f2adaSHeiko Carstens .endm 467*706f2adaSHeiko Carstens .macro VMRHB vr1, vr2, vr3 468*706f2adaSHeiko Carstens VMRH \vr1, \vr2, \vr3, 0 469*706f2adaSHeiko Carstens .endm 470*706f2adaSHeiko Carstens .macro VMRHH vr1, vr2, vr3 471*706f2adaSHeiko Carstens VMRH \vr1, \vr2, \vr3, 1 472*706f2adaSHeiko Carstens .endm 473*706f2adaSHeiko Carstens .macro VMRHF vr1, vr2, vr3 474*706f2adaSHeiko Carstens VMRH \vr1, \vr2, \vr3, 2 475*706f2adaSHeiko Carstens .endm 476*706f2adaSHeiko Carstens .macro VMRHG vr1, vr2, vr3 477*706f2adaSHeiko Carstens VMRH \vr1, \vr2, \vr3, 3 478*706f2adaSHeiko Carstens .endm 479*706f2adaSHeiko Carstens 480*706f2adaSHeiko Carstens /* VECTOR MERGE LOW */ 481*706f2adaSHeiko Carstens .macro VMRL vr1, vr2, vr3, m4 482*706f2adaSHeiko Carstens VX_NUM v1, \vr1 483*706f2adaSHeiko Carstens VX_NUM v2, \vr2 484*706f2adaSHeiko Carstens VX_NUM v3, \vr3 485*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) | (v2&15) 486*706f2adaSHeiko Carstens .word ((v3&15) << 12) 487*706f2adaSHeiko Carstens MRXBOPC \m4, 0x60, v1, v2, v3 488*706f2adaSHeiko Carstens .endm 489*706f2adaSHeiko Carstens .macro VMRLB vr1, vr2, vr3 490*706f2adaSHeiko Carstens VMRL \vr1, \vr2, \vr3, 0 491*706f2adaSHeiko Carstens .endm 492*706f2adaSHeiko Carstens .macro VMRLH vr1, vr2, vr3 493*706f2adaSHeiko Carstens VMRL \vr1, \vr2, \vr3, 1 494*706f2adaSHeiko Carstens .endm 495*706f2adaSHeiko Carstens .macro VMRLF vr1, vr2, vr3 496*706f2adaSHeiko Carstens VMRL \vr1, \vr2, \vr3, 2 497*706f2adaSHeiko Carstens .endm 498*706f2adaSHeiko Carstens .macro VMRLG vr1, vr2, vr3 499*706f2adaSHeiko Carstens VMRL \vr1, \vr2, \vr3, 3 500*706f2adaSHeiko Carstens .endm 501*706f2adaSHeiko Carstens 502*706f2adaSHeiko Carstens 503*706f2adaSHeiko Carstens /* Vector integer instructions */ 504*706f2adaSHeiko Carstens 505*706f2adaSHeiko Carstens /* VECTOR AND */ 506*706f2adaSHeiko Carstens .macro VN vr1, vr2, vr3 507*706f2adaSHeiko Carstens VX_NUM v1, \vr1 508*706f2adaSHeiko Carstens VX_NUM v2, \vr2 509*706f2adaSHeiko Carstens VX_NUM v3, \vr3 510*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) | (v2&15) 511*706f2adaSHeiko Carstens .word ((v3&15) << 12) 512*706f2adaSHeiko Carstens MRXBOPC 0, 0x68, v1, v2, v3 513*706f2adaSHeiko Carstens .endm 514*706f2adaSHeiko Carstens 515*706f2adaSHeiko Carstens /* VECTOR EXCLUSIVE OR */ 516*706f2adaSHeiko Carstens .macro VX vr1, vr2, vr3 517*706f2adaSHeiko Carstens VX_NUM v1, \vr1 518*706f2adaSHeiko Carstens VX_NUM v2, \vr2 519*706f2adaSHeiko Carstens VX_NUM v3, \vr3 520*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) | (v2&15) 521*706f2adaSHeiko Carstens .word ((v3&15) << 12) 522*706f2adaSHeiko Carstens MRXBOPC 0, 0x6D, v1, v2, v3 523*706f2adaSHeiko Carstens .endm 524*706f2adaSHeiko Carstens 525*706f2adaSHeiko Carstens /* VECTOR GALOIS FIELD MULTIPLY SUM */ 526*706f2adaSHeiko Carstens .macro VGFM vr1, vr2, vr3, m4 527*706f2adaSHeiko Carstens VX_NUM v1, \vr1 528*706f2adaSHeiko Carstens VX_NUM v2, \vr2 529*706f2adaSHeiko Carstens VX_NUM v3, \vr3 530*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) | (v2&15) 531*706f2adaSHeiko Carstens .word ((v3&15) << 12) 532*706f2adaSHeiko Carstens MRXBOPC \m4, 0xB4, v1, v2, v3 533*706f2adaSHeiko Carstens .endm 534*706f2adaSHeiko Carstens .macro VGFMB vr1, vr2, vr3 535*706f2adaSHeiko Carstens VGFM \vr1, \vr2, \vr3, 0 536*706f2adaSHeiko Carstens .endm 537*706f2adaSHeiko Carstens .macro VGFMH vr1, vr2, vr3 538*706f2adaSHeiko Carstens VGFM \vr1, \vr2, \vr3, 1 539*706f2adaSHeiko Carstens .endm 540*706f2adaSHeiko Carstens .macro VGFMF vr1, vr2, vr3 541*706f2adaSHeiko Carstens VGFM \vr1, \vr2, \vr3, 2 542*706f2adaSHeiko Carstens .endm 543*706f2adaSHeiko Carstens .macro VGFMG vr1, vr2, vr3 544*706f2adaSHeiko Carstens VGFM \vr1, \vr2, \vr3, 3 545*706f2adaSHeiko Carstens .endm 546*706f2adaSHeiko Carstens 547*706f2adaSHeiko Carstens /* VECTOR GALOIS FIELD MULTIPLY SUM AND ACCUMULATE */ 548*706f2adaSHeiko Carstens .macro VGFMA vr1, vr2, vr3, vr4, m5 549*706f2adaSHeiko Carstens VX_NUM v1, \vr1 550*706f2adaSHeiko Carstens VX_NUM v2, \vr2 551*706f2adaSHeiko Carstens VX_NUM v3, \vr3 552*706f2adaSHeiko Carstens VX_NUM v4, \vr4 553*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) | (v2&15) 554*706f2adaSHeiko Carstens .word ((v3&15) << 12) | (\m5 << 8) 555*706f2adaSHeiko Carstens MRXBOPC (v4&15), 0xBC, v1, v2, v3, v4 556*706f2adaSHeiko Carstens .endm 557*706f2adaSHeiko Carstens .macro VGFMAB vr1, vr2, vr3, vr4 558*706f2adaSHeiko Carstens VGFMA \vr1, \vr2, \vr3, \vr4, 0 559*706f2adaSHeiko Carstens .endm 560*706f2adaSHeiko Carstens .macro VGFMAH vr1, vr2, vr3, vr4 561*706f2adaSHeiko Carstens VGFMA \vr1, \vr2, \vr3, \vr4, 1 562*706f2adaSHeiko Carstens .endm 563*706f2adaSHeiko Carstens .macro VGFMAF vr1, vr2, vr3, vr4 564*706f2adaSHeiko Carstens VGFMA \vr1, \vr2, \vr3, \vr4, 2 565*706f2adaSHeiko Carstens .endm 566*706f2adaSHeiko Carstens .macro VGFMAG vr1, vr2, vr3, vr4 567*706f2adaSHeiko Carstens VGFMA \vr1, \vr2, \vr3, \vr4, 3 568*706f2adaSHeiko Carstens .endm 569*706f2adaSHeiko Carstens 570*706f2adaSHeiko Carstens /* VECTOR SHIFT RIGHT LOGICAL BY BYTE */ 571*706f2adaSHeiko Carstens .macro VSRLB vr1, vr2, vr3 572*706f2adaSHeiko Carstens VX_NUM v1, \vr1 573*706f2adaSHeiko Carstens VX_NUM v2, \vr2 574*706f2adaSHeiko Carstens VX_NUM v3, \vr3 575*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) | (v2&15) 576*706f2adaSHeiko Carstens .word ((v3&15) << 12) 577*706f2adaSHeiko Carstens MRXBOPC 0, 0x7D, v1, v2, v3 578*706f2adaSHeiko Carstens .endm 579*706f2adaSHeiko Carstens 580*706f2adaSHeiko Carstens /* VECTOR REPLICATE IMMEDIATE */ 581*706f2adaSHeiko Carstens .macro VREPI vr1, imm2, m3 582*706f2adaSHeiko Carstens VX_NUM v1, \vr1 583*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) 584*706f2adaSHeiko Carstens .word \imm2 585*706f2adaSHeiko Carstens MRXBOPC \m3, 0x45, v1 586*706f2adaSHeiko Carstens .endm 587*706f2adaSHeiko Carstens .macro VREPIB vr1, imm2 588*706f2adaSHeiko Carstens VREPI \vr1, \imm2, 0 589*706f2adaSHeiko Carstens .endm 590*706f2adaSHeiko Carstens .macro VREPIH vr1, imm2 591*706f2adaSHeiko Carstens VREPI \vr1, \imm2, 1 592*706f2adaSHeiko Carstens .endm 593*706f2adaSHeiko Carstens .macro VREPIF vr1, imm2 594*706f2adaSHeiko Carstens VREPI \vr1, \imm2, 2 595*706f2adaSHeiko Carstens .endm 596*706f2adaSHeiko Carstens .macro VREPIG vr1, imm2 597*706f2adaSHeiko Carstens VREP \vr1, \imm2, 3 598*706f2adaSHeiko Carstens .endm 599*706f2adaSHeiko Carstens 600*706f2adaSHeiko Carstens /* VECTOR ADD */ 601*706f2adaSHeiko Carstens .macro VA vr1, vr2, vr3, m4 602*706f2adaSHeiko Carstens VX_NUM v1, \vr1 603*706f2adaSHeiko Carstens VX_NUM v2, \vr2 604*706f2adaSHeiko Carstens VX_NUM v3, \vr3 605*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) | (v2&15) 606*706f2adaSHeiko Carstens .word ((v3&15) << 12) 607*706f2adaSHeiko Carstens MRXBOPC \m4, 0xF3, v1, v2, v3 608*706f2adaSHeiko Carstens .endm 609*706f2adaSHeiko Carstens .macro VAB vr1, vr2, vr3 610*706f2adaSHeiko Carstens VA \vr1, \vr2, \vr3, 0 611*706f2adaSHeiko Carstens .endm 612*706f2adaSHeiko Carstens .macro VAH vr1, vr2, vr3 613*706f2adaSHeiko Carstens VA \vr1, \vr2, \vr3, 1 614*706f2adaSHeiko Carstens .endm 615*706f2adaSHeiko Carstens .macro VAF vr1, vr2, vr3 616*706f2adaSHeiko Carstens VA \vr1, \vr2, \vr3, 2 617*706f2adaSHeiko Carstens .endm 618*706f2adaSHeiko Carstens .macro VAG vr1, vr2, vr3 619*706f2adaSHeiko Carstens VA \vr1, \vr2, \vr3, 3 620*706f2adaSHeiko Carstens .endm 621*706f2adaSHeiko Carstens .macro VAQ vr1, vr2, vr3 622*706f2adaSHeiko Carstens VA \vr1, \vr2, \vr3, 4 623*706f2adaSHeiko Carstens .endm 624*706f2adaSHeiko Carstens 625*706f2adaSHeiko Carstens /* VECTOR ELEMENT SHIFT RIGHT ARITHMETIC */ 626*706f2adaSHeiko Carstens .macro VESRAV vr1, vr2, vr3, m4 627*706f2adaSHeiko Carstens VX_NUM v1, \vr1 628*706f2adaSHeiko Carstens VX_NUM v2, \vr2 629*706f2adaSHeiko Carstens VX_NUM v3, \vr3 630*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) | (v2&15) 631*706f2adaSHeiko Carstens .word ((v3&15) << 12) 632*706f2adaSHeiko Carstens MRXBOPC \m4, 0x7A, v1, v2, v3 633*706f2adaSHeiko Carstens .endm 634*706f2adaSHeiko Carstens 635*706f2adaSHeiko Carstens .macro VESRAVB vr1, vr2, vr3 636*706f2adaSHeiko Carstens VESRAV \vr1, \vr2, \vr3, 0 637*706f2adaSHeiko Carstens .endm 638*706f2adaSHeiko Carstens .macro VESRAVH vr1, vr2, vr3 639*706f2adaSHeiko Carstens VESRAV \vr1, \vr2, \vr3, 1 640*706f2adaSHeiko Carstens .endm 641*706f2adaSHeiko Carstens .macro VESRAVF vr1, vr2, vr3 642*706f2adaSHeiko Carstens VESRAV \vr1, \vr2, \vr3, 2 643*706f2adaSHeiko Carstens .endm 644*706f2adaSHeiko Carstens .macro VESRAVG vr1, vr2, vr3 645*706f2adaSHeiko Carstens VESRAV \vr1, \vr2, \vr3, 3 646*706f2adaSHeiko Carstens .endm 647*706f2adaSHeiko Carstens 648*706f2adaSHeiko Carstens /* VECTOR ELEMENT ROTATE LEFT LOGICAL */ 649*706f2adaSHeiko Carstens .macro VERLL vr1, vr3, disp, base="%r0", m4 650*706f2adaSHeiko Carstens VX_NUM v1, \vr1 651*706f2adaSHeiko Carstens VX_NUM v3, \vr3 652*706f2adaSHeiko Carstens GR_NUM b2, \base 653*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) | (v3&15) 654*706f2adaSHeiko Carstens .word (b2 << 12) | (\disp) 655*706f2adaSHeiko Carstens MRXBOPC \m4, 0x33, v1, v3 656*706f2adaSHeiko Carstens .endm 657*706f2adaSHeiko Carstens .macro VERLLB vr1, vr3, disp, base="%r0" 658*706f2adaSHeiko Carstens VERLL \vr1, \vr3, \disp, \base, 0 659*706f2adaSHeiko Carstens .endm 660*706f2adaSHeiko Carstens .macro VERLLH vr1, vr3, disp, base="%r0" 661*706f2adaSHeiko Carstens VERLL \vr1, \vr3, \disp, \base, 1 662*706f2adaSHeiko Carstens .endm 663*706f2adaSHeiko Carstens .macro VERLLF vr1, vr3, disp, base="%r0" 664*706f2adaSHeiko Carstens VERLL \vr1, \vr3, \disp, \base, 2 665*706f2adaSHeiko Carstens .endm 666*706f2adaSHeiko Carstens .macro VERLLG vr1, vr3, disp, base="%r0" 667*706f2adaSHeiko Carstens VERLL \vr1, \vr3, \disp, \base, 3 668*706f2adaSHeiko Carstens .endm 669*706f2adaSHeiko Carstens 670*706f2adaSHeiko Carstens /* VECTOR SHIFT LEFT DOUBLE BY BYTE */ 671*706f2adaSHeiko Carstens .macro VSLDB vr1, vr2, vr3, imm4 672*706f2adaSHeiko Carstens VX_NUM v1, \vr1 673*706f2adaSHeiko Carstens VX_NUM v2, \vr2 674*706f2adaSHeiko Carstens VX_NUM v3, \vr3 675*706f2adaSHeiko Carstens .word 0xE700 | ((v1&15) << 4) | (v2&15) 676*706f2adaSHeiko Carstens .word ((v3&15) << 12) | (\imm4) 677*706f2adaSHeiko Carstens MRXBOPC 0, 0x77, v1, v2, v3 678*706f2adaSHeiko Carstens .endm 679*706f2adaSHeiko Carstens 680*706f2adaSHeiko Carstens #endif /* __ASSEMBLY__ */ 681*706f2adaSHeiko Carstens #endif /* __ASM_S390_VX_INSN_INTERNAL_H */ 682