Mercurial > projects > ldc
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 |