Linux-libre 5.4.48-gnu
[librecmc/linux-libre.git] / arch / sparc / kernel / una_asm_64.S
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
22 4:      stba    %g1, [%o0] %asi
23         srlx    %g3, 40, %g1
24 5:      stba    %g7, [%o0 + 1] %asi
25         srlx    %g3, 32, %g7
26 6:      stba    %g1, [%o0 + 2] %asi
27 7:      stba    %g7, [%o0 + 3] %asi
28         srlx    %g3, 16, %g1
29 8:      stba    %g2, [%o0 + 4] %asi
30         srlx    %g3, 8, %g7
31 9:      stba    %g1, [%o0 + 5] %asi
32 10:     stba    %g7, [%o0 + 6] %asi
33         ba,pt   %xcc, 0f
34 11:      stba   %g3, [%o0 + 7] %asi
35 1:      srl     %g3, 16, %g7
36 12:     stba    %g2, [%o0] %asi
37         srl     %g3, 8, %g2
38 13:     stba    %g7, [%o0 + 1] %asi
39 14:     stba    %g2, [%o0 + 2] %asi
40         ba,pt   %xcc, 0f
41 15:      stba   %g3, [%o0 + 3] %asi
42 2:      srl     %g3, 8, %g2
43 16:     stba    %g2, [%o0] %asi
44 17:     stba    %g3, [%o0 + 1] %asi
45 0:
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
69 do_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
76 4:       lduba  [%o2] %asi, %g2
77 5:      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
83 3:      ba,pt   %xcc, 0f
84          stx    %g2, [%o0]
85 6:      lduba   [%o2 + 1] %asi, %g3
86         sll     %g2, 24, %g2
87 7:      lduba   [%o2 + 2] %asi, %g7
88         sll     %g3, 16, %g3
89 8:      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
96 3:      ba,pt   %xcc, 0f
97          stx    %g2, [%o0]
98 9:      lduba   [%o2] %asi, %g2
99 10:     lduba   [%o2 + 1] %asi, %g3
100         sllx    %g2, 56, %g2
101 11:     lduba   [%o2 + 2] %asi, %g7
102         sllx    %g3, 48, %g3
103 12:     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
108 13:     lduba   [%o2 + 4] %asi, %g3
109         or      %g2, %g7, %g7
110 14:     lduba   [%o2 + 5] %asi, %g1
111         sllx    %g3, 24, %g3
112 15:     lduba   [%o2 + 6] %asi, %g2
113         sllx    %g1, 16, %g1
114         or      %g7, %g3, %g7
115 16:     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]
127 0:
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