Mercurial > projects > ldc
view 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 |
line wrap: on
line source
/** * Tango Fiber switching assembler code. * * Author: Mikola Lysenko */ /************************************************************************************ * 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