1/* SPDX-License-Identifier: GPL-2.0 */
2/* una_asm.S: Kernel unaligned trap assembler helpers.
3 *
4 * Copyright (C) 1996,2005 David S. Miller (davem@davemloft.net)
5 * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
6 */
7
8	.text
9
10	.globl	__do_int_store
11__do_int_store:
12	rd	%asi, %o4
13	wr	%o3, 0, %asi
14	mov	%o2, %g3
15	cmp	%o1, 2
16	be,pn	%icc, 2f
17	 cmp	%o1, 4
18	be,pt	%icc, 1f
19	 srlx	%g3, 24, %g2
20	srlx	%g3, 56, %g1
21	srlx	%g3, 48, %g7
224:	stba	%g1, [%o0] %asi
23	srlx	%g3, 40, %g1
245:	stba	%g7, [%o0 + 1] %asi
25	srlx	%g3, 32, %g7
266:	stba	%g1, [%o0 + 2] %asi
277:	stba	%g7, [%o0 + 3] %asi
28	srlx	%g3, 16, %g1
298:	stba	%g2, [%o0 + 4] %asi
30	srlx	%g3, 8, %g7
319:	stba	%g1, [%o0 + 5] %asi
3210:	stba	%g7, [%o0 + 6] %asi
33	ba,pt	%xcc, 0f
3411:	 stba	%g3, [%o0 + 7] %asi
351:	srl	%g3, 16, %g7
3612:	stba	%g2, [%o0] %asi
37	srl	%g3, 8, %g2
3813:	stba	%g7, [%o0 + 1] %asi
3914:	stba	%g2, [%o0 + 2] %asi
40	ba,pt	%xcc, 0f
4115:	 stba	%g3, [%o0 + 3] %asi
422:	srl	%g3, 8, %g2
4316:	stba	%g2, [%o0] %asi
4417:	stba	%g3, [%o0 + 1] %asi
450:
46	wr	%o4, 0x0, %asi
47	retl
48	 mov	0, %o0
49	.size	__do_int_store, .-__do_int_store
50
51	.section	__ex_table,"a"
52	.word		4b, __retl_efault
53	.word		5b, __retl_efault
54	.word		6b, __retl_efault
55	.word		7b, __retl_efault
56	.word		8b, __retl_efault
57	.word		9b, __retl_efault
58	.word		10b, __retl_efault
59	.word		11b, __retl_efault
60	.word		12b, __retl_efault
61	.word		13b, __retl_efault
62	.word		14b, __retl_efault
63	.word		15b, __retl_efault
64	.word		16b, __retl_efault
65	.word		17b, __retl_efault
66	.previous
67
68	.globl	do_int_load
69do_int_load:
70	rd	%asi, %o5
71	wr	%o4, 0, %asi
72	cmp	%o1, 8
73	bge,pn	%icc, 9f
74	 cmp	%o1, 4
75	be,pt	%icc, 6f
764:	 lduba	[%o2] %asi, %g2
775:	lduba	[%o2 + 1] %asi, %g3
78	sll	%g2, 8, %g2
79	brz,pt	%o3, 3f
80	 add	%g2, %g3, %g2
81	sllx	%g2, 48, %g2
82	srax	%g2, 48, %g2
833:	ba,pt	%xcc, 0f
84	 stx	%g2, [%o0]
856:	lduba	[%o2 + 1] %asi, %g3
86	sll	%g2, 24, %g2
877:	lduba	[%o2 + 2] %asi, %g7
88	sll	%g3, 16, %g3
898:	lduba	[%o2 + 3] %asi, %g1
90	sll	%g7, 8, %g7
91	or	%g2, %g3, %g2
92	or	%g7, %g1, %g7
93	or	%g2, %g7, %g2
94	brnz,a,pt %o3, 3f
95	 sra	%g2, 0, %g2
963:	ba,pt	%xcc, 0f
97	 stx	%g2, [%o0]
989:	lduba	[%o2] %asi, %g2
9910:	lduba	[%o2 + 1] %asi, %g3
100	sllx	%g2, 56, %g2
10111:	lduba	[%o2 + 2] %asi, %g7
102	sllx	%g3, 48, %g3
10312:	lduba	[%o2 + 3] %asi, %g1
104	sllx	%g7, 40, %g7
105	sllx	%g1, 32, %g1
106	or	%g2, %g3, %g2
107	or	%g7, %g1, %g7
10813:	lduba	[%o2 + 4] %asi, %g3
109	or	%g2, %g7, %g7
11014:	lduba	[%o2 + 5] %asi, %g1
111	sllx	%g3, 24, %g3
11215:	lduba	[%o2 + 6] %asi, %g2
113	sllx	%g1, 16, %g1
114	or	%g7, %g3, %g7
11516:	lduba	[%o2 + 7] %asi, %g3
116	sllx	%g2, 8, %g2
117	or	%g7, %g1, %g7
118	or	%g2, %g3, %g2
119	or	%g7, %g2, %g7
120	cmp	%o1, 8
121	be,a,pt %icc, 0f
122	 stx	%g7, [%o0]
123	srlx	%g7, 32, %g2
124	sra	%g7, 0, %g7
125	stx	%g2, [%o0]
126	stx	%g7, [%o0 + 8]
1270:
128	wr	%o5, 0x0, %asi
129	retl
130	 mov	0, %o0
131	.size	do_int_load, .-do_int_load
132
133	.section	__ex_table,"a"
134	.word		4b, __retl_efault
135	.word		5b, __retl_efault
136	.word		6b, __retl_efault
137	.word		7b, __retl_efault
138	.word		8b, __retl_efault
139	.word		9b, __retl_efault
140	.word		10b, __retl_efault
141	.word		11b, __retl_efault
142	.word		12b, __retl_efault
143	.word		13b, __retl_efault
144	.word		14b, __retl_efault
145	.word		15b, __retl_efault
146	.word		16b, __retl_efault
147	.previous
148