Merge with /pub/scm/linux/kernel/git/torvalds/linux-2.6.git
[linux-2.6] / arch / sparc64 / kernel / una_asm.S
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 kernel_unaligned_trap_fault:
10         call    kernel_mna_trap_fault
11          nop
12         retl
13          nop
14         .size   kern_unaligned_trap_fault, .-kern_unaligned_trap_fault
15
16         .globl  __do_int_store
17 __do_int_store:
18         rd      %asi, %o4
19         wr      %o3, 0, %asi
20         ldx     [%o2], %g3
21         cmp     %o1, 2
22         be,pn   %icc, 2f
23          cmp    %o1, 4
24         be,pt   %icc, 1f
25          srlx   %g3, 24, %g2
26         srlx    %g3, 56, %g1
27         srlx    %g3, 48, %g7
28 4:      stba    %g1, [%o0] %asi
29         srlx    %g3, 40, %g1
30 5:      stba    %g7, [%o0 + 1] %asi
31         srlx    %g3, 32, %g7
32 6:      stba    %g1, [%o0 + 2] %asi
33 7:      stba    %g7, [%o0 + 3] %asi
34         srlx    %g3, 16, %g1
35 8:      stba    %g2, [%o0 + 4] %asi
36         srlx    %g3, 8, %g7
37 9:      stba    %g1, [%o0 + 5] %asi
38 10:     stba    %g7, [%o0 + 6] %asi
39         ba,pt   %xcc, 0f
40 11:      stba   %g3, [%o0 + 7] %asi
41 1:      srl     %g3, 16, %g7
42 12:     stba    %g2, [%o0] %asi
43         srl     %g3, 8, %g2
44 13:     stba    %g7, [%o0 + 1] %asi
45 14:     stba    %g2, [%o0 + 2] %asi
46         ba,pt   %xcc, 0f
47 15:      stba   %g3, [%o0 + 3] %asi
48 2:      srl     %g3, 8, %g2
49 16:     stba    %g2, [%o0] %asi
50 17:     stba    %g3, [%o0 + 1] %asi
51 0:
52         wr      %o4, 0x0, %asi
53         retl
54          nop
55         .size   __do_int_store, .-__do_int_store
56
57         .section        __ex_table
58         .word           4b, kernel_unaligned_trap_fault
59         .word           5b, kernel_unaligned_trap_fault
60         .word           6b, kernel_unaligned_trap_fault
61         .word           7b, kernel_unaligned_trap_fault
62         .word           8b, kernel_unaligned_trap_fault
63         .word           9b, kernel_unaligned_trap_fault
64         .word           10b, kernel_unaligned_trap_fault
65         .word           11b, kernel_unaligned_trap_fault
66         .word           12b, kernel_unaligned_trap_fault
67         .word           13b, kernel_unaligned_trap_fault
68         .word           14b, kernel_unaligned_trap_fault
69         .word           15b, kernel_unaligned_trap_fault
70         .word           16b, kernel_unaligned_trap_fault
71         .word           17b, kernel_unaligned_trap_fault
72         .previous
73
74         .globl  do_int_load
75 do_int_load:
76         rd      %asi, %o5
77         wr      %o4, 0, %asi
78         cmp     %o1, 8
79         bge,pn  %icc, 9f
80          cmp    %o1, 4
81         be,pt   %icc, 6f
82 4:       lduba  [%o2] %asi, %g2
83 5:      lduba   [%o2 + 1] %asi, %g3
84         sll     %g2, 8, %g2
85         brz,pt  %o3, 3f
86          add    %g2, %g3, %g2
87         sllx    %g2, 48, %g2
88         srax    %g2, 48, %g2
89 3:      ba,pt   %xcc, 0f
90          stx    %g2, [%o0]
91 6:      lduba   [%o2 + 1] %asi, %g3
92         sll     %g2, 24, %g2
93 7:      lduba   [%o2 + 2] %asi, %g7
94         sll     %g3, 16, %g3
95 8:      lduba   [%o2 + 3] %asi, %g1
96         sll     %g7, 8, %g7
97         or      %g2, %g3, %g2
98         or      %g7, %g1, %g7
99         or      %g2, %g7, %g2
100         brnz,a,pt %o3, 3f
101          sra    %g2, 0, %g2
102 3:      ba,pt   %xcc, 0f
103          stx    %g2, [%o0]
104 9:      lduba   [%o2] %asi, %g2
105 10:     lduba   [%o2 + 1] %asi, %g3
106         sllx    %g2, 56, %g2
107 11:     lduba   [%o2 + 2] %asi, %g7
108         sllx    %g3, 48, %g3
109 12:     lduba   [%o2 + 3] %asi, %g1
110         sllx    %g7, 40, %g7
111         sllx    %g1, 32, %g1
112         or      %g2, %g3, %g2
113         or      %g7, %g1, %g7
114 13:     lduba   [%o2 + 4] %asi, %g3
115         or      %g2, %g7, %g7
116 14:     lduba   [%o2 + 5] %asi, %g1
117         sllx    %g3, 24, %g3
118 15:     lduba   [%o2 + 6] %asi, %g2
119         sllx    %g1, 16, %g1
120         or      %g7, %g3, %g7
121 16:     lduba   [%o2 + 7] %asi, %g3
122         sllx    %g2, 8, %g2
123         or      %g7, %g1, %g7
124         or      %g2, %g3, %g2
125         or      %g7, %g2, %g7
126         cmp     %o1, 8
127         be,a,pt %icc, 0f
128          stx    %g7, [%o0]
129         srlx    %g7, 32, %g2
130         sra     %g7, 0, %g7
131         stx     %g2, [%o0]
132         stx     %g7, [%o0 + 8]
133 0:
134         wr      %o5, 0x0, %asi
135         retl
136          nop
137         .size   __do_int_load, .-__do_int_load
138
139         .section        __ex_table
140         .word           4b, kernel_unaligned_trap_fault
141         .word           5b, kernel_unaligned_trap_fault
142         .word           6b, kernel_unaligned_trap_fault
143         .word           7b, kernel_unaligned_trap_fault
144         .word           8b, kernel_unaligned_trap_fault
145         .word           9b, kernel_unaligned_trap_fault
146         .word           10b, kernel_unaligned_trap_fault
147         .word           11b, kernel_unaligned_trap_fault
148         .word           12b, kernel_unaligned_trap_fault
149         .word           13b, kernel_unaligned_trap_fault
150         .word           14b, kernel_unaligned_trap_fault
151         .word           15b, kernel_unaligned_trap_fault
152         .word           16b, kernel_unaligned_trap_fault
153         .previous