xref: /linux/arch/sparc/kernel/una_asm_64.S (revision ca55b2fef3a9373fcfc30f82fd26bc7fccbda732)
1/* una_asm.S: Kernel unaligned trap assembler helpers.
2 *
3 * Copyright (C) 1996,2005 David S. Miller (davem@davemloft.net)
4 * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
5 */
6
7	.text
8
9	.globl	__do_int_store
10__do_int_store:
11	rd	%asi, %o4
12	wr	%o3, 0, %asi
13	mov	%o2, %g3
14	cmp	%o1, 2
15	be,pn	%icc, 2f
16	 cmp	%o1, 4
17	be,pt	%icc, 1f
18	 srlx	%g3, 24, %g2
19	srlx	%g3, 56, %g1
20	srlx	%g3, 48, %g7
214:	stba	%g1, [%o0] %asi
22	srlx	%g3, 40, %g1
235:	stba	%g7, [%o0 + 1] %asi
24	srlx	%g3, 32, %g7
256:	stba	%g1, [%o0 + 2] %asi
267:	stba	%g7, [%o0 + 3] %asi
27	srlx	%g3, 16, %g1
288:	stba	%g2, [%o0 + 4] %asi
29	srlx	%g3, 8, %g7
309:	stba	%g1, [%o0 + 5] %asi
3110:	stba	%g7, [%o0 + 6] %asi
32	ba,pt	%xcc, 0f
3311:	 stba	%g3, [%o0 + 7] %asi
341:	srl	%g3, 16, %g7
3512:	stba	%g2, [%o0] %asi
36	srl	%g3, 8, %g2
3713:	stba	%g7, [%o0 + 1] %asi
3814:	stba	%g2, [%o0 + 2] %asi
39	ba,pt	%xcc, 0f
4015:	 stba	%g3, [%o0 + 3] %asi
412:	srl	%g3, 8, %g2
4216:	stba	%g2, [%o0] %asi
4317:	stba	%g3, [%o0 + 1] %asi
440:
45	wr	%o4, 0x0, %asi
46	retl
47	 mov	0, %o0
48	.size	__do_int_store, .-__do_int_store
49
50	.section	__ex_table,"a"
51	.word		4b, __retl_efault
52	.word		5b, __retl_efault
53	.word		6b, __retl_efault
54	.word		7b, __retl_efault
55	.word		8b, __retl_efault
56	.word		9b, __retl_efault
57	.word		10b, __retl_efault
58	.word		11b, __retl_efault
59	.word		12b, __retl_efault
60	.word		13b, __retl_efault
61	.word		14b, __retl_efault
62	.word		15b, __retl_efault
63	.word		16b, __retl_efault
64	.word		17b, __retl_efault
65	.previous
66
67	.globl	do_int_load
68do_int_load:
69	rd	%asi, %o5
70	wr	%o4, 0, %asi
71	cmp	%o1, 8
72	bge,pn	%icc, 9f
73	 cmp	%o1, 4
74	be,pt	%icc, 6f
754:	 lduba	[%o2] %asi, %g2
765:	lduba	[%o2 + 1] %asi, %g3
77	sll	%g2, 8, %g2
78	brz,pt	%o3, 3f
79	 add	%g2, %g3, %g2
80	sllx	%g2, 48, %g2
81	srax	%g2, 48, %g2
823:	ba,pt	%xcc, 0f
83	 stx	%g2, [%o0]
846:	lduba	[%o2 + 1] %asi, %g3
85	sll	%g2, 24, %g2
867:	lduba	[%o2 + 2] %asi, %g7
87	sll	%g3, 16, %g3
888:	lduba	[%o2 + 3] %asi, %g1
89	sll	%g7, 8, %g7
90	or	%g2, %g3, %g2
91	or	%g7, %g1, %g7
92	or	%g2, %g7, %g2
93	brnz,a,pt %o3, 3f
94	 sra	%g2, 0, %g2
953:	ba,pt	%xcc, 0f
96	 stx	%g2, [%o0]
979:	lduba	[%o2] %asi, %g2
9810:	lduba	[%o2 + 1] %asi, %g3
99	sllx	%g2, 56, %g2
10011:	lduba	[%o2 + 2] %asi, %g7
101	sllx	%g3, 48, %g3
10212:	lduba	[%o2 + 3] %asi, %g1
103	sllx	%g7, 40, %g7
104	sllx	%g1, 32, %g1
105	or	%g2, %g3, %g2
106	or	%g7, %g1, %g7
10713:	lduba	[%o2 + 4] %asi, %g3
108	or	%g2, %g7, %g7
10914:	lduba	[%o2 + 5] %asi, %g1
110	sllx	%g3, 24, %g3
11115:	lduba	[%o2 + 6] %asi, %g2
112	sllx	%g1, 16, %g1
113	or	%g7, %g3, %g7
11416:	lduba	[%o2 + 7] %asi, %g3
115	sllx	%g2, 8, %g2
116	or	%g7, %g1, %g7
117	or	%g2, %g3, %g2
118	or	%g7, %g2, %g7
119	cmp	%o1, 8
120	be,a,pt %icc, 0f
121	 stx	%g7, [%o0]
122	srlx	%g7, 32, %g2
123	sra	%g7, 0, %g7
124	stx	%g2, [%o0]
125	stx	%g7, [%o0 + 8]
1260:
127	wr	%o5, 0x0, %asi
128	retl
129	 mov	0, %o0
130	.size	do_int_load, .-do_int_load
131
132	.section	__ex_table,"a"
133	.word		4b, __retl_efault
134	.word		5b, __retl_efault
135	.word		6b, __retl_efault
136	.word		7b, __retl_efault
137	.word		8b, __retl_efault
138	.word		9b, __retl_efault
139	.word		10b, __retl_efault
140	.word		11b, __retl_efault
141	.word		12b, __retl_efault
142	.word		13b, __retl_efault
143	.word		14b, __retl_efault
144	.word		15b, __retl_efault
145	.word		16b, __retl_efault
146	.previous
147