| .align 2 |
| .globl .jump_fcontext |
| .jump_fcontext: |
| # reserve space on stack |
| subi 1, 1, 328 |
| |
| std 13, 152(1) # save R13 |
| std 14, 160(1) # save R14 |
| std 15, 168(1) # save R15 |
| std 16, 176(1) # save R16 |
| std 17, 184(1) # save R17 |
| std 18, 192(1) # save R18 |
| std 19, 200(1) # save R19 |
| std 20, 208(1) # save R20 |
| std 21, 216(1) # save R21 |
| std 22, 224(1) # save R22 |
| std 23, 232(1) # save R23 |
| std 24, 240(1) # save R24 |
| std 25, 248(1) # save R25 |
| std 26, 256(1) # save R26 |
| std 27, 264(1) # save R27 |
| std 28, 272(1) # save R28 |
| std 29, 280(1) # save R29 |
| std 30, 288(1) # save R30 |
| std 31, 296(1) # save R31 |
| |
| # save CR |
| mfcr 0 |
| std 0, 304(1) |
| # save LR |
| mflr 0 |
| std 0, 312(1) |
| # save LR as PC |
| std 0, 320(1) |
| |
| # test if fpu env should be preserved |
| cmpwi 7, 6, 0 |
| beq 7, label1 |
| |
| stfd 14, 0(1) # save F14 |
| stfd 15, 8(1) # save F15 |
| stfd 16, 16(1) # save F16 |
| stfd 17, 24(1) # save F17 |
| stfd 18, 32(1) # save F18 |
| stfd 19, 40(1) # save F19 |
| stfd 20, 48(1) # save F20 |
| stfd 21, 56(1) # save F21 |
| stfd 22, 64(1) # save F22 |
| stfd 23, 72(1) # save F23 |
| stfd 24, 80(1) # save F24 |
| stfd 25, 88(1) # save F25 |
| stfd 26, 96(1) # save F26 |
| stfd 27, 104(1) # save F27 |
| stfd 28, 112(1) # save F28 |
| stfd 29, 120(1) # save F29 |
| stfd 30, 128(1) # save F30 |
| stfd 31, 136(1) # save F31 |
| mffs 0 # load FPSCR |
| stfd 0, 144(1) # save FPSCR |
| |
| label1: |
| # store RSP (pointing to context-data) in R3 |
| stw 1, 0(3) |
| |
| # restore RSP (pointing to context-data) from R4 |
| mr 1, 4 |
| |
| # test if fpu env should be preserved |
| cmpwi 7, 6, 0 |
| beq 7, label2 |
| |
| lfd 14, 0(1) # restore F14 |
| lfd 15, 8(1) # restore F15 |
| lfd 16, 16(1) # restore F16 |
| lfd 17, 24(1) # restore F17 |
| lfd 18, 32(1) # restore F18 |
| lfd 19, 40(1) # restore F19 |
| lfd 20, 48(1) # restore F20 |
| lfd 21, 56(1) # restore F21 |
| lfd 22, 64(1) # restore F22 |
| lfd 23, 72(1) # restore F23 |
| lfd 24, 80(1) # restore F24 |
| lfd 25, 88(1) # restore F25 |
| lfd 26, 96(1) # restore F26 |
| lfd 27, 104(1) # restore F27 |
| lfd 28, 112(1) # restore F28 |
| lfd 29, 120(1) # restore F29 |
| lfd 30, 128(1) # restore F30 |
| lfd 31, 136(1) # restore F31 |
| lfd 0, 144(1) # load FPSCR |
| mtfsf 0xff, 0 # restore FPSCR |
| |
| label2: |
| ld 13, 152(1) # restore R13 |
| ld 14, 160(1) # restore R14 |
| ld 15, 168(1) # restore R15 |
| ld 16, 176(1) # restore R16 |
| ld 17, 184(1) # restore R17 |
| ld 18, 192(1) # restore R18 |
| ld 19, 200(1) # restore R19 |
| ld 20, 208(1) # restore R20 |
| ld 21, 216(1) # restore R21 |
| ld 22, 224(1) # restore R22 |
| ld 23, 232(1) # restore R23 |
| ld 24, 240(1) # restore R24 |
| ld 25, 248(1) # restore R25 |
| ld 26, 256(1) # restore R26 |
| ld 27, 264(1) # restore R27 |
| ld 28, 272(1) # restore R28 |
| ld 29, 280(1) # restore R29 |
| ld 30, 288(1) # restore R30 |
| ld 31, 296(1) # restore R31 |
| |
| # restore CR |
| ld 0, 304(1) |
| mtcr 0 |
| # restore LR |
| ld 0, 312(1) |
| mtlr 0 |
| |
| # load PC |
| ld 0, 320(1) |
| # restore CTR |
| mtctr 0 |
| |
| # adjust stack |
| addi 1, 1, 328 |
| |
| # use third arg as return value after jump |
| # use third arg as first arg in context function |
| mr 3, 5 |
| |
| # jump to context |
| bctr |