* better
[mascara-docs.git] / i386 / linux-2.3.21 / arch / sparc64 / lib / VISsave.S
blob2254ba5c5d08b5d7d96bea330eb8b5bcefa75b50
1 /* $Id: VISsave.S,v 1.4 1999/07/30 09:35:37 davem Exp $
2  * VISsave.S: Code for saving FPU register state for
3  *            VIS routines. One should not call this directly,
4  *            but use macros provided in <asm/visasm.h>.
5  *
6  * Copyright (C) 1998 Jakub Jelinek (jj@ultra.linux.cz)
7  */
9 #include <asm/asi.h>
10 #include <asm/page.h>
11 #include <asm/ptrace.h>
12 #include <asm/visasm.h>
14         .text
15         .globl          VISenter, VISenterhalf
17         /* On entry: %o5=current FPRS value, %g7 is callers address */
18         /* May clobber %o5, %g1, %g2, %g3, %g7, %icc, %xcc */
20         .align          32
21 VISenter:
22         ldub            [%g6 + AOFF_task_thread + AOFF_thread_fpdepth], %g1
23         brnz,a,pn       %g1, 1f
24          cmp            %g1, 1
25         stb             %g0, [%g6 + AOFF_task_thread + AOFF_thread_fpsaved]
26         stx             %fsr, [%g6 + AOFF_task_thread + AOFF_thread_xfsr]
27 9:      jmpl            %g7 + %g0, %g0
28          nop
29 1:      bne,pn          %icc, 2f
31          srl            %g1, 1, %g1
32 vis1:   ldub            [%g6 + AOFF_task_thread + AOFF_thread_fpsaved], %g3
33         stx             %fsr, [%g6 + AOFF_task_thread + AOFF_thread_xfsr]
34         or              %g3, %o5, %g3
35         stb             %g3, [%g6 + AOFF_task_thread + AOFF_thread_fpsaved]
36         rd              %gsr, %g3
37         clr             %g1
38         ba,pt           %xcc, 3f
40          stb            %g3, [%g6 + AOFF_task_thread + AOFF_thread_gsr]
41 2:      add             %g6, %g1, %g3
42         cmp             %o5, FPRS_DU
43         be,pn           %icc, 6f
44          sll            %g1, 3, %g1
45         stb             %o5, [%g3 + AOFF_task_thread + AOFF_thread_fpsaved]
46         rd              %gsr, %g2
47         stb             %g2, [%g3 + AOFF_task_thread + AOFF_thread_gsr]
49         add             %g6, %g1, %g2
50         stx             %fsr, [%g2 + AOFF_task_thread + AOFF_thread_xfsr]
51         sll             %g1, 5, %g1
52 3:      andcc           %o5, FPRS_DL|FPRS_DU, %g0
53         be,pn           %icc, 9b
54          add            %g6, AOFF_task_fpregs, %g2
55         andcc           %o5, FPRS_DL, %g0
56         membar          #StoreStore | #LoadStore
58         be,pn           %icc, 4f
59          add            %g6, AOFF_task_fpregs+0x40, %g3
60         stda            %f0, [%g2 + %g1] ASI_BLK_P
61         stda            %f16, [%g3 + %g1] ASI_BLK_P
62         andcc           %o5, FPRS_DU, %g0
63         be,pn           %icc, 5f
64 4:       add            %g1, 128, %g1
65         stda            %f32, [%g2 + %g1] ASI_BLK_P
67         stda            %f48, [%g3 + %g1] ASI_BLK_P
68 5:      membar          #Sync
69         jmpl            %g7 + %g0, %g0
70          nop
72 6:      ldub            [%g3 + AOFF_task_thread + AOFF_thread_fpsaved], %o5
73         or              %o5, FPRS_DU, %o5
74         add             %g6, AOFF_task_fpregs+0x80, %g2
75         stb             %o5, [%g3 + AOFF_task_thread + AOFF_thread_fpsaved]
77         sll             %g1, 5, %g1
78         add             %g6, AOFF_task_fpregs+0xc0, %g3
79         wr              %g0, FPRS_FEF, %fprs
80         membar          #StoreStore | #LoadStore
81         stda            %f32, [%g2 + %g1] ASI_BLK_P
82         stda            %f48, [%g3 + %g1] ASI_BLK_P
83         membar          #Sync
84         jmpl            %g7 + %g0, %g0
86          nop
88         .align          32
89 VISenterhalf:
90         ldub            [%g6 + AOFF_task_thread + AOFF_thread_fpdepth], %g1
91         brnz,a,pn       %g1, 1f
92          cmp            %g1, 1
93         stb             %g0, [%g6 + AOFF_task_thread + AOFF_thread_fpsaved]
94         stx             %fsr, [%g6 + AOFF_task_thread + AOFF_thread_xfsr]
95         clr             %o5
96         jmpl            %g7 + %g0, %g0
97          wr             %g0, FPRS_FEF, %fprs
99 1:      bne,pn          %icc, 2f
100          srl            %g1, 1, %g1
101         ba,pt           %xcc, vis1
102          sub            %g7, 8, %g7
103 2:      addcc           %g6, %g1, %g3
104         sll             %g1, 3, %g1
105         andn            %o5, FPRS_DU, %g2
106         stb             %g2, [%g3 + AOFF_task_thread + AOFF_thread_fpsaved]
108         rd              %gsr, %g2
109         stb             %g2, [%g3 + AOFF_task_thread + AOFF_thread_gsr]
110         add             %g6, %g1, %g2
111         stx             %fsr, [%g2 + AOFF_task_thread + AOFF_thread_xfsr]
112         sll             %g1, 5, %g1
113 3:      andcc           %o5, FPRS_DL, %g0
114         be,pn           %icc, 4f
115          add            %g6, AOFF_task_fpregs, %g2
117         membar          #StoreStore | #LoadStore
118         add             %g6, AOFF_task_fpregs+0x40, %g3
119         stda            %f0, [%g2 + %g1] ASI_BLK_P
120         stda            %f16, [%g3 + %g1] ASI_BLK_P
121         membar          #Sync
122 4:      and             %o5, FPRS_DU, %o5
123         jmpl            %g7 + %g0, %g0
124          wr             %o5, FPRS_FEF, %fprs