xref: /linux/tools/testing/selftests/arm64/fp/sme-inst.h (revision 0e9b70c1e3623fa110fb6be553e644524228ef60)
1 // SPDX-License-Identifier: GPL-2.0-only
2 // Copyright (C) 2021-2 ARM Limited.
3 // Original author: Mark Brown <broonie@kernel.org>
4 
5 #ifndef SME_INST_H
6 #define SME_INST_H
7 
8 /*
9  * RDSVL X\nx, #\imm
10  */
11 .macro rdsvl nx, imm
12 	.inst	0x4bf5800			\
13 		| (\imm << 5)			\
14 		| (\nx)
15 .endm
16 
17 .macro smstop
18 	msr	S0_3_C4_C6_3, xzr
19 .endm
20 
21 .macro smstart_za
22 	msr	S0_3_C4_C5_3, xzr
23 .endm
24 
25 .macro smstart_sm
26 	msr	S0_3_C4_C3_3, xzr
27 .endm
28 
29 /*
30  * LDR (vector to ZA array):
31  *	LDR ZA[\nw, #\offset], [X\nxbase, #\offset, MUL VL]
32  */
33 .macro _ldr_za nw, nxbase, offset=0
34 	.inst	0xe1000000			\
35 		| (((\nw) & 3) << 13)		\
36 		| ((\nxbase) << 5)		\
37 		| ((\offset) & 7)
38 .endm
39 
40 /*
41  * STR (vector from ZA array):
42  *	STR ZA[\nw, #\offset], [X\nxbase, #\offset, MUL VL]
43  */
44 .macro _str_za nw, nxbase, offset=0
45 	.inst	0xe1200000			\
46 		| (((\nw) & 3) << 13)		\
47 		| ((\nxbase) << 5)		\
48 		| ((\offset) & 7)
49 .endm
50 
51 /*
52  * LDR (ZT0)
53  *
54  *	LDR ZT0, nx
55  */
56 .macro _ldr_zt nx
57 	.inst	0xe11f8000			\
58 		| (((\nx) & 0x1f) << 5)
59 .endm
60 
61 /*
62  * STR (ZT0)
63  *
64  *	STR ZT0, nx
65  */
66 .macro _str_zt nx
67 	.inst	0xe13f8000			\
68 		| (((\nx) & 0x1f) << 5)
69 .endm
70 
71 #endif
72