comparison druntime/src/common/core/threadasm.S @ 1458:e0b2d67cfe7c

Added druntime (this should be removed once it works).
author Robert Clipsham <robert@octarineparrot.com>
date Tue, 02 Jun 2009 17:43:06 +0100
parents
children
comparison
equal deleted inserted replaced
1456:7b218ec1044f 1458:e0b2d67cfe7c
1 /**
2 * Support code for mutithreading.
3 *
4 * Copyright: Copyright Mikola Lysenko 2005 - 2009.
5 * License: <a href="http://www.boost.org/LICENSE_1_0.txt>Boost License 1.0</a>.
6 * Authors: Mikola Lysenko
7 *
8 * Copyright Mikola Lysenko 2005 - 2009.
9 * Distributed under the Boost Software License, Version 1.0.
10 * (See accompanying file LICENSE_1_0.txt or copy at
11 * http://www.boost.org/LICENSE_1_0.txt)
12 */
13
14 /************************************************************************************
15 * POWER PC ASM BITS
16 ************************************************************************************/
17 #if defined( __ppc__ ) || defined( __PPC__ ) || defined( __powerpc__ )
18
19
20 /**
21 * Performs a context switch.
22 *
23 * r3 - old context pointer
24 * r4 - new context pointer
25 *
26 */
27 .text
28 .align 2
29 .globl _fiber_switchContext
30 _fiber_switchContext:
31
32 /* Save linkage area */
33 mflr r0
34 mfcr r5
35 stw r0, 8(r1)
36 stw r5, 4(r1)
37
38 /* Save GPRs */
39 stw r11, (-1 * 4)(r1)
40 stw r13, (-2 * 4)(r1)
41 stw r14, (-3 * 4)(r1)
42 stw r15, (-4 * 4)(r1)
43 stw r16, (-5 * 4)(r1)
44 stw r17, (-6 * 4)(r1)
45 stw r18, (-7 * 4)(r1)
46 stw r19, (-8 * 4)(r1)
47 stw r20, (-9 * 4)(r1)
48 stw r21, (-10 * 4)(r1)
49 stw r22, (-11 * 4)(r1)
50 stw r23, (-12 * 4)(r1)
51 stw r24, (-13 * 4)(r1)
52 stw r25, (-14 * 4)(r1)
53 stw r26, (-15 * 4)(r1)
54 stw r27, (-16 * 4)(r1)
55 stw r28, (-17 * 4)(r1)
56 stw r29, (-18 * 4)(r1)
57 stw r30, (-19 * 4)(r1)
58 stwu r31, (-20 * 4)(r1)
59
60 /* We update the stack pointer here, since we do not want the GC to
61 scan the floating point registers. */
62
63 /* Save FPRs */
64 stfd f14, (-1 * 8)(r1)
65 stfd f15, (-2 * 8)(r1)
66 stfd f16, (-3 * 8)(r1)
67 stfd f17, (-4 * 8)(r1)
68 stfd f18, (-5 * 8)(r1)
69 stfd f19, (-6 * 8)(r1)
70 stfd f20, (-7 * 8)(r1)
71 stfd f21, (-8 * 8)(r1)
72 stfd f22, (-9 * 8)(r1)
73 stfd f23, (-10 * 8)(r1)
74 stfd f24, (-11 * 8)(r1)
75 stfd f25, (-12 * 8)(r1)
76 stfd f26, (-13 * 8)(r1)
77 stfd f27, (-14 * 8)(r1)
78 stfd f28, (-15 * 8)(r1)
79 stfd f29, (-16 * 8)(r1)
80 stfd f30, (-17 * 8)(r1)
81 stfd f31, (-18 * 8)(r1)
82
83 /* Update the old stack pointer */
84 stw r1, 0(r3)
85
86 /* Set new stack pointer */
87 addi r1, r4, 20 * 4
88
89 /* Restore linkage area */
90 lwz r0, 8(r1)
91 lwz r5, 4(r1)
92
93 /* Restore GPRs */
94 lwz r11, (-1 * 4)(r1)
95 lwz r13, (-2 * 4)(r1)
96 lwz r14, (-3 * 4)(r1)
97 lwz r15, (-4 * 4)(r1)
98 lwz r16, (-5 * 4)(r1)
99 lwz r17, (-6 * 4)(r1)
100 lwz r18, (-7 * 4)(r1)
101 lwz r19, (-8 * 4)(r1)
102 lwz r20, (-9 * 4)(r1)
103 lwz r21, (-10 * 4)(r1)
104 lwz r22, (-11 * 4)(r1)
105 lwz r23, (-12 * 4)(r1)
106 lwz r24, (-13 * 4)(r1)
107 lwz r25, (-14 * 4)(r1)
108 lwz r26, (-15 * 4)(r1)
109 lwz r27, (-16 * 4)(r1)
110 lwz r28, (-17 * 4)(r1)
111 lwz r29, (-18 * 4)(r1)
112 lwz r30, (-19 * 4)(r1)
113 lwz r31, (-20 * 4)(r1)
114
115
116 /* Restore FPRs */
117 lfd f14, (-1 * 8)(r4)
118 lfd f15, (-2 * 8)(r4)
119 lfd f16, (-3 * 8)(r4)
120 lfd f17, (-4 * 8)(r4)
121 lfd f18, (-5 * 8)(r4)
122 lfd f19, (-6 * 8)(r4)
123 lfd f20, (-7 * 8)(r4)
124 lfd f21, (-8 * 8)(r4)
125 lfd f22, (-9 * 8)(r4)
126 lfd f23, (-10 * 8)(r4)
127 lfd f24, (-11 * 8)(r4)
128 lfd f25, (-12 * 8)(r4)
129 lfd f26, (-13 * 8)(r4)
130 lfd f27, (-14 * 8)(r4)
131 lfd f28, (-15 * 8)(r4)
132 lfd f29, (-16 * 8)(r4)
133 lfd f30, (-17 * 8)(r4)
134 lfd f31, (-18 * 8)(r4)
135
136 /* Set condition and link register */
137 mtcr r5
138 mtlr r0
139
140 /* Return and switch context */
141 blr
142
143 #endif