comparison tango/lib/common/tango/core/ThreadASM.S @ 132:1700239cab2e trunk

[svn r136] MAJOR UNSTABLE UPDATE!!! Initial commit after moving to Tango instead of Phobos. Lots of bugfixes... This build is not suitable for most things.
author lindquist
date Fri, 11 Jan 2008 17:57:40 +0100
parents
children
comparison
equal deleted inserted replaced
131:5825d48b27d1 132:1700239cab2e
1 /**
2 * Tango Fiber switching assembler code.
3 *
4 * Author: Mikola Lysenko
5 */
6
7 /************************************************************************************
8 * POWER PC ASM BITS
9 ************************************************************************************/
10 #if defined( __ppc__ ) || defined( __PPC__ ) || defined( __powerpc__ )
11
12
13 /**
14 * Performs a context switch.
15 *
16 * r3 - old context pointer
17 * r4 - new context pointer
18 *
19 */
20 .text
21 .align 2
22 .globl _fiber_switchContext
23 _fiber_switchContext:
24
25 /* Save linkage area */
26 mflr r0
27 mfcr r5
28 stw r0, 8(r1)
29 stw r5, 4(r1)
30
31 /* Save GPRs */
32 stw r11, (-1 * 4)(r1)
33 stw r13, (-2 * 4)(r1)
34 stw r14, (-3 * 4)(r1)
35 stw r15, (-4 * 4)(r1)
36 stw r16, (-5 * 4)(r1)
37 stw r17, (-6 * 4)(r1)
38 stw r18, (-7 * 4)(r1)
39 stw r19, (-8 * 4)(r1)
40 stw r20, (-9 * 4)(r1)
41 stw r21, (-10 * 4)(r1)
42 stw r22, (-11 * 4)(r1)
43 stw r23, (-12 * 4)(r1)
44 stw r24, (-13 * 4)(r1)
45 stw r25, (-14 * 4)(r1)
46 stw r26, (-15 * 4)(r1)
47 stw r27, (-16 * 4)(r1)
48 stw r28, (-17 * 4)(r1)
49 stw r29, (-18 * 4)(r1)
50 stw r30, (-19 * 4)(r1)
51 stwu r31, (-20 * 4)(r1)
52
53 /* We update the stack pointer here, since we do not want the GC to
54 scan the floating point registers. */
55
56 /* Save FPRs */
57 stfd f14, (-1 * 8)(r1)
58 stfd f15, (-2 * 8)(r1)
59 stfd f16, (-3 * 8)(r1)
60 stfd f17, (-4 * 8)(r1)
61 stfd f18, (-5 * 8)(r1)
62 stfd f19, (-6 * 8)(r1)
63 stfd f20, (-7 * 8)(r1)
64 stfd f21, (-8 * 8)(r1)
65 stfd f22, (-9 * 8)(r1)
66 stfd f23, (-10 * 8)(r1)
67 stfd f24, (-11 * 8)(r1)
68 stfd f25, (-12 * 8)(r1)
69 stfd f26, (-13 * 8)(r1)
70 stfd f27, (-14 * 8)(r1)
71 stfd f28, (-15 * 8)(r1)
72 stfd f29, (-16 * 8)(r1)
73 stfd f30, (-17 * 8)(r1)
74 stfd f31, (-18 * 8)(r1)
75
76 /* Update the old stack pointer */
77 stw r1, 0(r3)
78
79 /* Set new stack pointer */
80 addi r1, r4, 20 * 4
81
82 /* Restore linkage area */
83 lwz r0, 8(r1)
84 lwz r5, 4(r1)
85
86 /* Restore GPRs */
87 lwz r11, (-1 * 4)(r1)
88 lwz r13, (-2 * 4)(r1)
89 lwz r14, (-3 * 4)(r1)
90 lwz r15, (-4 * 4)(r1)
91 lwz r16, (-5 * 4)(r1)
92 lwz r17, (-6 * 4)(r1)
93 lwz r18, (-7 * 4)(r1)
94 lwz r19, (-8 * 4)(r1)
95 lwz r20, (-9 * 4)(r1)
96 lwz r21, (-10 * 4)(r1)
97 lwz r22, (-11 * 4)(r1)
98 lwz r23, (-12 * 4)(r1)
99 lwz r24, (-13 * 4)(r1)
100 lwz r25, (-14 * 4)(r1)
101 lwz r26, (-15 * 4)(r1)
102 lwz r27, (-16 * 4)(r1)
103 lwz r28, (-17 * 4)(r1)
104 lwz r29, (-18 * 4)(r1)
105 lwz r30, (-19 * 4)(r1)
106 lwz r31, (-20 * 4)(r1)
107
108
109 /* Restore FPRs */
110 lfd f14, (-1 * 8)(r4)
111 lfd f15, (-2 * 8)(r4)
112 lfd f16, (-3 * 8)(r4)
113 lfd f17, (-4 * 8)(r4)
114 lfd f18, (-5 * 8)(r4)
115 lfd f19, (-6 * 8)(r4)
116 lfd f20, (-7 * 8)(r4)
117 lfd f21, (-8 * 8)(r4)
118 lfd f22, (-9 * 8)(r4)
119 lfd f23, (-10 * 8)(r4)
120 lfd f24, (-11 * 8)(r4)
121 lfd f25, (-12 * 8)(r4)
122 lfd f26, (-13 * 8)(r4)
123 lfd f27, (-14 * 8)(r4)
124 lfd f28, (-15 * 8)(r4)
125 lfd f29, (-16 * 8)(r4)
126 lfd f30, (-17 * 8)(r4)
127 lfd f31, (-18 * 8)(r4)
128
129 /* Set condition and link register */
130 mtcr r5
131 mtlr r0
132
133 /* Return and switch context */
134 blr
135
136 #endif