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