summaryrefslogtreecommitdiff
path: root/arch/s390/include/asm/insn-common-asm.h
blob: fd9b3cacb7c542099a2899bb06e8c1c82eab1e18 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Assembler helper macros to generate .byte/.word code for instructions
 * that are unknown to older binutils versions.
 */

#ifndef __ASM_S390_INSN_COMMON_ASM_H
#define __ASM_S390_INSN_COMMON_ASM_H

#ifdef __ASSEMBLER__

/*
 * GR_NUM - Retrieve general-purpose register number
 *
 * @opd:	Operand to store register number
 * @gr:		String designation register in the format "%rN"
 */
.macro	GR_NUM	opd gr
	\opd = 255
	.irp rs,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
	.ifc \gr,%r\rs
		\opd = \rs
	.endif
	.endr
	.if \opd == 255
		\opd = \gr
	.endif
.endm

/*
 * VX_NUM - Retrieve vector register number
 *
 * @opd:	Operand to store register number
 * @vxr:	String designation register in the format "%vN"
 *
 * The vector register number is used for as input number to the
 * instruction and, as well as, to compute the RXB field of the
 * instruction.
 */
.macro	VX_NUM	opd vxr
	\opd = 255
	.irp vs,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
	.ifc \vxr,%v\vs
		\opd = \vs
	.endif
	.endr
	.if \opd == 255
		\opd = \vxr
	.endif
.endm

#endif	/* __ASSEMBLER__ */
#endif	/* __ASM_S390_INSN_COMMON_ASM_H */