Mercurial > projects > ldc
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/druntime/src/common/core/threadasm.S Tue Jun 02 17:43:06 2009 +0100 @@ -0,0 +1,143 @@ +/** + * Support code for mutithreading. + * + * Copyright: Copyright Mikola Lysenko 2005 - 2009. + * License: <a href="http://www.boost.org/LICENSE_1_0.txt>Boost License 1.0</a>. + * Authors: Mikola Lysenko + * + * Copyright Mikola Lysenko 2005 - 2009. + * Distributed under the Boost Software License, Version 1.0. + * (See accompanying file LICENSE_1_0.txt or copy at + * http://www.boost.org/LICENSE_1_0.txt) + */ + +/************************************************************************************ + * POWER PC ASM BITS + ************************************************************************************/ +#if defined( __ppc__ ) || defined( __PPC__ ) || defined( __powerpc__ ) + + +/** + * Performs a context switch. + * + * r3 - old context pointer + * r4 - new context pointer + * + */ +.text +.align 2 +.globl _fiber_switchContext +_fiber_switchContext: + + /* Save linkage area */ + mflr r0 + mfcr r5 + stw r0, 8(r1) + stw r5, 4(r1) + + /* Save GPRs */ + stw r11, (-1 * 4)(r1) + stw r13, (-2 * 4)(r1) + stw r14, (-3 * 4)(r1) + stw r15, (-4 * 4)(r1) + stw r16, (-5 * 4)(r1) + stw r17, (-6 * 4)(r1) + stw r18, (-7 * 4)(r1) + stw r19, (-8 * 4)(r1) + stw r20, (-9 * 4)(r1) + stw r21, (-10 * 4)(r1) + stw r22, (-11 * 4)(r1) + stw r23, (-12 * 4)(r1) + stw r24, (-13 * 4)(r1) + stw r25, (-14 * 4)(r1) + stw r26, (-15 * 4)(r1) + stw r27, (-16 * 4)(r1) + stw r28, (-17 * 4)(r1) + stw r29, (-18 * 4)(r1) + stw r30, (-19 * 4)(r1) + stwu r31, (-20 * 4)(r1) + + /* We update the stack pointer here, since we do not want the GC to + scan the floating point registers. */ + + /* Save FPRs */ + stfd f14, (-1 * 8)(r1) + stfd f15, (-2 * 8)(r1) + stfd f16, (-3 * 8)(r1) + stfd f17, (-4 * 8)(r1) + stfd f18, (-5 * 8)(r1) + stfd f19, (-6 * 8)(r1) + stfd f20, (-7 * 8)(r1) + stfd f21, (-8 * 8)(r1) + stfd f22, (-9 * 8)(r1) + stfd f23, (-10 * 8)(r1) + stfd f24, (-11 * 8)(r1) + stfd f25, (-12 * 8)(r1) + stfd f26, (-13 * 8)(r1) + stfd f27, (-14 * 8)(r1) + stfd f28, (-15 * 8)(r1) + stfd f29, (-16 * 8)(r1) + stfd f30, (-17 * 8)(r1) + stfd f31, (-18 * 8)(r1) + + /* Update the old stack pointer */ + stw r1, 0(r3) + + /* Set new stack pointer */ + addi r1, r4, 20 * 4 + + /* Restore linkage area */ + lwz r0, 8(r1) + lwz r5, 4(r1) + + /* Restore GPRs */ + lwz r11, (-1 * 4)(r1) + lwz r13, (-2 * 4)(r1) + lwz r14, (-3 * 4)(r1) + lwz r15, (-4 * 4)(r1) + lwz r16, (-5 * 4)(r1) + lwz r17, (-6 * 4)(r1) + lwz r18, (-7 * 4)(r1) + lwz r19, (-8 * 4)(r1) + lwz r20, (-9 * 4)(r1) + lwz r21, (-10 * 4)(r1) + lwz r22, (-11 * 4)(r1) + lwz r23, (-12 * 4)(r1) + lwz r24, (-13 * 4)(r1) + lwz r25, (-14 * 4)(r1) + lwz r26, (-15 * 4)(r1) + lwz r27, (-16 * 4)(r1) + lwz r28, (-17 * 4)(r1) + lwz r29, (-18 * 4)(r1) + lwz r30, (-19 * 4)(r1) + lwz r31, (-20 * 4)(r1) + + + /* Restore FPRs */ + lfd f14, (-1 * 8)(r4) + lfd f15, (-2 * 8)(r4) + lfd f16, (-3 * 8)(r4) + lfd f17, (-4 * 8)(r4) + lfd f18, (-5 * 8)(r4) + lfd f19, (-6 * 8)(r4) + lfd f20, (-7 * 8)(r4) + lfd f21, (-8 * 8)(r4) + lfd f22, (-9 * 8)(r4) + lfd f23, (-10 * 8)(r4) + lfd f24, (-11 * 8)(r4) + lfd f25, (-12 * 8)(r4) + lfd f26, (-13 * 8)(r4) + lfd f27, (-14 * 8)(r4) + lfd f28, (-15 * 8)(r4) + lfd f29, (-16 * 8)(r4) + lfd f30, (-17 * 8)(r4) + lfd f31, (-18 * 8)(r4) + + /* Set condition and link register */ + mtcr r5 + mtlr r0 + + /* Return and switch context */ + blr + +#endif