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