1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
| /*
| * r6000_fpu.S: Save/restore floating point context for signal handlers.
| *
| * This file is subject to the terms and conditions of the GNU General Public
| * License. See the file "COPYING" in the main directory of this archive
| * for more details.
| *
| * Copyright (C) 1996 by Ralf Baechle
| *
| * Multi-arch abstraction and asm macros for easier reading:
| * Copyright (C) 1996 David S. Miller (davem@davemloft.net)
| */
| #include <asm/asm.h>
| #include <asm/fpregdef.h>
| #include <asm/mipsregs.h>
| #include <asm/asm-offsets.h>
| #include <asm/regdef.h>
|
| .set noreorder
| .set mips2
| .set push
| SET_HARDFLOAT
|
| /**
| * _save_fp_context() - save FP context from the FPU
| * @a0 - pointer to fpregs field of sigcontext
| * @a1 - pointer to fpc_csr field of sigcontext
| *
| * Save FP context, including the 32 FP data registers and the FP
| * control & status register, from the FPU to signal context.
| */
| LEAF(_save_fp_context)
| mfc0 t0,CP0_STATUS
| sll t0,t0,2
| bgez t0,1f
| nop
|
| cfc1 t1,fcr31
| /* Store the 16 double precision registers */
| sdc1 $f0,0(a0)
| sdc1 $f2,16(a0)
| sdc1 $f4,32(a0)
| sdc1 $f6,48(a0)
| sdc1 $f8,64(a0)
| sdc1 $f10,80(a0)
| sdc1 $f12,96(a0)
| sdc1 $f14,112(a0)
| sdc1 $f16,128(a0)
| sdc1 $f18,144(a0)
| sdc1 $f20,160(a0)
| sdc1 $f22,176(a0)
| sdc1 $f24,192(a0)
| sdc1 $f26,208(a0)
| sdc1 $f28,224(a0)
| sdc1 $f30,240(a0)
| jr ra
| sw t0,(a1)
| 1: jr ra
| nop
| END(_save_fp_context)
|
| /**
| * _restore_fp_context() - restore FP context to the FPU
| * @a0 - pointer to fpregs field of sigcontext
| * @a1 - pointer to fpc_csr field of sigcontext
| *
| * Restore FP context, including the 32 FP data registers and the FP
| * control & status register, from signal context to the FPU.
| */
| LEAF(_restore_fp_context)
| mfc0 t0,CP0_STATUS
| sll t0,t0,2
|
| bgez t0,1f
| lw t0,(a1)
| /* Restore the 16 double precision registers */
| ldc1 $f0,0(a0)
| ldc1 $f2,16(a0)
| ldc1 $f4,32(a0)
| ldc1 $f6,48(a0)
| ldc1 $f8,64(a0)
| ldc1 $f10,80(a0)
| ldc1 $f12,96(a0)
| ldc1 $f14,112(a0)
| ldc1 $f16,128(a0)
| ldc1 $f18,144(a0)
| ldc1 $f20,160(a0)
| ldc1 $f22,176(a0)
| ldc1 $f24,192(a0)
| ldc1 $f26,208(a0)
| ldc1 $f28,224(a0)
| ldc1 $f30,240(a0)
| jr ra
| ctc1 t0,fcr31
| 1: jr ra
| nop
| END(_restore_fp_context)
|
| .set pop /* SET_HARDFLOAT */
|
|