Browse Source

Updated boost context asm files to latest versions.

Mark Sibly 7 years ago
parent
commit
f18f2ebea4
69 changed files with 7687 additions and 5883 deletions
  1. 113 88
      modules/std/fiber/native/asm/jump_arm64_aapcs_elf_gas.S
  2. 109 77
      modules/std/fiber/native/asm/jump_arm64_aapcs_macho_gas.S
  3. 86 58
      modules/std/fiber/native/asm/jump_arm_aapcs_elf_gas.S
  4. 95 67
      modules/std/fiber/native/asm/jump_arm_aapcs_macho_gas.S
  5. 81 81
      modules/std/fiber/native/asm/jump_arm_aapcs_pe_armasm.asm
  6. 20 20
      modules/std/fiber/native/asm/jump_combined_sysv_macho_gas.S
  7. 117 105
      modules/std/fiber/native/asm/jump_i386_ms_pe_gas.asm
  8. 116 107
      modules/std/fiber/native/asm/jump_i386_ms_pe_masm.asm
  9. 82 59
      modules/std/fiber/native/asm/jump_i386_sysv_elf_gas.S
  10. 75 54
      modules/std/fiber/native/asm/jump_i386_sysv_macho_gas.S
  11. 16 16
      modules/std/fiber/native/asm/jump_i386_x86_64_sysv_macho_gas.S
  12. 118 86
      modules/std/fiber/native/asm/jump_mips32_o32_elf_gas.S
  13. 16 16
      modules/std/fiber/native/asm/jump_ppc32_ppc64_sysv_macho_gas.S
  14. 206 129
      modules/std/fiber/native/asm/jump_ppc32_sysv_elf_gas.S
  15. 201 125
      modules/std/fiber/native/asm/jump_ppc32_sysv_macho_gas.S
  16. 203 88
      modules/std/fiber/native/asm/jump_ppc32_sysv_xcoff_gas.S
  17. 220 195
      modules/std/fiber/native/asm/jump_ppc64_sysv_elf_gas.S
  18. 164 152
      modules/std/fiber/native/asm/jump_ppc64_sysv_macho_gas.S
  19. 84 84
      modules/std/fiber/native/asm/jump_ppc64_sysv_xcoff_gas.S
  20. 209 140
      modules/std/fiber/native/asm/jump_x86_64_ms_pe_gas.asm
  21. 124 47
      modules/std/fiber/native/asm/jump_x86_64_ms_pe_masm.asm
  22. 80 67
      modules/std/fiber/native/asm/jump_x86_64_sysv_elf_gas.S
  23. 75 62
      modules/std/fiber/native/asm/jump_x86_64_sysv_macho_gas.S
  24. 84 71
      modules/std/fiber/native/asm/make_arm64_aapcs_elf_gas.S
  25. 88 68
      modules/std/fiber/native/asm/make_arm64_aapcs_macho_gas.S
  26. 79 62
      modules/std/fiber/native/asm/make_arm_aapcs_elf_gas.S
  27. 71 57
      modules/std/fiber/native/asm/make_arm_aapcs_macho_gas.S
  28. 77 77
      modules/std/fiber/native/asm/make_arm_aapcs_pe_armasm.asm
  29. 20 20
      modules/std/fiber/native/asm/make_combined_sysv_macho_gas.S
  30. 147 142
      modules/std/fiber/native/asm/make_i386_ms_pe_gas.asm
  31. 140 138
      modules/std/fiber/native/asm/make_i386_ms_pe_masm.asm
  32. 106 94
      modules/std/fiber/native/asm/make_i386_sysv_elf_gas.S
  33. 90 83
      modules/std/fiber/native/asm/make_i386_sysv_macho_gas.S
  34. 16 16
      modules/std/fiber/native/asm/make_i386_x86_64_sysv_macho_gas.S
  35. 118 86
      modules/std/fiber/native/asm/make_mips32_o32_elf_gas.S
  36. 16 16
      modules/std/fiber/native/asm/make_ppc32_ppc64_sysv_macho_gas.S
  37. 142 104
      modules/std/fiber/native/asm/make_ppc32_sysv_elf_gas.S
  38. 137 99
      modules/std/fiber/native/asm/make_ppc32_sysv_macho_gas.S
  39. 138 64
      modules/std/fiber/native/asm/make_ppc32_sysv_xcoff_gas.S
  40. 176 176
      modules/std/fiber/native/asm/make_ppc64_sysv_elf_gas.S
  41. 126 126
      modules/std/fiber/native/asm/make_ppc64_sysv_macho_gas.S
  42. 62 62
      modules/std/fiber/native/asm/make_ppc64_sysv_xcoff_gas.S
  43. 174 123
      modules/std/fiber/native/asm/make_x86_64_ms_pe_gas.asm
  44. 163 109
      modules/std/fiber/native/asm/make_x86_64_ms_pe_masm.asm
  45. 81 62
      modules/std/fiber/native/asm/make_x86_64_sysv_elf_gas.S
  46. 76 58
      modules/std/fiber/native/asm/make_x86_64_sysv_macho_gas.S
  47. 112 87
      modules/std/fiber/native/asm/ontop_arm64_aapcs_elf_gas.S
  48. 108 82
      modules/std/fiber/native/asm/ontop_arm64_aapcs_macho_gas.S
  49. 91 63
      modules/std/fiber/native/asm/ontop_arm_aapcs_elf_gas.S
  50. 100 72
      modules/std/fiber/native/asm/ontop_arm_aapcs_macho_gas.S
  51. 86 86
      modules/std/fiber/native/asm/ontop_arm_aapcs_pe_armasm.asm
  52. 20 20
      modules/std/fiber/native/asm/ontop_combined_sysv_macho_gas.S
  53. 125 113
      modules/std/fiber/native/asm/ontop_i386_ms_pe_gas.asm
  54. 124 115
      modules/std/fiber/native/asm/ontop_i386_ms_pe_masm.asm
  55. 89 61
      modules/std/fiber/native/asm/ontop_i386_sysv_elf_gas.S
  56. 81 56
      modules/std/fiber/native/asm/ontop_i386_sysv_macho_gas.S
  57. 16 16
      modules/std/fiber/native/asm/ontop_i386_x86_64_sysv_macho_gas.S
  58. 119 87
      modules/std/fiber/native/asm/ontop_mips32_o32_elf_gas.S
  59. 16 16
      modules/std/fiber/native/asm/ontop_ppc32_ppc64_sysv_macho_gas.S
  60. 206 129
      modules/std/fiber/native/asm/ontop_ppc32_sysv_elf_gas.S
  61. 201 124
      modules/std/fiber/native/asm/ontop_ppc32_sysv_macho_gas.S
  62. 203 87
      modules/std/fiber/native/asm/ontop_ppc32_sysv_xcoff_gas.S
  63. 240 194
      modules/std/fiber/native/asm/ontop_ppc64_sysv_elf_gas.S
  64. 151 151
      modules/std/fiber/native/asm/ontop_ppc64_sysv_macho_gas.S
  65. 83 83
      modules/std/fiber/native/asm/ontop_ppc64_sysv_xcoff_gas.S
  66. 211 142
      modules/std/fiber/native/asm/ontop_x86_64_ms_pe_gas.asm
  67. 207 130
      modules/std/fiber/native/asm/ontop_x86_64_ms_pe_masm.asm
  68. 83 69
      modules/std/fiber/native/asm/ontop_x86_64_sysv_elf_gas.S
  69. 78 64
      modules/std/fiber/native/asm/ontop_x86_64_sysv_macho_gas.S

+ 113 - 88
modules/std/fiber/native/asm/jump_arm64_aapcs_elf_gas.S

@@ -1,88 +1,113 @@
-/*
-            Copyright Edward Nevill + Oliver Kowalke 2015
-   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)
-*/
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
- *  -------------------------------------------------  *
- *  |    x19    |    x20    |    x21    |    x22    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
- *  -------------------------------------------------  *
- *  |    x23    |    x24    |    x25    |    x26    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
- *  -------------------------------------------------  *
- *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
- *  -------------------------------------------------  *
- *  |    x27    |    x28    |    FP     |     LR    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
- *  -------------------------------------------------  *
- *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
- *  -------------------------------------------------  *
- *  |     PC    |   align   |           |           |  *
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.cpu    generic+fp+simd
-.text
-.align  2
-.global jump_fcontext
-.type   jump_fcontext, %function
-jump_fcontext:
-    # prepare stack for GP + FPU
-    sub  sp, sp, #0x70
-
-    # save x19-x30
-    stp  x19, x20, [sp, #0x00]
-    stp  x21, x22, [sp, #0x10]
-    stp  x23, x24, [sp, #0x20]
-    stp  x25, x26, [sp, #0x30]
-    stp  x27, x28, [sp, #0x40]
-    stp  x29, x30, [sp, #0x50]
-
-    # save LR as PC
-    str  x30, [sp, #0x60]
-
-    # store RSP (pointing to context-data) in X0
-    mov  x4, sp
-
-    # restore RSP (pointing to context-data) from X1
-    mov  sp, x0
-
-    # load x19-x30
-    ldp  x19, x20, [sp, #0x00]
-    ldp  x21, x22, [sp, #0x10]
-    ldp  x23, x24, [sp, #0x20]
-    ldp  x25, x26, [sp, #0x30]
-    ldp  x27, x28, [sp, #0x40]
-    ldp  x29, x30, [sp, #0x50]
-
-    # return transfer_t from jump
-    # pass transfer_t as first arg in context function
-    # X0 == FCTX, X1 == DATA
-    mov x0, x4
-
-    # load pc
-    ldr  x4, [sp, #0x60]
-
-    # restore stack from GP + FPU
-    add  sp, sp, #0x70
-
-    ret x4
-.size   jump_fcontext,.-jump_fcontext
-# Mark that we don't need executable stack.
-.section .note.GNU-stack,"",%progbits
+/*
+       Copyright Edward Nevill + Oliver Kowalke 2015
+   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)
+*/
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  |    d8     |    d9     |    d10    |    d11    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |    d12    |    d13    |    d14    |    d15    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
+ *  -------------------------------------------------  *
+ *  |    x19    |    x20    |    x21    |    x22    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
+ *  -------------------------------------------------  *
+ *  |    x23    |    x24    |    x25    |    x26    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c|  *
+ *  -------------------------------------------------  *
+ *  |    x27    |    x28    |    FP     |     LR    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 | 43  |           |           |  *
+ *  -------------------------------------------------  *
+ *  | 0xa0| 0xa4| 0xa8| 0xac|           |           |  *
+ *  -------------------------------------------------  *
+ *  |     PC    |   align   |           |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.align  2
+.global jump_fcontext
+.type   jump_fcontext, %function
+jump_fcontext:
+    # prepare stack for GP + FPU
+    sub  sp, sp, #0xb0
+
+    # save d8 - d15
+    stp  d8,  d9,  [sp, #0x00]
+    stp  d10, d11, [sp, #0x10]
+    stp  d12, d13, [sp, #0x20]
+    stp  d14, d15, [sp, #0x30]
+
+    # save x19-x30
+    stp  x19, x20, [sp, #0x40]
+    stp  x21, x22, [sp, #0x50]
+    stp  x23, x24, [sp, #0x60]
+    stp  x25, x26, [sp, #0x70]
+    stp  x27, x28, [sp, #0x80]
+    stp  x29, x30, [sp, #0x90]
+
+    # save LR as PC
+    str  x30, [sp, #0xa0]
+
+    # store RSP (pointing to context-data) in X0
+    mov  x4, sp
+
+    # restore RSP (pointing to context-data) from X1
+    mov  sp, x0
+
+    # load d8 - d15
+    ldp  d8,  d9,  [sp, #0x00]
+    ldp  d10, d11, [sp, #0x10]
+    ldp  d12, d13, [sp, #0x20]
+    ldp  d14, d15, [sp, #0x30]
+
+    # load x19-x30
+    ldp  x19, x20, [sp, #0x40]
+    ldp  x21, x22, [sp, #0x50]
+    ldp  x23, x24, [sp, #0x60]
+    ldp  x25, x26, [sp, #0x70]
+    ldp  x27, x28, [sp, #0x80]
+    ldp  x29, x30, [sp, #0x90]
+
+    # return transfer_t from jump
+    # pass transfer_t as first arg in context function
+    # X0 == FCTX, X1 == DATA
+    mov x0, x4
+
+    # load pc
+    ldr  x4, [sp, #0xa0]
+
+    # restore stack from GP + FPU
+    add  sp, sp, #0xb0
+
+    ret x4
+.size   jump_fcontext,.-jump_fcontext
+# Mark that we don't need executable stack.
+.section .note.GNU-stack,"",%progbits

+ 109 - 77
modules/std/fiber/native/asm/jump_arm64_aapcs_macho_gas.S

@@ -1,77 +1,109 @@
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
- *  -------------------------------------------------  *
- *  |    x19    |    x20    |    x21    |    x22    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
- *  -------------------------------------------------  *
- *  |    x23    |    x24    |    x25    |    x26    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
- *  -------------------------------------------------  *
- *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
- *  -------------------------------------------------  *
- *  |    x27    |    x28    |    FP     |     LR    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
- *  -------------------------------------------------  *
- *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
- *  -------------------------------------------------  *
- *  |     PC    |   align   |           |           |  *
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.text
-.globl _jump_fcontext
-.balign 16
-_jump_fcontext:
-    ; prepare stack for GP + FPU
-    sub  sp, sp, #0x70
-
-    ; save x19-x30
-    stp  x19, x20, [sp, #0x00]
-    stp  x21, x22, [sp, #0x10]
-    stp  x23, x24, [sp, #0x20]
-    stp  x25, x26, [sp, #0x30]
-    stp  x27, x28, [sp, #0x40]
-    stp  fp,  lr,  [sp, #0x50]
-
-    ; save LR as PC
-    str  lr, [sp, #0x60]
-
-    ; store RSP (pointing to context-data) in X0
-    mov  x4, sp
-
-    ; restore RSP (pointing to context-data) from X1
-    mov  sp, x0
-
-    ; load x19-x30
-    ldp  x19, x20, [sp, #0x00]
-    ldp  x21, x22, [sp, #0x10]
-    ldp  x23, x24, [sp, #0x20]
-    ldp  x25, x26, [sp, #0x30]
-    ldp  x27, x28, [sp, #0x40]
-    ldp  fp,  lr,  [sp, #0x50]
-
-    ; return transfer_t from jump
-    ; pass transfer_t as first arg in context function
-    ; X0 == FCTX, X1 == DATA
-    mov x0, x4
-
-    ; load pc
-    ldr  x4, [sp, #0x60]
-
-    ; restore stack from GP + FPU
-    add  sp, sp, #0x70
-
-    ret x4
+/*
+         Copyright Edward Nevill + Oliver Kowalke 2015
+   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)
+*/
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  |    d8     |    d9     |    d10    |    d11    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |    d12    |    d13    |    d14    |    d15    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
+ *  -------------------------------------------------  *
+ *  |    x19    |    x20    |    x21    |    x22    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
+ *  -------------------------------------------------  *
+ *  |    x23    |    x24    |    x25    |    x26    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c|  *
+ *  -------------------------------------------------  *
+ *  |    x27    |    x28    |    FP     |     LR    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 | 43  |           |           |  *
+ *  -------------------------------------------------  *
+ *  | 0xa0| 0xa4| 0xa8| 0xac|           |           |  *
+ *  -------------------------------------------------  *
+ *  |     PC    |   align   |           |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl _jump_fcontext
+.balign 16
+_jump_fcontext:
+    ; prepare stack for GP + FPU
+    sub  sp, sp, #0xb0
+
+    ; save d8 - d15
+    stp  d8,  d9,  [sp, #0x00]
+    stp  d10, d11, [sp, #0x10]
+    stp  d12, d13, [sp, #0x20]
+    stp  d14, d15, [sp, #0x30]
+
+    ; save x19-x30
+    stp  x19, x20, [sp, #0x40]
+    stp  x21, x22, [sp, #0x50]
+    stp  x23, x24, [sp, #0x60]
+    stp  x25, x26, [sp, #0x70]
+    stp  x27, x28, [sp, #0x80]
+    stp  fp,  lr,  [sp, #0x90]
+
+    ; save LR as PC
+    str  lr, [sp, #0xa0]
+
+    ; store RSP (pointing to context-data) in X0
+    mov  x4, sp
+
+    ; restore RSP (pointing to context-data) from X1
+    mov  sp, x0
+
+    ; load d8 - d15
+    ldp  d8,  d9,  [sp, #0x00]
+    ldp  d10, d11, [sp, #0x10]
+    ldp  d12, d13, [sp, #0x20]
+    ldp  d14, d15, [sp, #0x30]
+
+    ; load x19-x30
+    ldp  x19, x20, [sp, #0x40]
+    ldp  x21, x22, [sp, #0x50]
+    ldp  x23, x24, [sp, #0x60]
+    ldp  x25, x26, [sp, #0x70]
+    ldp  x27, x28, [sp, #0x80]
+    ldp  fp,  lr,  [sp, #0x90]
+
+    ; return transfer_t from jump
+    ; pass transfer_t as first arg in context function
+    ; X0 == FCTX, X1 == DATA
+    mov x0, x4
+
+    ; load pc
+    ldr  x4, [sp, #0xa0]
+
+    ; restore stack from GP + FPU
+    add  sp, sp, #0xb0
+
+    ret x4

+ 86 - 58
modules/std/fiber/native/asm/jump_arm_aapcs_elf_gas.S

@@ -1,58 +1,86 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
- *  -------------------------------------------------  *
- *  |hiddn|  v1 |  v2 |  v3 |  v4 |  v5 |  v6 |  v7 |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
- *  -------------------------------------------------  *
- *  |  v8 |  lr |  pc | FCTX| DATA|                 |  *
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.text
-.globl jump_fcontext
-.align 2
-.type jump_fcontext,%function
-jump_fcontext:
-    @ save LR as PC
-    push {lr}
-    @ save hidden,V1-V8,LR
-    push {a1,v1-v8,lr}
-
-    @ store RSP (pointing to context-data) in A1
-    mov  a1, sp
-
-    @ restore RSP (pointing to context-data) from A2
-    mov  sp, a2
-
-    @ restore hidden,V1-V8,LR
-    pop {a4,v1-v8,lr}
-
-    @ return transfer_t from jump
-    str  a1, [a4, #0]
-    str  a3, [a4, #4]
-    @ pass transfer_t as first arg in context function
-    @ A1 == FCTX, A2 == DATA
-    mov  a2, a3
-
-    @ restore PC
-    pop {pc}
-.size jump_fcontext,.-jump_fcontext
-
-@ Mark that we don't need executable stack.
-.section .note.GNU-stack,"",%progbits
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  | s16 | s17 | s18 | s19 | s20 | s21 | s22 | s23 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  | s24 | s25 | s26 | s27 | s28 | s29 | s30 | s31 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
+ *  -------------------------------------------------  *
+ *  |hiddn|  v1 |  v2 |  v3 |  v4 |  v5 |  v6 |  v7 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
+ *  -------------------------------------------------  *
+ *  |  v8 |  lr |  pc | FCTX| DATA|                 |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl jump_fcontext
+.align 2
+.type jump_fcontext,%function
+jump_fcontext:
+    @ save LR as PC
+    push {lr}
+    @ save hidden,V1-V8,LR
+    push {a1,v1-v8,lr}
+
+    @ prepare stack for FPU
+    sub  sp, sp, #64
+#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
+    @ save S16-S31
+    vstmia sp, {d8-d15}
+#endif
+
+    @ store RSP (pointing to context-data) in A1
+    mov  a1, sp
+
+    @ restore RSP (pointing to context-data) from A2
+    mov  sp, a2
+
+#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
+    @ restore S16-S31
+    vldmia  sp, {d8-d15}
+#endif
+    @ prepare stack for FPU
+    add  sp, sp, #64
+
+    @ restore hidden,V1-V8,LR
+    pop {a4,v1-v8,lr}
+
+    @ return transfer_t from jump
+    str  a1, [a4, #0]
+    str  a3, [a4, #4]
+    @ pass transfer_t as first arg in context function
+    @ A1 == FCTX, A2 == DATA
+    mov  a2, a3
+
+    @ restore PC
+    pop {pc}
+.size jump_fcontext,.-jump_fcontext
+
+@ Mark that we don't need executable stack.
+.section .note.GNU-stack,"",%progbits

+ 95 - 67
modules/std/fiber/native/asm/jump_arm_aapcs_macho_gas.S

@@ -1,67 +1,95 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
- *  -------------------------------------------------  *
- *  | sjlj|hiddn|  v1 |  v2 |  v3 |  v4 |  v5 |  v6 |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
- *  -------------------------------------------------  *
- *  |  v7 |  v8 |  lr |  pc | FCTX| DATA|           |  *
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.text
-.globl _jump_fcontext
-.align 2
-_jump_fcontext:
-    @ save LR as PC
-    push {lr}
-    @ save hidden,V1-V8,LR
-    push {a1,v1-v8,lr}
-
-    @ locate TLS to save/restore SjLj handler
-    mrc  p15, 0, v2, c13, c0, #3
-    bic  v2, v2, #3
-
-    @ load TLS[__PTK_LIBC_DYLD_Unwind_SjLj_Key]
-    ldr  v1, [v2, #8]
-    @ save SjLj handler
-    push  {v1}
-
-    @ store RSP (pointing to context-data) in A1
-    mov  a1, sp
-
-    @ restore RSP (pointing to context-data) from A2
-    mov  sp, a2
-
-    @ r#estore SjLj handler
-    pop  {v1}
-    @ store SjLj handler in TLS
-    str  v1, [v2, #8]
-
-    @ restore hidden,V1-V8,LR
-    pop {a4,v1-v8,lr}
-
-    @ return transfer_t from jump
-    str  a1, [a4, #0]
-    str  a3, [a4, #4]
-    @ pass transfer_t as first arg in context function
-    @ A1 == FCTX, A2 == DATA
-    mov  a2, a3
-
-    @ restore PC
-    pop {pc}
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  | s16 | s17 | s18 | s19 | s20 | s21 | s22 | s23 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  | s24 | s25 | s26 | s27 | s28 | s29 | s30 | s31 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  | sjlj|hiddn|  v1 |  v2 |  v3 |  v4 |  v5 |  v6 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |  v7 |  v8 |  lr |  pc | FCTX| DATA|           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl _jump_fcontext
+.align 2
+_jump_fcontext:
+    @ save LR as PC
+    push {lr}
+    @ save hidden,V1-V8,LR
+    push {a1,v1-v8,lr}
+
+    @ locate TLS to save/restore SjLj handler
+    mrc  p15, 0, v2, c13, c0, #3
+    bic  v2, v2, #3
+
+    @ load TLS[__PTK_LIBC_DYLD_Unwind_SjLj_Key]
+    ldr  v1, [v2, #8]
+    @ save SjLj handler
+    push  {v1}
+
+    @ prepare stack for FPU
+    sub  sp, sp, #64
+#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
+    @ save S16-S31
+    vstmia sp, {d8-d15}
+#endif
+
+    @ store RSP (pointing to context-data) in A1
+    mov  a1, sp
+
+    @ restore RSP (pointing to context-data) from A2
+    mov  sp, a2
+
+#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
+    @ restore S16-S31
+    vldmia  sp, {d8-d15}
+#endif
+    @ prepare stack for FPU
+    add  sp, sp, #64
+
+    @ r#estore SjLj handler
+    pop  {v1}
+    @ store SjLj handler in TLS
+    str  v1, [v2, #8]
+
+    @ restore hidden,V1-V8,LR
+    pop {a4,v1-v8,lr}
+
+    @ return transfer_t from jump
+    str  a1, [a4, #0]
+    str  a3, [a4, #4]
+    @ pass transfer_t as first arg in context function
+    @ A1 == FCTX, A2 == DATA
+    mov  a2, a3
+
+    @ restore PC
+    pop {pc}

+ 81 - 81
modules/std/fiber/native/asm/jump_arm_aapcs_pe_armasm.asm

@@ -1,81 +1,81 @@
-;/*
-;            Copyright Oliver Kowalke 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)
-;*/
-
-; *******************************************************
-; *                                                     *
-; *  -------------------------------------------------  *
-; *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
-; *  -------------------------------------------------  *
-; *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
-; *  -------------------------------------------------  *
-; *  |deall|limit| base|hiddn|  v1 |  v2 |  v3 |  v4 |  *
-; *  -------------------------------------------------  *
-; *  -------------------------------------------------  *
-; *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
-; *  -------------------------------------------------  *
-; *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
-; *  -------------------------------------------------  *
-; *  |  v5 |  v6 |  v7 |  v8 |  lr |  pc | FCTX| DATA|  *
-; *  -------------------------------------------------  *
-; *                                                     *
-; *******************************************************
-
-    AREA |.text|, CODE
-    ALIGN 4
-    EXPORT jump_fcontext
-
-jump_fcontext PROC
-    ; save LR as PC
-    push {lr}
-    ; save hidden,V1-V8,LR
-    push {a1,v1-v8,lr}
-
-    ; load TIB to save/restore thread size and limit.
-    ; we do not need preserve CPU flag and can use it's arg register
-    mrc     p15, #0, v1, c13, c0, #2
-
-    ; save current stack base
-    ldr  a5, [v1, #0x04]
-    push {a5}
-    ; save current stack limit
-    ldr  a5, [v1, #0x08]
-    push {a5}
-    ; save current deallocation stack
-    ldr  a5, [v1, #0xe0c]
-    push {a5}
-
-    ; store RSP (pointing to context-data) in A1
-    mov  a1, sp
-
-    ; restore RSP (pointing to context-data) from A2
-    mov  sp, a2
-
-    ; restore deallocation stack
-    pop  {a5}
-    str  a5, [v1, #0xe0c]
-    ; restore stack limit
-    pop  {a5}
-    str  a5, [v1, #0x08]
-    ; restore stack base
-    pop  {a5}
-    str  a5, [v1, #0x04]
-
-    ; restore hidden,V1-V8,LR
-    pop {a4,v1-v8,lr}
-
-    ; return transfer_t from jump
-    str  a1, [a4, #0]
-    str  a3, [a4, #4]
-    ; pass transfer_t as first arg in context function
-    ; A1 == FCTX, A2 == DATA
-    mov  a2, a3
-
-    ; restore PC
-    pop {pc}
-
-    ENDP
-    END
+;/*
+;            Copyright Oliver Kowalke 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)
+;*/
+
+; *******************************************************
+; *                                                     *
+; *  -------------------------------------------------  *
+; *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+; *  -------------------------------------------------  *
+; *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+; *  -------------------------------------------------  *
+; *  |deall|limit| base|hiddn|  v1 |  v2 |  v3 |  v4 |  *
+; *  -------------------------------------------------  *
+; *  -------------------------------------------------  *
+; *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+; *  -------------------------------------------------  *
+; *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+; *  -------------------------------------------------  *
+; *  |  v5 |  v6 |  v7 |  v8 |  lr |  pc | FCTX| DATA|  *
+; *  -------------------------------------------------  *
+; *                                                     *
+; *******************************************************
+
+    AREA |.text|, CODE
+    ALIGN 4
+    EXPORT jump_fcontext
+
+jump_fcontext PROC
+    ; save LR as PC
+    push {lr}
+    ; save hidden,V1-V8,LR
+    push {a1,v1-v8,lr}
+
+    ; load TIB to save/restore thread size and limit.
+    ; we do not need preserve CPU flag and can use it's arg register
+    mrc     p15, #0, v1, c13, c0, #2
+
+    ; save current stack base
+    ldr  a5, [v1, #0x04]
+    push {a5}
+    ; save current stack limit
+    ldr  a5, [v1, #0x08]
+    push {a5}
+    ; save current deallocation stack
+    ldr  a5, [v1, #0xe0c]
+    push {a5}
+
+    ; store RSP (pointing to context-data) in A1
+    mov  a1, sp
+
+    ; restore RSP (pointing to context-data) from A2
+    mov  sp, a2
+
+    ; restore deallocation stack
+    pop  {a5}
+    str  a5, [v1, #0xe0c]
+    ; restore stack limit
+    pop  {a5}
+    str  a5, [v1, #0x08]
+    ; restore stack base
+    pop  {a5}
+    str  a5, [v1, #0x04]
+
+    ; restore hidden,V1-V8,LR
+    pop {a4,v1-v8,lr}
+
+    ; return transfer_t from jump
+    str  a1, [a4, #0]
+    str  a3, [a4, #4]
+    ; pass transfer_t as first arg in context function
+    ; A1 == FCTX, A2 == DATA
+    mov  a2, a3
+
+    ; restore PC
+    pop {pc}
+
+    ENDP
+    END

+ 20 - 20
modules/std/fiber/native/asm/jump_combined_sysv_macho_gas.S

@@ -1,20 +1,20 @@
-/*
-            Copyright Sergue E. Leontiev 2013.
-   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)
-*/
-
-// Stub file for universal binary
-
-#if defined(__i386__)
-    #include "jump_i386_sysv_macho_gas.S"
-#elif defined(__x86_64__)
-    #include "jump_x86_64_sysv_macho_gas.S"
-#elif defined(__ppc__)
-    #include "jump_ppc32_sysv_macho_gas.S"
-#elif defined(__ppc64__)
-    #include "jump_ppc64_sysv_macho_gas.S"
-#else
-    #error "No arch's"
-#endif
+/*
+            Copyright Sergue E. Leontiev 2013.
+   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)
+*/
+
+// Stub file for universal binary
+
+#if defined(__i386__)
+    #include "jump_i386_sysv_macho_gas.S"
+#elif defined(__x86_64__)
+    #include "jump_x86_64_sysv_macho_gas.S"
+#elif defined(__ppc__)
+    #include "jump_ppc32_sysv_macho_gas.S"
+#elif defined(__ppc64__)
+    #include "jump_ppc64_sysv_macho_gas.S"
+#else
+    #error "No arch's"
+#endif

+ 117 - 105
modules/std/fiber/native/asm/jump_i386_ms_pe_gas.asm

@@ -1,105 +1,117 @@
-/*
-            Copyright Oliver Kowalke 2009.
-            Copyright Thomas Sailer 2013.
-   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)
-*/
-
-/*************************************************************************************
-*  --------------------------------------------------------------------------------- *
-*  |    0    |    1    |    2    |    3    |    4    |    5    |    6    |    7    | *
-*  --------------------------------------------------------------------------------- *
-*  |    0h   |   04h   |   08h   |   0ch   |   010h  |   014h  |   018h  |   01ch  | *
-*  --------------------------------------------------------------------------------- *
-*  | fc_strg |fc_deallo|  limit  |   base  |  fc_seh |   EDI   |   ESI   |   EBX   | *
-*  --------------------------------------------------------------------------------- *
-*  --------------------------------------------------------------------------------- *
-*  |    8    |    9    |   10    |    11   |    12   |    13   |    14   |    15   | *
-*  --------------------------------------------------------------------------------- *
-*  |   020h  |  024h   |  028h   |   02ch  |   030h  |   034h  |   038h  |   03ch  | *
-*  --------------------------------------------------------------------------------- *
-*  |   EBP   |   EIP   |    to   |   data  |         |  EH NXT |SEH HNDLR|         | *
-*  --------------------------------------------------------------------------------- *
-*************************************************************************************/
-
-.file	"jump_i386_ms_pe_gas.asm"
-.text
-.p2align 4,,15
-.globl	_jump_fcontext
-.def	_jump_fcontext;	.scl	2;	.type	32;	.endef
-_jump_fcontext:
-    pushl  %ebp  /* save EBP */
-    pushl  %ebx  /* save EBX */
-    pushl  %esi  /* save ESI */
-    pushl  %edi  /* save EDI */
-
-    /* load NT_TIB */
-    movl  %fs:(0x18), %edx
-
-    /* load current SEH exception list */
-    movl  (%edx), %eax
-    push  %eax
-
-    /* load current stack base */
-    movl  0x04(%edx), %eax
-    push  %eax
-
-    /* load current stack limit */
-    movl  0x08(%edx), %eax
-    push  %eax
-    
-    /* load current dealloction stack */
-    movl  0xe0c(%edx), %eax
-    push  %eax
-    
-    /* load fiber local storage */
-    movl  0x10(%edx), %eax
-    push  %eax
-
-    /* store ESP (pointing to context-data) in EAX */
-    movl  %esp, %eax
-
-    /* first arg of jump_fcontext() == fcontext to jump to */
-    movl  0x28(%esp), %ecx
-
-    /* restore ESP (pointing to context-data) from EDX */
-    movl  %ecx, %esp
-
-    /* load NT_TIB into ECX */
-    movl  %fs:(0x18), %edx
-
-    /* restore fiber local storage */
-    popl  %ecx
-    movl  %ecx, 0x10(%edx)
-
-    /* restore current deallocation stack */
-    popl  %ecx
-    movl  %ecx, 0xe0c(%edx)
-
-    /* restore current stack limit */
-    popl  %ecx
-    movl  %ecx, 0x08(%edx)
-
-    /* restore current stack base */
-    popl  %ecx
-    movl  %ecx, 0x04(%edx)
-
-    /* restore current SEH exception list */
-    popl  %ecx
-    movl  %ecx, (%edx)
-
-    popl  %edi  /* save EDI */
-    popl  %esi  /* save ESI */
-    popl  %ebx  /* save EBX */
-    popl  %ebp  /* save EBP */
-
-    /* return transfer_t */
-    /* FCTX == EAX, DATA == EDX */
-    movl  0x2c(%eax), %edx
-
-    /* jump to context */
-    ret
-
-.section .drectve
-.ascii " -export:\"jump_fcontext\""
+/*
+            Copyright Oliver Kowalke 2009.
+            Copyright Thomas Sailer 2013.
+   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)
+*/
+
+/*************************************************************************************
+*  --------------------------------------------------------------------------------- *
+*  |    0    |    1    |    2    |    3    |    4    |    5    |    6    |    7    | *
+*  --------------------------------------------------------------------------------- *
+*  |    0h   |   04h   |   08h   |   0ch   |   010h  |   014h  |   018h  |   01ch  | *
+*  --------------------------------------------------------------------------------- *
+*  | fc_mxcsr|fc_x87_cw| fc_strg |fc_deallo|  limit  |   base  |  fc_seh |   EDI   | *
+*  --------------------------------------------------------------------------------- *
+*  --------------------------------------------------------------------------------- *
+*  |    8    |    9    |   10    |    11   |    12   |    13   |    14   |    15   | *
+*  --------------------------------------------------------------------------------- *
+*  |   020h  |  024h   |  028h   |   02ch  |   030h  |   034h  |   038h  |   03ch  | *
+*  --------------------------------------------------------------------------------- *
+*  |   ESI   |   EBX   |   EBP   |   EIP   |    to   |   data  |  EH NXT |SEH HNDLR| *
+*  --------------------------------------------------------------------------------- *
+**************************************************************************************/
+
+.file	"jump_i386_ms_pe_gas.asm"
+.text
+.p2align 4,,15
+.globl	_jump_fcontext
+.def	_jump_fcontext;	.scl	2;	.type	32;	.endef
+_jump_fcontext:
+    /* prepare stack */
+    leal  -0x2c(%esp), %esp
+
+#if !defined(BOOST_USE_TSX)
+    /* save MMX control- and status-word */
+    stmxcsr  (%esp)
+    /* save x87 control-word */
+    fnstcw  0x4(%esp)
+#endif
+
+    /* load NT_TIB */
+    movl  %fs:(0x18), %edx
+    /* load fiber local storage */
+    movl  0x10(%edx), %eax
+    movl  %eax, 0x8(%esp)
+    /* load current dealloction stack */
+    movl  0xe0c(%edx), %eax
+    movl  %eax, 0xc(%esp)
+    /* load current stack limit */
+    movl  0x8(%edx), %eax
+    movl  %eax, 0x10(%esp)
+    /* load current stack base */
+    movl  0x4(%edx), %eax
+    movl  %eax, 0x14(%esp)
+    /* load current SEH exception list */
+    movl  (%edx), %eax
+    movl  %eax, 0x18(%esp)
+
+    movl  %edi, 0x1c(%esp)  /* save EDI */
+    movl  %esi, 0x20(%esp)  /* save ESI */
+    movl  %ebx, 0x24(%esp)  /* save EBX */
+    movl  %ebp, 0x28(%esp)  /* save EBP */
+
+    /* store ESP (pointing to context-data) in EAX */
+    movl  %esp, %eax
+
+    /* firstarg of jump_fcontext() == fcontext to jump to */
+    movl  0x30(%esp), %ecx
+    
+    /* restore ESP (pointing to context-data) from ECX */
+    movl  %ecx, %esp
+
+#if !defined(BOOST_USE_TSX)
+    /* restore MMX control- and status-word */
+    ldmxcsr  (%esp)
+    /* restore x87 control-word */
+    fldcw  0x4(%esp)
+#endif
+
+    /* restore NT_TIB into EDX */
+    movl  %fs:(0x18), %edx
+    /* restore fiber local storage */
+    movl  0x8(%esp), %ecx
+    movl  %ecx, 0x10(%edx)
+    /* restore current deallocation stack */
+    movl  0xc(%esp), %ecx
+    movl  %ecx, 0xe0c(%edx)
+    /* restore current stack limit */
+    movl  0x10(%esp), %ecx
+    movl  %ecx, 0x8(%edx)
+    /* restore current stack base */
+    movl  0x14(%esp), %ecx
+    movl  %ecx, 0x4(%edx)
+    /* restore current SEH exception list */
+    movl  0x18(%esp), %ecx
+    movl  %ecx, (%edx)
+
+    movl  0x2c(%esp), %ecx  /* restore EIP */
+
+    movl  0x1c(%esp), %edi  /* restore EDI */
+    movl  0x20(%esp), %esi  /* restore ESI */
+    movl  0x24(%esp), %ebx  /* restore EBX */
+    movl  0x28(%esp), %ebp  /* restore EBP */
+
+    /* prepare stack */
+    leal  0x30(%esp), %esp
+
+    /* return transfer_t */
+    /* FCTX == EAX, DATA == EDX */
+    movl  0x34(%eax), %edx
+
+    /* jump to context */
+    jmp *%ecx
+
+.section .drectve
+.ascii " -export:\"jump_fcontext\""

+ 116 - 107
modules/std/fiber/native/asm/jump_i386_ms_pe_masm.asm

@@ -1,107 +1,116 @@
-
-;           Copyright Oliver Kowalke 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)
-
-;  ---------------------------------------------------------------------------------
-;  |    0    |    1    |    2    |    3    |    4    |    5    |    6    |    7    |
-;  ---------------------------------------------------------------------------------
-;  |    0h   |   04h   |   08h   |   0ch   |   010h  |   014h  |   018h  |   01ch  |
-;  ---------------------------------------------------------------------------------
-;  | fc_strg |fc_deallo|  limit  |   base  |  fc_seh |   EDI   |   ESI   |   EBX   |
-;  ---------------------------------------------------------------------------------
-;  ---------------------------------------------------------------------------------
-;  |    8    |    9    |   10    |    11   |    12   |    13   |    14   |    15   |
-;  ---------------------------------------------------------------------------------
-;  |   020h  |  024h   |  028h   |   02ch  |   030h  |   034h  |   038h  |   03ch  |
-;  ---------------------------------------------------------------------------------
-;  |   EBP   |   EIP   |    to   |   data  |         |  EH NXT |SEH HNDLR|         |
-;  ---------------------------------------------------------------------------------
-
-.386
-.XMM
-.model flat, c
-.code
-
-jump_fcontext PROC 
-
-	;BOOST_CONTEXT_EXPORT
-	
-    push  ebp  ; save EBP 
-    push  ebx  ; save EBX 
-    push  esi  ; save ESI 
-    push  edi  ; save EDI 
-
-    assume  fs:nothing
-    ; load NT_TIB into ECX
-    mov  edx, fs:[018h]
-    assume  fs:error
-
-    ; load current SEH exception list
-    mov  eax, [edx]
-    push  eax
-
-    ; load current stack base
-    mov  eax, [edx+04h]
-    push  eax
-
-    ; load current stack limit
-    mov  eax, [edx+08h]
-    push  eax
-
-    ; load current deallocation stack
-    mov  eax, [edx+0e0ch]
-    push  eax
-
-    ; load fiber local storage
-    mov  eax, [edx+010h]
-    push  eax
-
-    ; store ESP (pointing to context-data) in EAX
-    mov  eax, esp
-
-    ; firstarg of jump_fcontext() == fcontext to jump to
-    mov  ecx, [esp+028h]
-    
-    ; restore ESP (pointing to context-data) from EAX
-    mov  esp, ecx
-
-    assume  fs:nothing
-    ; load NT_TIB into EDX
-    mov  edx, fs:[018h]
-    assume  fs:error
-
-    ; restore fiber local storage
-    pop  ecx
-    mov  [edx+010h], ecx
-
-    ; restore current deallocation stack
-    pop  ecx
-    mov  [edx+0e0ch], ecx
-
-    ; restore current stack limit
-    pop  ecx
-    mov  [edx+08h], ecx
-
-    ; restore current stack base
-    pop  ecx
-    mov  [edx+04h], ecx
-
-    ; restore current SEH exception list
-    pop  ecx
-    mov  [edx], ecx
-
-    pop  edi  ; save EDI 
-    pop  esi  ; save ESI 
-    pop  ebx  ; save EBX 
-    pop  ebp  ; save EBP
-
-    ; return transfer_t
-    ; FCTX == EAX, DATA == EDX
-    mov  edx, [eax+02ch]
-
-    ; jump to context
-    ret
-jump_fcontext ENDP
-END
+
+;           Copyright Oliver Kowalke 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)
+
+;  ---------------------------------------------------------------------------------
+;  |    0    |    1    |    2    |    3    |    4    |    5    |    6    |    7    |
+;  ---------------------------------------------------------------------------------
+;  |    0h   |   04h   |   08h   |   0ch   |   010h  |   014h  |   018h  |   01ch  |
+;  ---------------------------------------------------------------------------------
+;  | fc_mxcsr|fc_x87_cw| fc_strg |fc_deallo|  limit  |   base  |  fc_seh |   EDI   |
+;  ---------------------------------------------------------------------------------
+;  ---------------------------------------------------------------------------------
+;  |    8    |    9    |   10    |    11   |    12   |    13   |    14   |    15   |
+;  ---------------------------------------------------------------------------------
+;  |   020h  |  024h   |  028h   |   02ch  |   030h  |   034h  |   038h  |   03ch  |
+;  ---------------------------------------------------------------------------------
+;  |   ESI   |   EBX   |   EBP   |   EIP   |    to   |   data  |  EH NXT |SEH HNDLR|
+;  ---------------------------------------------------------------------------------
+
+.386
+.XMM
+.model flat, c
+.code
+
+jump_fcontext PROC BOOST_CONTEXT_EXPORT
+    ; prepare stack
+    lea  esp, [esp-02ch]
+
+IFNDEF BOOST_USE_TSX
+    ; save MMX control- and status-word
+    stmxcsr  [esp]
+    ; save x87 control-word
+    fnstcw  [esp+04h]
+ENDIF
+
+    assume  fs:nothing
+    ; load NT_TIB into ECX
+    mov  edx, fs:[018h]
+    assume  fs:error
+    ; load fiber local storage
+    mov  eax, [edx+010h]
+    mov  [esp+08h], eax
+    ; load current deallocation stack
+    mov  eax, [edx+0e0ch]
+    mov  [esp+0ch], eax
+    ; load current stack limit
+    mov  eax, [edx+08h]
+    mov  [esp+010h], eax
+    ; load current stack base
+    mov  eax, [edx+04h]
+    mov  [esp+014h], eax
+    ; load current SEH exception list
+    mov  eax, [edx]
+    mov  [esp+018h], eax
+
+    mov  [esp+01ch], edi  ; save EDI 
+    mov  [esp+020h], esi  ; save ESI 
+    mov  [esp+024h], ebx  ; save EBX 
+    mov  [esp+028h], ebp  ; save EBP 
+
+    ; store ESP (pointing to context-data) in EAX
+    mov  eax, esp
+
+    ; firstarg of jump_fcontext() == fcontext to jump to
+    mov  ecx, [esp+030h]
+    
+    ; restore ESP (pointing to context-data) from ECX
+    mov  esp, ecx
+
+IFNDEF BOOST_USE_TSX
+    ; restore MMX control- and status-word
+    ldmxcsr  [esp]
+    ; restore x87 control-word
+    fldcw  [esp+04h]
+ENDIF
+
+    assume  fs:nothing
+    ; load NT_TIB into EDX
+    mov  edx, fs:[018h]
+    assume  fs:error
+    ; restore fiber local storage
+    mov  ecx, [esp+08h]
+    mov  [edx+010h], ecx
+    ; restore current deallocation stack
+    mov  ecx, [esp+0ch]
+    mov  [edx+0e0ch], ecx
+    ; restore current stack limit
+    mov  ecx, [esp+010h]
+    mov  [edx+08h], ecx
+    ; restore current stack base
+    mov  ecx, [esp+014h]
+    mov  [edx+04h], ecx
+    ; restore current SEH exception list
+    mov  ecx, [esp+018h]
+    mov  [edx], ecx
+
+    mov  ecx, [esp+02ch]  ; restore EIP
+
+    mov  edi, [esp+01ch]  ; restore EDI 
+    mov  esi, [esp+020h]  ; restore ESI 
+    mov  ebx, [esp+024h]  ; restore EBX 
+    mov  ebp, [esp+028h]  ; restore EBP 
+
+    ; prepare stack
+    lea  esp, [esp+030h]
+
+    ; return transfer_t
+    ; FCTX == EAX, DATA == EDX
+    mov  edx, [eax+034h]
+
+    ; jump to context
+    jmp ecx
+jump_fcontext ENDP
+END

+ 82 - 59
modules/std/fiber/native/asm/jump_i386_sysv_elf_gas.S

@@ -1,59 +1,82 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*****************************************************************************************
- *                                                                                       *
- *  -----------------------------------------------------------------------------------  *
- *  |    0    |    1    |    2    |    3    |    4     |    5    |    6     |    7    |  *
- *  -----------------------------------------------------------------------------------  *
- *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18   |   0x1c  |  *
- *  -----------------------------------------------------------------------------------  *
- *  |   EDI   |   ESI   |   EBX   |   EBP   |   EIP    |  hidden |    to    |   data  |  *
- *  -----------------------------------------------------------------------------------  *
- *                                                                                       *
- *****************************************************************************************/
-
-.text
-.globl jump_fcontext
-.align 2
-.type jump_fcontext,@function
-jump_fcontext:
-    pushl  %ebp  /* save EBP */
-    pushl  %ebx  /* save EBX */
-    pushl  %esi  /* save ESI */
-    pushl  %edi  /* save EDI */
-
-    /* store fcontext_t in ECX */
-    movl  %esp, %ecx
-
-    /* first arg of jump_fcontext() == fcontext to jump to */
-    movl  0x18(%esp), %eax
-
-    /* second arg of jump_fcontext() == data to be transferred */
-    movl  0x1c(%esp), %edx
-
-    /* restore ESP (pointing to context-data) from EAX */
-    movl  %eax, %esp
-
-    /* address of returned transport_t */
-    movl 0x14(%esp), %eax
-    /* return parent fcontext_t */
-    movl  %ecx, (%eax)
-    /* return data */
-    movl %edx, 0x4(%eax)
-
-    popl  %edi  /* restore EDI */
-    popl  %esi  /* restore ESI */
-    popl  %ebx  /* restore EBX */
-    popl  %ebp  /* restore EBP */
-
-    /* jump to context */
-    ret $4
-.size jump_fcontext,.-jump_fcontext
-
-/* Mark that we don't need executable stack.  */
-.section .note.GNU-stack,"",%progbits
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/****************************************************************************************
+ *                                                                                      *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  | fc_mxcsr|fc_x87_cw|   EDI   |   ESI   |   EBX    |   EBP   |   EIP   |  hidden |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    8    |    9    |    10   |    11   |    12    |    13   |    14   |    15   |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x20  |   0x24  |                                                            |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    to   |   data  |                                                            |  *
+ *  ----------------------------------------------------------------------------------  *
+ *                                                                                      *
+ ****************************************************************************************/
+
+.text
+.globl jump_fcontext
+.align 2
+.type jump_fcontext,@function
+jump_fcontext:
+    leal  -0x18(%esp), %esp  /* prepare stack */
+
+#if !defined(BOOST_USE_TSX)
+    stmxcsr  (%esp)     /* save MMX control- and status-word */
+    fnstcw   0x4(%esp)  /* save x87 control-word */
+#endif
+
+    movl  %edi, 0x8(%esp)  /* save EDI */
+    movl  %esi, 0xc(%esp)  /* save ESI */
+    movl  %ebx, 0x10(%esp)  /* save EBX */
+    movl  %ebp, 0x14(%esp)  /* save EBP */
+
+    /* store ESP (pointing to context-data) in ECX */
+    movl  %esp, %ecx
+
+    /* first arg of jump_fcontext() == fcontext to jump to */
+    movl  0x20(%esp), %eax
+
+    /* second arg of jump_fcontext() == data to be transferred */
+    movl  0x24(%esp), %edx
+
+    /* restore ESP (pointing to context-data) from EAX */
+    movl  %eax, %esp
+
+    /* address of returned transport_t */
+    movl 0x1c(%esp), %eax
+    /* return parent fcontext_t */
+    movl  %ecx, (%eax)
+    /* return data */
+    movl %edx, 0x4(%eax)
+
+    movl  0x18(%esp), %ecx  /* restore EIP */
+
+#if !defined(BOOST_USE_TSX)
+    ldmxcsr  (%esp)     /* restore MMX control- and status-word */
+    fldcw    0x4(%esp)  /* restore x87 control-word */
+#endif
+
+    movl  0x8(%esp), %edi  /* restore EDI */
+    movl  0xc(%esp), %esi  /* restore ESI */
+    movl  0x10(%esp), %ebx  /* restore EBX */
+    movl  0x14(%esp), %ebp  /* restore EBP */
+
+    leal  0x20(%esp), %esp  /* prepare stack */
+
+    /* jump to context */
+    jmp *%ecx
+.size jump_fcontext,.-jump_fcontext
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 75 - 54
modules/std/fiber/native/asm/jump_i386_sysv_macho_gas.S

@@ -1,54 +1,75 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*****************************************************************************************
- *                                                                                       *
- *  -----------------------------------------------------------------------------------  *
- *  |    0    |    1    |    2    |    3    |    4     |    5    |    6     |    7    |  *
- *  -----------------------------------------------------------------------------------  *
- *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18   |   0x1c  |  *
- *  -----------------------------------------------------------------------------------  *
- *  |   EDI   |   ESI   |   EBX   |   EBP   |   EIP    |  hidden |    to    |   data  |  *
- *  -----------------------------------------------------------------------------------  *
- *                                                                                       *
- *****************************************************************************************/
-
-.text
-.globl _jump_fcontext
-.align 2
-_jump_fcontext:
-    pushl  %ebp  /* save EBP */
-    pushl  %ebx  /* save EBX */
-    pushl  %esi  /* save ESI */
-    pushl  %edi  /* save EDI */
-
-    /* store fcontext_t in ECX */
-    movl  %esp, %ecx
-
-    /* first arg of jump_fcontext() == context jumping to */
-    movl  0x18(%esp), %eax
-
-    /* second arg of jump_fcontext() == data to be transferred */
-    movl  0x1c(%esp), %edx
-
-    /* restore ESP (pointing to context-data) from EAX */
-    movl  %eax, %esp
-
-    /* address of returned transport_t */
-    movl 0x14(%esp), %eax
-    /* return parent fcontext_t */
-    movl  %ecx, (%eax)
-    /* return data */
-    movl %edx, 0x4(%eax)
-
-    popl  %edi  /* restore EDI */
-    popl  %esi  /* restore ESI */
-    popl  %ebx  /* restore EBX */
-    popl  %ebp  /* restore EBP */
-
-    /* jump to context */
-    ret $4
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/****************************************************************************************
+ *                                                                                      *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  | fc_mxcsr|fc_x87_cw|   EDI   |   ESI   |   EBX    |   EBP   |   EIP   |    to   |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    8    |    9    |    10   |    11   |    12    |    13   |    14   |    15   |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x20  |                                                                      |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   data  |                                                                      |  *
+ *  ----------------------------------------------------------------------------------  *
+ *                                                                                      *
+ ****************************************************************************************/
+
+.text
+.globl _jump_fcontext
+.align 2
+_jump_fcontext:
+    leal  -0x18(%esp), %esp  /* prepare stack */
+
+#if !defined(BOOST_USE_TSX)
+    stmxcsr  (%esp)     /* save MMX control- and status-word */
+    fnstcw   0x4(%esp)  /* save x87 control-word */
+#endif
+
+    movl  %edi, 0x8(%esp)  /* save EDI */
+    movl  %esi, 0xc(%esp)  /* save ESI */
+    movl  %ebx, 0x10(%esp)  /* save EBX */
+    movl  %ebp, 0x14(%esp)  /* save EBP */
+
+    /* store ESP (pointing to context-data) in ECX */
+    movl  %esp, %ecx
+
+    /* first arg of jump_fcontext() == fcontext to jump to */
+    movl  0x1c(%esp), %eax
+
+    /* second arg of jump_fcontext() == data to be transferred */
+    movl  0x20(%esp), %edx
+
+    /* restore ESP (pointing to context-data) from EAX */
+    movl  %eax, %esp
+
+    /* return parent fcontext_t */
+    movl  %ecx, %eax
+    /* returned data is stored in EDX */
+    movl %edx, 0x4(%eax)
+
+    movl  0x18(%esp), %ecx  /* restore EIP */
+
+#if !defined(BOOST_USE_TSX)
+    ldmxcsr  (%esp)     /* restore MMX control- and status-word */
+    fldcw    0x4(%esp)  /* restore x87 control-word */
+#endif
+
+    movl  0x8(%esp), %edi  /* restore EDI */
+    movl  0xc(%esp), %esi  /* restore ESI */
+    movl  0x10(%esp), %ebx  /* restore EBX */
+    movl  0x14(%esp), %ebp  /* restore EBP */
+
+    leal  0x1c(%esp), %esp  /* prepare stack */
+
+    /* jump to context */
+    jmp *%ecx

+ 16 - 16
modules/std/fiber/native/asm/jump_i386_x86_64_sysv_macho_gas.S

@@ -1,16 +1,16 @@
-/*
-            Copyright Sergue E. Leontiev 2013.
-   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)
-*/
-
-// Stub file for universal binary
-
-#if defined(__i386__)
-    #include "jump_i386_sysv_macho_gas.S"
-#elif defined(__x86_64__)
-    #include "jump_x86_64_sysv_macho_gas.S"
-#else
-    #error "No arch's"
-#endif
+/*
+            Copyright Sergue E. Leontiev 2013.
+   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)
+*/
+
+// Stub file for universal binary
+
+#if defined(__i386__)
+    #include "jump_i386_sysv_macho_gas.S"
+#elif defined(__x86_64__)
+    #include "jump_x86_64_sysv_macho_gas.S"
+#else
+    #error "No arch's"
+#endif

+ 118 - 86
modules/std/fiber/native/asm/jump_mips32_o32_elf_gas.S

@@ -1,86 +1,118 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
- *  -------------------------------------------------  *
- *  |  S0 |  S1 |  S2 |  S3 |  S4 |  S5 |  S6 |  S7 |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
- *  -------------------------------------------------  *
- *  |  FP |hiddn|  RA |  PC |  GP | FCTX| DATA|     |  *
- *  -------------------------------------------------  *
- *                                                     *
- * *****************************************************/
-
-.text
-.globl jump_fcontext
-.align 2
-.type jump_fcontext,@function
-.ent jump_fcontext
-jump_fcontext:
-    # reserve space on stack
-    addiu $sp, $sp, -112
-
-    sw  $s0, ($sp)  # save S0
-    sw  $s1, 4($sp)  # save S1
-    sw  $s2, 8($sp)  # save S2
-    sw  $s3, 12($sp)  # save S3
-    sw  $s4, 16($sp)  # save S4
-    sw  $s5, 20($sp)  # save S5
-    sw  $s6, 24($sp)  # save S6
-    sw  $s7, 28($sp)  # save S7
-    sw  $fp, 32($sp)  # save FP
-    sw  $a0, 36($sp)  # save hidden, address of returned transfer_t
-    sw  $ra, 40($sp)  # save RA
-    sw  $ra, 44($sp)  # save RA as PC
-
-    # store SP (pointing to context-data) in A0
-    move  $a0, $sp
-
-    # restore SP (pointing to context-data) from A1
-    move  $sp, $a1
-
-    lw  $s0, ($sp)  # restore S0
-    lw  $s1, 4($sp)  # restore S1
-    lw  $s2, 8($sp)  # restore S2
-    lw  $s3, 12($sp)  # restore S3
-    lw  $s4, 16($sp)  # restore S4
-    lw  $s5, 20($sp)  # restore S5
-    lw  $s6, 24($sp)  # restore S6
-    lw  $s7, 28($sp)  # restore S7
-    lw  $fp, 32($sp)  # restore FP
-    lw  $t0, 36($sp)  # restore hidden, address of returned transfer_t
-    lw  $ra, 40($sp)  # restore RA
-
-    # load PC
-    lw  $t9, 44($sp)
-
-    # adjust stack
-    addiu $sp, $sp, 112
-    
-    # return transfer_t from jump
-    sw  $a0, ($t0)  # fctx of transfer_t
-    sw  $a1, 4($t0) # data of transfer_t
-    # pass transfer_t as first arg in context function
-    # A0 == fctx, A1 == data
-    move  $a1, $a2 
-
-    # jump to context
-    jr  $t9
-.end jump_fcontext
-.size jump_fcontext, .-jump_fcontext
-
-/* Mark that we don't need executable stack.  */
-.section .note.GNU-stack,"",%progbits
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    F20    |    F22    |    F24    |    F26    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    F28    |    F30    |  S0 |  S1 |  S2 |  S3 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |  S4 |  S5 |  S6 |  S7 |  FP |hiddn|  RA |  PC |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |  GP | FCTX| DATA|     |     |     |     |     |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ * *****************************************************/
+
+.text
+.globl jump_fcontext
+.align 2
+.type jump_fcontext,@function
+.ent jump_fcontext
+jump_fcontext:
+    # reserve space on stack
+    addiu $sp, $sp, -96
+
+    sw  $s0, 48($sp)  # save S0
+    sw  $s1, 52($sp)  # save S1
+    sw  $s2, 56($sp)  # save S2
+    sw  $s3, 60($sp)  # save S3
+    sw  $s4, 64($sp)  # save S4
+    sw  $s5, 68($sp)  # save S5
+    sw  $s6, 72($sp)  # save S6
+    sw  $s7, 76($sp)  # save S7
+    sw  $fp, 80($sp)  # save FP
+    sw  $a0, 84($sp)  # save hidden, address of returned transfer_t
+    sw  $ra, 88($sp)  # save RA
+    sw  $ra, 92($sp)  # save RA as PC
+
+#if defined(__mips_hard_float)
+    s.d  $f20, ($sp)  # save F20
+    s.d  $f22, 8($sp)  # save F22
+    s.d  $f24, 16($sp)  # save F24
+    s.d  $f26, 24($sp)  # save F26
+    s.d  $f28, 32($sp)  # save F28
+    s.d  $f30, 40($sp)  # save F30
+#endif
+
+    # store SP (pointing to context-data) in A0
+    move  $a0, $sp
+
+    # restore SP (pointing to context-data) from A1
+    move  $sp, $a1
+
+#if defined(__mips_hard_float)
+    l.d  $f20, ($sp)  # restore F20
+    l.d  $f22, 8($sp)  # restore F22
+    l.d  $f24, 16($sp)  # restore F24
+    l.d  $f26, 24($sp)  # restore F26
+    l.d  $f28, 32($sp)  # restore F28
+    l.d  $f30, 40($sp)  # restore F30
+#endif
+
+    lw  $s0, 48($sp)  # restore S0
+    lw  $s1, 52($sp)  # restore S1
+    lw  $s2, 56($sp)  # restore S2
+    lw  $s3, 60($sp)  # restore S3
+    lw  $s4, 64($sp)  # restore S4
+    lw  $s5, 68($sp)  # restore S5
+    lw  $s6, 72($sp)  # restore S6
+    lw  $s7, 76($sp)  # restore S7
+    lw  $fp, 80($sp)  # restore FP
+    lw  $t0, 84($sp)  # restore hidden, address of returned transfer_t
+    lw  $ra, 88($sp)  # restore RA
+
+    # load PC
+    lw  $t9, 92($sp)
+
+    # adjust stack
+    addiu $sp, $sp, 96
+    
+    # return transfer_t from jump
+    sw  $a0, ($t0)  # fctx of transfer_t
+    sw  $a2, 4($t0) # data of transfer_t
+    # pass transfer_t as first arg in context function
+    # A0 == fctx, A1 == data
+    move  $a1, $a2 
+
+    # jump to context
+    jr  $t9
+.end jump_fcontext
+.size jump_fcontext, .-jump_fcontext
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 16 - 16
modules/std/fiber/native/asm/jump_ppc32_ppc64_sysv_macho_gas.S

@@ -1,16 +1,16 @@
-/*
-            Copyright Sergue E. Leontiev 2013.
-   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)
-*/
-
-// Stub file for universal binary
-
-#if defined(__ppc__)
-    #include "jump_ppc32_sysv_macho_gas.S"
-#elif defined(__ppc64__)
-    #include "jump_ppc64_sysv_macho_gas.S"
-#else
-    #error "No arch's"
-#endif
+/*
+            Copyright Sergue E. Leontiev 2013.
+   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)
+*/
+
+// Stub file for universal binary
+
+#if defined(__ppc__)
+    #include "jump_ppc32_sysv_macho_gas.S"
+#elif defined(__ppc64__)
+    #include "jump_ppc64_sysv_macho_gas.S"
+#else
+    #error "No arch's"
+#endif

+ 206 - 129
modules/std/fiber/native/asm/jump_ppc32_sysv_elf_gas.S

@@ -1,129 +1,206 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
- *  -------------------------------------------------  *
- *  | R13 | R14 | R15 | R16 | R17 | R18 | R19 | R20 |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
- *  -------------------------------------------------  *
- *  | R21 | R22 | R23 | R24 | R25 | R26 | R27 | R28 |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
- *  -------------------------------------------------  *
- *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
- *  -------------------------------------------------  *
- *  | R29 | R30 | R31 |hiddn|  CR |  LR |  PC | FCTX|  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
- *  -------------------------------------------------  *
- *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
- *  -------------------------------------------------  *
- *  | DATA|     |     |     |                       |  * 
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.text
-.globl jump_fcontext
-.align 2
-.type jump_fcontext,@function
-jump_fcontext:
-    # reserve space on stack
-    subi  %r1, %r1, 92
-
-    stw  %r13, 0(%r1)  # save R13
-    stw  %r14, 4(%r1)  # save R14
-    stw  %r15, 8(%r1)  # save R15
-    stw  %r16, 12(%r1)  # save R16
-    stw  %r17, 16(%r1)  # save R17
-    stw  %r18, 20(%r1)  # save R18
-    stw  %r19, 24(%r1)  # save R19
-    stw  %r20, 28(%r1)  # save R20
-    stw  %r21, 32(%r1)  # save R21
-    stw  %r22, 36(%r1)  # save R22
-    stw  %r23, 40(%r1)  # save R23
-    stw  %r24, 44(%r1)  # save R24
-    stw  %r25, 48(%r1)  # save R25
-    stw  %r26, 52(%r1)  # save R26
-    stw  %r27, 56(%r1)  # save R27
-    stw  %r28, 60(%r1)  # save R28
-    stw  %r29, 64(%r1)  # save R29
-    stw  %r30, 68(%r1)  # save R30
-    stw  %r31, 72(%r1)  # save R31
-    stw  %r3,  76(%r1)  # save hidden
-
-    # save CR
-    mfcr  %r0
-    stw   %r0, 80(%r1)
-    # save LR
-    mflr  %r0
-    stw   %r0, 84(%r1)
-    # save LR as PC
-    stw   %r0, 88(%r1)
-
-    # store RSP (pointing to context-data) in R6
-    mr  %r6, %r1
-
-    # restore RSP (pointing to context-data) from R4
-    mr  %r1, %r4
-
-    lwz  %r13, 0(%r1)  # restore R13
-    lwz  %r14, 4(%r1)  # restore R14
-    lwz  %r15, 8(%r1)  # restore R15
-    lwz  %r16, 12(%r1)  # restore R16
-    lwz  %r17, 16(%r1)  # restore R17
-    lwz  %r18, 20(%r1)  # restore R18
-    lwz  %r19, 24(%r1)  # restore R19
-    lwz  %r20, 28(%r1)  # restore R20
-    lwz  %r21, 32(%r1)  # restore R21
-    lwz  %r22, 36(%r1)  # restore R22
-    lwz  %r23, 40(%r1)  # restore R23
-    lwz  %r24, 44(%r1)  # restore R24
-    lwz  %r25, 48(%r1)  # restore R25
-    lwz  %r26, 52(%r1)  # restore R26
-    lwz  %r27, 56(%r1)  # restore R27
-    lwz  %r28, 60(%r1)  # restore R28
-    lwz  %r29, 64(%r1)  # restore R29
-    lwz  %r30, 68(%r1)  # restore R30
-    lwz  %r31, 72(%r1)  # restore R31
-    lwz  %r3,  76(%r1)  # restore hidden
-
-    # restore CR
-    lwz   %r0, 80(%r1)
-    mtcr  %r0
-    # restore LR
-    lwz   %r0, 84(%r1)
-    mtlr  %r0
-    # load PC
-    lwz   %r0, 88(%r1)
-    # restore CTR
-    mtctr %r0
-
-    # adjust stack
-    addi  %r1, %r1, 92
-
-    # return transfer_t 
-    stw  %r6, 0(%r3)
-    stw  %r5, 4(%r3)
-
-    # jump to context
-    bctr
-.size jump_fcontext, .-jump_fcontext
-
-/* Mark that we don't need executable stack.  */
-.section .note.GNU-stack,"",%progbits
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    F14    |    F15    |    F16    |    F17    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    F18    |    F19    |    F20    |    F21    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |    F22    |    F23    |    F24    |    F25    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |    F26    |    F27    |    F28    |    F29    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
+ *  -------------------------------------------------  *
+ *  |    F30    |    F31    |   fpscr   | R13 | R14 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
+ *  -------------------------------------------------  *
+ *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
+ *  -------------------------------------------------  *
+ *  | R15 | R16 | R17 | R18 | R19 | R20 | R21 | R22 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
+ *  -------------------------------------------------  *
+ *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
+ *  -------------------------------------------------  *
+ *  | R23 | R24 | R25 | R26 | R27 | R28 | R29 | R30 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
+ *  -------------------------------------------------  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
+ *  -------------------------------------------------  *
+ *  | R31 |hiddn|  CR |  LR |  PC |bchai|linkr| FCTX|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  64 |                                         |  *
+ *  -------------------------------------------------  *
+ *  | 256 |                                         |  *
+ *  -------------------------------------------------  *
+ *  | DATA|                                         |  * 
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl jump_fcontext
+.align 2
+.type jump_fcontext,@function
+jump_fcontext:
+    # reserve space on stack
+    subi  %r1, %r1, 244
+
+    stfd  %f14, 0(%r1)  # save F14
+    stfd  %f15, 8(%r1)  # save F15
+    stfd  %f16, 16(%r1)  # save F16
+    stfd  %f17, 24(%r1)  # save F17
+    stfd  %f18, 32(%r1)  # save F18
+    stfd  %f19, 40(%r1)  # save F19
+    stfd  %f20, 48(%r1)  # save F20
+    stfd  %f21, 56(%r1)  # save F21
+    stfd  %f22, 64(%r1)  # save F22
+    stfd  %f23, 72(%r1)  # save F23
+    stfd  %f24, 80(%r1)  # save F24
+    stfd  %f25, 88(%r1)  # save F25
+    stfd  %f26, 96(%r1)  # save F26
+    stfd  %f27, 104(%r1)  # save F27
+    stfd  %f28, 112(%r1)  # save F28
+    stfd  %f29, 120(%r1)  # save F29
+    stfd  %f30, 128(%r1)  # save F30
+    stfd  %f31, 136(%r1)  # save F31
+    mffs  %f0  # load FPSCR
+    stfd  %f0, 144(%r1)  # save FPSCR
+
+    stw  %r13, 152(%r1)  # save R13
+    stw  %r14, 156(%r1)  # save R14
+    stw  %r15, 160(%r1)  # save R15
+    stw  %r16, 164(%r1)  # save R16
+    stw  %r17, 168(%r1)  # save R17
+    stw  %r18, 172(%r1)  # save R18
+    stw  %r19, 176(%r1)  # save R19
+    stw  %r20, 180(%r1)  # save R20
+    stw  %r21, 184(%r1)  # save R21
+    stw  %r22, 188(%r1)  # save R22
+    stw  %r23, 192(%r1)  # save R23
+    stw  %r24, 196(%r1)  # save R24
+    stw  %r25, 200(%r1)  # save R25
+    stw  %r26, 204(%r1)  # save R26
+    stw  %r27, 208(%r1)  # save R27
+    stw  %r28, 212(%r1)  # save R28
+    stw  %r29, 216(%r1)  # save R29
+    stw  %r30, 220(%r1)  # save R30
+    stw  %r31, 224(%r1)  # save R31
+    stw  %r3,  228(%r1)  # save hidden
+
+    # save CR
+    mfcr  %r0
+    stw   %r0, 232(%r1)
+    # save LR
+    mflr  %r0
+    stw   %r0, 236(%r1)
+    # save LR as PC
+    stw   %r0, 240(%r1)
+
+    # store RSP (pointing to context-data) in R6
+    mr  %r6, %r1
+
+    # restore RSP (pointing to context-data) from R4
+    mr  %r1, %r4
+
+    lfd  %f14, 0(%r1)  # restore F14
+    lfd  %f15, 8(%r1)  # restore F15
+    lfd  %f16, 16(%r1)  # restore F16
+    lfd  %f17, 24(%r1)  # restore F17
+    lfd  %f18, 32(%r1)  # restore F18
+    lfd  %f19, 40(%r1)  # restore F19
+    lfd  %f20, 48(%r1)  # restore F20
+    lfd  %f21, 56(%r1)  # restore F21
+    lfd  %f22, 64(%r1)  # restore F22
+    lfd  %f23, 72(%r1)  # restore F23
+    lfd  %f24, 80(%r1)  # restore F24
+    lfd  %f25, 88(%r1)  # restore F25
+    lfd  %f26, 96(%r1)  # restore F26
+    lfd  %f27, 104(%r1)  # restore F27
+    lfd  %f28, 112(%r1)  # restore F28
+    lfd  %f29, 120(%r1)  # restore F29
+    lfd  %f30, 128(%r1)  # restore F30
+    lfd  %f31, 136(%r1)  # restore F31
+    lfd  %f0,  144(%r1)  # load FPSCR
+    mtfsf  0xff, %f0  # restore FPSCR
+
+    lwz  %r13, 152(%r1)  # restore R13
+    lwz  %r14, 156(%r1)  # restore R14
+    lwz  %r15, 160(%r1)  # restore R15
+    lwz  %r16, 164(%r1)  # restore R16
+    lwz  %r17, 168(%r1)  # restore R17
+    lwz  %r18, 172(%r1)  # restore R18
+    lwz  %r19, 176(%r1)  # restore R19
+    lwz  %r20, 180(%r1)  # restore R20
+    lwz  %r21, 184(%r1)  # restore R21
+    lwz  %r22, 188(%r1)  # restore R22
+    lwz  %r23, 192(%r1)  # restore R23
+    lwz  %r24, 196(%r1)  # restore R24
+    lwz  %r25, 200(%r1)  # restore R25
+    lwz  %r26, 204(%r1)  # restore R26
+    lwz  %r27, 208(%r1)  # restore R27
+    lwz  %r28, 212(%r1)  # restore R28
+    lwz  %r29, 216(%r1)  # restore R29
+    lwz  %r30, 220(%r1)  # restore R30
+    lwz  %r31, 224(%r1)  # restore R31
+    lwz  %r3,  228(%r1)  # restore hidden
+
+    # restore CR
+    lwz   %r0, 232(%r1)
+    mtcr  %r0
+    # restore LR
+    lwz   %r0, 236(%r1)
+    mtlr  %r0
+    # load PC
+    lwz   %r0, 240(%r1)
+    # restore CTR
+    mtctr %r0
+
+    # adjust stack
+    addi  %r1, %r1, 244
+
+    # return transfer_t 
+    stw  %r6, 0(%r3)
+    stw  %r5, 4(%r3)
+
+    # jump to context
+    bctr
+.size jump_fcontext, .-jump_fcontext
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 201 - 125
modules/std/fiber/native/asm/jump_ppc32_sysv_macho_gas.S

@@ -1,125 +1,201 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
- *  -------------------------------------------------  *
- *  | R13 | R14 | R15 | R16 | R17 | R18 | R19 | R20 |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
- *  -------------------------------------------------  *
- *  | R21 | R22 | R23 | R24 | R25 | R26 | R27 | R28 |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
- *  -------------------------------------------------  *
- *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
- *  -------------------------------------------------  *
- *  | R29 | R30 | R31 |hiddn|  CR |  LR |  PC | FCTX|  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
- *  -------------------------------------------------  *
- *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
- *  -------------------------------------------------  *
- *  | DATA|     |     |     |                       |  * 
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.text
-.globl _jump_fcontext
-.align 2
-_jump_fcontext:
-    ; reserve space on stack
-    subi  r1, r1, 92
-
-    stw  r13, 0(r1)  # save R13
-    stw  r14, 4(r1)  # save R14
-    stw  r15, 8(r1)  # save R15
-    stw  r16, 12(r1)  # save R16
-    stw  r17, 16(r1)  # save R17
-    stw  r18, 20(r1)  # save R18
-    stw  r19, 24(r1)  # save R19
-    stw  r20, 28(r1)  # save R20
-    stw  r21, 32(r1)  # save R21
-    stw  r22, 36(r1)  # save R22
-    stw  r23, 40(r1)  # save R23
-    stw  r24, 44(r1)  # save R24
-    stw  r25, 48(r1)  # save R25
-    stw  r26, 52(r1)  # save R26
-    stw  r27, 56(r1)  # save R27
-    stw  r28, 60(r1)  # save R28
-    stw  r29, 64(r1)  # save R29
-    stw  r30, 68(r1)  # save R30
-    stw  r31, 72(r1)  # save R31
-    stw  r3,  76(r1)  # save hidden
-
-    # save CR
-    mfcr  r0
-    stw  r0, 80(r1)
-    # save LR
-    mflr  r0
-    stw  r0, 84(r1)
-    # save LR as PC
-    stw  r0, 88(r1)
-
-    # store RSP (pointing to context-data) in R6
-    mr  r6, r1
-
-    # restore RSP (pointing to context-data) from R4
-    mr  r1, r4
-
-    lwz  r13, 0(r1)  # restore R13
-    lwz  r14, 4(r1)  # restore R14
-    lwz  r15, 8(r1)  # restore R15
-    lwz  r16, 12(r1)  # restore R16
-    lwz  r17, 16(r1)  # restore R17
-    lwz  r18, 20(r1)  # restore R18
-    lwz  r19, 24(r1)  # restore R19
-    lwz  r20, 28(r1)  # restore R20
-    lwz  r21, 32(r1)  # restore R21
-    lwz  r22, 36(r1)  # restore R22
-    lwz  r23, 40(r1)  # restore R23
-    lwz  r24, 44(r1)  # restore R24
-    lwz  r25, 48(r1)  # restore R25
-    lwz  r26, 52(r1)  # restore R26
-    lwz  r27, 56(r1)  # restore R27
-    lwz  r28, 60(r1)  # restore R28
-    lwz  r29, 64(r1)  # restore R29
-    lwz  r30, 68(r1)  # restore R30
-    lwz  r31, 72(r1)  # restore R31
-    lwz  r3,  76(r1)  # restore hidden
-
-    # restore CR
-    lwz  r0, 80(r1)
-    mtcr  r0
-    # restore LR
-    lwz  r0, 84(r1)
-    mtlr  r0
-
-    # load PC
-    lwz  r0, 88(r1)
-    # restore CTR
-    mtctr  r0
-
-    # adjust stack
-    addi  r1, r1, 92
-
-    # return transfer_t 
-    stw  r6, 0(r3)
-    stw  r5, 4(r3)
-
-    # jump to context
-    bctr
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    F14    |    F15    |    F16    |    F17    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    F18    |    F19    |    F20    |    F21    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |    F22    |    F23    |    F24    |    F25    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |    F26    |    F27    |    F28    |    F29    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
+ *  -------------------------------------------------  *
+ *  |    F30    |    F31    |   fpscr   | R13 | R14 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
+ *  -------------------------------------------------  *
+ *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
+ *  -------------------------------------------------  *
+ *  | R15 | R16 | R17 | R18 | R19 | R20 | R21 | R22 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
+ *  -------------------------------------------------  *
+ *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
+ *  -------------------------------------------------  *
+ *  | R23 | R24 | R25 | R26 | R27 | R28 | R29 | R30 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
+ *  -------------------------------------------------  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
+ *  -------------------------------------------------  *
+ *  | R31 |hiddn|  CR |  LR |  PC |bchai|linkr| FCTX|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  64 |                                         |  *
+ *  -------------------------------------------------  *
+ *  | 256 |                                         |  *
+ *  -------------------------------------------------  *
+ *  | DATA|                                         |  * 
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl _jump_fcontext
+.align 2
+_jump_fcontext:
+    ; reserve space on stack
+    subi  r1, r1, 244
+
+    stfd  f14, 0(r1)  # save F14
+    stfd  f15, 8(r1)  # save F15
+    stfd  f16, 16(r1)  # save F16
+    stfd  f17, 24(r1)  # save F17
+    stfd  f18, 32(r1)  # save F18
+    stfd  f19, 40(r1)  # save F19
+    stfd  f20, 48(r1)  # save F20
+    stfd  f21, 56(r1)  # save F21
+    stfd  f22, 64(r1)  # save F22
+    stfd  f23, 72(r1)  # save F23
+    stfd  f24, 80(r1)  # save F24
+    stfd  f25, 88(r1)  # save F25
+    stfd  f26, 96(r1)  # save F26
+    stfd  f27, 104(r1)  # save F27
+    stfd  f28, 112(r1)  # save F28
+    stfd  f29, 120(r1)  # save F29
+    stfd  f30, 128(r1)  # save F30
+    stfd  f31, 136(r1)  # save F31
+    mffs  f0  # load FPSCR
+    stfd  f0, 144(r1)  # save FPSCR
+
+    stw  r13, 152(r1)  # save R13
+    stw  r14, 156(r1)  # save R14
+    stw  r15, 160(r1)  # save R15
+    stw  r16, 164(r1)  # save R16
+    stw  r17, 168(r1)  # save R17
+    stw  r18, 172(r1)  # save R18
+    stw  r19, 176(r1)  # save R19
+    stw  r20, 180(r1)  # save R20
+    stw  r21, 184(r1)  # save R21
+    stw  r22, 188(r1)  # save R22
+    stw  r23, 192(r1)  # save R23
+    stw  r24, 196(r1)  # save R24
+    stw  r25, 200(r1)  # save R25
+    stw  r26, 204(r1)  # save R26
+    stw  r27, 208(r1)  # save R27
+    stw  r28, 212(r1)  # save R28
+    stw  r29, 216(r1)  # save R29
+    stw  r30, 220(r1)  # save R30
+    stw  r31, 224(r1)  # save R31
+    stw  r3,  228(r1)  # save hidden
+
+    # save CR
+    mfcr  r0
+    stw   r0, 232(r1)
+    # save LR
+    mflr  r0
+    stw   r0, 236(r1)
+    # save LR as PC
+    stw   r0, 240(r1)
+
+    # store RSP (pointing to context-data) in R6
+    mr  r6, r1
+
+    # restore RSP (pointing to context-data) from R4
+    mr  r1, r4
+
+    lfd  f14, 0(r1)  # restore F14
+    lfd  f15, 8(r1)  # restore F15
+    lfd  f16, 16(r1)  # restore F16
+    lfd  f17, 24(r1)  # restore F17
+    lfd  f18, 32(r1)  # restore F18
+    lfd  f19, 40(r1)  # restore F19
+    lfd  f20, 48(r1)  # restore F20
+    lfd  f21, 56(r1)  # restore F21
+    lfd  f22, 64(r1)  # restore F22
+    lfd  f23, 72(r1)  # restore F23
+    lfd  f24, 80(r1)  # restore F24
+    lfd  f25, 88(r1)  # restore F25
+    lfd  f26, 96(r1)  # restore F26
+    lfd  f27, 104(r1)  # restore F27
+    lfd  f28, 112(r1)  # restore F28
+    lfd  f29, 120(r1)  # restore F29
+    lfd  f30, 128(r1)  # restore F30
+    lfd  f31, 136(r1)  # restore F31
+    lfd  f0,  144(r1)  # load FPSCR
+    mtfsf  0xff, f0  # restore FPSCR
+
+    lwz  r13, 152(r1)  # restore R13
+    lwz  r14, 156(r1)  # restore R14
+    lwz  r15, 160(r1)  # restore R15
+    lwz  r16, 164(r1)  # restore R16
+    lwz  r17, 168(r1)  # restore R17
+    lwz  r18, 172(r1)  # restore R18
+    lwz  r19, 176(r1)  # restore R19
+    lwz  r20, 180(r1)  # restore R20
+    lwz  r21, 184(r1)  # restore R21
+    lwz  r22, 188(r1)  # restore R22
+    lwz  r23, 192(r1)  # restore R23
+    lwz  r24, 196(r1)  # restore R24
+    lwz  r25, 200(r1)  # restore R25
+    lwz  r26, 204(r1)  # restore R26
+    lwz  r27, 208(r1)  # restore R27
+    lwz  r28, 212(r1)  # restore R28
+    lwz  r29, 216(r1)  # restore R29
+    lwz  r30, 220(r1)  # restore R30
+    lwz  r31, 224(r1)  # restore R31
+    lwz  r3,  228(r1)  # restore hidden
+
+    # restore CR
+    lwz   r0, 232(r1)
+    mtcr  r0
+    # restore LR
+    lwz   r0, 236(r1)
+    mtlr  r0
+    # load PC
+    lwz   r0, 240(r1)
+    # restore CTR
+    mtctr r0
+
+    # adjust stack
+    addi  r1, r1, 244
+
+    # return transfer_t 
+    stw  r6, 0(r3)
+    stw  r5, 4(r3)
+
+    # jump to context
+    bctr

+ 203 - 88
modules/std/fiber/native/asm/jump_ppc32_sysv_xcoff_gas.S

@@ -1,88 +1,203 @@
-.globl .jump_fcontext
-.globl  jump_fcontext[DS]
-.align 2 
-.csect	jump_fcontext[DS]
-jump_fcontext:
-  .long	.jump_fcontext
-.jump_fcontext:
-    # reserve space on stack
-    subi 1, 1, 92
-
-    stw  13, 0(1)  # save R13
-    stw  14, 4(1)  # save R14
-    stw  15, 8(1)  # save R15
-    stw  16, 12(1)  # save R16
-    stw  17, 16(1)  # save R17
-    stw  18, 20(1)  # save R18
-    stw  19, 24(1)  # save R19
-    stw  20, 28(1)  # save R20
-    stw  21, 32(1)  # save R21
-    stw  22, 36(1)  # save R22
-    stw  23, 40(1)  # save R23
-    stw  24, 44(1)  # save R24
-    stw  25, 48(1)  # save R25
-    stw  26, 52(1)  # save R26
-    stw  27, 56(1)  # save R27
-    stw  28, 60(1)  # save R28
-    stw  29, 64(1)  # save R29
-    stw  30, 68(1)  # save R30
-    stw  31, 72(1)  # save R31
-    stw  3,  76(1)  # save hidden
-
-    # save CR
-    mfcr 0
-    stw 0, 80(1)
-    # save LR
-    mflr 0
-    stw 0, 84(1)
-    # save LR as PC
-    stw 0, 88(1)
-
-    # store RSP (pointing to context-data) in R6
-    mr  6, 1
-
-    # restore RSP (pointing to context-data) from R4
-    mr 1, 4
-
-    lwz  13, 0(1)  # restore R13
-    lwz  14, 4(1)  # restore R14
-    lwz  15, 8(1)  # restore R15
-    lwz  16, 12(1)  # restore R16
-    lwz  17, 16(1)  # restore R17
-    lwz  18, 20(1)  # restore R18
-    lwz  19, 24(1)  # restore R19
-    lwz  20, 28(1)  # restore R20
-    lwz  21, 32(1)  # restore R21
-    lwz  22, 36(1)  # restore R22
-    lwz  23, 40(1)  # restore R23
-    lwz  24, 44(1)  # restore R24
-    lwz  25, 48(1)  # restore R25
-    lwz  26, 52(1)  # restore R26
-    lwz  27, 56(1)  # restore R27
-    lwz  28, 60(1)  # restore R28
-    lwz  29, 64(1)  # restore R29
-    lwz  30, 68(1)  # restore R30
-    lwz  31, 72(1)  # restore R31
-    lwz  3,  76(1)  # restore hidden
-
-    # restore CR
-    lwz 0, 80(1)
-    mtcr 0
-    # restore LR
-    lwz 0, 84(1)
-    mtlr 0
-
-    # load PC
-    lwz 0, 88(1)
-    # restore CTR
-    mtctr 0
-
-    # adjust stack
-    addi 1, 1, 92
-
-    # return transfer_t 
-    stw  6, 0(3)
-    stw  5, 4(3)
-
-    # jump to context
-    bctr
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    F14    |    F15    |    F16    |    F17    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    F18    |    F19    |    F20    |    F21    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |    F22    |    F23    |    F24    |    F25    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |    F26    |    F27    |    F28    |    F29    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
+ *  -------------------------------------------------  *
+ *  |    F30    |    F31    |   fpscr   | R13 | R14 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
+ *  -------------------------------------------------  *
+ *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
+ *  -------------------------------------------------  *
+ *  | R15 | R16 | R17 | R18 | R19 | R20 | R21 | R22 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
+ *  -------------------------------------------------  *
+ *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
+ *  -------------------------------------------------  *
+ *  | R23 | R24 | R25 | R26 | R27 | R28 | R29 | R30 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
+ *  -------------------------------------------------  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
+ *  -------------------------------------------------  *
+ *  | R31 |hiddn|  CR |  LR |  PC |bchai|linkr| FCTX|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  64 |                                         |  *
+ *  -------------------------------------------------  *
+ *  | 256 |                                         |  *
+ *  -------------------------------------------------  *
+ *  | DATA|                                         |  * 
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+.globl .jump_fcontext
+.globl  jump_fcontext[DS]
+.align 2 
+.csect	jump_fcontext[DS]
+jump_fcontext:
+  .long	.jump_fcontext
+.jump_fcontext:
+    # reserve space on stack
+    subi  r1, r1, 244
+
+    stfd  f14, 0(r1)  # save F14
+    stfd  f15, 8(r1)  # save F15
+    stfd  f16, 16(r1)  # save F16
+    stfd  f17, 24(r1)  # save F17
+    stfd  f18, 32(r1)  # save F18
+    stfd  f19, 40(r1)  # save F19
+    stfd  f20, 48(r1)  # save F20
+    stfd  f21, 56(r1)  # save F21
+    stfd  f22, 64(r1)  # save F22
+    stfd  f23, 72(r1)  # save F23
+    stfd  f24, 80(r1)  # save F24
+    stfd  f25, 88(r1)  # save F25
+    stfd  f26, 96(r1)  # save F26
+    stfd  f27, 104(r1)  # save F27
+    stfd  f28, 112(r1)  # save F28
+    stfd  f29, 120(r1)  # save F29
+    stfd  f30, 128(r1)  # save F30
+    stfd  f31, 136(r1)  # save F31
+    mffs  f0  # load FPSCR
+    stfd  f0, 144(r1)  # save FPSCR
+
+    stw  r13, 152(r1)  # save R13
+    stw  r14, 156(r1)  # save R14
+    stw  r15, 160(r1)  # save R15
+    stw  r16, 164(r1)  # save R16
+    stw  r17, 168(r1)  # save R17
+    stw  r18, 172(r1)  # save R18
+    stw  r19, 176(r1)  # save R19
+    stw  r20, 180(r1)  # save R20
+    stw  r21, 184(r1)  # save R21
+    stw  r22, 188(r1)  # save R22
+    stw  r23, 192(r1)  # save R23
+    stw  r24, 196(r1)  # save R24
+    stw  r25, 200(r1)  # save R25
+    stw  r26, 204(r1)  # save R26
+    stw  r27, 208(r1)  # save R27
+    stw  r28, 212(r1)  # save R28
+    stw  r29, 216(r1)  # save R29
+    stw  r30, 220(r1)  # save R30
+    stw  r31, 224(r1)  # save R31
+    stw  r3,  228(r1)  # save hidden
+
+    # save CR
+    mfcr  r0
+    stw   r0, 232(r1)
+    # save LR
+    mflr  r0
+    stw   r0, 236(r1)
+    # save LR as PC
+    stw   r0, 240(r1)
+
+    # store RSP (pointing to context-data) in R6
+    mr  r6, r1
+
+    # restore RSP (pointing to context-data) from R4
+    mr  r1, r4
+
+    lfd  f14, 0(r1)  # restore F14
+    lfd  f15, 8(r1)  # restore F15
+    lfd  f16, 16(r1)  # restore F16
+    lfd  f17, 24(r1)  # restore F17
+    lfd  f18, 32(r1)  # restore F18
+    lfd  f19, 40(r1)  # restore F19
+    lfd  f20, 48(r1)  # restore F20
+    lfd  f21, 56(r1)  # restore F21
+    lfd  f22, 64(r1)  # restore F22
+    lfd  f23, 72(r1)  # restore F23
+    lfd  f24, 80(r1)  # restore F24
+    lfd  f25, 88(r1)  # restore F25
+    lfd  f26, 96(r1)  # restore F26
+    lfd  f27, 104(r1)  # restore F27
+    lfd  f28, 112(r1)  # restore F28
+    lfd  f29, 120(r1)  # restore F29
+    lfd  f30, 128(r1)  # restore F30
+    lfd  f31, 136(r1)  # restore F31
+    lfd  f0,  144(r1)  # load FPSCR
+    mtfsf  0xff, f0  # restore FPSCR
+
+    lwz  r13, 152(r1)  # restore R13
+    lwz  r14, 156(r1)  # restore R14
+    lwz  r15, 160(r1)  # restore R15
+    lwz  r16, 164(r1)  # restore R16
+    lwz  r17, 168(r1)  # restore R17
+    lwz  r18, 172(r1)  # restore R18
+    lwz  r19, 176(r1)  # restore R19
+    lwz  r20, 180(r1)  # restore R20
+    lwz  r21, 184(r1)  # restore R21
+    lwz  r22, 188(r1)  # restore R22
+    lwz  r23, 192(r1)  # restore R23
+    lwz  r24, 196(r1)  # restore R24
+    lwz  r25, 200(r1)  # restore R25
+    lwz  r26, 204(r1)  # restore R26
+    lwz  r27, 208(r1)  # restore R27
+    lwz  r28, 212(r1)  # restore R28
+    lwz  r29, 216(r1)  # restore R29
+    lwz  r30, 220(r1)  # restore R30
+    lwz  r31, 224(r1)  # restore R31
+    lwz  r3,  228(r1)  # restore hidden
+
+    # restore CR
+    lwz   r0, 232(r1)
+    mtcr  r0
+    # restore LR
+    lwz   r0, 236(r1)
+    mtlr  r0
+    # load PC
+    lwz   r0, 240(r1)
+    # restore CTR
+    mtctr r0
+
+    # adjust stack
+    addi  r1, r1, 244
+
+    # return transfer_t 
+    stw  r6, 0(r3)
+    stw  r5, 4(r3)
+
+    # jump to context
+    bctr

+ 220 - 195
modules/std/fiber/native/asm/jump_ppc64_sysv_elf_gas.S

@@ -1,195 +1,220 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
- *  -------------------------------------------------  *
- *  |    TOC    |    R14    |    R15    |    R16    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
- *  -------------------------------------------------  *
- *  |    R17    |    R18    |     R19   |    R20    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
- *  -------------------------------------------------  *
- *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
- *  -------------------------------------------------  *
- *  |    R21    |    R22    |    R23    |    R24    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
- *  -------------------------------------------------  *
- *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
- *  -------------------------------------------------  *
- *  |    R25    |    R26    |    R27    |    R28    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
- *  -------------------------------------------------  *
- *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
- *  -------------------------------------------------  *
- *  |    R29    |    R30    |    R31    |   hidden  |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
- *  -------------------------------------------------  *
- *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
- *  -------------------------------------------------  *
- *  |     CR    |     LR    |     PC    | back-chain|  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
- *  -------------------------------------------------  *
- *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
- *  -------------------------------------------------  *
- *  |  cr saved |  lr saved |  compiler |   linker  |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
- *  -------------------------------------------------  *
- *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
- *  -------------------------------------------------  *
- *  | TOC saved |    FCTX   |    DATA   |           |  *
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.globl jump_fcontext
-#if _CALL_ELF == 2
-	.text
-	.align 2
-jump_fcontext:
-        addis   %r2, %r12, .TOC.-jump_fcontext@ha
-        addi    %r2, %r2, .TOC.-jump_fcontext@l
-        .localentry jump_fcontext, . - jump_fcontext
-#else
-	.section ".opd","aw"
-	.align 3
-jump_fcontext:
-# ifdef _CALL_LINUX
-        .quad   .L.jump_fcontext,.TOC.@tocbase,0
-        .type   jump_fcontext,@function
-        .text
-        .align 2
-.L.jump_fcontext:
-# else
-        .hidden .jump_fcontext
-        .globl  .jump_fcontext
-        .quad   .jump_fcontext,.TOC.@tocbase,0
-        .size   jump_fcontext,24
-        .type   .jump_fcontext,@function
-        .text
-        .align 2
-.jump_fcontext:
-# endif
-#endif
-    # reserve space on stack
-    subi  %r1, %r1, 184
-
-#if _CALL_ELF != 2
-    std  %r2,  0(%r1)  # save TOC
-#endif
-    std  %r14, 8(%r1)  # save R14
-    std  %r15, 16(%r1)  # save R15
-    std  %r16, 24(%r1)  # save R16
-    std  %r17, 32(%r1)  # save R17
-    std  %r18, 40(%r1)  # save R18
-    std  %r19, 48(%r1)  # save R19
-    std  %r20, 56(%r1)  # save R20
-    std  %r21, 64(%r1)  # save R21
-    std  %r22, 72(%r1)  # save R22
-    std  %r23, 80(%r1)  # save R23
-    std  %r24, 88(%r1)  # save R24
-    std  %r25, 96(%r1)  # save R25
-    std  %r26, 104(%r1)  # save R26
-    std  %r27, 112(%r1)  # save R27
-    std  %r29, 120(%r1)  # save R28
-    std  %r29, 128(%r1)  # save R29
-    std  %r30, 136(%r1)  # save R30
-    std  %r31, 144(%r1)  # save R31
-    std  %r3,  152(%r1)  # save hidden
-
-    # save CR
-    mfcr  %r0
-    std   %r0, 160(%r1)
-    # save LR
-    mflr  %r0
-    std   %r0, 168(%r1)
-    # save LR as PC
-    std   %r0, 176(%r1)
-
-    # store RSP (pointing to context-data) in R6
-    mr  %r6, %r1
-
-    # restore RSP (pointing to context-data) from R4
-    mr  %r1, %r4
-
-#if _CALL_ELF != 2
-    ld  %r2,  0(%r1)  # restore TOC
-#endif
-    ld  %r14, 8(%r1)  # restore R14
-    ld  %r15, 16(%r1)  # restore R15
-    ld  %r16, 24(%r1)  # restore R16
-    ld  %r17, 32(%r1)  # restore R17
-    ld  %r18, 40(%r1)  # restore R18
-    ld  %r19, 48(%r1)  # restore R19
-    ld  %r20, 56(%r1)  # restore R20
-    ld  %r21, 64(%r1)  # restore R21
-    ld  %r22, 72(%r1)  # restore R22
-    ld  %r23, 80(%r1)  # restore R23
-    ld  %r24, 88(%r1)  # restore R24
-    ld  %r25, 96(%r1)  # restore R25
-    ld  %r26, 104(%r1)  # restore R26
-    ld  %r27, 112(%r1)  # restore R27
-    ld  %r28, 120(%r1)  # restore R28
-    ld  %r29, 128(%r1)  # restore R29
-    ld  %r30, 136(%r1)  # restore R30
-    ld  %r31, 144(%r1)  # restore R31
-    ld  %r3,  152(%r1)  # restore hidden
-
-    # restore CR
-    ld  %r0, 160(%r1)
-    mtcr  %r0
-    # restore LR
-    ld  %r0, 168(%r1)
-    mtlr  %r0
-
-    # load PC
-    ld  %r12, 176(%r1)
-    # restore CTR
-    mtctr  %r12
-
-    # adjust stack
-    addi  %r1, %r1, 184
-
-    # return transfer_t
-    std  %r6, 0(%r3)
-    std  %r5, 8(%r3)
-
-    # jump to context
-    bctr
-#if _CALL_ELF == 2
-	.size jump_fcontext, .-jump_fcontext
-#else
-# ifdef _CALL_LINUX
-	.size .jump_fcontext, .-.L.jump_fcontext
-# else
-	.size .jump_fcontext, .-.jump_fcontext
-# endif
-#endif
-
-
-/* Mark that we don't need executable stack.  */
-.section .note.GNU-stack,"",%progbits
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    TOC    |    R14    |    R15    |    R16    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    R17    |    R18    |     R19   |    R20    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |    R21    |    R22    |    R23    |    R24    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |    R25    |    R26    |    R27    |    R28    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
+ *  -------------------------------------------------  *
+ *  |    R29    |    R30    |    R31    |   hidden  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
+ *  -------------------------------------------------  *
+ *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
+ *  -------------------------------------------------  *
+ *  |     CR    |     LR    |     PC    | back-chain|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
+ *  -------------------------------------------------  *
+ *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
+ *  -------------------------------------------------  *
+ *  |  cr saved |  lr saved |  compiler |   linker  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
+ *  -------------------------------------------------  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
+ *  -------------------------------------------------  *
+ *  | TOC saved |    FCTX   |    DATA   |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.globl jump_fcontext
+#if _CALL_ELF == 2
+	.text
+	.align 2
+jump_fcontext:
+        addis   %r2, %r12, .TOC.-jump_fcontext@ha
+        addi    %r2, %r2, .TOC.-jump_fcontext@l
+        .localentry jump_fcontext, . - jump_fcontext
+#else
+	.section ".opd","aw"
+	.align 3
+jump_fcontext:
+# ifdef _CALL_LINUX
+        .quad   .L.jump_fcontext,.TOC.@tocbase,0
+        .type   jump_fcontext,@function
+        .text
+        .align 2
+.L.jump_fcontext:
+# else
+        .hidden .jump_fcontext
+        .globl  .jump_fcontext
+        .quad   .jump_fcontext,.TOC.@tocbase,0
+        .size   jump_fcontext,24
+        .type   .jump_fcontext,@function
+        .text
+        .align 2
+.jump_fcontext:
+# endif
+#endif
+    # reserve space on stack
+    subi  %r1, %r1, 184
+
+#if _CALL_ELF != 2
+    std  %r2,  0(%r1)  # save TOC
+#endif
+    std  %r14, 8(%r1)  # save R14
+    std  %r15, 16(%r1)  # save R15
+    std  %r16, 24(%r1)  # save R16
+    std  %r17, 32(%r1)  # save R17
+    std  %r18, 40(%r1)  # save R18
+    std  %r19, 48(%r1)  # save R19
+    std  %r20, 56(%r1)  # save R20
+    std  %r21, 64(%r1)  # save R21
+    std  %r22, 72(%r1)  # save R22
+    std  %r23, 80(%r1)  # save R23
+    std  %r24, 88(%r1)  # save R24
+    std  %r25, 96(%r1)  # save R25
+    std  %r26, 104(%r1)  # save R26
+    std  %r27, 112(%r1)  # save R27
+    std  %r28, 120(%r1)  # save R28
+    std  %r29, 128(%r1)  # save R29
+    std  %r30, 136(%r1)  # save R30
+    std  %r31, 144(%r1)  # save R31
+#if _CALL_ELF != 2
+    std  %r3,  152(%r1)  # save hidden
+#endif
+
+    # save CR
+    mfcr  %r0
+    std   %r0, 160(%r1)
+    # save LR
+    mflr  %r0
+    std   %r0, 168(%r1)
+    # save LR as PC
+    std   %r0, 176(%r1)
+
+    # store RSP (pointing to context-data) in R6
+    mr  %r6, %r1
+
+#if _CALL_ELF == 2
+    # restore RSP (pointing to context-data) from R3
+    mr  %r1, %r3
+#else
+    # restore RSP (pointing to context-data) from R4
+    mr  %r1, %r4
+
+    ld  %r2,  0(%r1)  # restore TOC
+#endif
+    ld  %r14, 8(%r1)  # restore R14
+    ld  %r15, 16(%r1)  # restore R15
+    ld  %r16, 24(%r1)  # restore R16
+    ld  %r17, 32(%r1)  # restore R17
+    ld  %r18, 40(%r1)  # restore R18
+    ld  %r19, 48(%r1)  # restore R19
+    ld  %r20, 56(%r1)  # restore R20
+    ld  %r21, 64(%r1)  # restore R21
+    ld  %r22, 72(%r1)  # restore R22
+    ld  %r23, 80(%r1)  # restore R23
+    ld  %r24, 88(%r1)  # restore R24
+    ld  %r25, 96(%r1)  # restore R25
+    ld  %r26, 104(%r1)  # restore R26
+    ld  %r27, 112(%r1)  # restore R27
+    ld  %r28, 120(%r1)  # restore R28
+    ld  %r29, 128(%r1)  # restore R29
+    ld  %r30, 136(%r1)  # restore R30
+    ld  %r31, 144(%r1)  # restore R31
+#if _CALL_ELF != 2
+    ld  %r3,  152(%r1)  # restore hidden
+#endif
+
+    # restore CR
+    ld  %r0, 160(%r1)
+    mtcr  %r0
+    # restore LR
+    ld  %r0, 168(%r1)
+    mtlr  %r0
+
+    # load PC
+    ld  %r12, 176(%r1)
+    # restore CTR
+    mtctr  %r12
+
+    # adjust stack
+    addi  %r1, %r1, 184
+
+#if _CALL_ELF == 2
+    # copy transfer_t into transfer_fn arg registers
+    mr  %r3, %r6
+    # arg pointer already in %r4
+
+    # jump to context
+    bctr
+	.size jump_fcontext, .-jump_fcontext
+#else
+    # zero in r3 indicates first jump to context-function
+    cmpdi %r3, 0
+    beq use_entry_arg
+
+    # return transfer_t
+    std  %r6, 0(%r3)
+    std  %r5, 8(%r3)
+
+    # jump to context
+    bctr
+
+use_entry_arg:
+    # copy transfer_t into transfer_fn arg registers
+    mr  %r3, %r6
+    mr  %r4, %r5
+
+    # jump to context
+    bctr
+# ifdef _CALL_LINUX
+	.size .jump_fcontext, .-.L.jump_fcontext
+# else
+	.size .jump_fcontext, .-.jump_fcontext
+# endif
+#endif
+
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 164 - 152
modules/std/fiber/native/asm/jump_ppc64_sysv_macho_gas.S

@@ -1,152 +1,164 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
- *  -------------------------------------------------  *
- *  |    TOC    |    R14    |    R15    |    R16    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
- *  -------------------------------------------------  *
- *  |    R17    |    R18    |     R19   |    R20    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
- *  -------------------------------------------------  *
- *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
- *  -------------------------------------------------  *
- *  |    R21    |    R22    |    R23    |    R24    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
- *  -------------------------------------------------  *
- *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
- *  -------------------------------------------------  *
- *  |    R25    |    R26    |    R27    |    R28    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
- *  -------------------------------------------------  *
- *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
- *  -------------------------------------------------  *
- *  |    R29    |    R30    |    R31    |   hidden  |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
- *  -------------------------------------------------  *
- *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
- *  -------------------------------------------------  *
- *  |     CR    |     LR    |     PC    | back-chain|  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
- *  -------------------------------------------------  *
- *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
- *  -------------------------------------------------  *
- *  |  cr saved |  lr saved |  compiler |   linker  |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
- *  -------------------------------------------------  *
- *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
- *  -------------------------------------------------  *
- *  | TOC saved |    FCTX   |    DATA   |           |  *
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.text
-.align 2
-.globl jump_fcontext
-
-_jump_fcontext:
-    ; reserve space on stack
-    subi  r1, r1, 184
-
-    std  %r14, 8(%r1)  ; save R14
-    std  %r15, 16(%r1)  ; save R15
-    std  %r16, 24(%r1)  ; save R16
-    std  %r17, 32(%r1)  ; save R17
-    std  %r18, 40(%r1)  ; save R18
-    std  %r19, 48(%r1)  ; save R19
-    std  %r20, 56(%r1)  ; save R20
-    std  %r21, 64(%r1)  ; save R21
-    std  %r22, 72(%r1)  ; save R22
-    std  %r23, 80(%r1)  ; save R23
-    std  %r24, 88(%r1)  ; save R24
-    std  %r25, 96(%r1)  ; save R25
-    std  %r26, 104(%r1)  ; save R26
-    std  %r27, 112(%r1)  ; save R27
-    std  %r29, 120(%r1)  ; save R28
-    std  %r29, 128(%r1)  ; save R29
-    std  %r30, 136(%r1)  ; save R30
-    std  %r31, 144(%r1)  ; save R31
-    std  %r3,  152(%r1)  ; save hidden
-
-    ; save CR
-    mfcr  r0
-    std  r0, 160(r1)
-    ; save LR
-    mflr  r0
-    std  r0, 168(r1)
-    ; save LR as PC
-    std  r0, 176(r1)
-
-    ; store RSP (pointing to context-data) in R6
-    mr  %r6, %r1
-
-    ; restore RSP (pointing to context-data) from R4
-    mr  r1, r4
-
-    ld  %r14, 8(%r1)  ; restore R14
-    ld  %r15, 16(%r1)  ; restore R15
-    ld  %r16, 24(%r1)  ; restore R16
-    ld  %r17, 32(%r1)  ; restore R17
-    ld  %r18, 40(%r1)  ; restore R18
-    ld  %r19, 48(%r1)  ; restore R19
-    ld  %r20, 56(%r1)  ; restore R20
-    ld  %r21, 64(%r1)  ; restore R21
-    ld  %r22, 72(%r1)  ; restore R22
-    ld  %r23, 80(%r1)  ; restore R23
-    ld  %r24, 88(%r1)  ; restore R24
-    ld  %r25, 96(%r1)  ; restore R25
-    ld  %r26, 104(%r1)  ; restore R26
-    ld  %r27, 112(%r1)  ; restore R27
-    ld  %r28, 120(%r1)  ; restore R28
-    ld  %r29, 128(%r1)  ; restore R29
-    ld  %r30, 136(%r1)  ; restore R30
-    ld  %r31, 144(%r1)  ; restore R31
-    ld  %r3,  152(%r1)  ; restore hidden
-
-    ; restore CR
-    ld  r0, 160(r1)
-    mtcr  r0
-    ; restore LR
-    ld  r0, 168(r1)
-    mtlr  r0
-
-    ; load PC
-    ld  r0, 176(r1)
-    ; restore CTR
-    mtctr  r0
-
-    ; adjust stack
-    addi  r1, r1, 184
-
-    ; return transfer_t
-    std  %r6, 0(%r3)
-    std  %r5, 8(%r3)
-
-    ; jump to context
-    bctr
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    TOC    |    R14    |    R15    |    R16    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    R17    |    R18    |     R19   |    R20    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |    R21    |    R22    |    R23    |    R24    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |    R25    |    R26    |    R27    |    R28    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
+ *  -------------------------------------------------  *
+ *  |    R29    |    R30    |    R31    |   hidden  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
+ *  -------------------------------------------------  *
+ *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
+ *  -------------------------------------------------  *
+ *  |     CR    |     LR    |     PC    | back-chain|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
+ *  -------------------------------------------------  *
+ *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
+ *  -------------------------------------------------  *
+ *  |  cr saved |  lr saved |  compiler |   linker  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
+ *  -------------------------------------------------  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
+ *  -------------------------------------------------  *
+ *  | TOC saved |    FCTX   |    DATA   |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.align 2
+.globl _jump_fcontext
+
+_jump_fcontext:
+    ; reserve space on stack
+    subi  r1, r1, 184
+
+    std  r14, 8(r1)  ; save R14
+    std  r15, 16(r1)  ; save R15
+    std  r16, 24(r1)  ; save R16
+    std  r17, 32(r1)  ; save R17
+    std  r18, 40(r1)  ; save R18
+    std  r19, 48(r1)  ; save R19
+    std  r20, 56(r1)  ; save R20
+    std  r21, 64(r1)  ; save R21
+    std  r22, 72(r1)  ; save R22
+    std  r23, 80(r1)  ; save R23
+    std  r24, 88(r1)  ; save R24
+    std  r25, 96(r1)  ; save R25
+    std  r26, 104(r1)  ; save R26
+    std  r27, 112(r1)  ; save R27
+    std  r28, 120(r1)  ; save R28
+    std  r29, 128(r1)  ; save R29
+    std  r30, 136(r1)  ; save R30
+    std  r31, 144(r1)  ; save R31
+    std  r3,  152(r1)  ; save hidden
+
+    ; save CR
+    mfcr  r0
+    std   r0, 160(r1)
+    ; save LR
+    mflr  r0
+    std   r0, 168(r1)
+    ; save LR as PC
+    std   r0, 176(r1)
+
+    ; store RSP (pointing to context-data) in R6
+    mr  r6, r1
+
+    ; restore RSP (pointing to context-data) from R4
+    mr  r1, r4
+
+    ld  r14, 8(r1)  ; restore R14
+    ld  r15, 16(r1)  ; restore R15
+    ld  r16, 24(r1)  ; restore R16
+    ld  r17, 32(r1)  ; restore R17
+    ld  r18, 40(r1)  ; restore R18
+    ld  r19, 48(r1)  ; restore R19
+    ld  r20, 56(r1)  ; restore R20
+    ld  r21, 64(r1)  ; restore R21
+    ld  r22, 72(r1)  ; restore R22
+    ld  r23, 80(r1)  ; restore R23
+    ld  r24, 88(r1)  ; restore R24
+    ld  r25, 96(r1)  ; restore R25
+    ld  r26, 104(r1)  ; restore R26
+    ld  r27, 112(r1)  ; restore R27
+    ld  r28, 120(r1)  ; restore R28
+    ld  r29, 128(r1)  ; restore R29
+    ld  r30, 136(r1)  ; restore R30
+    ld  r31, 144(r1)  ; restore R31
+    ld  r3,  152(r1)  ; restore hidden
+
+    ; restore CR
+    ld  r0, 160(r1)
+    mtcr  r0
+    ; restore LR
+    ld  r0, 168(r1)
+    mtlr  r0
+
+    ; load PC
+    ld  r12, 176(r1)
+    # restore CTR
+    mtctr  r12
+
+    # adjust stack
+    addi  r1, r1, 184
+
+    # zero in r3 indicates first jump to context-function
+    cmpdi r3, 0
+    beq use_entry_arg
+
+    # return transfer_t
+    std  r6, 0(r3)
+    std  r5, 8(r3)
+
+    # jump to context
+    bctr
+
+use_entry_arg:
+    # copy transfer_t into transfer_fn arg registers
+    mr  r3, r6
+    mr  r4, r5
+
+    # jump to context
+    bctr

+ 84 - 84
modules/std/fiber/native/asm/jump_ppc64_sysv_xcoff_gas.S

@@ -1,84 +1,84 @@
-.align 2
-.globl .jump_fcontext
-.jump_fcontext:
-    # reserve space on stack
-    subi  1, 1, 184
-
-    std  13, 0(1)  # save R13
-    std  14, 8(1)  # save R14
-    std  15, 16(1)  # save R15
-    std  16, 24(1)  # save R16
-    std  17, 32(1)  # save R17
-    std  18, 40(1)  # save R18
-    std  19, 48(1)  # save R19
-    std  20, 56(1)  # save R20
-    std  21, 64(1)  # save R21
-    std  22, 72(1)  # save R22
-    std  23, 80(1)  # save R23
-    std  24, 88(1)  # save R24
-    std  25, 96(1)  # save R25
-    std  26, 104(1)  # save R26
-    std  27, 112(1)  # save R27
-    std  29, 120(1)  # save R28
-    std  29, 128(1)  # save R29
-    std  30, 136(1)  # save R30
-    std  31, 144(1)  # save R31
-    std  3,  152(1)  # save hidden
-
-    # save CR
-    mfcr  0
-    std  0, 160(1)
-    # save LR
-    mflr  0
-    std  0, 168(1)
-    # save LR as PC
-    std  0, 176(1)
-
-    # store RSP (pointing to context-data) in R6
-    mr  6, 1
-
-    # restore RSP (pointing to context-data) from R4
-    mr  1, 4
-
-    ld  13, 0(1)  # restore R13
-    ld  14, 8(1)  # restore R14
-    ld  15, 16(1)  # restore R15
-    ld  16, 24(1)  # restore R16
-    ld  17, 32(1)  # restore R17
-    ld  18, 40(1)  # restore R18
-    ld  19, 48(1)  # restore R19
-    ld  20, 56(1)  # restore R20
-    ld  21, 64(1)  # restore R21
-    ld  22, 72(1)  # restore R22
-    ld  23, 80(1)  # restore R23
-    ld  24, 88(1)  # restore R24
-    ld  25, 96(1)  # restore R25
-    ld  26, 104(1)  # restore R26
-    ld  27, 112(1)  # restore R27
-    ld  28, 120(1)  # restore R28
-    ld  29, 128(1)  # restore R29
-    ld  30, 136(1)  # restore R30
-    ld  31, 144(1)  # restore R31
-    ld  3,  152(1)  # restore hidden
-
-    # restore CR
-    ld  0, 160(1)
-    mtcr  0
-    # restore LR
-    ld  0, 168(1)
-    mtlr  0
-
-    # load PC
-    ld  0, 176(1)
-    # restore CTR
-    mtctr  0
-
-    # adjust stack
-    addi  1, 1, 184
-
-    # return transfer_t
-    std  6, 0(3)
-    std  5, 8(3)
-
-    # jump to context
-    bctr
+.align 2
+.globl .jump_fcontext
+.jump_fcontext:
+    # reserve space on stack
+    subi  1, 1, 184
+
+    std  13, 0(1)  # save R13
+    std  14, 8(1)  # save R14
+    std  15, 16(1)  # save R15
+    std  16, 24(1)  # save R16
+    std  17, 32(1)  # save R17
+    std  18, 40(1)  # save R18
+    std  19, 48(1)  # save R19
+    std  20, 56(1)  # save R20
+    std  21, 64(1)  # save R21
+    std  22, 72(1)  # save R22
+    std  23, 80(1)  # save R23
+    std  24, 88(1)  # save R24
+    std  25, 96(1)  # save R25
+    std  26, 104(1)  # save R26
+    std  27, 112(1)  # save R27
+    std  29, 120(1)  # save R28
+    std  29, 128(1)  # save R29
+    std  30, 136(1)  # save R30
+    std  31, 144(1)  # save R31
+    std  3,  152(1)  # save hidden
+
+    # save CR
+    mfcr  0
+    std  0, 160(1)
+    # save LR
+    mflr  0
+    std  0, 168(1)
+    # save LR as PC
+    std  0, 176(1)
+
+    # store RSP (pointing to context-data) in R6
+    mr  6, 1
+
+    # restore RSP (pointing to context-data) from R4
+    mr  1, 4
+
+    ld  13, 0(1)  # restore R13
+    ld  14, 8(1)  # restore R14
+    ld  15, 16(1)  # restore R15
+    ld  16, 24(1)  # restore R16
+    ld  17, 32(1)  # restore R17
+    ld  18, 40(1)  # restore R18
+    ld  19, 48(1)  # restore R19
+    ld  20, 56(1)  # restore R20
+    ld  21, 64(1)  # restore R21
+    ld  22, 72(1)  # restore R22
+    ld  23, 80(1)  # restore R23
+    ld  24, 88(1)  # restore R24
+    ld  25, 96(1)  # restore R25
+    ld  26, 104(1)  # restore R26
+    ld  27, 112(1)  # restore R27
+    ld  28, 120(1)  # restore R28
+    ld  29, 128(1)  # restore R29
+    ld  30, 136(1)  # restore R30
+    ld  31, 144(1)  # restore R31
+    ld  3,  152(1)  # restore hidden
+
+    # restore CR
+    ld  0, 160(1)
+    mtcr  0
+    # restore LR
+    ld  0, 168(1)
+    mtlr  0
+
+    # load PC
+    ld  0, 176(1)
+    # restore CTR
+    mtctr  0
+
+    # adjust stack
+    addi  1, 1, 184
+
+    # return transfer_t
+    std  6, 0(3)
+    std  5, 8(3)
+
+    # jump to context
+    bctr

+ 209 - 140
modules/std/fiber/native/asm/jump_x86_64_ms_pe_gas.asm

@@ -1,140 +1,209 @@
-/*
-            Copyright Oliver Kowalke 2009.
-            Copyright Thomas Sailer 2013.
-   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)
-*/
-
-/**************************************************************************************
- *                                                                                    *
- * ---------------------------------------------------------------------------------- *
- * |     0   |     1   |     2    |     3   |     4   |     5   |     6   |     7   | *
- * ---------------------------------------------------------------------------------- *
- * |    0x0  |    0x4  |    0x8   |    0xc  |   0x10  |   0x14  |   0x18  |   0x1c  | *
- * ---------------------------------------------------------------------------------- *
- * |      fbr_strg     |      fc_dealloc    |       limit       |        base       | *
- * ---------------------------------------------------------------------------------- *
- * ---------------------------------------------------------------------------------- *
- * |     8   |    9    |    10    |    11   |    12   |    13   |    14   |    15   | *
- * ---------------------------------------------------------------------------------- *
- * |   0x20  |  0x24   |   0x28   |   0x2c  |   0x30  |   0x34  |   0x38  |   0x3c  | *
- * ---------------------------------------------------------------------------------- *
- * |        R12        |         R13        |        R14        |        R15        | *
- * ---------------------------------------------------------------------------------- *
- * ---------------------------------------------------------------------------------- *
- * |    16   |    17   |    18   |    19    |    20   |    21   |    22   |    23   | *
- * ---------------------------------------------------------------------------------- *
- * |   0xe40  |   0x44 |   0x48  |   0x4c   |   0x50  |   0x54  |   0x58  |   0x5c  | *
- * ---------------------------------------------------------------------------------- *
- * |        RDI         |       RSI         |        RBX        |        RBP        | *
- * ---------------------------------------------------------------------------------- *
- * ---------------------------------------------------------------------------------- *
- * |    24   |   25    |    26    |   27    |    28   |    29   |    30   |    31   | *
- * ---------------------------------------------------------------------------------- *
- * |   0x60  |   0x64  |   0x68   |   0x6c  |   0x70  |   0x74  |   0x78  |   0x7c  | *
- * ---------------------------------------------------------------------------------- *
- * |        hidden     |         RIP        |        EXIT       |   parameter area  | *
- * ---------------------------------------------------------------------------------- *
- * ---------------------------------------------------------------------------------- *
- * |    32   |   32    |    33    |   34    |    35   |    36   |    37   |    38   | *
- * ---------------------------------------------------------------------------------- *
- * |   0x80  |   0x84  |   0x88   |   0x8c  |   0x90  |   0x94  |   0x98  |   0x9c  | *
- * ---------------------------------------------------------------------------------- *
- * |                       parameter area                       |        FCTX       | *
- * ---------------------------------------------------------------------------------- *
- * ---------------------------------------------------------------------------------- *
- * |    39   |   40    |    41    |   42    |    43   |    44   |    45   |    46   | *
- * ---------------------------------------------------------------------------------- *
- * |   0xa0  |   0xa4  |   0xa8   |   0xac  |   0xb0  |   0xb4  |   0xb8  |   0xbc  | *
- * ---------------------------------------------------------------------------------- *
- * |       DATA        |                    |                   |                   | *
- * ---------------------------------------------------------------------------------- *
- *                                                                                    *
- * ***********************************************************************************/
-
-.file	"jump_x86_64_ms_pe_gas.asm"
-.text
-.p2align 4,,15
-.globl	jump_fcontext
-.def	jump_fcontext;	.scl	2;	.type	32;	.endef
-.seh_proc	jump_fcontext
-jump_fcontext:
-.seh_endprologue
-
-    pushq  %rcx  /* save hidden address of transport_t */
-
-    pushq  %rbp  /* save RBP */
-    pushq  %rbx  /* save RBX */
-    pushq  %rsi  /* save RSI */
-    pushq  %rdi  /* save RDI */
-    pushq  %r15  /* save R15 */
-    pushq  %r14  /* save R14 */
-    pushq  %r13  /* save R13 */
-    pushq  %r12  /* save R12 */
-
-    /* load NT_TIB */
-    movq  %gs:(0x30), %r10
-    /* save current stack base */
-    movq  0x08(%r10), %rax
-    pushq  %rax
-    /* save current stack limit */
-    movq  0x10(%r10), %rax
-    pushq  %rax
-    /* save current deallocation stack */
-    movq  0x1478(%r10), %rax
-    pushq  %rax
-    /* save fiber local storage */
-    movq  0x18(%r10), %rax
-    pushq  %rax
-
-    /* preserve RSP (pointing to context-data) in R9 */
-    movq  %rsp, %r9
-
-    /* restore RSP (pointing to context-data) from RDX */
-    movq  %rdx, %rsp
-
-    /* load NT_TIB */
-    movq  %gs:(0x30), %r10
-    /* restore fiber local storage */
-    popq  %rax
-    movq  %rax, 0x18(%r10)
-    /* restore deallocation stack */
-    popq  %rax
-    movq  %rax, 0x1478(%r10)
-    /* restore stack limit */
-    popq  %rax
-    movq  %rax, 0x10(%r10)
-    /* restore stack base */
-    popq  %rax
-    movq  %rax, 0x8(%r10)
-
-    popq  %r12  /* restore R12 */
-    popq  %r13  /* restore R13 */
-    popq  %r14  /* restore R14 */
-    popq  %r15  /* restore R15 */
-    popq  %rdi  /* restore RDI */
-    popq  %rsi  /* restore RSI */
-    popq  %rbx  /* restore RBX */
-    popq  %rbp  /* restore RBP */
-
-    popq  %rax  /* restore hidden address of transport_t */
-
-    /* restore return-address */
-    popq  %r10
-
-    /* transport_t returned in RAX */
-    /* return parent fcontext_t */
-    movq  %r9, (%rax)
-    /* return data */
-    movq  %r8, 0x8(%rax)
-
-    /* transport_t as 1.arg of context-function */
-    movq  %rax, %rcx
-
-    /* indirect jump to context */
-    jmp  *%r10
-.seh_endproc
-
-.section .drectve
-.ascii " -export:\"jump_fcontext\""
+/*
+            Copyright Oliver Kowalke 2009.
+            Copyright Thomas Sailer 2013.
+   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)
+*/
+
+/*************************************************************************************
+* ---------------------------------------------------------------------------------- *
+* |     0   |     1   |     2    |     3   |     4   |     5   |     6   |     7   | *
+* ---------------------------------------------------------------------------------- *
+* |    0x0  |    0x4  |    0x8   |    0xc  |   0x10  |   0x14  |   0x18  |   0x1c  | *
+* ---------------------------------------------------------------------------------- *
+* |                          SEE registers (XMM6-XMM15)                            | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |     8   |    9    |    10    |    11   |    12   |    13   |    14   |    15   | *
+* ---------------------------------------------------------------------------------- *
+* |   0x20  |  0x24   |   0x28   |   0x2c  |   0x30  |   0x34  |   0x38  |   0x3c  | *
+* ---------------------------------------------------------------------------------- *
+* |                          SEE registers (XMM6-XMM15)                            | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    16   |    17   |    18   |    19    |    20   |    21   |    22   |    23   | *
+* ---------------------------------------------------------------------------------- *
+* |   0xe40  |   0x44 |   0x48  |   0x4c   |   0x50  |   0x54  |   0x58  |   0x5c  | *
+* ---------------------------------------------------------------------------------- *
+* |                          SEE registers (XMM6-XMM15)                            | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    24   |   25    |    26    |   27    |    28   |    29   |    30   |    31   | *
+* ---------------------------------------------------------------------------------- *
+* |   0x60  |   0x64  |   0x68   |   0x6c  |   0x70  |   0x74  |   0x78  |   0x7c  | *
+* ---------------------------------------------------------------------------------- *
+* |                          SEE registers (XMM6-XMM15)                            | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    32   |   32    |    33    |   34    |    35   |    36   |    37   |    38   | *
+* ---------------------------------------------------------------------------------- *
+* |   0x80  |   0x84  |   0x88   |   0x8c  |   0x90  |   0x94  |   0x98  |   0x9c  | *
+* ---------------------------------------------------------------------------------- *
+* |                          SEE registers (XMM6-XMM15)                            | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    39   |   40    |    41    |   42    |    43   |    44   |    45   |    46   | *
+* ---------------------------------------------------------------------------------- *
+* |   0xa0  |   0xa4  |   0xa8   |   0xac  |   0xb0  |   0xb4  |   0xb8  |   0xbc  | *
+* ---------------------------------------------------------------------------------- *
+* | fc_mxcsr|fc_x87_cw|     <alignment>    |       fbr_strg    |      fc_dealloc   | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    47   |   48    |    49    |   50    |    51   |    52   |    53   |    54   | *
+* ---------------------------------------------------------------------------------- *
+* |   0xc0  |   0xc4  |   0xc8   |   0xcc  |   0xd0  |   0xd4  |   0xd8  |   0xdc  | *
+* ---------------------------------------------------------------------------------- *
+* |        limit      |         base       |         R12       |         R13       | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    55   |   56    |    57    |   58    |    59   |    60   |    61   |    62   | *
+* ---------------------------------------------------------------------------------- *
+* |   0xe0  |   0xe4  |   0xe8   |   0xec  |   0xf0  |   0xf4  |   0xf8  |   0xfc  | *
+* ---------------------------------------------------------------------------------- *
+* |        R14        |         R15        |         RDI       |        RSI        | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    63   |   64    |    65    |   66    |    67   |    68   |    69   |    70   | *
+* ---------------------------------------------------------------------------------- *
+* |  0x100  |  0x104  |  0x108   |  0x10c  |  0x110  |  0x114  |  0x118  |  0x11c  | *
+* ---------------------------------------------------------------------------------- *
+* |        RBX        |         RBP        |       hidden      |        RIP        | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    71   |   72    |    73    |   74    |    75   |    76   |    77   |    78   | *
+* ---------------------------------------------------------------------------------- *
+* |  0x120  |  0x124  |  0x128   |  0x12c  |  0x130  |  0x134  |  0x138  |  0x13c  | *
+* ---------------------------------------------------------------------------------- *
+* |                                   parameter area                               | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    79   |   80    |    81    |   82    |    83   |    84   |    85   |    86   | *
+* ---------------------------------------------------------------------------------- *
+* |  0x140  |  0x144  |  0x148   |  0x14c  |  0x150  |  0x154  |  0x158  |  0x15c  | *
+* ---------------------------------------------------------------------------------- *
+* |       FCTX        |        DATA        |                                       | *
+* ---------------------------------------------------------------------------------- *
+**************************************************************************************/
+
+.file	"jump_x86_64_ms_pe_gas.asm"
+.text
+.p2align 4,,15
+.globl	jump_fcontext
+.def	jump_fcontext;	.scl	2;	.type	32;	.endef
+.seh_proc	jump_fcontext
+jump_fcontext:
+.seh_endprologue
+
+    leaq  -0x118(%rsp), %rsp /* prepare stack */
+
+#if !defined(BOOST_USE_TSX)
+    /* save XMM storage */
+    movaps  %xmm6, 0x0(%rsp)
+    movaps  %xmm7, 0x10(%rsp)
+    movaps  %xmm8, 0x20(%rsp)
+    movaps  %xmm9, 0x30(%rsp)
+    movaps  %xmm10, 0x40(%rsp)
+    movaps  %xmm11, 0x50(%rsp)
+    movaps  %xmm12, 0x60(%rsp)
+    movaps  %xmm13, 0x70(%rsp)
+    movaps  %xmm14, 0x80(%rsp)
+    movaps  %xmm15, 0x90(%rsp)
+    stmxcsr  0xa0(%rsp)  /* save MMX control- and status-word */
+    fnstcw   0xa4(%rsp)  /* save x87 control-word */
+#endif
+
+    /* load NT_TIB */
+    movq  %gs:(0x30), %r10
+    /* save fiber local storage */
+    movq  0x20(%r10), %rax
+    movq  %rax, 0xb0(%rsp)
+    /* save current deallocation stack */
+    movq  0x1478(%r10), %rax
+    movq  %rax, 0xb8(%rsp)
+    /* save current stack limit */
+    movq  0x10(%r10), %rax
+    movq  %rax, 0xc0(%rsp)
+    /* save current stack base */
+    movq  0x08(%r10), %rax
+    movq  %rax, 0xc8(%rsp)
+
+    movq  %r12, 0xd0(%rsp)  /* save R12 */
+    movq  %r13, 0xd8(%rsp)  /* save R13 */
+    movq  %r14, 0xe0(%rsp)  /* save R14 */
+    movq  %r15, 0xe8(%rsp)  /* save R15 */
+    movq  %rdi, 0xf0(%rsp)  /* save RDI */
+    movq  %rsi, 0xf8(%rsp)  /* save RSI */
+    movq  %rbx, 0x100(%rsp)  /* save RBX */
+    movq  %rbp, 0x108(%rsp)  /* save RBP */
+
+    movq  %rcx, 0x110(%rsp)  /* save hidden address of transport_t */
+
+    /* preserve RSP (pointing to context-data) in R9 */
+    movq  %rsp, %r9
+
+    /* restore RSP (pointing to context-data) from RDX */
+    movq  %rdx, %rsp
+
+#if !defined(BOOST_USE_TSX)
+    /* restore XMM storage */
+    movaps  0x0(%rsp), %xmm6
+    movaps  0x10(%rsp), %xmm7
+    movaps  0x20(%rsp), %xmm8
+    movaps  0x30(%rsp), %xmm9
+    movaps  0x40(%rsp), %xmm10
+    movaps  0x50(%rsp), %xmm11
+    movaps  0x60(%rsp), %xmm12
+    movaps  0x70(%rsp), %xmm13
+    movaps  0x80(%rsp), %xmm14
+    movaps  0x90(%rsp), %xmm15
+ 	ldmxcsr 0xa0(%rsp) /* restore MMX control- and status-word */
+ 	fldcw   0xa4(%rsp) /* restore x87 control-word */
+#endif
+
+    /* load NT_TIB */
+    movq  %gs:(0x30), %r10
+    /* restore fiber local storage */
+    movq  0xb0(%rsp), %rax
+    movq  %rax, 0x20(%r10)
+    /* restore current deallocation stack */
+    movq  0xb8(%rsp), %rax
+    movq  %rax, 0x1478(%r10)
+    /* restore current stack limit */
+    movq  0xc0(%rsp), %rax
+    movq  %rax, 0x10(%r10)
+    /* restore current stack base */
+    movq  0xc8(%rsp), %rax
+    movq  %rax, 0x08(%r10)
+
+    movq  0xd0(%rsp),  %r12  /* restore R12 */
+    movq  0xd8(%rsp),  %r13  /* restore R13 */
+    movq  0xe0(%rsp),  %r14  /* restore R14 */
+    movq  0xe8(%rsp),  %r15  /* restore R15 */
+    movq  0xf0(%rsp),  %rdi  /* restore RDI */
+    movq  0xf8(%rsp),  %rsi  /* restore RSI */
+    movq  0x100(%rsp), %rbx  /* restore RBX */
+    movq  0x108(%rsp), %rbp  /* restore RBP */
+
+    movq  0x110(%rsp), %rax  /* restore hidden address of transport_t */
+
+    leaq  0x118(%rsp), %rsp /* prepare stack */
+
+    /* restore return-address */
+    popq  %r10
+
+    /* transport_t returned in RAX */
+    /* return parent fcontext_t */
+    movq  %r9, 0x0(%rax)
+    /* return data */
+    movq  %r8, 0x8(%rax)
+
+    /* transport_t as 1.arg of context-function */
+    movq  %rax, %rcx
+
+    /* indirect jump to context */
+    jmp  *%r10
+.seh_endproc
+
+.section .drectve
+.ascii " -export:\"jump_fcontext\""

+ 124 - 47
modules/std/fiber/native/asm/jump_x86_64_ms_pe_masm.asm

@@ -9,74 +9,130 @@
 ;  ----------------------------------------------------------------------------------
 ;  |    0x0  |    0x4  |    0x8   |    0xc  |   0x10  |   0x14  |   0x18  |   0x1c  |
 ;  ----------------------------------------------------------------------------------
-;  |      fbr_strg     |      fc_dealloc    |       limit       |        base       |
+;  |                          SEE registers (XMM6-XMM15)                            |
 ;  ----------------------------------------------------------------------------------
 ;  ----------------------------------------------------------------------------------
 ;  |     8   |    9    |    10    |    11   |    12   |    13   |    14   |    15   |
 ;  ----------------------------------------------------------------------------------
 ;  |   0x20  |  0x24   |   0x28   |   0x2c  |   0x30  |   0x34  |   0x38  |   0x3c  |
 ;  ----------------------------------------------------------------------------------
-;  |        R12        |         R13        |        R14        |        R15        |
+;  |                          SEE registers (XMM6-XMM15)                            |
 ;  ----------------------------------------------------------------------------------
 ;  ----------------------------------------------------------------------------------
 ;  |    16   |    17   |    18   |    19    |    20   |    21   |    22   |    23   |
 ;  ----------------------------------------------------------------------------------
 ;  |   0xe40  |   0x44 |   0x48  |   0x4c   |   0x50  |   0x54  |   0x58  |   0x5c  |
 ;  ----------------------------------------------------------------------------------
-;  |        RDI         |       RSI         |        RBX        |        RBP        |
+;  |                          SEE registers (XMM6-XMM15)                            |
 ;  ----------------------------------------------------------------------------------
 ;  ----------------------------------------------------------------------------------
 ;  |    24   |   25    |    26    |   27    |    28   |    29   |    30   |    31   |
 ;  ----------------------------------------------------------------------------------
 ;  |   0x60  |   0x64  |   0x68   |   0x6c  |   0x70  |   0x74  |   0x78  |   0x7c  |
 ;  ----------------------------------------------------------------------------------
-;  |        hidden     |         RIP        |       EXIT        |   parameter area  |
+;  |                          SEE registers (XMM6-XMM15)                            |
 ;  ----------------------------------------------------------------------------------
 ;  ----------------------------------------------------------------------------------
 ;  |    32   |   32    |    33    |   34    |    35   |    36   |    37   |    38   |
 ;  ----------------------------------------------------------------------------------
 ;  |   0x80  |   0x84  |   0x88   |   0x8c  |   0x90  |   0x94  |   0x98  |   0x9c  |
 ;  ----------------------------------------------------------------------------------
-;  |                       parameter area                       |        FCTX       |
+;  |                          SEE registers (XMM6-XMM15)                            |
 ;  ----------------------------------------------------------------------------------
 ;  ----------------------------------------------------------------------------------
 ;  |    39   |   40    |    41    |   42    |    43   |    44   |    45   |    46   |
 ;  ----------------------------------------------------------------------------------
 ;  |   0xa0  |   0xa4  |   0xa8   |   0xac  |   0xb0  |   0xb4  |   0xb8  |   0xbc  |
 ;  ----------------------------------------------------------------------------------
-;  |       DATA        |                    |                   |                   |
+;  | fc_mxcsr|fc_x87_cw|     <alignment>    |       fbr_strg    |      fc_dealloc   |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    47   |   48    |    49    |   50    |    51   |    52   |    53   |    54   |
+;  ----------------------------------------------------------------------------------
+;  |   0xc0  |   0xc4  |   0xc8   |   0xcc  |   0xd0  |   0xd4  |   0xd8  |   0xdc  |
+;  ----------------------------------------------------------------------------------
+;  |        limit      |         base       |         R12       |         R13       |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    55   |   56    |    57    |   58    |    59   |    60   |    61   |    62   |
+;  ----------------------------------------------------------------------------------
+;  |   0xe0  |   0xe4  |   0xe8   |   0xec  |   0xf0  |   0xf4  |   0xf8  |   0xfc  |
+;  ----------------------------------------------------------------------------------
+;  |        R14        |         R15        |         RDI       |        RSI        |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    63   |   64    |    65    |   66    |    67   |    68   |    69   |    70   |
+;  ----------------------------------------------------------------------------------
+;  |  0x100  |  0x104  |  0x108   |  0x10c  |  0x110  |  0x114  |  0x118  |  0x11c  |
+;  ----------------------------------------------------------------------------------
+;  |        RBX        |         RBP        |       hidden      |        RIP        |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    71   |   72    |    73    |   74    |    75   |    76   |    77   |    78   |
+;  ----------------------------------------------------------------------------------
+;  |  0x120  |  0x124  |  0x128   |  0x12c  |  0x130  |  0x134  |  0x138  |  0x13c  |
+;  ----------------------------------------------------------------------------------
+;  |                                   parameter area                               |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    79   |   80    |    81    |   82    |    83   |    84   |    85   |    86   |
+;  ----------------------------------------------------------------------------------
+;  |  0x140  |  0x144  |  0x148   |  0x14c  |  0x150  |  0x154  |  0x158  |  0x15c  |
+;  ----------------------------------------------------------------------------------
+;  |       FCTX        |        DATA        |                                       |
 ;  ----------------------------------------------------------------------------------
 
 .code
 
 jump_fcontext PROC BOOST_CONTEXT_EXPORT FRAME
-    .endprolog
-
-    push  rcx  ; save hidden address of transport_t
-
-    push  rbp  ; save RBP
-    push  rbx  ; save RBX
-    push  rsi  ; save RSI
-    push  rdi  ; save RDI
-    push  r15  ; save R15
-    push  r14  ; save R14
-    push  r13  ; save R13
-    push  r12  ; save R12
+.endprolog
+
+    ; prepare stack
+    lea rsp, [rsp-0118h]
+
+IFNDEF BOOST_USE_TSX
+    ; save XMM storage
+    movaps  [rsp], xmm6
+    movaps  [rsp+010h], xmm7
+    movaps  [rsp+020h], xmm8
+    movaps  [rsp+030h], xmm9
+    movaps  [rsp+040h], xmm10
+    movaps  [rsp+050h], xmm11
+    movaps  [rsp+060h], xmm12
+    movaps  [rsp+070h], xmm13
+    movaps  [rsp+080h], xmm14
+    movaps  [rsp+090h], xmm15
+    ; save MMX control- and status-word
+    stmxcsr  [rsp+0a0h]
+    ; save x87 control-word
+    fnstcw  [rsp+0a4h]
+ENDIF
 
     ; load NT_TIB
     mov  r10,  gs:[030h]
-    ; save current stack base
-    mov  rax,  [r10+08h]
-    push  rax
-    ; save current stack limit
-    mov  rax, [r10+010h]
-    push  rax
+    ; save fiber local storage
+    mov  rax, [r10+020h]
+    mov  [rsp+0b0h], rax
     ; save current deallocation stack
     mov  rax, [r10+01478h]
-    push  rax
-    ; save fiber local storage
-    mov  rax, [r10+018h]
-    push  rax
+    mov  [rsp+0b8h], rax
+    ; save current stack limit
+    mov  rax, [r10+010h]
+    mov  [rsp+0c0h], rax
+    ; save current stack base
+    mov  rax,  [r10+08h]
+    mov  [rsp+0c8h], rax
+
+    mov [rsp+0d0h], r12  ; save R12
+    mov [rsp+0d8h], r13  ; save R13
+    mov [rsp+0e0h], r14  ; save R14
+    mov [rsp+0e8h], r15  ; save R15
+    mov [rsp+0f0h], rdi  ; save RDI
+    mov [rsp+0f8h], rsi  ; save RSI
+    mov [rsp+0100h], rbx  ; save RBX
+    mov [rsp+0108h], rbp  ; save RBP
+
+    mov [rsp+0110h], rcx  ; save hidden address of transport_t
 
     ; preserve RSP (pointing to context-data) in R9
     mov  r9, rsp
@@ -84,33 +140,54 @@ jump_fcontext PROC BOOST_CONTEXT_EXPORT FRAME
     ; restore RSP (pointing to context-data) from RDX
     mov  rsp, rdx
 
+IFNDEF BOOST_USE_TSX
+    ; restore XMM storage
+    movaps  xmm6, [rsp]
+    movaps  xmm7, [rsp+010h]
+    movaps  xmm8, [rsp+020h]
+    movaps  xmm9, [rsp+030h]
+    movaps  xmm10, [rsp+040h]
+    movaps  xmm11, [rsp+050h]
+    movaps  xmm12, [rsp+060h]
+    movaps  xmm13, [rsp+070h]
+    movaps  xmm14, [rsp+080h]
+    movaps  xmm15, [rsp+090h]
+    ; restore MMX control- and status-word
+    ldmxcsr  [rsp+0a0h]
+    ; save x87 control-word
+    fldcw   [rsp+0a4h]
+ENDIF
+
     ; load NT_TIB
-    mov  r10, gs:[030h]
+    mov  r10,  gs:[030h]
     ; restore fiber local storage
-    pop  rax
-    mov  [r10+018h], rax
-    ; restore deallocation stack
-    pop  rax
+    mov  rax, [rsp+0b0h]
+    mov  [r10+020h], rax
+    ; restore current deallocation stack
+    mov  rax, [rsp+0b8h]
     mov  [r10+01478h], rax
-    ; restore stack limit
-    pop  rax
+    ; restore current stack limit
+    mov  rax, [rsp+0c0h]
     mov  [r10+010h], rax
-    ; restore stack base
-    pop  rax
+    ; restore current stack base
+    mov  rax, [rsp+0c8h]
     mov  [r10+08h], rax
 
-    pop  r12  ; restore R12
-    pop  r13  ; restore R13
-    pop  r14  ; restore R14
-    pop  r15  ; restore R15
-    pop  rdi  ; restore RDI
-    pop  rsi  ; restore RSI
-    pop  rbx  ; restore RBX
-    pop  rbp  ; restore RBP
+    mov r12, [rsp+0d0h]  ; restore R12
+    mov r13, [rsp+0d8h]  ; restore R13
+    mov r14, [rsp+0e0h]  ; restore R14
+    mov r15, [rsp+0e8h]  ; restore R15
+    mov rdi, [rsp+0f0h]  ; restore RDI
+    mov rsi, [rsp+0f8h]  ; restore RSI
+    mov rbx, [rsp+0100h]  ; restore RBX
+    mov rbp, [rsp+0108h]  ; restore RBP
+
+    mov rax, [rsp+0110h] ; restore hidden address of transport_t
 
-    pop  rax  ; restore hidden address of transport_t
+    ; prepare stack
+    lea rsp, [rsp+0118h]
 
-    ; restore return-address
+    ; load return-address
     pop  r10
 
     ; transport_t returned in RAX

+ 80 - 67
modules/std/fiber/native/asm/jump_x86_64_sysv_elf_gas.S

@@ -1,67 +1,80 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/****************************************************************************************
- *                                                                                      *
- *  ----------------------------------------------------------------------------------  *
- *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
- *  ----------------------------------------------------------------------------------  *
- *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
- *  ----------------------------------------------------------------------------------  *
- *  |        R12        |         R13       |         R14        |        R15        |  *
- *  ----------------------------------------------------------------------------------  *
- *  ----------------------------------------------------------------------------------  *
- *  |    8    |    9    |   10    |   11    |    12    |    13   |    14   |    15   |  *
- *  ----------------------------------------------------------------------------------  *
- *  |   0x20  |   0x24  |   0x28  |  0x2c   |   0x30   |   0x34  |   0x38  |   0x3c  |  *
- *  ----------------------------------------------------------------------------------  *
- *  |        RBX        |         RBP       |         RIP        |       EXIT        |  *
- *  ----------------------------------------------------------------------------------  *
- *                                                                                      *
- ****************************************************************************************/
-
-.text
-.globl jump_fcontext
-.type jump_fcontext,@function
-.align 16
-jump_fcontext:
-    pushq  %rbp  /* save RBP */
-    pushq  %rbx  /* save RBX */
-    pushq  %r15  /* save R15 */
-    pushq  %r14  /* save R14 */
-    pushq  %r13  /* save R13 */
-    pushq  %r12  /* save R12 */
-
-    /* store RSP (pointing to context-data) in RAX */
-    movq  %rsp, %rax
-
-    /* restore RSP (pointing to context-data) from RDI */
-    movq  %rdi, %rsp
-
-    popq  %r12  /* restrore R12 */
-    popq  %r13  /* restrore R13 */
-    popq  %r14  /* restrore R14 */
-    popq  %r15  /* restrore R15 */
-    popq  %rbx  /* restrore RBX */
-    popq  %rbp  /* restrore RBP */
-
-    /* restore return-address */
-    popq  %r8
-
-    /* return transfer_t from jump */
-    /* RAX == fctx, RDX == data */
-    movq  %rsi, %rdx
-    /* pass transfer_t as first arg in context function */
-    /* RDI == fctx, RSI == data */
-    movq  %rax, %rdi
-
-    /* indirect jump to context */
-    jmp  *%r8
-.size jump_fcontext,.-jump_fcontext
-
-/* Mark that we don't need executable stack.  */
-.section .note.GNU-stack,"",%progbits
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/****************************************************************************************
+ *                                                                                      *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  | fc_mxcsr|fc_x87_cw|        R12        |         R13        |        R14        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    8    |    9    |   10    |   11    |    12    |    13   |    14   |    15   |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x20  |   0x24  |   0x28  |  0x2c   |   0x30   |   0x34  |   0x38  |   0x3c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |        R15        |        RBX        |         RBP        |        RIP        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *                                                                                      *
+ ****************************************************************************************/
+
+.text
+.globl jump_fcontext
+.type jump_fcontext,@function
+.align 16
+jump_fcontext:
+    leaq  -0x38(%rsp), %rsp /* prepare stack */
+
+#if !defined(BOOST_USE_TSX)
+    stmxcsr  (%rsp)     /* save MMX control- and status-word */
+    fnstcw   0x4(%rsp)  /* save x87 control-word */
+#endif
+
+    movq  %r12, 0x8(%rsp)  /* save R12 */
+    movq  %r13, 0x10(%rsp)  /* save R13 */
+    movq  %r14, 0x18(%rsp)  /* save R14 */
+    movq  %r15, 0x20(%rsp)  /* save R15 */
+    movq  %rbx, 0x28(%rsp)  /* save RBX */
+    movq  %rbp, 0x30(%rsp)  /* save RBP */
+
+    /* store RSP (pointing to context-data) in RAX */
+    movq  %rsp, %rax
+
+    /* restore RSP (pointing to context-data) from RDI */
+    movq  %rdi, %rsp
+
+    movq  0x38(%rsp), %r8  /* restore return-address */
+
+#if !defined(BOOST_USE_TSX)
+    ldmxcsr  (%rsp)     /* restore MMX control- and status-word */
+    fldcw    0x4(%rsp)  /* restore x87 control-word */
+#endif
+
+    movq  0x8(%rsp), %r12  /* restore R12 */
+    movq  0x10(%rsp), %r13  /* restore R13 */
+    movq  0x18(%rsp), %r14  /* restore R14 */
+    movq  0x20(%rsp), %r15  /* restore R15 */
+    movq  0x28(%rsp), %rbx  /* restore RBX */
+    movq  0x30(%rsp), %rbp  /* restore RBP */
+
+    leaq  0x40(%rsp), %rsp /* prepare stack */
+
+    /* return transfer_t from jump */
+    /* RAX == fctx, RDX == data */
+    movq  %rsi, %rdx
+    /* pass transfer_t as first arg in context function */
+    /* RDI == fctx, RSI == data */
+    movq  %rax, %rdi
+
+    /* indirect jump to context */
+    jmp  *%r8
+.size jump_fcontext,.-jump_fcontext
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 75 - 62
modules/std/fiber/native/asm/jump_x86_64_sysv_macho_gas.S

@@ -1,62 +1,75 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/****************************************************************************************
- *                                                                                      *
- *  ----------------------------------------------------------------------------------  *
- *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
- *  ----------------------------------------------------------------------------------  *
- *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
- *  ----------------------------------------------------------------------------------  *
- *  |        R12        |         R13       |         R14        |        R15        |  *
- *  ----------------------------------------------------------------------------------  *
- *  ----------------------------------------------------------------------------------  *
- *  |    8    |    9    |   10    |   11    |    12    |    13   |    14   |    15   |  *
- *  ----------------------------------------------------------------------------------  *
- *  |   0x20  |   0x24  |   0x28  |  0x2c   |   0x30   |   0x34  |   0x38  |   0x3c  |  *
- *  ----------------------------------------------------------------------------------  *
- *  |        RBX        |         RBP       |         RIP        |       EXIT        |  *
- *  ----------------------------------------------------------------------------------  *
- *                                                                                      *
- ****************************************************************************************/
-
-.text
-.globl _jump_fcontext
-.align 8
-_jump_fcontext:
-    pushq  %rbp  /* save RBP */
-    pushq  %rbx  /* save RBX */
-    pushq  %r15  /* save R15 */
-    pushq  %r14  /* save R14 */
-    pushq  %r13  /* save R13 */
-    pushq  %r12  /* save R12 */
-
-    /* store RSP (pointing to context-data) in RAX */
-    movq  %rsp, %rax
-
-    /* restore RSP (pointing to context-data) from RDI */
-    movq  %rdi, %rsp
-
-    popq  %r12  /* restrore R12 */
-    popq  %r13  /* restrore R13 */
-    popq  %r14  /* restrore R14 */
-    popq  %r15  /* restrore R15 */
-    popq  %rbx  /* restrore RBX */
-    popq  %rbp  /* restrore RBP */
-
-    /* restore return-address */
-    popq  %r8
-
-    /* return transfer_t from jump */
-    /* RAX == fctx, RDX == data */
-    movq  %rsi, %rdx
-    /* pass transfer_t as first arg in context function */
-    /* RDI == fctx, RSI == data */
-    movq  %rax, %rdi
-
-    /* indirect jump to context */
-    jmp  *%r8
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/****************************************************************************************
+ *                                                                                      *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  | fc_mxcsr|fc_x87_cw|        R12        |         R13        |        R14        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    8    |    9    |   10    |   11    |    12    |    13   |    14   |    15   |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x20  |   0x24  |   0x28  |  0x2c   |   0x30   |   0x34  |   0x38  |   0x3c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |        R15        |        RBX        |         RBP        |        RIP        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *                                                                                      *
+ ****************************************************************************************/
+
+.text
+.globl _jump_fcontext
+.align 8
+_jump_fcontext:
+    leaq  -0x38(%rsp), %rsp /* prepare stack */
+
+#if !defined(BOOST_USE_TSX)
+    stmxcsr  (%rsp)     /* save MMX control- and status-word */
+    fnstcw   0x4(%rsp)  /* save x87 control-word */
+#endif
+
+    movq  %r12, 0x8(%rsp)  /* save R12 */
+    movq  %r13, 0x10(%rsp)  /* save R13 */
+    movq  %r14, 0x18(%rsp)  /* save R14 */
+    movq  %r15, 0x20(%rsp)  /* save R15 */
+    movq  %rbx, 0x28(%rsp)  /* save RBX */
+    movq  %rbp, 0x30(%rsp)  /* save RBP */
+
+    /* store RSP (pointing to context-data) in RAX */
+    movq  %rsp, %rax
+
+    /* restore RSP (pointing to context-data) from RDI */
+    movq  %rdi, %rsp
+
+    movq  0x38(%rsp), %r8  /* restore return-address */
+
+#if !defined(BOOST_USE_TSX)
+    ldmxcsr  (%rsp)     /* restore MMX control- and status-word */
+    fldcw    0x4(%rsp)  /* restore x87 control-word */
+#endif
+
+    movq  0x8(%rsp), %r12  /* restore R12 */
+    movq  0x10(%rsp), %r13  /* restore R13 */
+    movq  0x18(%rsp), %r14  /* restore R14 */
+    movq  0x20(%rsp), %r15  /* restore R15 */
+    movq  0x28(%rsp), %rbx  /* restore RBX */
+    movq  0x30(%rsp), %rbp  /* restore RBP */
+
+    leaq  0x40(%rsp), %rsp /* prepare stack */
+
+    /* return transfer_t from jump */
+    /* RAX == fctx, RDX == data */
+    movq  %rsi, %rdx
+    /* pass transfer_t as first arg in context function */
+    /* RDI == fctx, RSI == data */
+    movq  %rax, %rdi
+
+    /* indirect jump to context */
+    jmp  *%r8

+ 84 - 71
modules/std/fiber/native/asm/make_arm64_aapcs_elf_gas.S

@@ -1,71 +1,84 @@
-/*
-            Copyright Edward Nevill + Oliver Kowalke 2015
-   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)
-*/
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
- *  -------------------------------------------------  *
- *  |    x19    |    x20    |    x21    |    x22    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
- *  -------------------------------------------------  *
- *  |    x23    |    x24    |    x25    |    x26    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
- *  -------------------------------------------------  *
- *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
- *  -------------------------------------------------  *
- *  |    x27    |    x28    |    FP     |     LR    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
- *  -------------------------------------------------  *
- *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
- *  -------------------------------------------------  *
- *  |     PC    |   align   |           |           |  *
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.cpu    generic+fp+simd
-.text
-.align  2
-.global make_fcontext
-.type   make_fcontext, %function
-make_fcontext:
-    # shift address in x0 (allocated stack) to lower 16 byte boundary
-    and x0, x0, ~0xF
-
-    # reserve space for context-data on context-stack
-    sub  x0, x0, #0x70
-
-    # third arg of make_fcontext() == address of context-function
-    # store address as a PC to jump in
-    str  x2, [x0, #0x60]
-
-    # save address of finish as return-address for context-function
-    # will be entered after context-function returns (LR register)
-    adr  x1, finish
-    str  x1, [x0, #0x58]
-
-    ret  x30 // return pointer to context-data (x0)
-
-finish:
-    # exit code is zero
-    mov  x0, #0
-    # exit application
-    bl  _exit
-
-.size   make_fcontext,.-make_fcontext
-# Mark that we don't need executable stack.
-.section .note.GNU-stack,"",%progbits
+/*
+            Copyright Edward Nevill + Oliver Kowalke 2015
+   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)
+*/
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  |    d8     |    d9     |    d10    |    d11    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |    d12    |    d13    |    d14    |    d15    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
+ *  -------------------------------------------------  *
+ *  |    x19    |    x20    |    x21    |    x22    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
+ *  -------------------------------------------------  *
+ *  |    x23    |    x24    |    x25    |    x26    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c|  *
+ *  -------------------------------------------------  *
+ *  |    x27    |    x28    |    FP     |     LR    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 | 43  |           |           |  *
+ *  -------------------------------------------------  *
+ *  | 0xa0| 0xa4| 0xa8| 0xac|           |           |  *
+ *  -------------------------------------------------  *
+ *  |     PC    |   align   |           |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.align  2
+.global make_fcontext
+.type   make_fcontext, %function
+make_fcontext:
+    # shift address in x0 (allocated stack) to lower 16 byte boundary
+    and x0, x0, ~0xF
+
+    # reserve space for context-data on context-stack
+    sub  x0, x0, #0xb0
+
+    # third arg of make_fcontext() == address of context-function
+    # store address as a PC to jump in
+    str  x2, [x0, #0xa0]
+
+    # save address of finish as return-address for context-function
+    # will be entered after context-function returns (LR register)
+    adr  x1, finish
+    str  x1, [x0, #0x98]
+
+    ret  x30 // return pointer to context-data (x0)
+
+finish:
+    # exit code is zero
+    mov  x0, #0
+    # exit application
+    bl  _exit
+
+.size   make_fcontext,.-make_fcontext
+# Mark that we don't need executable stack.
+.section .note.GNU-stack,"",%progbits

+ 88 - 68
modules/std/fiber/native/asm/make_arm64_aapcs_macho_gas.S

@@ -1,68 +1,88 @@
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
- *  -------------------------------------------------  *
- *  |    x19    |    x20    |    x21    |    x22    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
- *  -------------------------------------------------  *
- *  |    x23    |    x24    |    x25    |    x26    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
- *  -------------------------------------------------  *
- *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
- *  -------------------------------------------------  *
- *  |    x27    |    x28    |    FP     |     LR    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
- *  -------------------------------------------------  *
- *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
- *  -------------------------------------------------  *
- *  |     PC    |   align   |           |           |  *
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.text
-.globl _make_fcontext
-.balign 16
-
-_make_fcontext:
-    ; shift address in x0 (allocated stack) to lower 16 byte boundary
-    and x0, x0, ~0xF
-
-    ; reserve space for context-data on context-stack
-    sub  x0, x0, #0x70
-
-    ; third arg of make_fcontext() == address of context-function
-    ; store address as a PC to jump in
-    str  x2, [x0, #0x60]
-
-    ; compute abs address of label finish
-    ; 0x0c = 3 instructions * size (4) before label 'finish'
-
-    ; TODO: Numeric offset since llvm still does not support labels in ADR. Fix:
-    ;       http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20140407/212336.html
-    adr  x1, 0x0c
-
-    ; save address of finish as return-address for context-function
-    ; will be entered after context-function returns (LR register)
-    str  x1, [x0, #0x58]
-
-    ret  lr ; return pointer to context-data (x0)
-
-finish:
-    ; exit code is zero
-    mov  x0, #0
-    ; exit application
-    bl  __exit
-
-
+/*
+            Copyright Edward Nevill + Oliver Kowalke 2015
+   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)
+*/
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  |    d8     |    d9     |    d10    |    d11    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |    d12    |    d13    |    d14    |    d15    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
+ *  -------------------------------------------------  *
+ *  |    x19    |    x20    |    x21    |    x22    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
+ *  -------------------------------------------------  *
+ *  |    x23    |    x24    |    x25    |    x26    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c|  *
+ *  -------------------------------------------------  *
+ *  |    x27    |    x28    |    FP     |     LR    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 | 43  |           |           |  *
+ *  -------------------------------------------------  *
+ *  | 0xa0| 0xa4| 0xa8| 0xac|           |           |  *
+ *  -------------------------------------------------  *
+ *  |     PC    |   align   |           |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl _make_fcontext
+.balign 16
+
+_make_fcontext:
+    ; shift address in x0 (allocated stack) to lower 16 byte boundary
+    and x0, x0, ~0xF
+
+    ; reserve space for context-data on context-stack
+    sub  x0, x0, #0xb0
+
+    ; third arg of make_fcontext() == address of context-function
+    ; store address as a PC to jump in
+    str  x2, [x0, #0xa0]
+
+    ; compute abs address of label finish
+    ; 0x0c = 3 instructions * size (4) before label 'finish'
+
+    ; TODO: Numeric offset since llvm still does not support labels in ADR. Fix:
+    ;       http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20140407/212336.html
+    adr  x1, 0x0c
+
+    ; save address of finish as return-address for context-function
+    ; will be entered after context-function returns (LR register)
+    str  x1, [x0, #0x98]
+
+    ret  lr ; return pointer to context-data (x0)
+
+finish:
+    ; exit code is zero
+    mov  x0, #0
+    ; exit application
+    bl  __exit
+
+

+ 79 - 62
modules/std/fiber/native/asm/make_arm_aapcs_elf_gas.S

@@ -1,62 +1,79 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
- *  -------------------------------------------------  *
- *  |hiddn|  v1 |  v2 |  v3 |  v4 |  v5 |  v6 |  v7 |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
- *  -------------------------------------------------  *
- *  |  v8 |  lr |  pc | FCTX| DATA|                 |  *
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.text
-.globl make_fcontext
-.align 2
-.type make_fcontext,%function
-make_fcontext:
-    @ shift address in A1 to lower 16 byte boundary
-    bic  a1, a1, #15
-
-    @ reserve space for context-data on context-stack
-    sub  a1, a1, #60
-
-    @ third arg of make_fcontext() == address of context-function
-    str  a3, [a1, #40]
-
-    @ compute address of returned transfer_t
-    add  a2, a1, #44
-    mov  a3, a2
-    str  a3, [a1, #0]
-
-    @ compute abs address of label finish
-    adr  a2, finish
-    @ save address of finish as return-address for context-function
-    @ will be entered after context-function returns
-    str  a2, [a1, #36]
-
-    bx  lr @ return pointer to context-data
-
-finish:
-    @ exit code is zero
-    mov  a1, #0
-    @ exit application
-    bl  _exit@PLT
-.size make_fcontext,.-make_fcontext
-
-@ Mark that we don't need executable stack.
-.section .note.GNU-stack,"",%progbits
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  | s16 | s17 | s18 | s19 | s20 | s21 | s22 | s23 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  | s24 | s25 | s26 | s27 | s28 | s29 | s30 | s31 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
+ *  -------------------------------------------------  *
+ *  |hiddn|  v1 |  v2 |  v3 |  v4 |  v5 |  v6 |  v7 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
+ *  -------------------------------------------------  *
+ *  |  v8 |  lr |  pc | FCTX| DATA|                 |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl make_fcontext
+.align 2
+.type make_fcontext,%function
+make_fcontext:
+    @ shift address in A1 to lower 16 byte boundary
+    bic  a1, a1, #15
+
+    @ reserve space for context-data on context-stack
+    sub  a1, a1, #124
+
+    @ third arg of make_fcontext() == address of context-function
+    str  a3, [a1, #104]
+
+    @ compute address of returned transfer_t
+    add  a2, a1, #108
+    mov  a3, a2
+    str  a3, [a1, #64]
+
+    @ compute abs address of label finish
+    adr  a2, finish
+    @ save address of finish as return-address for context-function
+    @ will be entered after context-function returns
+    str  a2, [a1, #100]
+
+#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
+#endif
+
+    bx  lr @ return pointer to context-data
+
+finish:
+    @ exit code is zero
+    mov  a1, #0
+    @ exit application
+    bl  _exit@PLT
+.size make_fcontext,.-make_fcontext
+
+@ Mark that we don't need executable stack.
+.section .note.GNU-stack,"",%progbits

+ 71 - 57
modules/std/fiber/native/asm/make_arm_aapcs_macho_gas.S

@@ -1,57 +1,71 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
- *  -------------------------------------------------  *
- *  | sjlj|hiddn|  v1 |  v2 |  v3 |  v4 |  v5 |  v6 |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
- *  -------------------------------------------------  *
- *  |  v7 |  v8 |  lr |  pc | FCTX| DATA|           |  *
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.text
-.globl _make_fcontext
-.align 2
-_make_fcontext:
-    @ shift address in A1 to lower 16 byte boundary
-    bic  a1, a1, #15
-
-    @ reserve space for context-data on context-stack
-    sub  a1, a1, #64
-
-    @ third arg of make_fcontext() == address of context-function
-    str  a3, [a1, #44]
-
-    @ compute address of returned transfer_t
-    add  a2, a1, #48
-    mov  a3, a2
-    str  a3, [a1, #4]
-
-    @ compute abs address of label finish
-    adr  a2, finish
-    @ save address of finish as return-address for context-function
-    @ will be entered after context-function returns
-    str  a2, [a1, #40]
-
-    bx  lr @ return pointer to context-data
-
-finish:
-    @ exit code is zero
-    mov  a1, #0
-    @ exit application
-    bl  __exit
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  | s16 | s17 | s18 | s19 | s20 | s21 | s22 | s23 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  | s24 | s25 | s26 | s27 | s28 | s29 | s30 | s31 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  | sjlj|hiddn|  v1 |  v2 |  v3 |  v4 |  v5 |  v6 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |  v7 |  v8 |  lr |  pc | FCTX| DATA|           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl _make_fcontext
+.align 2
+_make_fcontext:
+    @ shift address in A1 to lower 16 byte boundary
+    bic  a1, a1, #15
+
+    @ reserve space for context-data on context-stack
+    sub  a1, a1, #124
+
+    @ third arg of make_fcontext() == address of context-function
+    str  a3, [a1, #108]
+
+    @ compute address of returned transfer_t
+    add  a2, a1, #112
+    mov  a3, a2
+    str  a3, [a1, #68]
+
+    @ compute abs address of label finish
+    adr  a2, finish
+    @ save address of finish as return-address for context-function
+    @ will be entered after context-function returns
+    str  a2, [a1, #104]
+
+    bx  lr @ return pointer to context-data
+
+finish:
+    @ exit code is zero
+    mov  a1, #0
+    @ exit application
+    bl  __exit

+ 77 - 77
modules/std/fiber/native/asm/make_arm_aapcs_pe_armasm.asm

@@ -1,77 +1,77 @@
-;/*
-;            Copyright Oliver Kowalke 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)
-;*/
-
-; *******************************************************
-; *                                                     *
-; *  -------------------------------------------------  *
-; *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
-; *  -------------------------------------------------  *
-; *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
-; *  -------------------------------------------------  *
-; *  |deall|limit| base|hiddn|  v1 |  v2 |  v3 |  v4 |  *
-; *  -------------------------------------------------  *
-; *  -------------------------------------------------  *
-; *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
-; *  -------------------------------------------------  *
-; *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
-; *  -------------------------------------------------  *
-; *  |  v5 |  v6 |  v7 |  v8 |  lr |  pc | FCTX| DATA|  *
-; *  -------------------------------------------------  *
-; *                                                     *
-; *******************************************************
-
-
-    AREA |.text|, CODE
-    ALIGN 4
-    EXPORT make_fcontext
-    IMPORT _exit
-
-make_fcontext PROC
-    ; first arg of make_fcontext() == top of context-stack
-    ; save top of context-stack (base) A4
-    mov  a4, a1
-
-    ; shift address in A1 to lower 16 byte boundary
-    bic  a1, a1, #0x0f
-
-    ; reserve space for context-data on context-stack
-    sub  a1, a1, #0x48
-
-    ; save top address of context_stack as 'base'
-    str  a4, [a1, #0x8]
-    ; second arg of make_fcontext() == size of context-stack
-    ; compute bottom address of context-stack (limit)
-    sub  a4, a4, a2
-    ; save bottom address of context-stack as 'limit'
-    str  a4, [a1, #0x4]
-    ; save bottom address of context-stack as 'dealloction stack'
-    str  a4, [a1, #0x0]
-
-    ; third arg of make_fcontext() == address of context-function
-    str  a3, [a1, #0x34]
-
-    ; compute address of returned transfer_t
-    add  a2, a1, #0x38
-    mov  a3, a2
-    str  a3, [a1, #0xc]
-
-    ; compute abs address of label finish
-    adr  a2, finish
-    ; save address of finish as return-address for context-function
-    ; will be entered after context-function returns
-    str  a2, [a1, #0x30]
-
-    bx  lr ; return pointer to context-data
-
-finish
-    ; exit code is zero
-    mov  a1, #0
-    ; exit application
-    bl  _exit
-
-    ENDP
-    END
+;/*
+;            Copyright Oliver Kowalke 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)
+;*/
+
+; *******************************************************
+; *                                                     *
+; *  -------------------------------------------------  *
+; *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+; *  -------------------------------------------------  *
+; *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+; *  -------------------------------------------------  *
+; *  |deall|limit| base|hiddn|  v1 |  v2 |  v3 |  v4 |  *
+; *  -------------------------------------------------  *
+; *  -------------------------------------------------  *
+; *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+; *  -------------------------------------------------  *
+; *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+; *  -------------------------------------------------  *
+; *  |  v5 |  v6 |  v7 |  v8 |  lr |  pc | FCTX| DATA|  *
+; *  -------------------------------------------------  *
+; *                                                     *
+; *******************************************************
+
+
+    AREA |.text|, CODE
+    ALIGN 4
+    EXPORT make_fcontext
+    IMPORT _exit
+
+make_fcontext PROC
+    ; first arg of make_fcontext() == top of context-stack
+    ; save top of context-stack (base) A4
+    mov  a4, a1
+
+    ; shift address in A1 to lower 16 byte boundary
+    bic  a1, a1, #0x0f
+
+    ; reserve space for context-data on context-stack
+    sub  a1, a1, #0x48
+
+    ; save top address of context_stack as 'base'
+    str  a4, [a1, #0x8]
+    ; second arg of make_fcontext() == size of context-stack
+    ; compute bottom address of context-stack (limit)
+    sub  a4, a4, a2
+    ; save bottom address of context-stack as 'limit'
+    str  a4, [a1, #0x4]
+    ; save bottom address of context-stack as 'dealloction stack'
+    str  a4, [a1, #0x0]
+
+    ; third arg of make_fcontext() == address of context-function
+    str  a3, [a1, #0x34]
+
+    ; compute address of returned transfer_t
+    add  a2, a1, #0x38
+    mov  a3, a2
+    str  a3, [a1, #0xc]
+
+    ; compute abs address of label finish
+    adr  a2, finish
+    ; save address of finish as return-address for context-function
+    ; will be entered after context-function returns
+    str  a2, [a1, #0x30]
+
+    bx  lr ; return pointer to context-data
+
+finish
+    ; exit code is zero
+    mov  a1, #0
+    ; exit application
+    bl  _exit
+
+    ENDP
+    END

+ 20 - 20
modules/std/fiber/native/asm/make_combined_sysv_macho_gas.S

@@ -1,20 +1,20 @@
-/*
-            Copyright Sergue E. Leontiev 2013.
-   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)
-*/
-
-// Stub file for universal binary
-
-#if defined(__i386__)
-    #include "make_i386_sysv_macho_gas.S"
-#elif defined(__x86_64__)
-    #include "make_x86_64_sysv_macho_gas.S"
-#elif defined(__ppc__)
-    #include "make_ppc32_sysv_macho_gas.S"
-#elif defined(__ppc64__)
-    #include "make_ppc64_sysv_macho_gas.S"
-#else
-    #error "No arch's"
-#endif
+/*
+            Copyright Sergue E. Leontiev 2013.
+   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)
+*/
+
+// Stub file for universal binary
+
+#if defined(__i386__)
+    #include "make_i386_sysv_macho_gas.S"
+#elif defined(__x86_64__)
+    #include "make_x86_64_sysv_macho_gas.S"
+#elif defined(__ppc__)
+    #include "make_ppc32_sysv_macho_gas.S"
+#elif defined(__ppc64__)
+    #include "make_ppc64_sysv_macho_gas.S"
+#else
+    #error "No arch's"
+#endif

+ 147 - 142
modules/std/fiber/native/asm/make_i386_ms_pe_gas.asm

@@ -1,142 +1,147 @@
-/*
-            Copyright Oliver Kowalke 2009.
-            Copyright Thomas Sailer 2013.
-   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)
-*/
-
-/*************************************************************************************
-*  --------------------------------------------------------------------------------- *
-*  |    0    |    1    |    2    |    3    |    4    |    5    |    6    |    7    | *
-*  --------------------------------------------------------------------------------- *
-*  |    0h   |   04h   |   08h   |   0ch   |   010h  |   014h  |   018h  |   01ch  | *
-*  --------------------------------------------------------------------------------- *
-*  | fc_strg |fc_deallo|  limit  |   base  |  fc_seh |   EDI   |   ESI   |   EBX   | *
-*  --------------------------------------------------------------------------------- *
-*  --------------------------------------------------------------------------------- *
-*  |    8    |    9    |   10    |    11   |    12   |    13   |    14   |    15   | *
-*  --------------------------------------------------------------------------------- *
-*  |   020h  |  024h   |  028h   |   02ch  |   030h  |   034h  |   038h  |   03ch  | *
-*  --------------------------------------------------------------------------------- *
-*  |   EBP   |   EIP   |    to   |   data  |         |  EH NXT |SEH HNDLR|         | *
-*  --------------------------------------------------------------------------------- *
-*************************************************************************************/
-
-.file	"make_i386_ms_pe_gas.asm"
-.text
-.p2align 4,,15
-.globl	_make_fcontext
-.def	_make_fcontext;	.scl	2;	.type	32;	.endef
-_make_fcontext:
-    /* first arg of make_fcontext() == top of context-stack */
-    movl  0x04(%esp), %eax
-
-    /* reserve space for first argument of context-function */
-    /* EAX might already point to a 16byte border */
-    leal  -0x08(%eax), %eax
-
-    /* shift address in EAX to lower 16 byte boundary */
-    andl  $-16, %eax
-
-    /* reserve space for context-data on context-stack */
-    /* size for fc_mxcsr .. EIP + return-address for context-function */
-    /* on context-function entry: (ESP -0x4) % 8 == 0 */
-    /* additional space is required for SEH */
-    leal  -0x48(%eax), %eax
-
-    /* first arg of make_fcontext() == top of context-stack */
-    movl  0x04(%esp), %ecx
-    /* save top address of context stack as 'base' */
-    movl  %ecx, 0xc(%eax)
-    /* second arg of make_fcontext() == size of context-stack */
-    movl  0x08(%esp), %edx
-    /* negate stack size for LEA instruction (== substraction) */
-    negl  %edx
-    /* compute bottom address of context stack (limit) */
-    leal  (%ecx,%edx), %ecx
-    /* save bottom address of context-stack as 'limit' */
-    movl  %ecx, 0x8(%eax)
-    /* save bottom address of context-stack as 'dealloction stack' */
-    movl  %ecx, 0x4(%eax)
-	/* set fiber-storage to zero */
-	xorl  %ecx, %ecx
-    movl  %ecx, (%eax)
-
-    /* third arg of make_fcontext() == address of context-function */
-    /* stored in EBX */
-    movl  0xc(%esp), %ecx
-    movl  %ecx, 0x1c(%eax)
-
-    /* compute abs address of label trampoline */
-    movl  $trampoline, %ecx
-    /* save address of trampoline as return-address for context-function */
-    /* will be entered after calling jump_fcontext() first time */
-    movl  %ecx, 0x24(%eax)
-
-    /* compute abs address of label finish */
-    movl  $finish, %ecx
-    /* save address of finish as return-address for context-function */
-    /* will be entered after context-function returns */
-    movl  %ecx, 0x20(%eax)
-
-    /* traverse current seh chain to get the last exception handler installed by Windows */
-    /* note that on Windows Server 2008 and 2008 R2, SEHOP is activated by default */
-    /* the exception handler chain is tested for the presence of ntdll.dll!FinalExceptionHandler */
-    /* at its end by RaiseException all seh andlers are disregarded if not present and the */
-    /* program is aborted */
-    /* load NT_TIB into ECX */
-    movl  %fs:(0x0), %ecx
-
-walk:
-    /* load 'next' member of current SEH into EDX */
-    movl  (%ecx), %edx
-    /* test if 'next' of current SEH is last (== 0xffffffff) */
-    incl  %edx
-    jz  found
-    decl  %edx
-    /* exchange content; ECX contains address of next SEH */
-    xchgl  %ecx, %edx
-    /* inspect next SEH */
-    jmp  walk
-
-found:
-    /* load 'handler' member of SEH == address of last SEH handler installed by Windows */
-    movl  0x04(%ecx), %ecx
-    /* save address in ECX as SEH handler for context */
-    movl  %ecx, 0x38(%eax)
-    /* set ECX to -1 */
-    movl  $0xffffffff, %ecx
-    /* save ECX as next SEH item */
-    movl  %ecx, 0x34(%eax)
-    /* load address of next SEH item */
-    leal  0x34(%eax), %ecx
-    /* save next SEH */
-    movl  %ecx, 0x10(%eax)
-
-    /* return pointer to context-data */
-    ret
-
-trampoline:
-    /* move transport_t for entering context-function */
-    /* FCTX == EAX, DATA == EDX */
-    movl  %eax, (%esp)
-    movl  %edx, 0x4(%esp)
-    /* label finish as return-address */
-    pushl %ebp
-    /* jump to context-function */
-    jmp  *%ebx
-
-finish:
-    /* ESP points to same address as ESP on entry of context function + 0x4 */
-    xorl  %eax, %eax
-    /* exit code is zero */
-    movl  %eax, (%esp)
-    /* exit application */
-    call  __exit
-    hlt
-
-.def	__exit;	.scl	2;	.type	32;	.endef  /* standard C library function */
-
-.section .drectve
-.ascii " -export:\"make_fcontext\""
+/*
+            Copyright Oliver Kowalke 2009.
+            Copyright Thomas Sailer 2013.
+   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)
+*/
+
+/*************************************************************************************
+*  --------------------------------------------------------------------------------- *
+*  |    0    |    1    |    2    |    3    |    4    |    5    |    6    |    7    | *
+*  --------------------------------------------------------------------------------- *
+*  |    0h   |   04h   |   08h   |   0ch   |   010h  |   014h  |   018h  |   01ch  | *
+*  --------------------------------------------------------------------------------- *
+*  | fc_mxcsr|fc_x87_cw| fc_strg |fc_deallo|  limit  |   base  |  fc_seh |   EDI   | *
+*  --------------------------------------------------------------------------------- *
+*  --------------------------------------------------------------------------------- *
+*  |    8    |    9    |   10    |    11   |    12   |    13   |    14   |    15   | *
+*  --------------------------------------------------------------------------------- *
+*  |   020h  |  024h   |  028h   |   02ch  |   030h  |   034h  |   038h  |   03ch  | *
+*  --------------------------------------------------------------------------------- *
+*  |   ESI   |   EBX   |   EBP   |   EIP   |    to   |   data  |  EH NXT |SEH HNDLR| *
+*  --------------------------------------------------------------------------------- *
+**************************************************************************************/
+
+.file	"make_i386_ms_pe_gas.asm"
+.text
+.p2align 4,,15
+.globl	_make_fcontext
+.def	_make_fcontext;	.scl	2;	.type	32;	.endef
+_make_fcontext:
+    /* first arg of make_fcontext() == top of context-stack */
+    movl  0x04(%esp), %eax
+
+    /* reserve space for first argument of context-function */
+    /* EAX might already point to a 16byte border */
+    leal  -0x8(%eax), %eax
+
+    /* shift address in EAX to lower 16 byte boundary */
+    andl  $-16, %eax
+
+    /* reserve space for context-data on context-stack */
+    /* size for fc_mxcsr .. EIP + return-address for context-function */
+    /* on context-function entry: (ESP -0x4) % 8 == 0 */
+    /* additional space is required for SEH */
+    leal  -0x40(%eax), %eax
+
+    /* save MMX control- and status-word */
+    stmxcsr  (%eax)
+    /* save x87 control-word */
+    fnstcw  0x4(%eax)
+
+    /* first arg of make_fcontext() == top of context-stack */
+    movl  0x4(%esp), %ecx
+    /* save top address of context stack as 'base' */
+    movl  %ecx, 0x14(%eax)
+    /* second arg of make_fcontext() == size of context-stack */
+    movl  0x8(%esp), %edx
+    /* negate stack size for LEA instruction (== substraction) */
+    negl  %edx
+    /* compute bottom address of context stack (limit) */
+    leal  (%ecx,%edx), %ecx
+    /* save bottom address of context-stack as 'limit' */
+    movl  %ecx, 0x10(%eax)
+    /* save bottom address of context-stack as 'dealloction stack' */
+    movl  %ecx, 0xc(%eax)
+	/* set fiber-storage to zero */
+	xorl  %ecx, %ecx
+    movl  %ecx, 0x8(%eax)
+
+    /* third arg of make_fcontext() == address of context-function */
+    /* stored in EBX */
+    movl  0xc(%esp), %ecx
+    movl  %ecx, 0x24(%eax)
+
+    /* compute abs address of label trampoline */
+    movl  $trampoline, %ecx
+    /* save address of trampoline as return-address for context-function */
+    /* will be entered after calling jump_fcontext() first time */
+    movl  %ecx, 0x2c(%eax)
+
+    /* compute abs address of label finish */
+    movl  $finish, %ecx
+    /* save address of finish as return-address for context-function */
+    /* will be entered after context-function returns */
+    movl  %ecx, 0x28(%eax)
+
+    /* traverse current seh chain to get the last exception handler installed by Windows */
+    /* note that on Windows Server 2008 and 2008 R2, SEHOP is activated by default */
+    /* the exception handler chain is tested for the presence of ntdll.dll!FinalExceptionHandler */
+    /* at its end by RaiseException all seh andlers are disregarded if not present and the */
+    /* program is aborted */
+    /* load NT_TIB into ECX */
+    movl  %fs:(0x0), %ecx
+
+walk:
+    /* load 'next' member of current SEH into EDX */
+    movl  (%ecx), %edx
+    /* test if 'next' of current SEH is last (== 0xffffffff) */
+    incl  %edx
+    jz  found
+    decl  %edx
+    /* exchange content; ECX contains address of next SEH */
+    xchgl  %ecx, %edx
+    /* inspect next SEH */
+    jmp  walk
+
+found:
+    /* load 'handler' member of SEH == address of last SEH handler installed by Windows */
+    movl  0x04(%ecx), %ecx
+    /* save address in ECX as SEH handler for context */
+    movl  %ecx, 0x3c(%eax)
+    /* set ECX to -1 */
+    movl  $0xffffffff, %ecx
+    /* save ECX as next SEH item */
+    movl  %ecx, 0x38(%eax)
+    /* load address of next SEH item */
+    leal  0x38(%eax), %ecx
+    /* save next SEH */
+    movl  %ecx, 0x18(%eax)
+
+    /* return pointer to context-data */
+    ret
+
+trampoline:
+    /* move transport_t for entering context-function */
+    /* FCTX == EAX, DATA == EDX */
+    movl  %eax, (%esp)
+    movl  %edx, 0x4(%esp)
+    /* label finish as return-address */
+    pushl %ebp
+    /* jump to context-function */
+    jmp  *%ebx
+
+finish:
+    /* ESP points to same address as ESP on entry of context function + 0x4 */
+    xorl  %eax, %eax
+    /* exit code is zero */
+    movl  %eax, (%esp)
+    /* exit application */
+    call  __exit
+    hlt
+
+.def	__exit;	.scl	2;	.type	32;	.endef  /* standard C library function */
+
+.section .drectve
+.ascii " -export:\"make_fcontext\""

+ 140 - 138
modules/std/fiber/native/asm/make_i386_ms_pe_masm.asm

@@ -1,138 +1,140 @@
-
-;           Copyright Oliver Kowalke 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)
-
-;  ---------------------------------------------------------------------------------
-;  |    0    |    1    |    2    |    3    |    4    |    5    |    6    |    7    |
-;  ---------------------------------------------------------------------------------
-;  |    0h   |   04h   |   08h   |   0ch   |   010h  |   014h  |   018h  |   01ch  |
-;  ---------------------------------------------------------------------------------
-;  | fc_strg |fc_deallo|  limit  |   base  |  fc_seh |   EDI   |   ESI   |   EBX   |
-;  ---------------------------------------------------------------------------------
-;  ---------------------------------------------------------------------------------
-;  |    8    |    9    |   10    |    11   |    12   |    13   |    14   |    15   |
-;  ---------------------------------------------------------------------------------
-;  |   020h  |  024h   |  028h   |   02ch  |   030h  |   034h  |   038h  |   03ch  |
-;  ---------------------------------------------------------------------------------
-;  |   EBP   |   EIP   |    to   |   data  |         |  EH NXT |SEH HNDLR|         |
-;  ---------------------------------------------------------------------------------
-
-.386
-.XMM
-.model flat, c
-; standard C library function
-_exit PROTO, value:SDWORD
-.code
-
-make_fcontext PROC 
-
-	;BOOST_CONTEXT_EXPORT
-	
-    ; first arg of make_fcontext() == top of context-stack
-    mov  eax, [esp+04h]
-
-    ; reserve space for first argument of context-function
-    ; EAX might already point to a 16byte border
-    lea  eax, [eax-08h]
-
-    ; shift address in EAX to lower 16 byte boundary
-    and  eax, -16
-
-    ; reserve space for context-data on context-stack
-    ; on context-function entry: (ESP -0x4) % 8 == 0
-    ; additional space is required for SEH
-    lea  eax, [eax-048h]
-
-    ; first arg of make_fcontext() == top of context-stack
-    mov  ecx, [esp+04h]
-    ; save top address of context stack as 'base'
-    mov  [eax+0ch], ecx
-    ; second arg of make_fcontext() == size of context-stack
-    mov  edx, [esp+08h]
-    ; negate stack size for LEA instruction (== substraction)
-    neg  edx
-    ; compute bottom address of context stack (limit)
-    lea  ecx, [ecx+edx]
-    ; save bottom address of context-stack as 'limit'
-    mov  [eax+08h], ecx
-    ; save bottom address of context-stack as 'dealloction stack'
-    mov  [eax+04h], ecx
-	; set fiber-storage to zero
-	xor  ecx, ecx
-    mov  [eax], ecx
-
-    ; third arg of make_fcontext() == address of context-function
-    ; stored in EBX
-    mov  ecx, [esp+0ch]
-    mov  [eax+01ch], ecx
-
-    ; compute abs address of label trampoline
-    mov  ecx, trampoline
-    ; save address of trampoline as return-address for context-function
-    ; will be entered after calling jump_fcontext() first time
-    mov  [eax+024h], ecx
-
-    ; compute abs address of label finish
-    mov  ecx, finish
-    ; save address of finish as return-address for context-function
-    ; will be entered after context-function returns
-    mov  [eax+020h], ecx
-
-    ; traverse current seh chain to get the last exception handler installed by Windows
-    ; note that on Windows Server 2008 and 2008 R2, SEHOP is activated by default
-    ; the exception handler chain is tested for the presence of ntdll.dll!FinalExceptionHandler
-    ; at its end by RaiseException all seh-handlers are disregarded if not present and the
-    ; program is aborted
-    assume  fs:nothing
-    ; load NT_TIB into ECX
-    mov  ecx, fs:[0h]
-    assume  fs:error
-
-walk:
-    ; load 'next' member of current SEH into EDX
-    mov  edx, [ecx]
-    ; test if 'next' of current SEH is last (== 0xffffffff)
-    inc  edx
-    jz  found
-    dec  edx
-    ; exchange content; ECX contains address of next SEH
-    xchg edx, ecx
-    ; inspect next SEH
-    jmp  walk
-
-found:
-    ; load 'handler' member of SEH == address of last SEH handler installed by Windows
-    mov  ecx, [ecx+04h]
-    ; save address in ECX as SEH handler for context
-    mov  [eax+038h], ecx
-    ; set ECX to -1
-    mov  ecx, 0ffffffffh
-    ; save ECX as next SEH item
-    mov  [eax+034h], ecx
-    ; load address of next SEH item
-    lea  ecx, [eax+034h]
-    ; save next SEH
-    mov  [eax+010h], ecx
-
-    ret ; return pointer to context-data
-
-trampoline:
-    ; move transport_t for entering context-function
-    ; FCTX == EAX, DATA == EDX
-    mov  [esp], eax
-    mov  [esp+04h], edx
-    push ebp
-    ; jump to context-function
-    jmp ebx
-
-finish:
-    ; exit code is zero
-    xor  eax, eax
-    mov  [esp], eax
-    ; exit application
-    call  _exit
-    hlt
-make_fcontext ENDP
-END
+
+;           Copyright Oliver Kowalke 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)
+
+;  ---------------------------------------------------------------------------------
+;  |    0    |    1    |    2    |    3    |    4    |    5    |    6    |    7    |
+;  ---------------------------------------------------------------------------------
+;  |    0h   |   04h   |   08h   |   0ch   |   010h  |   014h  |   018h  |   01ch  |
+;  ---------------------------------------------------------------------------------
+;  | fc_mxcsr|fc_x87_cw| fc_strg |fc_deallo|  limit  |   base  |  fc_seh |   EDI   |
+;  ---------------------------------------------------------------------------------
+;  ---------------------------------------------------------------------------------
+;  |    8    |    9    |   10    |    11   |    12   |    13   |    14   |    15   |
+;  ---------------------------------------------------------------------------------
+;  |   020h  |  024h   |  028h   |   02ch  |   030h  |   034h  |   038h  |   03ch  |
+;  ---------------------------------------------------------------------------------
+;  |   ESI   |   EBX   |   EBP   |   EIP   |    to   |   data  |  EH NXT |SEH HNDLR|
+;  ---------------------------------------------------------------------------------
+
+.386
+.XMM
+.model flat, c
+; standard C library function
+_exit PROTO, value:SDWORD
+.code
+
+make_fcontext PROC BOOST_CONTEXT_EXPORT
+    ; first arg of make_fcontext() == top of context-stack
+    mov  eax, [esp+04h]
+
+    ; reserve space for first argument of context-function
+    ; EAX might already point to a 16byte border
+    lea  eax, [eax-08h]
+
+    ; shift address in EAX to lower 16 byte boundary
+    and  eax, -16
+
+    ; reserve space for context-data on context-stack
+    ; on context-function entry: (ESP -0x4) % 8 == 0
+    ; additional space is required for SEH
+    lea  eax, [eax-040h]
+
+    ; save MMX control- and status-word
+    stmxcsr  [eax]
+    ; save x87 control-word
+    fnstcw  [eax+04h]
+
+    ; first arg of make_fcontext() == top of context-stack
+    mov  ecx, [esp+04h]
+    ; save top address of context stack as 'base'
+    mov  [eax+014h], ecx
+    ; second arg of make_fcontext() == size of context-stack
+    mov  edx, [esp+08h]
+    ; negate stack size for LEA instruction (== substraction)
+    neg  edx
+    ; compute bottom address of context stack (limit)
+    lea  ecx, [ecx+edx]
+    ; save bottom address of context-stack as 'limit'
+    mov  [eax+010h], ecx
+    ; save bottom address of context-stack as 'dealloction stack'
+    mov  [eax+0ch], ecx
+	; set fiber-storage to zero
+	xor  ecx, ecx
+    mov  [eax+08h], ecx
+
+    ; third arg of make_fcontext() == address of context-function
+    ; stored in EBX
+    mov  ecx, [esp+0ch]
+    mov  [eax+024h], ecx
+
+    ; compute abs address of label trampoline
+    mov  ecx, trampoline
+    ; save address of trampoline as return-address for context-function
+    ; will be entered after calling jump_fcontext() first time
+    mov  [eax+02ch], ecx
+
+    ; compute abs address of label finish
+    mov  ecx, finish
+    ; save address of finish as return-address for context-function in EBP
+    ; will be entered after context-function returns
+    mov  [eax+028h], ecx
+
+    ; traverse current seh chain to get the last exception handler installed by Windows
+    ; note that on Windows Server 2008 and 2008 R2, SEHOP is activated by default
+    ; the exception handler chain is tested for the presence of ntdll.dll!FinalExceptionHandler
+    ; at its end by RaiseException all seh-handlers are disregarded if not present and the
+    ; program is aborted
+    assume  fs:nothing
+    ; load NT_TIB into ECX
+    mov  ecx, fs:[0h]
+    assume  fs:error
+
+walk:
+    ; load 'next' member of current SEH into EDX
+    mov  edx, [ecx]
+    ; test if 'next' of current SEH is last (== 0xffffffff)
+    inc  edx
+    jz  found
+    dec  edx
+    ; exchange content; ECX contains address of next SEH
+    xchg edx, ecx
+    ; inspect next SEH
+    jmp  walk
+
+found:
+    ; load 'handler' member of SEH == address of last SEH handler installed by Windows
+    mov  ecx, [ecx+04h]
+    ; save address in ECX as SEH handler for context
+    mov  [eax+03ch], ecx
+    ; set ECX to -1
+    mov  ecx, 0ffffffffh
+    ; save ECX as next SEH item
+    mov  [eax+038h], ecx
+    ; load address of next SEH item
+    lea  ecx, [eax+038h]
+    ; save next SEH
+    mov  [eax+018h], ecx
+
+    ret ; return pointer to context-data
+
+trampoline:
+    ; move transport_t for entering context-function
+    ; FCTX == EAX, DATA == EDX
+    mov  [esp], eax
+    mov  [esp+04h], edx
+    push ebp
+    ; jump to context-function
+    jmp ebx
+
+finish:
+    ; exit code is zero
+    xor  eax, eax
+    mov  [esp], eax
+    ; exit application
+    call  _exit
+    hlt
+make_fcontext ENDP
+END

+ 106 - 94
modules/std/fiber/native/asm/make_i386_sysv_elf_gas.S

@@ -1,94 +1,106 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*****************************************************************************************
- *                                                                                       *
- *  -----------------------------------------------------------------------------------  *
- *  |    0    |    1    |    2    |    3    |    4     |    5    |    6     |    7    |  *
- *  -----------------------------------------------------------------------------------  *
- *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18   |   0x1c  |  *
- *  -----------------------------------------------------------------------------------  *
- *  |   EDI   |   ESI   |   EBX   |   EBP   |   EIP    |  hidden |    to    |   data  |  *
- *  -----------------------------------------------------------------------------------  *
- *                                                                                       *
- *****************************************************************************************/
-
-.text
-.globl make_fcontext
-.align 2
-.type make_fcontext,@function
-make_fcontext:
-    /* first arg of make_fcontext() == top of context-stack */
-    movl  0x4(%esp), %eax
-
-    /* reserve space for first argument of context-function
-       rax might already point to a 16byte border */
-    leal  -0x8(%eax), %eax
-
-    /* shift address in EAX to lower 16 byte boundary */
-    andl  $-16, %eax
-
-    /* reserve space for context-data on context-stack */
-    leal  -0x28(%eax), %eax
-
-    /* third arg of make_fcontext() == address of context-function */
-    /* stored in EBX */
-    movl  0xc(%esp), %ecx
-    movl  %ecx, 0x8(%eax)
-
-    /* return transport_t */
-    /* FCTX == EDI, DATA == ESI */
-    leal  (%eax), %ecx
-    movl  %ecx, 0x14(%eax)
-
-    /* compute abs address of label trampoline */
-    call  1f
-    /* address of trampoline 1 */
-1:  popl  %ecx
-    /* compute abs address of label trampoline */
-    addl  $trampoline-1b, %ecx
-    /* save address of trampoline as return address */
-    /* will be entered after calling jump_fcontext() first time */
-    movl  %ecx, 0x10(%eax)
-
-    /* compute abs address of label finish */
-    call  2f
-    /* address of label 2 */
-2:  popl  %ecx
-    /* compute abs address of label finish */
-    addl  $finish-2b, %ecx
-    /* save address of finish as return-address for context-function */
-    /* will be entered after context-function returns */
-    movl  %ecx, 0xc(%eax) 
-
-    ret /* return pointer to context-data */
-
-trampoline:
-    /* move transport_t for entering context-function */
-    movl  %edi, (%esp)
-    movl  %esi, 0x4(%esp)
-    pushl %ebp
-    /* jump to context-function */
-    jmp *%ebx
-
-finish:
-    call  3f
-    /* address of label 3 */
-3:  popl  %ebx
-    /* compute address of GOT and store it in EBX */
-    addl  $_GLOBAL_OFFSET_TABLE_+[.-3b], %ebx
-
-    /* exit code is zero */
-    xorl  %eax, %eax
-    movl  %eax, (%esp)
-    /* exit application */
-    call  _exit@PLT
-    hlt
-.size make_fcontext,.-make_fcontext
-
-/* Mark that we don't need executable stack.  */
-.section .note.GNU-stack,"",%progbits
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/****************************************************************************************
+ *                                                                                      *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  | fc_mxcsr|fc_x87_cw|   EDI   |   ESI   |   EBX    |   EBP   |   EIP   |  hidden |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    8    |    9    |    10   |    11   |    12    |    13   |    14   |    15   |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x20  |   0x24  |                                                            |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    to   |   data  |                                                            |  *
+ *  ----------------------------------------------------------------------------------  *
+ *                                                                                      *
+ ****************************************************************************************/
+
+.text
+.globl make_fcontext
+.align 2
+.type make_fcontext,@function
+make_fcontext:
+    /* first arg of make_fcontext() == top of context-stack */
+    movl  0x4(%esp), %eax
+
+    /* reserve space for first argument of context-function
+       eax might already point to a 16byte border */
+    leal  -0x8(%eax), %eax
+
+    /* shift address in EAX to lower 16 byte boundary */
+    andl  $-16, %eax
+
+    /* reserve space for context-data on context-stack */
+    leal  -0x28(%eax), %eax
+
+    /* third arg of make_fcontext() == address of context-function */
+    /* stored in EBX */
+    movl  0xc(%esp), %ecx
+    movl  %ecx, 0x10(%eax)
+
+    /* save MMX control- and status-word */
+    stmxcsr (%eax)
+    /* save x87 control-word */
+    fnstcw  0x4(%eax)
+
+    /* return transport_t */
+    /* FCTX == EDI, DATA == ESI */
+    leal  0x8(%eax), %ecx
+    movl  %ecx, 0x1c(%eax)
+
+    /* compute abs address of label trampoline */
+    call  1f
+    /* address of trampoline 1 */
+1:  popl  %ecx
+    /* compute abs address of label trampoline */
+    addl  $trampoline-1b, %ecx
+    /* save address of trampoline as return address */
+    /* will be entered after calling jump_fcontext() first time */
+    movl  %ecx, 0x18(%eax)
+
+    /* compute abs address of label finish */
+    call  2f
+    /* address of label 2 */
+2:  popl  %ecx
+    /* compute abs address of label finish */
+    addl  $finish-2b, %ecx
+    /* save address of finish as return-address for context-function */
+    /* will be entered after context-function returns */
+    movl  %ecx, 0x14(%eax) 
+
+    ret /* return pointer to context-data */
+
+trampoline:
+    /* move transport_t for entering context-function */
+    movl  %edi, (%esp)
+    movl  %esi, 0x4(%esp)
+    pushl %ebp
+    /* jump to context-function */
+    jmp *%ebx
+
+finish:
+    call  3f
+    /* address of label 3 */
+3:  popl  %ebx
+    /* compute address of GOT and store it in EBX */
+    addl  $_GLOBAL_OFFSET_TABLE_+[.-3b], %ebx
+
+    /* exit code is zero */
+    xorl  %eax, %eax
+    movl  %eax, (%esp)
+    /* exit application */
+    call  _exit@PLT
+    hlt
+.size make_fcontext,.-make_fcontext
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 90 - 83
modules/std/fiber/native/asm/make_i386_sysv_macho_gas.S

@@ -1,83 +1,90 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*****************************************************************************************
- *                                                                                       *
- *  -----------------------------------------------------------------------------------  *
- *  |    0    |    1    |    2    |    3    |    4     |    5    |    6     |    7    |  *
- *  -----------------------------------------------------------------------------------  *
- *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18   |   0x1c  |  *
- *  -----------------------------------------------------------------------------------  *
- *  |   EDI   |   ESI   |   EBX   |   EBP   |   EIP    |  hidden |    to    |   data  |  *
- *  -----------------------------------------------------------------------------------  *
- *                                                                                       *
- *****************************************************************************************/
-
-.text
-.globl _make_fcontext
-.align 2
-_make_fcontext:
-    /* first arg of make_fcontext() == top of context-stack */
-    movl  0x4(%esp), %eax
-
-    /* reserve space for first argument of context-function
-       rax might already point to a 16byte border */
-    leal  -0x8(%eax), %eax
-
-    /* shift address in EAX to lower 16 byte boundary */
-    andl  $-16, %eax
-
-    /* reserve space for context-data on context-stack */
-    leal  -0x28(%eax), %eax
-
-    /* thrid arg of make_fcontext() == address of context-function */
-    /* stored in EBX */
-    movl  0xc(%esp), %edx
-    movl  %edx, 0x8(%eax)
-
-    /* return transport_t */
-    /* FCTX == EDI, DATA == ESI */
-    leal  (%eax), %ecx
-    movl  %ecx, 0x14(%eax)
-
-    /* compute abs address of label trampoline */
-    call  1f
-    /* address of trampoline 1 */
-1:  popl  %ecx
-    /* compute abs address of label trampoline */
-    addl  $trampoline-1b, %ecx
-    /* save address of trampoline as return address */
-    /* will be entered after calling jump_fcontext() first time */
-    movl  %ecx, 0x10(%eax)
-
-    /* compute abs address of label finish */
-    call  2f
-    /* address of label 2 */
-2:  popl  %ecx
-    /* compute abs address of label finish */
-    addl  $finish-2b, %ecx
-    /* save address of finish as return-address for context-function */
-    /* will be entered after context-function returns */
-    movl  %ecx, 0xc(%eax) 
-
-    ret /* return pointer to context-data */
-
-trampoline:
-    /* move transport_t for entering context-function */
-    movl  %edi, (%esp)
-    movl  %esi, 0x4(%esp)
-    pushl %ebp
-    /* jump to context-function */
-    jmp *%ebx
-
-finish:
-    /* exit code is zero */
-    xorl  %eax, %eax
-    movl  %eax, (%esp)
-    /* exit application */
-    call  __exit
-    hlt
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/****************************************************************************************
+ *                                                                                      *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  | fc_mxcsr|fc_x87_cw|   EDI   |   ESI   |   EBX    |   EBP   |   EIP   |    to   |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    8    |    9    |    10   |    11   |    12    |    13   |    14   |    15   |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x20  |                                                                      |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   data  |                                                                      |  *
+ *  ----------------------------------------------------------------------------------  *
+ *                                                                                      *
+ ****************************************************************************************/
+
+.text
+.globl _make_fcontext
+.align 2
+_make_fcontext:
+    /* first arg of make_fcontext() == top of context-stack */
+    movl  0x4(%esp), %eax
+
+    /* reserve space for first argument of context-function
+       eax might already point to a 16byte border */
+    leal  -0x8(%eax), %eax
+
+    /* shift address in EAX to lower 16 byte boundary */
+    andl  $-16, %eax
+
+    /* reserve space for context-data on context-stack */
+    leal  -0x2c(%eax), %eax
+
+    /* third arg of make_fcontext() == address of context-function */
+    /* stored in EBX */
+    movl  0xc(%esp), %ecx
+    movl  %ecx, 0x10(%eax)
+
+    /* save MMX control- and status-word */
+    stmxcsr (%eax)
+    /* save x87 control-word */
+    fnstcw  0x4(%eax)
+
+    /* compute abs address of label trampoline */
+    call  1f
+    /* address of trampoline 1 */
+1:  popl  %ecx
+    /* compute abs address of label trampoline */
+    addl  $trampoline-1b, %ecx
+    /* save address of trampoline as return address */
+    /* will be entered after calling jump_fcontext() first time */
+    movl  %ecx, 0x18(%eax)
+
+    /* compute abs address of label finish */
+    call  2f
+    /* address of label 2 */
+2:  popl  %ecx
+    /* compute abs address of label finish */
+    addl  $finish-2b, %ecx
+    /* save address of finish as return-address for context-function */
+    /* will be entered after context-function returns */
+    movl  %ecx, 0x14(%eax) 
+
+    ret /* return pointer to context-data */
+
+trampoline:
+    /* move transport_t for entering context-function */
+    movl  %eax, (%esp)
+    movl  %edx, 0x4(%esp)
+    pushl %ebp
+    /* jump to context-function */
+    jmp *%ebx
+
+finish:
+    /* exit code is zero */
+    xorl  %eax, %eax
+    movl  %eax, (%esp)
+    /* exit application */
+    call  __exit
+    hlt

+ 16 - 16
modules/std/fiber/native/asm/make_i386_x86_64_sysv_macho_gas.S

@@ -1,16 +1,16 @@
-/*
-            Copyright Sergue E. Leontiev 2013.
-   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)
-*/
-
-// Stub file for universal binary
-
-#if defined(__i386__)
-    #include "make_i386_sysv_macho_gas.S"
-#elif defined(__x86_64__)
-    #include "make_x86_64_sysv_macho_gas.S"
-#else
-    #error "No arch's"
-#endif
+/*
+            Copyright Sergue E. Leontiev 2013.
+   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)
+*/
+
+// Stub file for universal binary
+
+#if defined(__i386__)
+    #include "make_i386_sysv_macho_gas.S"
+#elif defined(__x86_64__)
+    #include "make_x86_64_sysv_macho_gas.S"
+#else
+    #error "No arch's"
+#endif

+ 118 - 86
modules/std/fiber/native/asm/make_mips32_o32_elf_gas.S

@@ -1,86 +1,118 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
- *  -------------------------------------------------  *
- *  |  S0 |  S1 |  S2 |  S3 |  S4 |  S5 |  S6 |  S7 |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
- *  -------------------------------------------------  *
- *  |  FP |hiddn|  RA |  PC |  GP | FCTX| DATA|     |  *
- *  -------------------------------------------------  *
- *                                                     *
- * *****************************************************/
-
-.text
-.globl make_fcontext
-.align 2
-.type make_fcontext,@function
-.ent make_fcontext
-make_fcontext:
-#ifdef __PIC__
-.set    noreorder
-.cpload $t9
-.set    reorder
-#endif
-    # first arg of make_fcontext() == top address of context-stack
-    move $v0, $a0
-
-    # shift address in A0 to lower 16 byte boundary
-    move $v1, $v0
-    li $v0, -16 # 0xfffffffffffffff0
-    and $v0, $v1, $v0
-
-    # reserve space for context-data on context-stack
-    # including 48 byte of shadow space (sp % 16 == 0)
-    addiu $v0, $v0, -112
-
-    # third arg of make_fcontext() == address of context-function
-    sw  $a2, 44($v0)
-    # save global pointer in context-data
-    sw  $gp, 48($v0)
-
-    # compute address of returned transfer_t
-    addiu $t0, $v0, 52
-    sw  $t0, 36($v0)
-
-    # compute abs address of label finish
-    la  $t9, finish
-    # save address of finish as return-address for context-function
-    # will be entered after context-function returns
-    sw  $t9, 40($v0)
-
-    jr  $ra # return pointer to context-data
-
-finish:
-    lw $gp, 0($sp)
-    # allocate stack space (contains shadow space for subroutines)
-    addiu  $sp, $sp, -32
-    # save return address
-    sw  $ra, 28($sp)
-
-    # restore GP (global pointer)
-#    move  $gp, $s1
-    # exit code is zero
-    move  $a0, $zero
-    # address of exit
-    lw  $t9, %call16(_exit)($gp)
-    # exit application
-    jalr  $t9
-.end make_fcontext
-.size make_fcontext, .-make_fcontext
-
-/* Mark that we don't need executable stack.  */
-.section .note.GNU-stack,"",%progbits
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |  S0 |  S1 |  S2 |  S3 |  S4 |  S5 |  S6 |  S7 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |  FP |hiddn|  RA |  PC |  GP | FCTX| DATA|     |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ * *****************************************************/
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    F20    |    F22    |    F24    |    F26    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    F28    |    F30    |  S0 |  S1 |  S2 |  S3 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |  S4 |  S5 |  S6 |  S7 |  FP |hiddn|  RA |  PC |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |  GP | FCTX| DATA|     |     |     |     |     |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ * *****************************************************/
+
+.text
+.globl make_fcontext
+.align 2
+.type make_fcontext,@function
+.ent make_fcontext
+make_fcontext:
+#ifdef __PIC__
+.set    noreorder
+.cpload $t9
+.set    reorder
+#endif
+    # first arg of make_fcontext() == top address of context-stack
+    move $v0, $a0
+
+    # shift address in A0 to lower 16 byte boundary
+    move $v1, $v0
+    li $v0, -16 # 0xfffffffffffffff0
+    and $v0, $v1, $v0
+
+    # reserve space for context-data on context-stack
+    # including 48 byte of shadow space (sp % 16 == 0)
+    addiu $v0, $v0, -112
+
+    # third arg of make_fcontext() == address of context-function
+    sw  $a2, 92($v0)
+    # save global pointer in context-data
+    sw  $gp, 96($v0)
+
+    # compute address of returned transfer_t
+    addiu $t0, $v0, 52
+    sw  $t0, 84($v0)
+
+    # compute abs address of label finish
+    la  $t9, finish
+    # save address of finish as return-address for context-function
+    # will be entered after context-function returns
+    sw  $t9, 88($v0)
+
+    jr  $ra # return pointer to context-data
+
+finish:
+    lw $gp, 0($sp)
+    # allocate stack space (contains shadow space for subroutines)
+    addiu  $sp, $sp, -32
+    # save return address
+    sw  $ra, 28($sp)
+
+    # restore GP (global pointer)
+#    move  $gp, $s1
+    # exit code is zero
+    move  $a0, $zero
+    # address of exit
+    lw  $t9, %call16(_exit)($gp)
+    # exit application
+    jalr  $t9
+.end make_fcontext
+.size make_fcontext, .-make_fcontext
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 16 - 16
modules/std/fiber/native/asm/make_ppc32_ppc64_sysv_macho_gas.S

@@ -1,16 +1,16 @@
-/*
-            Copyright Sergue E. Leontiev 2013.
-   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)
-*/
-
-// Stub file for universal binary
-
-#if defined(__ppc__)
-    #include "make_ppc32_sysv_macho_gas.S"
-#elif defined(__ppc64__)
-    #include "make_ppc64_sysv_macho_gas.S"
-#else
-    #error "No arch's"
-#endif
+/*
+            Copyright Sergue E. Leontiev 2013.
+   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)
+*/
+
+// Stub file for universal binary
+
+#if defined(__ppc__)
+    #include "make_ppc32_sysv_macho_gas.S"
+#elif defined(__ppc64__)
+    #include "make_ppc64_sysv_macho_gas.S"
+#else
+    #error "No arch's"
+#endif

+ 142 - 104
modules/std/fiber/native/asm/make_ppc32_sysv_elf_gas.S

@@ -1,104 +1,142 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
- *  -------------------------------------------------  *
- *  | R13 | R14 | R15 | R16 | R17 | R18 | R19 | R20 |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
- *  -------------------------------------------------  *
- *  | R21 | R22 | R23 | R24 | R25 | R26 | R27 | R28 |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
- *  -------------------------------------------------  *
- *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
- *  -------------------------------------------------  *
- *  | R29 | R30 | R31 |hiddn|  CR |  LR |  PC |bchai|  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
- *  -------------------------------------------------  *
- *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
- *  -------------------------------------------------  *
- *  |linkr| FCTX| DATA|                             |  * 
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.text
-.globl make_fcontext
-.align 2
-.type make_fcontext,@function
-make_fcontext:
-    # save return address into R6
-    mflr  %r6
-
-    # first arg of make_fcontext() == top address of context-function
-    # shift address in R3 to lower 16 byte boundary
-    clrrwi  %r3, %r3, 4
-
-    # reserve space for context-data on context-stack
-    # including 64 byte of linkage + parameter area (R1 % 16 == 0)
-    subi  %r3, %r3, 172
-
-    # third arg of make_fcontext() == address of context-function
-    stw  %r5, 88(%r3)
-
-    # set back-chain to zero
-    li   %r0, 0
-    stw  %r0, 92(%r3)
-
-    # compute address of returned transfer_t
-    addi  %r0, %r3, 100
-    mr    %r4, %r0 
-    stw   %r4, 76(%r3) 
-
-    # load LR
-    mflr  %r0
-    # jump to label 1
-    bl  1f
-1:
-    # load LR into R4
-    mflr  %r4
-    # compute abs address of label finish
-    addi  %r4, %r4, finish - 1b
-    # restore LR
-    mtlr  %r0
-    # save address of finish as return-address for context-function
-    # will be entered after context-function returns
-    stw  %r4, 84(%r3)
-
-    # restore return address from R6
-    mtlr  %r6
-
-    blr  # return pointer to context-data
-
-finish:
-    # save return address into R0
-    mflr  %r0
-    # save return address on stack, set up stack frame
-    stw  %r0, 4(%r1)
-    # allocate stack space, R1 % 16 == 0
-    stwu  %r1, -16(%r1)
-
-    # exit code is zero
-    li  %r3, 0
-    # exit application
-    bl  _exit@plt
-.size make_fcontext, .-make_fcontext
-
-/* Mark that we don't need executable stack.  */
-.section .note.GNU-stack,"",%progbits
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    F14    |    F15    |    F16    |    F17    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    F18    |    F19    |    F20    |    F21    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |    F22    |    F23    |    F24    |    F25    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |    F26    |    F27    |    F28    |    F29    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
+ *  -------------------------------------------------  *
+ *  |    F30    |    F31    |   fpscr   | R13 | R14 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
+ *  -------------------------------------------------  *
+ *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
+ *  -------------------------------------------------  *
+ *  | R15 | R16 | R17 | R18 | R19 | R20 | R21 | R22 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
+ *  -------------------------------------------------  *
+ *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
+ *  -------------------------------------------------  *
+ *  | R23 | R24 | R25 | R26 | R27 | R28 | R29 | R30 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
+ *  -------------------------------------------------  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
+ *  -------------------------------------------------  *
+ *  | R31 |hiddn|  CR |  LR |  PC |bchai|linkr| FCTX|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  64 |                                         |  *
+ *  -------------------------------------------------  *
+ *  | 256 |                                         |  *
+ *  -------------------------------------------------  *
+ *  | DATA|                                         |  * 
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl make_fcontext
+.align 2
+.type make_fcontext,@function
+make_fcontext:
+    # save return address into R6
+    mflr  %r6
+
+    # first arg of make_fcontext() == top address of context-function
+    # shift address in R3 to lower 16 byte boundary
+    clrrwi  %r3, %r3, 4
+
+    # reserve space for context-data on context-stack
+    # including 64 byte of linkage + parameter area (R1 % 16 == 0)
+    subi  %r3, %r3, 336
+
+    # third arg of make_fcontext() == address of context-function
+    stw  %r5, 240(%r3)
+
+    # set back-chain to zero
+    li   %r0, 0
+    stw  %r0, 244(%r3)
+
+    mffs  %f0  # load FPSCR
+    stfd  %f0, 144(%r3)  # save FPSCR
+
+    # compute address of returned transfer_t
+    addi  %r0, %r3, 252
+    mr    %r4, %r0 
+    stw   %r4, 228(%r3) 
+
+    # load LR
+    mflr  %r0
+    # jump to label 1
+    bl  1f
+1:
+    # load LR into R4
+    mflr  %r4
+    # compute abs address of label finish
+    addi  %r4, %r4, finish - 1b
+    # restore LR
+    mtlr  %r0
+    # save address of finish as return-address for context-function
+    # will be entered after context-function returns
+    stw  %r4, 236(%r3)
+
+    # restore return address from R6
+    mtlr  %r6
+
+    blr  # return pointer to context-data
+
+finish:
+    # save return address into R0
+    mflr  %r0
+    # save return address on stack, set up stack frame
+    stw  %r0, 4(%r1)
+    # allocate stack space, R1 % 16 == 0
+    stwu  %r1, -16(%r1)
+
+    # exit code is zero
+    li  %r3, 0
+    # exit application
+    bl  _exit@plt
+.size make_fcontext, .-make_fcontext
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 137 - 99
modules/std/fiber/native/asm/make_ppc32_sysv_macho_gas.S

@@ -1,99 +1,137 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
- *  -------------------------------------------------  *
- *  | R13 | R14 | R15 | R16 | R17 | R18 | R19 | R20 |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
- *  -------------------------------------------------  *
- *  | R21 | R22 | R23 | R24 | R25 | R26 | R27 | R28 |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
- *  -------------------------------------------------  *
- *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
- *  -------------------------------------------------  *
- *  | R29 | R30 | R31 |hiddn|  CR |  LR |  PC |bchai|  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
- *  -------------------------------------------------  *
- *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
- *  -------------------------------------------------  *
- *  |linkr| FCTX| DATA|                             |  * 
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.text
-.globl _make_fcontext
-.align 2
-_make_fcontext:
-    ; save return address into R6
-    mflr  r6
-
-    ; first arg of make_fcontext() == top address of context-function
-    ; shift address in R3 to lower 16 byte boundary
-    clrrwi  r3, r3, 4
-
-    ; reserve space for context-data on context-stack
-    ; including 64 byte of linkage + parameter area (R1 % 16 == 0)
-    subi  r3, r3, 172
-
-    ; third arg of make_fcontext() == address of context-function
-    stw  r5, 88(r3)
-
-    ; set back-chain to zero
-    li   r0, 0
-    stw  r0, 92(r3)
-
-    ; compute address of returned transfer_t
-    addi  r0, r3, 100
-    mr    r4, r0 
-    stw   r4, 76(r3) 
-
-    ; load LR
-    mflr  r0
-    ; jump to label 1
-    bl  l1
-l1:
-    ; load LR into R4
-    mflr  r4
-    ; compute abs address of label finish
-    addi  r4, r4, lo16((finish - .)+4)
-    # restore LR
-    mtlr  r0
-    ; save address of finish as return-address for context-function
-    ; will be entered after context-function returns
-    stw  r4, 84(r3)
-
-    ; restore return address from R6
-    mtlr  r6
-
-    blr  ; return pointer to context-data
-
-finish:
-    ; save return address into R0
-    mflr  r0
-    ; save return address on stack, set up stack frame
-    stw  r0, 4(r1)
-    ; allocate stack space, R1 % 16 == 0
-    stwu  r1, -16(r1)
-
-    ; exit code is zero
-    li  r3, 0
-    ; exit application
-    bl  __exit
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    F14    |    F15    |    F16    |    F17    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    F18    |    F19    |    F20    |    F21    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |    F22    |    F23    |    F24    |    F25    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |    F26    |    F27    |    F28    |    F29    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
+ *  -------------------------------------------------  *
+ *  |    F30    |    F31    |   fpscr   | R13 | R14 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
+ *  -------------------------------------------------  *
+ *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
+ *  -------------------------------------------------  *
+ *  | R15 | R16 | R17 | R18 | R19 | R20 | R21 | R22 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
+ *  -------------------------------------------------  *
+ *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
+ *  -------------------------------------------------  *
+ *  | R23 | R24 | R25 | R26 | R27 | R28 | R29 | R30 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
+ *  -------------------------------------------------  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
+ *  -------------------------------------------------  *
+ *  | R31 |hiddn|  CR |  LR |  PC |bchai|linkr| FCTX|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  64 |                                         |  *
+ *  -------------------------------------------------  *
+ *  | 256 |                                         |  *
+ *  -------------------------------------------------  *
+ *  | DATA|                                         |  * 
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl _make_fcontext
+.align 2
+_make_fcontext:
+    # save return address into R6
+    mflr  r6
+
+    # first arg of make_fcontext() == top address of context-function
+    # shift address in R3 to lower 16 byte boundary
+    clrrwi  r3, r3, 4
+
+    # reserve space for context-data on context-stack
+    # including 64 byte of linkage + parameter area (R1  16 == 0)
+    subi  r3, r3, 336
+
+    # third arg of make_fcontext() == address of context-function
+    stw  r5, 240(r3)
+
+    # set back-chain to zero
+    li   r0, 0
+    stw  r0, 244(r3)
+
+    mffs  f0  # load FPSCR
+    stfd  f0, 144(r3)  # save FPSCR
+
+    # compute address of returned transfer_t
+    addi  r0, r3, 252
+    mr    r4, r0 
+    stw   r4, 228(r3) 
+
+    # load LR
+    mflr  r0
+    # jump to label 1
+    bl  1f
+1:
+    # load LR into R4
+    mflr  r4
+    # compute abs address of label finish
+    addi  r4, r4, finish - 1b
+    # restore LR
+    mtlr  r0
+    # save address of finish as return-address for context-function
+    # will be entered after context-function returns
+    stw  r4, 236(r3)
+
+    # restore return address from R6
+    mtlr  r6
+
+    blr  # return pointer to context-data
+
+finish:
+    # save return address into R0
+    mflr  r0
+    # save return address on stack, set up stack frame
+    stw  r0, 4(r1)
+    # allocate stack space, R1  16 == 0
+    stwu  r1, -16(r1)
+
+    # exit code is zero
+    li  r3, 0
+    # exit application
+    bl  _exit@plt

+ 138 - 64
modules/std/fiber/native/asm/make_ppc32_sysv_xcoff_gas.S

@@ -1,64 +1,138 @@
-	.globl	make_fcontext[DS]
-	.globl .make_fcontext[PR]
-	.align 2 
-	.csect  make_fcontext[DS]
-make_fcontext:
-	.long .make_fcontext[PR]
-	.csect .make_fcontext[PR], 3
-#.make_fcontext:
-    # save return address into R6
-    mflr  6
-
-    # first arg of make_fcontext() == top address of context-function
-    # shift address in R3 to lower 16 byte boundary
-    clrrwi  3, 3, 4
-
-    # reserve space for context-data on context-stack
-    # including 64 byte of linkage + parameter area (R1 % 16 == 0)
-    subi  3, 3, 172
-
-    # third arg of make_fcontext() == address of context-function
-    stw  5, 88(3)
-
-    # set back-chain to zero
-    li   0, 0
-    stw  0, 92(3)
-
-    # compute address of returned transfer_t
-    addi  0, 3, 100
-    mr    4, 0 
-    stw   4, 76(3) 
-
-    # load LR
-    mflr  0
-    # jump to label 1
-    bl  .Label
-.Label:
-    # load LR into R4
-    mflr  4
-    # compute abs address of label .L_finish
-    addi  4, 4, .L_finish - .Label 
-    # restore LR
-    mtlr  0
-    # save address of finish as return-address for context-function
-    # will be entered after context-function returns
-    stw  4, 84(3)
-
-    # restore return address from R6
-    mtlr  6
-
-    blr  # return pointer to context-data
-
-.L_finish:
-    # save return address into R0
-    mflr  0
-    # save return address on stack, set up stack frame
-    stw  0, 4(1)
-    # allocate stack space, R1 % 16 == 0
-    stwu  1, -16(1)
-
-    # exit code is zero
-    li  3, 0
-    # exit application
-    bl  ._exit
-    nop
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    F14    |    F15    |    F16    |    F17    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    F18    |    F19    |    F20    |    F21    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |    F22    |    F23    |    F24    |    F25    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |    F26    |    F27    |    F28    |    F29    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
+ *  -------------------------------------------------  *
+ *  |    F30    |    F31    |   fpscr   | R13 | R14 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
+ *  -------------------------------------------------  *
+ *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
+ *  -------------------------------------------------  *
+ *  | R15 | R16 | R17 | R18 | R19 | R20 | R21 | R22 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
+ *  -------------------------------------------------  *
+ *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
+ *  -------------------------------------------------  *
+ *  | R23 | R24 | R25 | R26 | R27 | R28 | R29 | R30 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
+ *  -------------------------------------------------  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
+ *  -------------------------------------------------  *
+ *  | R31 |hiddn|  CR |  LR |  PC |bchai|linkr| FCTX|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  64 |                                         |  *
+ *  -------------------------------------------------  *
+ *  | 256 |                                         |  *
+ *  -------------------------------------------------  *
+ *  | DATA|                                         |  * 
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+	.globl	make_fcontext[DS]
+	.globl .make_fcontext[PR]
+	.align 2 
+	.csect  make_fcontext[DS]
+make_fcontext:
+	.long .make_fcontext[PR]
+	.csect .make_fcontext[PR], 3
+#.make_fcontext:
+    # save return address into R6
+    mflr  6
+
+    # first arg of make_fcontext() == top address of context-function
+    # shift address in R3 to lower 16 byte boundary
+    clrrwi  3, 3, 4
+
+    # reserve space for context-data on context-stack
+    # including 64 byte of linkage + parameter area (R1 % 16 == 0)
+    subi  3, 3, 336
+
+    # third arg of make_fcontext() == address of context-function
+    stw  5, 240(3)
+
+    # set back-chain to zero
+    li   0, 0
+    stw  0, 244(3)
+
+    # compute address of returned transfer_t
+    addi  0, 3, 252
+    mr    4, 0 
+    stw   4, 228(3) 
+
+    # load LR
+    mflr  0
+    # jump to label 1
+    bl  .Label
+.Label:
+    # load LR into R4
+    mflr  4
+    # compute abs address of label .L_finish
+    addi  4, 4, .L_finish - .Label 
+    # restore LR
+    mtlr  0
+    # save address of finish as return-address for context-function
+    # will be entered after context-function returns
+    stw  4, 236(3)
+
+    # restore return address from R6
+    mtlr  6
+
+    blr  # return pointer to context-data
+
+.L_finish:
+    # save return address into R0
+    mflr  0
+    # save return address on stack, set up stack frame
+    stw  0, 4(1)
+    # allocate stack space, R1 % 16 == 0
+    stwu  1, -16(1)
+
+    # exit code is zero
+    li  3, 0
+    # exit application
+    bl  ._exit
+    nop

+ 176 - 176
modules/std/fiber/native/asm/make_ppc64_sysv_elf_gas.S

@@ -1,176 +1,176 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
- *  -------------------------------------------------  *
- *  |    TOC    |    R14    |    R15    |    R16    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
- *  -------------------------------------------------  *
- *  |    R17    |    R18    |     R19   |    R20    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
- *  -------------------------------------------------  *
- *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
- *  -------------------------------------------------  *
- *  |    R21    |    R22    |    R23    |    R24    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
- *  -------------------------------------------------  *
- *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
- *  -------------------------------------------------  *
- *  |    R25    |    R26    |    R27    |    R28    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
- *  -------------------------------------------------  *
- *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
- *  -------------------------------------------------  *
- *  |    R29    |    R30    |    R31    |   hidden  |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
- *  -------------------------------------------------  *
- *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
- *  -------------------------------------------------  *
- *  |     CR    |     LR    |     PC    | back-chain|  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
- *  -------------------------------------------------  *
- *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
- *  -------------------------------------------------  *
- *  |  cr saved |  lr saved |  compiler |   linker  |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
- *  -------------------------------------------------  *
- *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
- *  -------------------------------------------------  *
- *  | TOC saved |    FCTX   |    DATA   |           |  *
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.globl make_fcontext
-#if _CALL_ELF == 2
-	.text
-	.align 2
-make_fcontext:
-	addis	%r2, %r12, .TOC.-make_fcontext@ha
-	addi	%r2, %r2, .TOC.-make_fcontext@l
-	.localentry make_fcontext, . - make_fcontext
-#else
-	.section ".opd","aw"
-	.align 3
-make_fcontext:
-# ifdef _CALL_LINUX
-	.quad	.L.make_fcontext,.TOC.@tocbase,0
-	.type	make_fcontext,@function
-	.text
-	.align 2
-.L.make_fcontext:
-# else
-	.hidden	.make_fcontext
-	.globl	.make_fcontext
-	.quad	.make_fcontext,.TOC.@tocbase,0
-	.size	make_fcontext,24
-	.type	.make_fcontext,@function
-	.text
-	.align 2
-.make_fcontext:
-# endif
-#endif
-    # save return address into R6
-    mflr  %r6
-
-    # first arg of make_fcontext() == top address of context-stack
-    # shift address in R3 to lower 16 byte boundary
-    clrrdi  %r3, %r3, 4
-
-    # reserve space for context-data on context-stack
-    # including 64 byte of linkage + parameter area (R1 % 16 == 0)
-    subi  %r3, %r3, 248
-
-    # third arg of make_fcontext() == address of context-function
-    # entry point (ELFv2) or descriptor (ELFv1)
-#if _CALL_ELF == 2
-    # save address of context-function entry point
-    std  %r5, 176(%r3)
-#else
-    # save address of context-function entry point
-    ld   %r4, 0(%r5)
-    std  %r4, 176(%r3)
-    # save TOC of context-function
-    ld   %r4, 8(%r5)
-    std  %r4, 0(%r3)
-#endif
-
-    # set back-chain to zero
-    li   %r0, 0
-    std  %r0, 184(%r3)
-
-    # compute address of returned transfer_t
-    addi %r0, %r3, 232
-    mr   %r4, %r0
-    std  %r4, 152(%r3)
-
-    # load LR
-    mflr  %r0
-    # jump to label 1
-    bl  1f
-1:
-    # load LR into R4
-    mflr  %r4
-    # compute abs address of label finish
-    addi  %r4, %r4, finish - 1b
-    # restore LR
-    mtlr  %r0
-    # save address of finish as return-address for context-function
-    # will be entered after context-function returns
-    std  %r4, 168(%r3)
-
-    # restore return address from R6
-    mtlr  %r6
-
-    blr  # return pointer to context-data
-
-finish:
-    # save return address into R0
-    mflr  %r0
-    # save return address on stack, set up stack frame
-    std  %r0, 8(%r1)
-    # allocate stack space, R1 % 16 == 0
-    stdu  %r1, -32(%r1)
-
-    # exit code is zero
-    li  %r3, 0
-    # exit application
-    bl  _exit
-    nop
-#if _CALL_ELF == 2
-	.size make_fcontext, .-make_fcontext
-#else
-# ifdef _CALL_LINUX
-	.size .make_fcontext, .-.L.make_fcontext
-# else
-	.size .make_fcontext, .-.make_fcontext
-# endif
-#endif
-
-/* Mark that we don't need executable stack.  */
-.section .note.GNU-stack,"",%progbits
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    TOC    |    R14    |    R15    |    R16    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    R17    |    R18    |     R19   |    R20    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |    R21    |    R22    |    R23    |    R24    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |    R25    |    R26    |    R27    |    R28    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
+ *  -------------------------------------------------  *
+ *  |    R29    |    R30    |    R31    |   hidden  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
+ *  -------------------------------------------------  *
+ *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
+ *  -------------------------------------------------  *
+ *  |     CR    |     LR    |     PC    | back-chain|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
+ *  -------------------------------------------------  *
+ *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
+ *  -------------------------------------------------  *
+ *  |  cr saved |  lr saved |  compiler |   linker  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
+ *  -------------------------------------------------  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
+ *  -------------------------------------------------  *
+ *  | TOC saved |    FCTX   |    DATA   |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.globl make_fcontext
+#if _CALL_ELF == 2
+	.text
+	.align 2
+make_fcontext:
+	addis	%r2, %r12, .TOC.-make_fcontext@ha
+	addi	%r2, %r2, .TOC.-make_fcontext@l
+	.localentry make_fcontext, . - make_fcontext
+#else
+	.section ".opd","aw"
+	.align 3
+make_fcontext:
+# ifdef _CALL_LINUX
+	.quad	.L.make_fcontext,.TOC.@tocbase,0
+	.type	make_fcontext,@function
+	.text
+	.align 2
+.L.make_fcontext:
+# else
+	.hidden	.make_fcontext
+	.globl	.make_fcontext
+	.quad	.make_fcontext,.TOC.@tocbase,0
+	.size	make_fcontext,24
+	.type	.make_fcontext,@function
+	.text
+	.align 2
+.make_fcontext:
+# endif
+#endif
+    # save return address into R6
+    mflr  %r6
+
+    # first arg of make_fcontext() == top address of context-stack
+    # shift address in R3 to lower 16 byte boundary
+    clrrdi  %r3, %r3, 4
+
+    # reserve space for context-data on context-stack
+    # including 64 byte of linkage + parameter area (R1 % 16 == 0)
+    subi  %r3, %r3, 248
+
+    # third arg of make_fcontext() == address of context-function
+    # entry point (ELFv2) or descriptor (ELFv1)
+#if _CALL_ELF == 2
+    # save address of context-function entry point
+    std  %r5, 176(%r3)
+#else
+    # save address of context-function entry point
+    ld   %r4, 0(%r5)
+    std  %r4, 176(%r3)
+    # save TOC of context-function
+    ld   %r4, 8(%r5)
+    std  %r4, 0(%r3)
+#endif
+
+    # set back-chain to zero
+    li   %r0, 0
+    std  %r0, 184(%r3)
+
+#if _CALL_ELF != 2
+    # zero in r3 indicates first jump to context-function
+    std  %r0, 152(%r3)
+#endif
+
+    # load LR
+    mflr  %r0
+    # jump to label 1
+    bl  1f
+1:
+    # load LR into R4
+    mflr  %r4
+    # compute abs address of label finish
+    addi  %r4, %r4, finish - 1b
+    # restore LR
+    mtlr  %r0
+    # save address of finish as return-address for context-function
+    # will be entered after context-function returns
+    std  %r4, 168(%r3)
+
+    # restore return address from R6
+    mtlr  %r6
+
+    blr  # return pointer to context-data
+
+finish:
+    # save return address into R0
+    mflr  %r0
+    # save return address on stack, set up stack frame
+    std  %r0, 8(%r1)
+    # allocate stack space, R1 % 16 == 0
+    stdu  %r1, -32(%r1)
+
+    # exit code is zero
+    li  %r3, 0
+    # exit application
+    bl  _exit
+    nop
+#if _CALL_ELF == 2
+	.size make_fcontext, .-make_fcontext
+#else
+# ifdef _CALL_LINUX
+	.size .make_fcontext, .-.L.make_fcontext
+# else
+	.size .make_fcontext, .-.make_fcontext
+# endif
+#endif
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 126 - 126
modules/std/fiber/native/asm/make_ppc64_sysv_macho_gas.S

@@ -1,126 +1,126 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
- *  -------------------------------------------------  *
- *  |    TOC    |    R14    |    R15    |    R16    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
- *  -------------------------------------------------  *
- *  |    R17    |    R18    |     R19   |    R20    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
- *  -------------------------------------------------  *
- *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
- *  -------------------------------------------------  *
- *  |    R21    |    R22    |    R23    |    R24    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
- *  -------------------------------------------------  *
- *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
- *  -------------------------------------------------  *
- *  |    R25    |    R26    |    R27    |    R28    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
- *  -------------------------------------------------  *
- *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
- *  -------------------------------------------------  *
- *  |    R29    |    R30    |    R31    |   hidden  |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
- *  -------------------------------------------------  *
- *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
- *  -------------------------------------------------  *
- *  |     CR    |     LR    |     PC    | back-chain|  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
- *  -------------------------------------------------  *
- *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
- *  -------------------------------------------------  *
- *  |  cr saved |  lr saved |  compiler |   linker  |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
- *  -------------------------------------------------  *
- *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
- *  -------------------------------------------------  *
- *  | TOC saved |    FCTX   |    DATA   |           |  *
- *  -------------------------------------------------  *
- *                                                     *
-
-.text
-.globl _make_fcontext
-_make_fcontext:
-    ; save return address into R6
-    mflr  r6
-
-    ; first arg of make_fcontext() == top address of context-function
-    ; shift address in R3 to lower 16 byte boundary
-    clrrwi  r3, r3, 4
-
-    ; reserve space for context-data on context-stack
-    ; including 64 byte of linkage + parameter area (R1  16 == 0)
-    subi  r3, r3, 248
-
-    ; third arg of make_fcontext() == address of context-function
-    stw  r5, 176(r3)
-
-    ; set back-chain to zero
-    li   %r0, 0
-    std  %r0, 184(%r3)
-
-    ; compute address of returned transfer_t
-    addi %r0, %r3, 232
-    mr   %r4, %r0
-    std  %r4, 152(%r3)
-
-    ; load LR
-    mflr  r0
-    ; jump to label 1
-    bl  l1
-l1:
-    ; load LR into R4
-    mflr  r4
-    ; compute abs address of label finish
-    addi  r4, r4, lo16((finish - .) + 4)
-    ; restore LR
-    mtlr  r0
-    ; save address of finish as return-address for context-function
-    ; will be entered after context-function returns
-    std  r4, 168(r3)
-
-    ; restore return address from R6
-    mtlr  r6
-
-    blr  ; return pointer to context-data
-
-finish:
-    ; save return address into R0
-    mflr  r0
-    ; save return address on stack, set up stack frame
-    stw  r0, 8(r1)
-    ; allocate stack space, R1  16 == 0
-    stwu  r1, -32(r1)
-
-    ; set return value to zero
-    li  r3, 0
-    ; exit application
-    bl  __exit
-    nop
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    TOC    |    R14    |    R15    |    R16    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    R17    |    R18    |     R19   |    R20    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |    R21    |    R22    |    R23    |    R24    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |    R25    |    R26    |    R27    |    R28    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
+ *  -------------------------------------------------  *
+ *  |    R29    |    R30    |    R31    |   hidden  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
+ *  -------------------------------------------------  *
+ *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
+ *  -------------------------------------------------  *
+ *  |     CR    |     LR    |     PC    | back-chain|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
+ *  -------------------------------------------------  *
+ *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
+ *  -------------------------------------------------  *
+ *  |  cr saved |  lr saved |  compiler |   linker  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
+ *  -------------------------------------------------  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
+ *  -------------------------------------------------  *
+ *  | TOC saved |    FCTX   |    DATA   |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+
+.text
+.globl _make_fcontext
+_make_fcontext:
+    ; save return address into R6
+    mflr  r6
+
+    ; first arg of make_fcontext() == top address of context-function
+    ; shift address in R3 to lower 16 byte boundary
+    clrrwi  r3, r3, 4
+
+    ; reserve space for context-data on context-stack
+    ; including 64 byte of linkage + parameter area (R1  16 == 0)
+    subi  r3, r3, 248
+
+    ; third arg of make_fcontext() == address of context-function
+    stw  r5, 176(r3)
+
+    ; set back-chain to zero
+    li   %r0, 0
+    std  %r0, 184(%r3)
+
+    ; compute address of returned transfer_t
+    addi %r0, %r3, 232
+    mr   %r4, %r0
+    std  %r4, 152(%r3)
+
+    ; load LR
+    mflr  r0
+    ; jump to label 1
+    bl  l1
+l1:
+    ; load LR into R4
+    mflr  r4
+    ; compute abs address of label finish
+    addi  r4, r4, lo16((finish - .) + 4)
+    ; restore LR
+    mtlr  r0
+    ; save address of finish as return-address for context-function
+    ; will be entered after context-function returns
+    std  r4, 168(r3)
+
+    ; restore return address from R6
+    mtlr  r6
+
+    blr  ; return pointer to context-data
+
+finish:
+    ; save return address into R0
+    mflr  r0
+    ; save return address on stack, set up stack frame
+    stw  r0, 8(r1)
+    ; allocate stack space, R1  16 == 0
+    stwu  r1, -32(r1)
+
+    ; set return value to zero
+    li  r3, 0
+    ; exit application
+    bl  __exit
+    nop

+ 62 - 62
modules/std/fiber/native/asm/make_ppc64_sysv_xcoff_gas.S

@@ -1,62 +1,62 @@
-	.globl	make_fcontext[DS]
-	.globl .make_fcontext[PR]
-	.align 2 
-	.csect .make_fcontext[PR], 3
-	.globl _make_fcontext
-#._make_fcontext:
-    # save return address into R6
-    mflr  6
-
-    # first arg of make_fcontext() == top address of context-function
-    # shift address in R3 to lower 16 byte boundary
-    clrrwi  3, 3, 4
-
-    # reserve space for context-data on context-stack
-    # including 64 byte of linkage + parameter area (R1 % 16 == 0)
-    subi  3, 3, 248
-
-    # third arg of make_fcontext() == address of context-function
-    stw  5, 176(3)
-
-    # set back-chain to zero
-    li   0, 0
-    std  0, 184(3)
-
-    # compute address of returned transfer_t
-    addi 0, 3, 232
-    mr   4, 0
-    std  4, 152(3)
-
-    # load LR
-    mflr  0
-    # jump to label 1
-    bl  .Label
-.Label:
-    # load LR into R4
-    mflr  4
-    # compute abs address of label .L_finish
-    addi  4, 4, .L_finish - .Label
-    # restore LR
-    mtlr  0
-    # save address of finish as return-address for context-function
-    # will be entered after context-function returns
-    stw  4, 168(3)
-
-    # restore return address from R6
-    mtlr  6
-
-    blr  # return pointer to context-data
-
-.L_finish:
-    # save return address into R0
-    mflr  0
-    # save return address on stack, set up stack frame
-    stw  0, 8(1)
-    # allocate stack space, R1 % 16 == 0
-    stwu  1, -32(1)
-
-    # exit code is zero
-    li  3, 0
-    # exit application
-    bl  ._exit
-    nop
+	.globl	make_fcontext[DS]
+	.globl .make_fcontext[PR]
+	.align 2 
+	.csect .make_fcontext[PR], 3
+	.globl _make_fcontext
+#._make_fcontext:
+    # save return address into R6
+    mflr  6
+
+    # first arg of make_fcontext() == top address of context-function
+    # shift address in R3 to lower 16 byte boundary
+    clrrwi  3, 3, 4
+
+    # reserve space for context-data on context-stack
+    # including 64 byte of linkage + parameter area (R1 % 16 == 0)
+    subi  3, 3, 248
+
+    # third arg of make_fcontext() == address of context-function
+    stw  5, 176(3)
+
+    # set back-chain to zero
+    li   0, 0
+    std  0, 184(3)
+
+    # compute address of returned transfer_t
+    addi 0, 3, 232
+    mr   4, 0
+    std  4, 152(3)
+
+    # load LR
+    mflr  0
+    # jump to label 1
+    bl  .Label
+.Label:
+    # load LR into R4
+    mflr  4
+    # compute abs address of label .L_finish
+    addi  4, 4, .L_finish - .Label
+    # restore LR
+    mtlr  0
+    # save address of finish as return-address for context-function
+    # will be entered after context-function returns
+    stw  4, 168(3)
+
+    # restore return address from R6
+    mtlr  6
+
+    blr  # return pointer to context-data
+
+.L_finish:
+    # save return address into R0
+    mflr  0
+    # save return address on stack, set up stack frame
+    stw  0, 8(1)
+    # allocate stack space, R1 % 16 == 0
+    stwu  1, -32(1)
+
+    # exit code is zero
+    li  3, 0
+    # exit application
+    bl  ._exit
+    nop

+ 174 - 123
modules/std/fiber/native/asm/make_x86_64_ms_pe_gas.asm

@@ -1,123 +1,174 @@
-/*
-            Copyright Oliver Kowalke 2009.
-            Copyright Thomas Sailer 2013.
-   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)
-*/
-
-/**************************************************************************************
- *                                                                                    *
- * ---------------------------------------------------------------------------------- *
- * |     0   |     1   |     2    |     3   |     4   |     5   |     6   |     7   | *
- * ---------------------------------------------------------------------------------- *
- * |    0x0  |    0x4  |    0x8   |    0xc  |   0x10  |   0x14  |   0x18  |   0x1c  | *
- * ---------------------------------------------------------------------------------- *
- * |      fbr_strg     |      fc_dealloc    |       limit       |        base       | *
- * ---------------------------------------------------------------------------------- *
- * ---------------------------------------------------------------------------------- *
- * |     8   |    9    |    10    |    11   |    12   |    13   |    14   |    15   | *
- * ---------------------------------------------------------------------------------- *
- * |   0x20  |  0x24   |   0x28   |   0x2c  |   0x30  |   0x34  |   0x38  |   0x3c  | *
- * ---------------------------------------------------------------------------------- *
- * |        R12        |         R13        |        R14        |        R15        | *
- * ---------------------------------------------------------------------------------- *
- * ---------------------------------------------------------------------------------- *
- * |    16   |    17   |    18   |    19    |    20   |    21   |    22   |    23   | *
- * ---------------------------------------------------------------------------------- *
- * |   0xe40  |   0x44 |   0x48  |   0x4c   |   0x50  |   0x54  |   0x58  |   0x5c  | *
- * ---------------------------------------------------------------------------------- *
- * |        RDI         |       RSI         |        RBX        |        RBP        | *
- * ---------------------------------------------------------------------------------- *
- * ---------------------------------------------------------------------------------- *
- * |    24   |   25    |    26    |   27    |    28   |    29   |    30   |    31   | *
- * ---------------------------------------------------------------------------------- *
- * |   0x60  |   0x64  |   0x68   |   0x6c  |   0x70  |   0x74  |   0x78  |   0x7c  | *
- * ---------------------------------------------------------------------------------- *
- * |        hidden     |         RIP        |        EXIT       |   parameter area  | *
- * ---------------------------------------------------------------------------------- *
- * ---------------------------------------------------------------------------------- *
- * |    32   |   32    |    33    |   34    |    35   |    36   |    37   |    38   | *
- * ---------------------------------------------------------------------------------- *
- * |   0x80  |   0x84  |   0x88   |   0x8c  |   0x90  |   0x94  |   0x98  |   0x9c  | *
- * ---------------------------------------------------------------------------------- *
- * |                       parameter area                       |        FCTX       | *
- * ---------------------------------------------------------------------------------- *
- * ---------------------------------------------------------------------------------- *
- * |    39   |   40    |    41    |   42    |    43   |    44   |    45   |    46   | *
- * ---------------------------------------------------------------------------------- *
- * |   0xa0  |   0xa4  |   0xa8   |   0xac  |   0xb0  |   0xb4  |   0xb8  |   0xbc  | *
- * ---------------------------------------------------------------------------------- *
- * |       DATA        |                    |                   |                   | *
- * ---------------------------------------------------------------------------------- *
- *                                                                                    *
- * ***********************************************************************************/
-
-.file	"make_x86_64_ms_pe_gas.asm"
-.text
-.p2align 4,,15
-.globl	make_fcontext
-.def	make_fcontext;	.scl	2;	.type	32;	.endef
-.seh_proc	make_fcontext
-make_fcontext:
-.seh_endprologue
-
-    /* first arg of make_fcontext() == top of context-stack */
-    movq  %rcx, %rax
-
-    /* shift address in RAX to lower 16 byte boundary */
-    /* == pointer to fcontext_t and address of context stack */
-    andq  $-16, %rax
-
-    /* reserve space for context-data on context-stack */
-    /* on context-function entry: (RSP -0x8) % 16 == 0 */
-    leaq  -0xb8(%rax), %rax
-
-    /* third arg of make_fcontext() == address of context-function */
-    movq  %r8, 0x68(%rax)
-
-    /* first arg of make_fcontext() == top of context-stack */
-    /* save top address of context stack as 'base' */
-    movq  %rcx, 0x18(%rax)
-    /* second arg of make_fcontext() == size of context-stack */
-    /* negate stack size for LEA instruction (== substraction) */
-    negq  %rdx
-    /* compute bottom address of context stack (limit) */
-    leaq  (%rcx,%rdx), %rcx
-    /* save bottom address of context stack as 'limit' */
-    movq  %rcx, 0x10(%rax)
-    /* save address of context stack limit as 'dealloction stack' */
-    movq  %rcx, 0x8(%rax)
-	/* set fiber-storage to zero */
-    xorq  %rcx, %rcx
-    movq  %rcx, (%rax)
-
-    /* compute address of transport_t */
-    leaq  0x98(%rax), %rcx
-    /* store address of transport_t in hidden field */
-    movq %rcx, 0x60(%rax)
-
-    /* compute abs address of label finish */
-    leaq  finish(%rip), %rcx
-    /* save address of finish as return-address for context-function */
-    /* will be entered after context-function returns */
-    movq  %rcx, 0x70(%rax)
-
-    ret /* return pointer to context-data */
-
-finish:
-    /* 32byte shadow-space for _exit() */
-    andq  $-32, %rsp
-    /* 32byte shadow-space for _exit() are */
-    /* already reserved by make_fcontext() */
-    /* exit code is zero */
-    xorq  %rcx, %rcx
-    /* exit application */
-    call  _exit
-    hlt
-.seh_endproc
-
-.def	_exit;	.scl	2;	.type	32;	.endef  /* standard C library function */
-
-.section .drectve
-.ascii " -export:\"make_fcontext\""
+/*
+            Copyright Oliver Kowalke 2009.
+            Copyright Thomas Sailer 2013.
+   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)
+*/
+
+/*************************************************************************************
+* ---------------------------------------------------------------------------------- *
+* |     0   |     1   |     2    |     3   |     4   |     5   |     6   |     7   | *
+* ---------------------------------------------------------------------------------- *
+* |    0x0  |    0x4  |    0x8   |    0xc  |   0x10  |   0x14  |   0x18  |   0x1c  | *
+* ---------------------------------------------------------------------------------- *
+* |                          SEE registers (XMM6-XMM15)                            | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |     8   |    9    |    10    |    11   |    12   |    13   |    14   |    15   | *
+* ---------------------------------------------------------------------------------- *
+* |   0x20  |  0x24   |   0x28   |   0x2c  |   0x30  |   0x34  |   0x38  |   0x3c  | *
+* ---------------------------------------------------------------------------------- *
+* |                          SEE registers (XMM6-XMM15)                            | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    16   |    17   |    18   |    19    |    20   |    21   |    22   |    23   | *
+* ---------------------------------------------------------------------------------- *
+* |   0xe40  |   0x44 |   0x48  |   0x4c   |   0x50  |   0x54  |   0x58  |   0x5c  | *
+* ---------------------------------------------------------------------------------- *
+* |                          SEE registers (XMM6-XMM15)                            | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    24   |   25    |    26    |   27    |    28   |    29   |    30   |    31   | *
+* ---------------------------------------------------------------------------------- *
+* |   0x60  |   0x64  |   0x68   |   0x6c  |   0x70  |   0x74  |   0x78  |   0x7c  | *
+* ---------------------------------------------------------------------------------- *
+* |                          SEE registers (XMM6-XMM15)                            | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    32   |   32    |    33    |   34    |    35   |    36   |    37   |    38   | *
+* ---------------------------------------------------------------------------------- *
+* |   0x80  |   0x84  |   0x88   |   0x8c  |   0x90  |   0x94  |   0x98  |   0x9c  | *
+* ---------------------------------------------------------------------------------- *
+* |                          SEE registers (XMM6-XMM15)                            | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    39   |   40    |    41    |   42    |    43   |    44   |    45   |    46   | *
+* ---------------------------------------------------------------------------------- *
+* |   0xa0  |   0xa4  |   0xa8   |   0xac  |   0xb0  |   0xb4  |   0xb8  |   0xbc  | *
+* ---------------------------------------------------------------------------------- *
+* | fc_mxcsr|fc_x87_cw|     <alignment>    |       fbr_strg    |      fc_dealloc   | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    47   |   48    |    49    |   50    |    51   |    52   |    53   |    54   | *
+* ---------------------------------------------------------------------------------- *
+* |   0xc0  |   0xc4  |   0xc8   |   0xcc  |   0xd0  |   0xd4  |   0xd8  |   0xdc  | *
+* ---------------------------------------------------------------------------------- *
+* |        limit      |         base       |         R12       |         R13       | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    55   |   56    |    57    |   58    |    59   |    60   |    61   |    62   | *
+* ---------------------------------------------------------------------------------- *
+* |   0xe0  |   0xe4  |   0xe8   |   0xec  |   0xf0  |   0xf4  |   0xf8  |   0xfc  | *
+* ---------------------------------------------------------------------------------- *
+* |        R14        |         R15        |         RDI       |        RSI        | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    63   |   64    |    65    |   66    |    67   |    68   |    69   |    70   | *
+* ---------------------------------------------------------------------------------- *
+* |  0x100  |  0x104  |  0x108   |  0x10c  |  0x110  |  0x114  |  0x118  |  0x11c  | *
+* ---------------------------------------------------------------------------------- *
+* |        RBX        |         RBP        |       hidden      |        RIP        | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    71   |   72    |    73    |   74    |    75   |    76   |    77   |    78   | *
+* ---------------------------------------------------------------------------------- *
+* |  0x120  |  0x124  |  0x128   |  0x12c  |  0x130  |  0x134  |  0x138  |  0x13c  | *
+* ---------------------------------------------------------------------------------- *
+* |                                   parameter area                               | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    79   |   80    |    81    |   82    |    83   |    84   |    85   |    86   | *
+* ---------------------------------------------------------------------------------- *
+* |  0x140  |  0x144  |  0x148   |  0x14c  |  0x150  |  0x154  |  0x158  |  0x15c  | *
+* ---------------------------------------------------------------------------------- *
+* |       FCTX        |        DATA        |                                       | *
+* ---------------------------------------------------------------------------------- *
+**************************************************************************************/
+
+.file	"make_x86_64_ms_pe_gas.asm"
+.text
+.p2align 4,,15
+.globl	make_fcontext
+.def	make_fcontext;	.scl	2;	.type	32;	.endef
+.seh_proc	make_fcontext
+make_fcontext:
+.seh_endprologue
+
+    /* first arg of make_fcontext() == top of context-stack */
+    movq  %rcx, %rax
+
+    /* shift address in RAX to lower 16 byte boundary */
+    /* == pointer to fcontext_t and address of context stack */
+    andq  $-16, %rax
+
+    /* reserve space for context-data on context-stack */
+    /* on context-function entry: (RSP -0x8) % 16 == 0 */
+    leaq  -0x150(%rax), %rax
+
+    /* third arg of make_fcontext() == address of context-function */
+    movq  %r8, 0x100(%rax)
+
+    /* first arg of make_fcontext() == top of context-stack */
+    /* save top address of context stack as 'base' */
+    movq  %rcx, 0xc8(%rax)
+    /* second arg of make_fcontext() == size of context-stack */
+    /* negate stack size for LEA instruction (== substraction) */
+    negq  %rdx
+    /* compute bottom address of context stack (limit) */
+    leaq  (%rcx,%rdx), %rcx
+    /* save bottom address of context stack as 'limit' */
+    movq  %rcx, 0xc0(%rax)
+    /* save address of context stack limit as 'dealloction stack' */
+    movq  %rcx, 0xb8(%rax)
+	/* set fiber-storage to zero */
+    xorq  %rcx, %rcx
+    movq  %rcx, 0xb0(%rax)
+
+	/* save MMX control- and status-word */
+    stmxcsr  0xa0(%rax)
+    /* save x87 control-word */
+    fnstcw   0xa4(%rax)
+
+    /* compute address of transport_t */
+    leaq  0x140(%rax), %rcx
+    /* store address of transport_t in hidden field */
+    movq %rcx, 0x110(%rax)
+
+    /* compute abs address of label trampoline */
+    leaq  trampoline(%rip), %rcx
+    /* save address of finish as return-address for context-function */
+    /* will be entered after jump_fcontext() first time */
+    movq  %rcx, 0x118(%rax)
+
+    /* compute abs address of label finish */
+    leaq  finish(%rip), %rcx
+    /* save address of finish as return-address for context-function */
+    /* will be entered after context-function returns */
+    movq  %rcx, 0x108(%rax)
+
+    ret /* return pointer to context-data */
+
+trampoline:
+    /* store return address on stack */
+    /* fix stack alignment */ 
+    pushq %rbp
+    /* jump to context-function */
+    jmp *%rbx
+
+finish:
+    /* 32byte shadow-space for _exit() */
+    andq  $-32, %rsp
+    /* 32byte shadow-space for _exit() are */
+    /* already reserved by make_fcontext() */
+    /* exit code is zero */
+    xorq  %rcx, %rcx
+    /* exit application */
+    call  _exit
+    hlt
+.seh_endproc
+
+.def	_exit;	.scl	2;	.type	32;	.endef  /* standard C library function */
+
+.section .drectve
+.ascii " -export:\"make_fcontext\""

+ 163 - 109
modules/std/fiber/native/asm/make_x86_64_ms_pe_masm.asm

@@ -1,109 +1,163 @@
-
-;           Copyright Oliver Kowalke 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)
-
-;  ----------------------------------------------------------------------------------
-;  |     0   |     1   |     2    |     3   |     4   |     5   |     6   |     7   |
-;  ----------------------------------------------------------------------------------
-;  |    0x0  |    0x4  |    0x8   |    0xc  |   0x10  |   0x14  |   0x18  |   0x1c  |
-;  ----------------------------------------------------------------------------------
-;  |      fbr_strg     |      fc_dealloc    |       limit       |        base       |
-;  ----------------------------------------------------------------------------------
-;  ----------------------------------------------------------------------------------
-;  |     8   |    9    |    10    |    11   |    12   |    13   |    14   |    15   |
-;  ----------------------------------------------------------------------------------
-;  |   0x20  |  0x24   |   0x28   |   0x2c  |   0x30  |   0x34  |   0x38  |   0x3c  |
-;  ----------------------------------------------------------------------------------
-;  |        R12        |         R13        |        R14        |        R15        |
-;  ----------------------------------------------------------------------------------
-;  ----------------------------------------------------------------------------------
-;  |    16   |    17   |    18   |    19    |    20   |    21   |    22   |    23   |
-;  ----------------------------------------------------------------------------------
-;  |   0xe40  |   0x44 |   0x48  |   0x4c   |   0x50  |   0x54  |   0x58  |   0x5c  |
-;  ----------------------------------------------------------------------------------
-;  |        RDI         |       RSI         |        RBX        |        RBP        |
-;  ----------------------------------------------------------------------------------
-;  ----------------------------------------------------------------------------------
-;  |    24   |   25    |    26    |   27    |    28   |    29   |    30   |    31   |
-;  ----------------------------------------------------------------------------------
-;  |   0x60  |   0x64  |   0x68   |   0x6c  |   0x70  |   0x74  |   0x78  |   0x7c  |
-;  ----------------------------------------------------------------------------------
-;  |        hidden     |         RIP        |       EXIT        |   parameter area  |
-;  ----------------------------------------------------------------------------------
-;  ----------------------------------------------------------------------------------
-;  |    32   |   32    |    33    |   34    |    35   |    36   |    37   |    38   |
-;  ----------------------------------------------------------------------------------
-;  |   0x80  |   0x84  |   0x88   |   0x8c  |   0x90  |   0x94  |   0x98  |   0x9c  |
-;  ----------------------------------------------------------------------------------
-;  |                       parameter area                       |        FCTX       |
-;  ----------------------------------------------------------------------------------
-;  ----------------------------------------------------------------------------------
-;  |    39   |   40    |    41    |   42    |    43   |    44   |    45   |    46   |
-;  ----------------------------------------------------------------------------------
-;  |   0xa0  |   0xa4  |   0xa8   |   0xac  |   0xb0  |   0xb4  |   0xb8  |   0xbc  |
-;  ----------------------------------------------------------------------------------
-;  |       DATA        |                    |                   |                   |
-;  ----------------------------------------------------------------------------------
-
-; standard C library function
-EXTERN  _exit:PROC
-.code
-
-; generate function table entry in .pdata and unwind information in
-make_fcontext PROC BOOST_CONTEXT_EXPORT FRAME
-    ; .xdata for a function's structured exception handling unwind behavior
-    .endprolog
-
-    ; first arg of make_fcontext() == top of context-stack
-    mov  rax, rcx
-
-    ; shift address in RAX to lower 16 byte boundary
-    ; == pointer to fcontext_t and address of context stack
-    and  rax, -16
-
-    ; reserve space for context-data on context-stack
-    ; on context-function entry: (RSP -0x8) % 16 == 0
-    sub  rax, 0b8h
-
-    ; third arg of make_fcontext() == address of context-function
-    mov  [rax+068h], r8
-
-    ; first arg of make_fcontext() == top of context-stack
-    ; save top address of context stack as 'base'
-    mov  [rax+018h], rcx
-    ; second arg of make_fcontext() == size of context-stack
-    ; negate stack size for LEA instruction (== substraction)
-    neg  rdx
-    ; compute bottom address of context stack (limit)
-    lea  rcx, [rcx+rdx]
-    ; save bottom address of context stack as 'limit'
-    mov  [rax+010h], rcx
-    ; save address of context stack limit as 'dealloction stack'
-    mov  [rax+08h], rcx
-	; set fiber-storage to zero
-	xor  rcx, rcx
-    mov  [rax], rcx
-
-    ; compute address of transport_t
-    lea rcx, [rax+098h]
-    ; store address of transport_t in hidden field
-    mov [rax+060h], rcx
-
-    ; compute abs address of label finish
-    lea  rcx, finish
-    ; save address of finish as return-address for context-function
-    ; will be entered after context-function returns
-    mov  [rax+070h], rcx
-
-    ret ; return pointer to context-data
-
-finish:
-    ; exit code is zero
-    xor  rcx, rcx
-    ; exit application
-    call  _exit
-    hlt
-make_fcontext ENDP
-END
+
+;           Copyright Oliver Kowalke 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)
+
+;  ----------------------------------------------------------------------------------
+;  |     0   |     1   |     2    |     3   |     4   |     5   |     6   |     7   |
+;  ----------------------------------------------------------------------------------
+;  |    0x0  |    0x4  |    0x8   |    0xc  |   0x10  |   0x14  |   0x18  |   0x1c  |
+;  ----------------------------------------------------------------------------------
+;  |                          SEE registers (XMM6-XMM15)                            |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |     8   |    9    |    10    |    11   |    12   |    13   |    14   |    15   |
+;  ----------------------------------------------------------------------------------
+;  |   0x20  |  0x24   |   0x28   |   0x2c  |   0x30  |   0x34  |   0x38  |   0x3c  |
+;  ----------------------------------------------------------------------------------
+;  |                          SEE registers (XMM6-XMM15)                            |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    16   |    17   |    18   |    19    |    20   |    21   |    22   |    23   |
+;  ----------------------------------------------------------------------------------
+;  |   0xe40  |   0x44 |   0x48  |   0x4c   |   0x50  |   0x54  |   0x58  |   0x5c  |
+;  ----------------------------------------------------------------------------------
+;  |                          SEE registers (XMM6-XMM15)                            |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    24   |   25    |    26    |   27    |    28   |    29   |    30   |    31   |
+;  ----------------------------------------------------------------------------------
+;  |   0x60  |   0x64  |   0x68   |   0x6c  |   0x70  |   0x74  |   0x78  |   0x7c  |
+;  ----------------------------------------------------------------------------------
+;  |                          SEE registers (XMM6-XMM15)                            |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    32   |   32    |    33    |   34    |    35   |    36   |    37   |    38   |
+;  ----------------------------------------------------------------------------------
+;  |   0x80  |   0x84  |   0x88   |   0x8c  |   0x90  |   0x94  |   0x98  |   0x9c  |
+;  ----------------------------------------------------------------------------------
+;  |                          SEE registers (XMM6-XMM15)                            |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    39   |   40    |    41    |   42    |    43   |    44   |    45   |    46   |
+;  ----------------------------------------------------------------------------------
+;  |   0xa0  |   0xa4  |   0xa8   |   0xac  |   0xb0  |   0xb4  |   0xb8  |   0xbc  |
+;  ----------------------------------------------------------------------------------
+;  | fc_mxcsr|fc_x87_cw|     <alignment>    |       fbr_strg    |      fc_dealloc   |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    47   |   48    |    49    |   50    |    51   |    52   |    53   |    54   |
+;  ----------------------------------------------------------------------------------
+;  |   0xc0  |   0xc4  |   0xc8   |   0xcc  |   0xd0  |   0xd4  |   0xd8  |   0xdc  |
+;  ----------------------------------------------------------------------------------
+;  |        limit      |         base       |         R12       |         R13       |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    55   |   56    |    57    |   58    |    59   |    60   |    61   |    62   |
+;  ----------------------------------------------------------------------------------
+;  |   0xe0  |   0xe4  |   0xe8   |   0xec  |   0xf0  |   0xf4  |   0xf8  |   0xfc  |
+;  ----------------------------------------------------------------------------------
+;  |        R14        |         R15        |         RDI       |        RSI        |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    63   |   64    |    65    |   66    |    67   |    68   |    69   |    70   |
+;  ----------------------------------------------------------------------------------
+;  |  0x100  |  0x104  |  0x108   |  0x10c  |  0x110  |  0x114  |  0x118  |  0x11c  |
+;  ----------------------------------------------------------------------------------
+;  |        RBX        |         RBP        |       hidden      |        RIP        |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    71   |   72    |    73    |   74    |    75   |    76   |    77   |    78   |
+;  ----------------------------------------------------------------------------------
+;  |  0x120  |  0x124  |  0x128   |  0x12c  |  0x130  |  0x134  |  0x138  |  0x13c  |
+;  ----------------------------------------------------------------------------------
+;  |                                   parameter area                               |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    79   |   80    |    81    |   82    |    83   |    84   |    85   |    86   |
+;  ----------------------------------------------------------------------------------
+;  |  0x140  |  0x144  |  0x148   |  0x14c  |  0x150  |  0x154  |  0x158  |  0x15c  |
+;  ----------------------------------------------------------------------------------
+;  |       FCTX        |        DATA        |                                       |
+;  ----------------------------------------------------------------------------------
+
+; standard C library function
+EXTERN  _exit:PROC
+.code
+
+; generate function table entry in .pdata and unwind information in
+make_fcontext PROC BOOST_CONTEXT_EXPORT FRAME
+    ; .xdata for a function's structured exception handling unwind behavior
+    .endprolog
+
+    ; first arg of make_fcontext() == top of context-stack
+    mov  rax, rcx
+
+    ; shift address in RAX to lower 16 byte boundary
+    ; == pointer to fcontext_t and address of context stack
+    and  rax, -16
+
+    ; reserve space for context-data on context-stack
+    ; on context-function entry: (RSP -0x8) % 16 == 0
+    sub  rax, 0150h
+
+    ; third arg of make_fcontext() == address of context-function
+    ; stored in RBX
+    mov  [rax+0100h], r8
+
+    ; first arg of make_fcontext() == top of context-stack
+    ; save top address of context stack as 'base'
+    mov  [rax+0c8h], rcx
+    ; second arg of make_fcontext() == size of context-stack
+    ; negate stack size for LEA instruction (== substraction)
+    neg  rdx
+    ; compute bottom address of context stack (limit)
+    lea  rcx, [rcx+rdx]
+    ; save bottom address of context stack as 'limit'
+    mov  [rax+0c0h], rcx
+    ; save address of context stack limit as 'dealloction stack'
+    mov  [rax+0b8h], rcx
+	; set fiber-storage to zero
+	xor  rcx, rcx
+    mov  [rax+0b0h], rcx
+
+	; save MMX control- and status-word
+    stmxcsr  [rax+0a0h]
+    ; save x87 control-word
+    fnstcw  [rax+0a4h]
+
+    ; compute address of transport_t
+    lea rcx, [rax+0140h]
+    ; store address of transport_t in hidden field
+    mov [rax+0110h], rcx
+
+    ; compute abs address of label trampoline
+    lea  rcx, trampoline
+    ; save address of trampoline as return-address for context-function
+    ; will be entered after calling jump_fcontext() first time
+    mov  [rax+0118h], rcx
+
+    ; compute abs address of label finish
+    lea  rcx, finish
+    ; save address of finish as return-address for context-function in RBP
+    ; will be entered after context-function returns 
+    mov  [rax+0108h], rcx
+
+    ret ; return pointer to context-data
+
+trampoline:
+    ; store return address on stack
+    ; fix stack alignment
+    push rbp
+    ; jump to context-function
+    jmp rbx
+
+finish:
+    ; exit code is zero
+    xor  rcx, rcx
+    ; exit application
+    call  _exit
+    hlt
+make_fcontext ENDP
+END

+ 81 - 62
modules/std/fiber/native/asm/make_x86_64_sysv_elf_gas.S

@@ -1,62 +1,81 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/****************************************************************************************
- *                                                                                      *
- *  ----------------------------------------------------------------------------------  *
- *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
- *  ----------------------------------------------------------------------------------  *
- *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
- *  ----------------------------------------------------------------------------------  *
- *  |        R12        |         R13       |         R14        |        R15        |  *
- *  ----------------------------------------------------------------------------------  *
- *  ----------------------------------------------------------------------------------  *
- *  |    8    |    9    |   10    |   11    |    12    |    13   |    14   |    15   |  *
- *  ----------------------------------------------------------------------------------  *
- *  |   0x20  |   0x24  |   0x28  |  0x2c   |   0x30   |   0x34  |   0x38  |   0x3c  |  *
- *  ----------------------------------------------------------------------------------  *
- *  |        RBX        |         RBP       |         RIP        |       EXIT        |  *
- *  ----------------------------------------------------------------------------------  *
- *                                                                                      *
- ****************************************************************************************/
-
-.text
-.globl make_fcontext
-.type make_fcontext,@function
-.align 16
-make_fcontext:
-    /* first arg of make_fcontext() == top of context-stack */
-    movq  %rdi, %rax
-
-    /* shift address in RAX to lower 16 byte boundary */
-    andq  $-16, %rax
-
-    /* reserve space for context-data on context-stack */
-    /* on context-function entry: (RSP -0x8) % 16 == 0 */
-    leaq  -0x40(%rax), %rax
-
-    /* third arg of make_fcontext() == address of context-function */
-    movq  %rdx, 0x30(%rax)
-
-    /* compute abs address of label finish */
-    leaq  finish(%rip), %rcx
-    /* save address of finish as return-address for context-function */
-    /* will be entered after context-function returns */
-    movq  %rcx, 0x38(%rax)
-
-    ret /* return pointer to context-data */
-
-finish:
-    /* exit code is zero */
-    xorq  %rdi, %rdi
-    /* exit application */
-    call  _exit@PLT
-    hlt
-.size make_fcontext,.-make_fcontext
-
-/* Mark that we don't need executable stack. */
-.section .note.GNU-stack,"",%progbits
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/****************************************************************************************
+ *                                                                                      *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  | fc_mxcsr|fc_x87_cw|        R12        |         R13        |        R14        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    8    |    9    |   10    |   11    |    12    |    13   |    14   |    15   |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x20  |   0x24  |   0x28  |  0x2c   |   0x30   |   0x34  |   0x38  |   0x3c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |        R15        |        RBX        |         RBP        |        RIP        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *                                                                                      *
+ ****************************************************************************************/
+
+.text
+.globl make_fcontext
+.type make_fcontext,@function
+.align 16
+make_fcontext:
+    /* first arg of make_fcontext() == top of context-stack */
+    movq  %rdi, %rax
+
+    /* shift address in RAX to lower 16 byte boundary */
+    andq  $-16, %rax
+
+    /* reserve space for context-data on context-stack */
+    /* on context-function entry: (RSP -0x8) % 16 == 0 */
+    leaq  -0x40(%rax), %rax
+
+    /* third arg of make_fcontext() == address of context-function */
+    /* stored in RBX */
+    movq  %rdx, 0x28(%rax)
+
+    /* save MMX control- and status-word */
+    stmxcsr  (%rax)
+    /* save x87 control-word */
+    fnstcw   0x4(%rax)
+
+    /* compute abs address of label trampoline */
+    leaq  trampoline(%rip), %rcx
+    /* save address of trampoline as return-address for context-function */
+    /* will be entered after calling jump_fcontext() first time */
+    movq  %rcx, 0x38(%rax)
+
+    /* compute abs address of label finish */
+    leaq  finish(%rip), %rcx
+    /* save address of finish as return-address for context-function */
+    /* will be entered after context-function returns */
+    movq  %rcx, 0x30(%rax)
+
+    ret /* return pointer to context-data */
+
+trampoline:
+    /* store return address on stack */
+    /* fix stack alignment */
+    push %rbp
+    /* jump to context-function */
+    jmp *%rbx
+
+finish:
+    /* exit code is zero */
+    xorq  %rdi, %rdi
+    /* exit application */
+    call  _exit@PLT
+    hlt
+.size make_fcontext,.-make_fcontext
+
+/* Mark that we don't need executable stack. */
+.section .note.GNU-stack,"",%progbits

+ 76 - 58
modules/std/fiber/native/asm/make_x86_64_sysv_macho_gas.S

@@ -1,58 +1,76 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/****************************************************************************************
- *                                                                                      *
- *  ----------------------------------------------------------------------------------  *
- *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
- *  ----------------------------------------------------------------------------------  *
- *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
- *  ----------------------------------------------------------------------------------  *
- *  |        R12        |         R13       |         R14        |        R15        |  *
- *  ----------------------------------------------------------------------------------  *
- *  ----------------------------------------------------------------------------------  *
- *  |    8    |    9    |   10    |   11    |    12    |    13   |    14   |    15   |  *
- *  ----------------------------------------------------------------------------------  *
- *  |   0x20  |   0x24  |   0x28  |  0x2c   |   0x30   |   0x34  |   0x38  |   0x3c  |  *
- *  ----------------------------------------------------------------------------------  *
- *  |        RBX        |         RBP       |         RIP        |       EXIT        |  *
- *  ----------------------------------------------------------------------------------  *
- *                                                                                      *
- ****************************************************************************************/
-
-.text
-.globl _make_fcontext
-.align 8
-_make_fcontext:
-    /* first arg of make_fcontext() == top of context-stack */
-    movq  %rdi, %rax
-
-    /* shift address in RAX to lower 16 byte boundary */
-    movabs  $-16,           %r8
-    andq    %r8,            %rax
-
-    /* reserve space for context-data on context-stack */
-    /* on context-function entry: (RSP -0x8) % 16 == 0 */
-    leaq  -0x40(%rax), %rax
-
-    /* third arg of make_fcontext() == address of context-function */
-    movq  %rdx, 0x30(%rax)
-
-    /* compute abs address of label finish */
-    leaq  finish(%rip), %rcx
-    /* save address of finish as return-address for context-function */
-    /* will be entered after context-function returns */
-    movq  %rcx, 0x38(%rax)
-
-    ret /* return pointer to context-data */
-
-finish:
-    /* exit code is zero */
-    xorq  %rdi, %rdi
-    /* exit application */
-    call  __exit
-    hlt
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/****************************************************************************************
+ *                                                                                      *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  | fc_mxcsr|fc_x87_cw|        R12        |         R13        |        R14        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    8    |    9    |   10    |   11    |    12    |    13   |    14   |    15   |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x20  |   0x24  |   0x28  |  0x2c   |   0x30   |   0x34  |   0x38  |   0x3c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |        R15        |        RBX        |         RBP        |        RIP        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *                                                                                      *
+ ****************************************************************************************/
+
+.text
+.globl _make_fcontext
+.align 8
+_make_fcontext:
+    /* first arg of make_fcontext() == top of context-stack */
+    movq  %rdi, %rax
+
+    /* shift address in RAX to lower 16 byte boundary */
+    andq  $-16, %rax
+
+    /* reserve space for context-data on context-stack */
+    /* on context-function entry: (RSP -0x8) % 16 == 0 */
+    leaq  -0x40(%rax), %rax
+
+    /* third arg of make_fcontext() == address of context-function */
+    /* stored in RBX */
+    movq  %rdx, 0x28(%rax)
+
+    /* save MMX control- and status-word */
+    stmxcsr  (%rax)
+    /* save x87 control-word */
+    fnstcw   0x4(%rax)
+
+    /* compute abs address of label trampoline */
+    leaq  trampoline(%rip), %rcx
+    /* save address of trampoline as return-address for context-function */
+    /* will be entered after calling jump_fcontext() first time */
+    movq  %rcx, 0x38(%rax)
+
+    /* compute abs address of label finish */
+    leaq  finish(%rip), %rcx
+    /* save address of finish as return-address for context-function */
+    /* will be entered after context-function returns */
+    movq  %rcx, 0x30(%rax)
+
+    ret /* return pointer to context-data */
+
+trampoline:
+    /* store return address on stack */
+    /* fix stack alignment */
+    push %rbp
+    /* jump to context-function */
+    jmp *%rbx
+
+finish:
+    /* exit code is zero */
+    xorq  %rdi, %rdi
+    /* exit application */
+    call  __exit
+    hlt

+ 112 - 87
modules/std/fiber/native/asm/ontop_arm64_aapcs_elf_gas.S

@@ -1,87 +1,112 @@
-/*
-            Copyright Edward Nevill + Oliver Kowalke 2015
-   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)
-*/
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
- *  -------------------------------------------------  *
- *  |    x19    |    x20    |    x21    |    x22    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
- *  -------------------------------------------------  *
- *  |    x23    |    x24    |    x25    |    x26    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
- *  -------------------------------------------------  *
- *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
- *  -------------------------------------------------  *
- *  |    x27    |    x28    |    FP     |     LR    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
- *  -------------------------------------------------  *
- *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
- *  -------------------------------------------------  *
- *  |     PC    |   align   |           |           |  *
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.cpu    generic+fp+simd
-.text
-.align  2
-.global ontop_fcontext
-.type   ontop_fcontext, %function
-ontop_fcontext:
-    # prepare stack for GP + FPU
-    sub  sp, sp, #0x70
-
-    # save x19-x30
-    stp  x19, x20, [sp, #0x00]
-    stp  x21, x22, [sp, #0x10]
-    stp  x23, x24, [sp, #0x20]
-    stp  x25, x26, [sp, #0x30]
-    stp  x27, x28, [sp, #0x40]
-    stp  x29, x30, [sp, #0x50]
-
-    # save LR as PC
-    str  x30, [sp, #0x60]
-
-    # store RSP (pointing to context-data) in X5
-    mov  x4, sp
-
-    # restore RSP (pointing to context-data) from X1
-    mov  sp, x0
-
-    # load x19-x30
-    ldp  x19, x20, [sp, #0x00]
-    ldp  x21, x22, [sp, #0x10]
-    ldp  x23, x24, [sp, #0x20]
-    ldp  x25, x26, [sp, #0x30]
-    ldp  x27, x28, [sp, #0x40]
-    ldp  x29, x30, [sp, #0x50]
-
-    # return transfer_t from jump
-    # pass transfer_t as first arg in context function
-    # X0 == FCTX, X1 == DATA
-    mov x0, x4
-
-    # skip pc
-    # restore stack from GP + FPU
-    add  sp, sp, #0x70
-
-    # jump to ontop-function
-    ret x2
-.size   ontop_fcontext,.-ontop_fcontext
-# Mark that we don't need executable stack.
-.section .note.GNU-stack,"",%progbits
+/*
+       Copyright Edward Nevill + Oliver Kowalke 2015
+   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)
+*/
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  |    d8     |    d9     |    d10    |    d11    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |    d12    |    d13    |    d14    |    d15    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
+ *  -------------------------------------------------  *
+ *  |    x19    |    x20    |    x21    |    x22    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
+ *  -------------------------------------------------  *
+ *  |    x23    |    x24    |    x25    |    x26    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c|  *
+ *  -------------------------------------------------  *
+ *  |    x27    |    x28    |    FP     |     LR    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 | 43  |           |           |  *
+ *  -------------------------------------------------  *
+ *  | 0xa0| 0xa4| 0xa8| 0xac|           |           |  *
+ *  -------------------------------------------------  *
+ *  |     PC    |   align   |           |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.align  2
+.global ontop_fcontext
+.type   ontop_fcontext, %function
+ontop_fcontext:
+    # prepare stack for GP + FPU
+    sub  sp, sp, #0xb0
+
+    # save d8 - d15
+    stp  d8,  d9,  [sp, #0x00]
+    stp  d10, d11, [sp, #0x10]
+    stp  d12, d13, [sp, #0x20]
+    stp  d14, d15, [sp, #0x30]
+
+    # save x19-x30
+    stp  x19, x20, [sp, #0x40]
+    stp  x21, x22, [sp, #0x50]
+    stp  x23, x24, [sp, #0x60]
+    stp  x25, x26, [sp, #0x70]
+    stp  x27, x28, [sp, #0x80]
+    stp  x29, x30, [sp, #0x90]
+
+    # save LR as PC
+    str  x30, [sp, #0xa0]
+
+    # store RSP (pointing to context-data) in X5
+    mov  x4, sp
+
+    # restore RSP (pointing to context-data) from X1
+    mov  sp, x0
+
+    # load d8 - d15
+    ldp  d8,  d9,  [sp, #0x00]
+    ldp  d10, d11, [sp, #0x10]
+    ldp  d12, d13, [sp, #0x20]
+    ldp  d14, d15, [sp, #0x30]
+
+    # load x19-x30
+    ldp  x19, x20, [sp, #0x40]
+    ldp  x21, x22, [sp, #0x50]
+    ldp  x23, x24, [sp, #0x60]
+    ldp  x25, x26, [sp, #0x70]
+    ldp  x27, x28, [sp, #0x80]
+    ldp  x29, x30, [sp, #0x90]
+
+    # return transfer_t from jump
+    # pass transfer_t as first arg in context function
+    # X0 == FCTX, X1 == DATA
+    mov x0, x4
+
+    # skip pc
+    # restore stack from GP + FPU
+    add  sp, sp, #0xb0
+
+    # jump to ontop-function
+    ret x2
+.size   ontop_fcontext,.-ontop_fcontext
+# Mark that we don't need executable stack.
+.section .note.GNU-stack,"",%progbits

+ 108 - 82
modules/std/fiber/native/asm/ontop_arm64_aapcs_macho_gas.S

@@ -1,82 +1,108 @@
-/*
-            Copyright Edward Nevill + Oliver Kowalke 2015
-   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)
-*/
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
- *  -------------------------------------------------  *
- *  |    x19    |    x20    |    x21    |    x22    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
- *  -------------------------------------------------  *
- *  |    x23    |    x24    |    x25    |    x26    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
- *  -------------------------------------------------  *
- *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
- *  -------------------------------------------------  *
- *  |    x27    |    x28    |    FP     |     LR    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
- *  -------------------------------------------------  *
- *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
- *  -------------------------------------------------  *
- *  |     PC    |   align   |           |           |  *
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.text
-.global _ontop_fcontext
-.balign 16
-_ontop_fcontext:
-    # prepare stack for GP + FPU
-    sub  sp, sp, #0x70
-
-    # save x19-x30
-    stp  x19, x20, [sp, #0x00]
-    stp  x21, x22, [sp, #0x10]
-    stp  x23, x24, [sp, #0x20]
-    stp  x25, x26, [sp, #0x30]
-    stp  x27, x28, [sp, #0x40]
-    stp  x29, x30, [sp, #0x50]
-
-    # save LR as PC
-    str  x30, [sp, #0x60]
-
-    # store RSP (pointing to context-data) in X5
-    mov  x4, sp
-
-    # restore RSP (pointing to context-data) from X1
-    mov  sp, x0
-
-    # load x19-x30
-    ldp  x19, x20, [sp, #0x00]
-    ldp  x21, x22, [sp, #0x10]
-    ldp  x23, x24, [sp, #0x20]
-    ldp  x25, x26, [sp, #0x30]
-    ldp  x27, x28, [sp, #0x40]
-    ldp  x29, x30, [sp, #0x50]
-
-    # return transfer_t from jump
-    # pass transfer_t as first arg in context function
-    # X0 == FCTX, X1 == DATA
-    mov x0, x4
-
-    # skip pc
-    # restore stack from GP + FPU
-    add  sp, sp, #0x70
-
-    # jump to ontop-function
-    ret x2
+/*
+       Copyright Edward Nevill + Oliver Kowalke 2015
+   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)
+*/
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  |    d8     |    d9     |    d10    |    d11    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |    d12    |    d13    |    d14    |    d15    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
+ *  -------------------------------------------------  *
+ *  |    x19    |    x20    |    x21    |    x22    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
+ *  -------------------------------------------------  *
+ *  |    x23    |    x24    |    x25    |    x26    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c|  *
+ *  -------------------------------------------------  *
+ *  |    x27    |    x28    |    FP     |     LR    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 | 43  |           |           |  *
+ *  -------------------------------------------------  *
+ *  | 0xa0| 0xa4| 0xa8| 0xac|           |           |  *
+ *  -------------------------------------------------  *
+ *  |     PC    |   align   |           |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.global _ontop_fcontext
+.balign 16
+_ontop_fcontext:
+    ; prepare stack for GP + FPU
+    sub  sp, sp, #0xb0
+
+    ; save d8 - d15
+    stp  d8,  d9,  [sp, #0x00]
+    stp  d10, d11, [sp, #0x10]
+    stp  d12, d13, [sp, #0x20]
+    stp  d14, d15, [sp, #0x30]
+
+    ; save x19-x30
+    stp  x19, x20, [sp, #0x40]
+    stp  x21, x22, [sp, #0x50]
+    stp  x23, x24, [sp, #0x60]
+    stp  x25, x26, [sp, #0x70]
+    stp  x27, x28, [sp, #0x80]
+    stp  x29, x30, [sp, #0x90]
+
+    ; save LR as PC
+    str  x30, [sp, #0xa0]
+
+    ; store RSP (pointing to context-data) in X5
+    mov  x4, sp
+
+    ; restore RSP (pointing to context-data) from X1
+    mov  sp, x0
+
+    ; load d8 - d15
+    ldp  d8,  d9,  [sp, #0x00]
+    ldp  d10, d11, [sp, #0x10]
+    ldp  d12, d13, [sp, #0x20]
+    ldp  d14, d15, [sp, #0x30]
+
+    ; load x19-x30
+    ldp  x19, x20, [sp, #0x40]
+    ldp  x21, x22, [sp, #0x50]
+    ldp  x23, x24, [sp, #0x60]
+    ldp  x25, x26, [sp, #0x70]
+    ldp  x27, x28, [sp, #0x80]
+    ldp  x29, x30, [sp, #0x90]
+
+    ; return transfer_t from jump
+    ; pass transfer_t as first arg in context function
+    ; X0 == FCTX, X1 == DATA
+    mov x0, x4
+
+    ; skip pc
+    ; restore stack from GP + FPU
+    add  sp, sp, #0xb0
+
+    ; jump to ontop-function
+    ret x2

+ 91 - 63
modules/std/fiber/native/asm/ontop_arm_aapcs_elf_gas.S

@@ -1,63 +1,91 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
- *  -------------------------------------------------  *
- *  |hiddn|  v1 |  v2 |  v3 |  v4 |  v5 |  v6 |  v7 |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
- *  -------------------------------------------------  *
- *  |  v8 |  lr |  pc | FCTX| DATA|                 |  *
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.text
-.globl ontop_fcontext
-.align 2
-.type ontop_fcontext,%function
-ontop_fcontext:
-    @ save LR as PC
-    push {lr}
-    @ save hidden,V1-V8,LR
-    push {a1,v1-v8,lr}
-
-    @ store RSP (pointing to context-data) in A1
-    mov  a1, sp
-
-    @ restore RSP (pointing to context-data) from A2
-    mov  sp, a2
-
-    @ store parent context in A2
-    mov  a2, a1
-
-    @ restore hidden,V1-V8,LR
-    pop {a1,v1-v8,lr}
-
-    @ return transfer_t from jump
-    str  a2, [a1, #0]
-    str  a3, [a1, #4]
-    @ pass transfer_t as first arg in context function
-    @ A1 == hidden, A2 == FCTX, A3 == DATA
-
-    @ skip PC
-    add  sp, sp, #4
-
-    @ jump to ontop-function
-    bx  a4
-.size ontop_fcontext,.-ontop_fcontext
-
-@ Mark that we don't need executable stack.
-.section .note.GNU-stack,"",%progbits
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  | s16 | s17 | s18 | s19 | s20 | s21 | s22 | s23 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  | s24 | s25 | s26 | s27 | s28 | s29 | s30 | s31 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c|  *
+ *  -------------------------------------------------  *
+ *  |hiddn|  v1 |  v2 |  v3 |  v4 |  v5 |  v6 |  v7 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c|  *
+ *  -------------------------------------------------  *
+ *  |  v8 |  lr |  pc | FCTX| DATA|                 |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl ontop_fcontext
+.align 2
+.type ontop_fcontext,%function
+ontop_fcontext:
+    @ save LR as PC
+    push {lr}
+    @ save hidden,V1-V8,LR
+    push {a1,v1-v8,lr}
+
+    @ prepare stack for FPU
+    sub  sp, sp, #64
+#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
+    @ save S16-S31
+    vstmia sp, {d8-d15}
+#endif
+
+    @ store RSP (pointing to context-data) in A1
+    mov  a1, sp
+
+    @ restore RSP (pointing to context-data) from A2
+    mov  sp, a2
+
+    @ store parent context in A2
+    mov  a2, a1
+
+#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
+    @ restore S16-S31
+    vldmia  sp, {d8-d15}
+#endif
+    @ prepare stack for FPU
+    add  sp, sp, #64
+
+    @ restore hidden,V1-V8,LR
+    pop {a1,v1-v8,lr}
+
+    @ return transfer_t from jump
+    str  a2, [a1, #0]
+    str  a3, [a1, #4]
+    @ pass transfer_t as first arg in context function
+    @ A1 == hidden, A2 == FCTX, A3 == DATA
+
+    @ skip PC
+    add  sp, sp, #4
+
+    @ jump to ontop-function
+    bx  a4
+.size ontop_fcontext,.-ontop_fcontext
+
+@ Mark that we don't need executable stack.
+.section .note.GNU-stack,"",%progbits

+ 100 - 72
modules/std/fiber/native/asm/ontop_arm_aapcs_macho_gas.S

@@ -1,72 +1,100 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
- *  -------------------------------------------------  *
- *  | sjlj|hiddn|  v1 |  v2 |  v3 |  v4 |  v5 |  v6 |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
- *  -------------------------------------------------  *
- *  |  v7 |  v8 |  lr |  pc | FCTX| DATA|           |  *
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.text
-.globl _ontop_fcontext
-.align 2
-_ontop_fcontext:
-    @ save LR as PC
-    push {lr}
-    @ save hidden,V1-V8,LR
-    push {a1,v1-v8,lr}
-
-    @ locate TLS to save/restore SjLj handler
-    mrc  p15, 0, v2, c13, c0, #3
-    bic  v2, v2, #3
-
-    @ load TLS[__PTK_LIBC_DYLD_Unwind_SjLj_Key]
-    ldr  v1, [v2, #8]
-    @ save SjLj handler
-    push  {v1}
-
-    @ store RSP (pointing to context-data) in A1
-    mov  a1, sp
-
-    @ restore RSP (pointing to context-data) from A2
-    mov  sp, a2
-
-    @ restore SjLj handler
-    pop  {v1}
-    @ store SjLj handler in TLS
-    str  v1, [v2, #8]
-
-    @ store parent context in A2
-    mov  a2, a1
-
-    @ restore hidden,V1-V8,LR
-    pop {a1,v1-v8,lr}
-
-    @ return transfer_t from jump
-    str  a2, [a1, #0]
-    str  a3, [a1, #4]
-    @ pass transfer_t as first arg in context function
-    @ A1 == hidden, A2 == FCTX, A3 == DATA
-
-    @ skip PC
-    add  sp, sp, #4
-
-    @ jump to ontop-function
-    bx  a4
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  | s16 | s17 | s18 | s19 | s20 | s21 | s22 | s23 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  | s24 | s25 | s26 | s27 | s28 | s29 | s30 | s31 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+ *  -------------------------------------------------  *
+ *  | sjlj|hiddn|  v1 |  v2 |  v3 |  v4 |  v5 |  v6 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+ *  -------------------------------------------------  *
+ *  |  v7 |  v8 |  lr |  pc | FCTX| DATA|           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl _ontop_fcontext
+.align 2
+_ontop_fcontext:
+    @ save LR as PC
+    push {lr}
+    @ save hidden,V1-V8,LR
+    push {a1,v1-v8,lr}
+
+    @ locate TLS to save/restore SjLj handler
+    mrc  p15, 0, v2, c13, c0, #3
+    bic  v2, v2, #3
+
+    @ load TLS[__PTK_LIBC_DYLD_Unwind_SjLj_Key]
+    ldr  v1, [v2, #8]
+    @ save SjLj handler
+    push  {v1}
+
+    @ prepare stack for FPU
+    sub  sp, sp, #64
+#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
+    @ save S16-S31
+    vstmia sp, {d8-d15}
+#endif
+
+    @ store RSP (pointing to context-data) in A1
+    mov  a1, sp
+
+    @ restore RSP (pointing to context-data) from A2
+    mov  sp, a2
+
+#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
+    @ restore S16-S31
+    vldmia  sp, {d8-d15}
+#endif
+    @ prepare stack for FPU
+    add  sp, sp, #64
+
+    @ restore SjLj handler
+    pop  {v1}
+    @ store SjLj handler in TLS
+    str  v1, [v2, #8]
+
+    @ store parent context in A2
+    mov  a2, a1
+
+    @ restore hidden,V1-V8,LR
+    pop {a1,v1-v8,lr}
+
+    @ return transfer_t from jump
+    str  a2, [a1, #0]
+    str  a3, [a1, #4]
+    @ pass transfer_t as first arg in context function
+    @ A1 == hidden, A2 == FCTX, A3 == DATA
+
+    @ skip PC
+    add  sp, sp, #4
+
+    @ jump to ontop-function
+    bx  a4

+ 86 - 86
modules/std/fiber/native/asm/ontop_arm_aapcs_pe_armasm.asm

@@ -1,86 +1,86 @@
-;/*
-;            Copyright Oliver Kowalke 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)
-;*/
-
-; *******************************************************
-; *                                                     *
-; *  -------------------------------------------------  *
-; *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
-; *  -------------------------------------------------  *
-; *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
-; *  -------------------------------------------------  *
-; *  |deall|limit| base|hiddn|  v1 |  v2 |  v3 |  v4 |  *
-; *  -------------------------------------------------  *
-; *  -------------------------------------------------  *
-; *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
-; *  -------------------------------------------------  *
-; *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
-; *  -------------------------------------------------  *
-; *  |  v5 |  v6 |  v7 |  v8 |  lr |  pc | FCTX| DATA|  *
-; *  -------------------------------------------------  *
-; *                                                     *
-; *******************************************************
-
-    AREA |.text|, CODE
-    ALIGN 4
-    EXPORT ontop_fcontext
-
-ontop_fcontext PROC
-    ; save LR as PC
-    push {lr}
-    ; save hidden,V1-V8,LR
-    push {a1,v1-v8,lr}
-
-    ; load TIB to save/restore thread size and limit.
-    ; we do not need preserve CPU flag and can use it's arg register
-    mrc     p15, #0, v1, c13, c0, #2
-
-    ; save current stack base
-    ldr  a1, [v1, #0x04]
-    push {a1}
-    ; save current stack limit
-    ldr  a1, [v1, #0x08]
-    push {a1}
-    ; save current deallocation stack
-    ldr  a1, [v1, #0xe0c]
-    push {a1}
-
-    ; store RSP (pointing to context-data) in A1
-    mov  a1, sp
-
-    ; restore RSP (pointing to context-data) from A2
-    mov  sp, a2
-
-    ; restore stack base
-    pop  {a1}
-    str  a1, [v1, #0x04]
-    ; restore stack limit
-    pop  {a1}
-    str  a1, [v1, #0x08]
-    ; restore deallocation stack
-    pop  {a1}
-    str  a1, [v1, #0xe0c]
-
-    ; store parent context in A2
-    mov  a2, a1
-
-    ; restore hidden,V1-V8,LR
-    pop {a1,v1-v8,lr}
-
-    ; return transfer_t from jump
-    str  a2, [a1, #0]
-    str  a3, [a1, #4]
-    ; pass transfer_t as first arg in context function
-    ; A1 == hidden, A2 == FCTX, A3 == DATA
-
-    ; skip PC
-    add  sp, sp, #4
-
-    ; jump to ontop-function
-    bx  a4
-
-    ENDP
-    END
+;/*
+;            Copyright Oliver Kowalke 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)
+;*/
+
+; *******************************************************
+; *                                                     *
+; *  -------------------------------------------------  *
+; *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+; *  -------------------------------------------------  *
+; *  | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c|  *
+; *  -------------------------------------------------  *
+; *  |deall|limit| base|hiddn|  v1 |  v2 |  v3 |  v4 |  *
+; *  -------------------------------------------------  *
+; *  -------------------------------------------------  *
+; *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+; *  -------------------------------------------------  *
+; *  | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c|  *
+; *  -------------------------------------------------  *
+; *  |  v5 |  v6 |  v7 |  v8 |  lr |  pc | FCTX| DATA|  *
+; *  -------------------------------------------------  *
+; *                                                     *
+; *******************************************************
+
+    AREA |.text|, CODE
+    ALIGN 4
+    EXPORT ontop_fcontext
+
+ontop_fcontext PROC
+    ; save LR as PC
+    push {lr}
+    ; save hidden,V1-V8,LR
+    push {a1,v1-v8,lr}
+
+    ; load TIB to save/restore thread size and limit.
+    ; we do not need preserve CPU flag and can use it's arg register
+    mrc     p15, #0, v1, c13, c0, #2
+
+    ; save current stack base
+    ldr  a1, [v1, #0x04]
+    push {a1}
+    ; save current stack limit
+    ldr  a1, [v1, #0x08]
+    push {a1}
+    ; save current deallocation stack
+    ldr  a1, [v1, #0xe0c]
+    push {a1}
+
+    ; store RSP (pointing to context-data) in A1
+    mov  a1, sp
+
+    ; restore RSP (pointing to context-data) from A2
+    mov  sp, a2
+
+    ; restore stack base
+    pop  {a1}
+    str  a1, [v1, #0x04]
+    ; restore stack limit
+    pop  {a1}
+    str  a1, [v1, #0x08]
+    ; restore deallocation stack
+    pop  {a1}
+    str  a1, [v1, #0xe0c]
+
+    ; store parent context in A2
+    mov  a2, a1
+
+    ; restore hidden,V1-V8,LR
+    pop {a1,v1-v8,lr}
+
+    ; return transfer_t from jump
+    str  a2, [a1, #0]
+    str  a3, [a1, #4]
+    ; pass transfer_t as first arg in context function
+    ; A1 == hidden, A2 == FCTX, A3 == DATA
+
+    ; skip PC
+    add  sp, sp, #4
+
+    ; jump to ontop-function
+    bx  a4
+
+    ENDP
+    END

+ 20 - 20
modules/std/fiber/native/asm/ontop_combined_sysv_macho_gas.S

@@ -1,20 +1,20 @@
-/*
-            Copyright Sergue E. Leontiev 2013.
-   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)
-*/
-
-// Stub file for universal binary
-
-#if defined(__i386__)
-    #include "ontop_i386_sysv_macho_gas.S"
-#elif defined(__x86_64__)
-    #include "ontop_x86_64_sysv_macho_gas.S"
-#elif defined(__ppc__)
-    #include "ontop_ppc32_sysv_macho_gas.S"
-#elif defined(__ppc64__)
-    #include "ontop_ppc64_sysv_macho_gas.S"
-#else
-    #error "No arch's"
-#endif
+/*
+            Copyright Sergue E. Leontiev 2013.
+   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)
+*/
+
+// Stub file for universal binary
+
+#if defined(__i386__)
+    #include "ontop_i386_sysv_macho_gas.S"
+#elif defined(__x86_64__)
+    #include "ontop_x86_64_sysv_macho_gas.S"
+#elif defined(__ppc__)
+    #include "ontop_ppc32_sysv_macho_gas.S"
+#elif defined(__ppc64__)
+    #include "ontop_ppc64_sysv_macho_gas.S"
+#else
+    #error "No arch's"
+#endif

+ 125 - 113
modules/std/fiber/native/asm/ontop_i386_ms_pe_gas.asm

@@ -1,113 +1,125 @@
-/*
-            Copyright Oliver Kowalke 2009.
-            Copyright Thomas Sailer 2013.
-   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)
-*/
-
-/*************************************************************************************
-*  --------------------------------------------------------------------------------- *
-*  |    0    |    1    |    2    |    3    |    4    |    5    |    6    |    7    | *
-*  --------------------------------------------------------------------------------- *
-*  |    0h   |   04h   |   08h   |   0ch   |   010h  |   014h  |   018h  |   01ch  | *
-*  --------------------------------------------------------------------------------- *
-*  | fc_strg |fc_deallo|  limit  |   base  |  fc_seh |   EDI   |   ESI   |   EBX   | *
-*  --------------------------------------------------------------------------------- *
-*  --------------------------------------------------------------------------------- *
-*  |    8    |    9    |   10    |    11   |    12   |    13   |    14   |    15   | *
-*  --------------------------------------------------------------------------------- *
-*  |   020h  |  024h   |  028h   |   02ch  |   030h  |   034h  |   038h  |   03ch  | *
-*  --------------------------------------------------------------------------------- *
-*  |   EBP   |   EIP   |    to   |   data  |         |  EH NXT |SEH HNDLR|         | *
-*  --------------------------------------------------------------------------------- *
-*************************************************************************************/
-
-.file	"ontop_i386_ms_pe_gas.asm"
-.text
-.p2align 4,,15
-.globl	_ontop_fcontext
-.def	_ontop_fcontext;	.scl	2;	.type	32;	.endef
-_ontop_fcontext:
-    pushl  %ebp  /* save EBP */
-    pushl  %ebx  /* save EBX */
-    pushl  %esi  /* save ESI */
-    pushl  %edi  /* save EDI */
-
-    /* load NT_TIB */
-    movl  %fs:(0x18), %edx
-
-    /* load current SEH exception list */
-    movl  (%edx), %eax
-    push  %eax
-
-    /* load current stack base */
-    movl  0x04(%edx), %eax
-    push  %eax
-
-    /* load current stack limit */
-    movl  0x08(%edx), %eax
-    push  %eax
-    
-    /* load current dealloction stack */
-    movl  0xe0c(%edx), %eax
-    push  %eax
-    
-    /* load fiber local storage */
-    movl  0x10(%edx), %eax
-    push  %eax
-
-    /* store ESP (pointing to context-data) in EAX */
-    movl  %esp, %ecx
-
-    /* first arg of ontop_fcontext() == fcontext to jump to */
-    movl  0x28(%esp), %eax
-
-	/* pass parent fcontext_t */
-	movl  %ecx, 0x28(%eax)
-
-    /* second arg of ontop_fcontext() == data to be transferred */
-    movl  0x2c(%esp), %ecx
-
-	/* pass data */
-	movl  %ecx, 0x2c(%eax)
-
-    /* third arg of ontop_fcontext() == ontop-function */
-    movl  0x30(%esp), %ecx
-
-    /* restore ESP (pointing to context-data) from EDX */
-    movl  %eax, %esp
-
-    /* load NT_TIB into ECX */
-    movl  %fs:(0x18), %edx
-
-    /* restore fiber local storage */
-    popl  %eax
-    movl  %eax, 0x10(%edx)
-
-    /* restore current deallocation stack */
-    popl  %eax
-    movl  %eax, 0xe0c(%edx)
-
-    /* restore current stack limit */
-    popl  %eax
-    movl  %eax, 0x08(%edx)
-
-    /* restore current stack base */
-    popl  %eax
-    movl  %eax, 0x04(%edx)
-
-    /* restore current SEH exception list */
-    popl  %eax
-    movl  %eax, (%edx)
-
-    popl  %edi  /* save EDI */
-    popl  %esi  /* save ESI */
-    popl  %ebx  /* save EBX */
-    popl  %ebp  /* save EBP */
-
-    /* jump to context */
-    jmp  *%ecx
-
-.section .drectve
-.ascii " -export:\"ontop_fcontext\""
+/*
+            Copyright Oliver Kowalke 2009.
+            Copyright Thomas Sailer 2013.
+   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)
+*/
+
+/*************************************************************************************
+*  --------------------------------------------------------------------------------- *
+*  |    0    |    1    |    2    |    3    |    4    |    5    |    6    |    7    | *
+*  --------------------------------------------------------------------------------- *
+*  |    0h   |   04h   |   08h   |   0ch   |   010h  |   014h  |   018h  |   01ch  | *
+*  --------------------------------------------------------------------------------- *
+*  | fc_mxcsr|fc_x87_cw| fc_strg |fc_deallo|  limit  |   base  |  fc_seh |   EDI   | *
+*  --------------------------------------------------------------------------------- *
+*  --------------------------------------------------------------------------------- *
+*  |    8    |    9    |   10    |    11   |    12   |    13   |    14   |    15   | *
+*  --------------------------------------------------------------------------------- *
+*  |   020h  |  024h   |  028h   |   02ch  |   030h  |   034h  |   038h  |   03ch  | *
+*  --------------------------------------------------------------------------------- *
+*  |   ESI   |   EBX   |   EBP   |   EIP   |    to   |   data  |  EH NXT |SEH HNDLR| *
+*  --------------------------------------------------------------------------------- *
+**************************************************************************************/
+
+.file	"ontop_i386_ms_pe_gas.asm"
+.text
+.p2align 4,,15
+.globl	_ontop_fcontext
+.def	_ontop_fcontext;	.scl	2;	.type	32;	.endef
+_ontop_fcontext:
+    /* prepare stack */
+    leal  -0x2c(%esp), %esp
+
+#if !defined(BOOST_USE_TSX)
+    /* save MMX control- and status-word */
+    stmxcsr  (%esp)
+    /* save x87 control-word */
+    fnstcw  0x4(%esp)
+#endif
+
+    /* load NT_TIB */
+    movl  %fs:(0x18), %edx
+    /* load fiber local storage */
+    movl  0x10(%edx), %eax
+    movl  %eax, 0x8(%esp)
+    /* load current dealloction stack */
+    movl  0xe0c(%edx), %eax
+    movl  %eax, 0xc(%esp)
+    /* load current stack limit */
+    movl  0x8(%edx), %eax
+    movl  %eax, 0x10(%esp)
+    /* load current stack base */
+    movl  0x4(%edx), %eax
+    movl  %eax, 0x14(%esp)
+    /* load current SEH exception list */
+    movl  (%edx), %eax
+    movl  %eax, 0x18(%esp)
+
+    movl  %edi, 0x1c(%esp)  /* save EDI */
+    movl  %esi, 0x20(%esp)  /* save ESI */
+    movl  %ebx, 0x24(%esp)  /* save EBX */
+    movl  %ebp, 0x28(%esp)  /* save EBP */
+
+    /* store ESP (pointing to context-data) in ECX */
+    movl  %esp, %ecx
+
+    /* first arg of ontop_fcontext() == fcontext to jump to */
+    movl  0x30(%esp), %eax
+
+	/* pass parent fcontext_t */
+	movl  %ecx, 0x30(%eax)
+
+    /* second arg of ontop_fcontext() == data to be transferred */
+    movl  0x34(%esp), %ecx
+
+	/* pass data */
+	movl  %ecx, 0x34(%eax)
+
+    /* third arg of ontop_fcontext() == ontop-function */
+    movl  0x38(%esp), %ecx
+
+    /* restore ESP (pointing to context-data) from EDX */
+    movl  %eax, %esp
+
+#if !defined(BOOST_USE_TSX)
+    /* restore MMX control- and status-word */
+    ldmxcsr  (%esp)
+    /* restore x87 control-word */
+    fldcw  0x4(%esp)
+#endif
+
+    /* restore NT_TIB into EDX */
+    movl  %fs:(0x18), %edx
+    /* restore fiber local storage */
+    movl  0x8(%esp), %eax
+    movl  %eax, 0x10(%edx)
+    /* restore current deallocation stack */
+    movl  0xc(%esp), %eax
+    movl  %eax, 0xe0c(%edx)
+    /* restore current stack limit */
+    movl  0x10(%esp), %eax
+    movl  %eax, 0x08(%edx)
+    /* restore current stack base */
+    movl  0x14(%esp), %eax
+    movl  %eax, 0x04(%edx)
+    /* restore current SEH exception list */
+    movl  0x18(%esp), %eax
+    movl  %eax, (%edx)
+
+    movl  0x1c(%esp), %edi  /* restore EDI */
+    movl  0x20(%esp), %esi  /* restore ESI */
+    movl  0x24(%esp), %ebx  /* restore EBX */
+    movl  0x28(%esp), %ebp  /* restore EBP */
+
+    /* prepare stack */
+    leal  0x2c(%esp), %esp
+
+    /* keep return-address on stack */
+
+    /* jump to context */
+    jmp  *%ecx
+
+.section .drectve
+.ascii " -export:\"ontop_fcontext\""

+ 124 - 115
modules/std/fiber/native/asm/ontop_i386_ms_pe_masm.asm

@@ -1,115 +1,124 @@
-
-;           Copyright Oliver Kowalke 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)
-
-;  ---------------------------------------------------------------------------------
-;  |    0    |    1    |    2    |    3    |    4    |    5    |    6    |    7    |
-;  ---------------------------------------------------------------------------------
-;  |    0h   |   04h   |   08h   |   0ch   |   010h  |   014h  |   018h  |   01ch  |
-;  ---------------------------------------------------------------------------------
-;  | fc_strg |fc_deallo|  limit  |   base  |  fc_seh |   EDI   |   ESI   |   EBX   |
-;  ---------------------------------------------------------------------------------
-;  ---------------------------------------------------------------------------------
-;  |    8    |    9    |   10    |    11   |    12   |    13   |    14   |    15   |
-;  ---------------------------------------------------------------------------------
-;  |   020h  |  024h   |  028h   |   02ch  |   030h  |   034h  |   038h  |   03ch  |
-;  ---------------------------------------------------------------------------------
-;  |   EBP   |   EIP   |    to   |   data  |         |  EH NXT |SEH HNDLR|         |
-;  ---------------------------------------------------------------------------------
-
-.386
-.XMM
-.model flat, c
-.code
-
-ontop_fcontext PROC 
-
-	;BOOST_CONTEXT_EXPORT
-	
-    push  ebp  ; save EBP 
-    push  ebx  ; save EBX 
-    push  esi  ; save ESI 
-    push  edi  ; save EDI 
-
-    assume  fs:nothing
-    ; load NT_TIB into EDX
-    mov  edx, fs:[018h]
-    assume  fs:error
-
-    ; load current SEH exception list
-    mov  eax, [edx]
-    push  eax
-
-    ; load current stack base
-    mov  eax, [edx+04h]
-    push  eax
-
-    ; load current stack limit
-    mov  eax, [edx+08h]
-    push  eax
-
-    ; load current deallocation stack
-    mov  eax, [edx+0e0ch]
-    push  eax
-
-    ; load fiber local storage
-    mov  eax, [edx+010h]
-    push  eax
-
-    ; store ESP (pointing to context-data) in ECX
-    mov  ecx, esp
-
-    ; first arg of ontop_fcontext() == fcontext to jump to
-    mov  eax, [esp+028h]
-
-	; pass parent fcontext_t
-	mov  [eax+028h], ecx
-
-    ; second arg of ontop_fcontext() == data to be transferred
-    mov  ecx, [esp+02ch]
-
-	; pass data
-	mov  [eax+02ch], ecx
-
-    ; third arg of ontop_fcontext() == ontop-function
-    mov  ecx, [esp+030h]
-    
-    ; restore ESP (pointing to context-data) from EAX
-    mov  esp, eax
-
-    assume  fs:nothing
-    ; load NT_TIB into EDX
-    mov  edx, fs:[018h]
-    assume  fs:error
-
-    ; restore fiber local storage
-    pop  eax
-    mov  [edx+010h], eax
-
-    ; restore current deallocation stack
-    pop  eax
-    mov  [edx+0e0ch], eax
-
-    ; restore current stack limit
-    pop  eax
-    mov  [edx+08h], eax
-
-    ; restore current stack base
-    pop  eax
-    mov  [edx+04h], eax
-
-    ; restore current SEH exception list
-    pop  eax
-    mov  [edx], eax
-
-    pop  edi  ; save EDI 
-    pop  esi  ; save ESI 
-    pop  ebx  ; save EBX 
-    pop  ebp  ; save EBP
-
-    ; jump to context
-    jmp ecx
-ontop_fcontext ENDP
-END
+
+;           Copyright Oliver Kowalke 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)
+
+;  ---------------------------------------------------------------------------------
+;  |    0    |    1    |    2    |    3    |    4    |    5    |    6    |    7    |
+;  ---------------------------------------------------------------------------------
+;  |    0h   |   04h   |   08h   |   0ch   |   010h  |   014h  |   018h  |   01ch  |
+;  ---------------------------------------------------------------------------------
+;  | fc_mxcsr|fc_x87_cw| fc_strg |fc_deallo|  limit  |   base  |  fc_seh |   EDI   |
+;  ---------------------------------------------------------------------------------
+;  ---------------------------------------------------------------------------------
+;  |    8    |    9    |   10    |    11   |    12   |    13   |    14   |    15   |
+;  ---------------------------------------------------------------------------------
+;  |   020h  |  024h   |  028h   |   02ch  |   030h  |   034h  |   038h  |   03ch  |
+;  ---------------------------------------------------------------------------------
+;  |   ESI   |   EBX   |   EBP   |   EIP   |    to   |   data  |  EH NXT |SEH HNDLR|
+;  ---------------------------------------------------------------------------------
+
+.386
+.XMM
+.model flat, c
+.code
+
+ontop_fcontext PROC BOOST_CONTEXT_EXPORT
+    ; prepare stack
+    lea  esp, [esp-02ch]
+
+IFNDEF BOOST_USE_TSX
+    ; save MMX control- and status-word
+    stmxcsr  [esp]
+    ; save x87 control-word
+    fnstcw  [esp+04h]
+ENDIF
+
+    assume  fs:nothing
+    ; load NT_TIB into ECX
+    mov  edx, fs:[018h]
+    assume  fs:error
+    ; load fiber local storage
+    mov  eax, [edx+010h]
+    mov  [esp+08h], eax
+    ; load current deallocation stack
+    mov  eax, [edx+0e0ch]
+    mov  [esp+0ch], eax
+    ; load current stack limit
+    mov  eax, [edx+08h]
+    mov  [esp+010h], eax
+    ; load current stack base
+    mov  eax, [edx+04h]
+    mov  [esp+014h], eax
+    ; load current SEH exception list
+    mov  eax, [edx]
+    mov  [esp+018h], eax
+
+    mov  [esp+01ch], edi  ; save EDI 
+    mov  [esp+020h], esi  ; save ESI 
+    mov  [esp+024h], ebx  ; save EBX 
+    mov  [esp+028h], ebp  ; save EBP 
+
+    ; store ESP (pointing to context-data) in ECX
+    mov  ecx, esp
+
+    ; first arg of ontop_fcontext() == fcontext to jump to
+    mov  eax, [esp+030h]
+
+	; pass parent fcontext_t
+	mov  [eax+030h], ecx
+
+    ; second arg of ontop_fcontext() == data to be transferred
+    mov  ecx, [esp+034h]
+
+	; pass data
+	mov  [eax+034h], ecx
+
+    ; third arg of ontop_fcontext() == ontop-function
+    mov  ecx, [esp+038h]
+    
+    ; restore ESP (pointing to context-data) from EAX
+    mov  esp, eax
+
+IFNDEF BOOST_USE_TSX
+    ; restore MMX control- and status-word
+    ldmxcsr  [esp]
+    ; restore x87 control-word
+    fldcw  [esp+04h]
+ENDIF
+
+    assume  fs:nothing
+    ; load NT_TIB into EDX
+    mov  edx, fs:[018h]
+    assume  fs:error
+    ; restore fiber local storage
+    mov  eax, [esp+08h]
+    mov  [edx+010h], eax
+    ; restore current deallocation stack
+    mov  eax, [esp+0ch]
+    mov  [edx+0e0ch], eax
+    ; restore current stack limit
+    mov  eax, [esp+010h]
+    mov  [edx+08h], eax
+    ; restore current stack base
+    mov  eax, [esp+014h]
+    mov  [edx+04h], eax
+    ; restore current SEH exception list
+    mov  eax, [esp+018h]
+    mov  [edx], eax
+
+    mov  edi, [esp+01ch]  ; restore EDI 
+    mov  esi, [esp+020h]  ; restore ESI 
+    mov  ebx, [esp+024h]  ; restore EBX 
+    mov  ebp, [esp+028h]  ; restore EBP 
+
+    ; prepare stack
+    lea  esp, [esp+02ch]
+
+    ; keep return-address on stack
+
+    ; jump to context
+    jmp ecx
+ontop_fcontext ENDP
+END

+ 89 - 61
modules/std/fiber/native/asm/ontop_i386_sysv_elf_gas.S

@@ -1,61 +1,89 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*****************************************************************************************
- *                                                                                       *
- *  -----------------------------------------------------------------------------------  *
- *  |    0    |    1    |    2    |    3    |    4     |    5    |    6     |    7    |  *
- *  -----------------------------------------------------------------------------------  *
- *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18   |   0x1c  |  *
- *  -----------------------------------------------------------------------------------  *
- *  |   EDI   |   ESI   |   EBX   |   EBP   |   EIP    |  hidden |    to    |   data  |  *
- *  -----------------------------------------------------------------------------------  *
- *                                                                                       *
- *****************************************************************************************/
-
-.text
-.globl ontop_fcontext
-.align 2
-.type ontop_fcontext,@function
-ontop_fcontext:
-    pushl  %ebp  /* save EBP */
-    pushl  %ebx  /* save EBX */
-    pushl  %esi  /* save ESI */
-    pushl  %edi  /* save EDI */
-
-    /* store fcontext_t in ECX */
-    movl  %esp, %ecx
-
-    /* first arg of ontop_fcontext() == fcontext to jump to */
-    movl  0x18(%esp), %eax
-
-    /* pass parent fcontext_t */
-    movl  %ecx, 0x18(%eax)
-
-    /* second arg of ontop_fcontext() == data to be transferred */
-    movl  0x1c(%esp), %ecx
-
-    /* pass data */
-    movl %ecx, 0x1c(%eax)
-
-    /* third arg of ontop_fcontext() == ontop-function */
-    movl  0x20(%esp), %ecx
-
-    /* restore ESP (pointing to context-data) from EDX */
-    movl  %eax, %esp
-
-    popl  %edi  /* restore EDI */
-    popl  %esi  /* restore ESI */
-    popl  %ebx  /* restore EBX */
-    popl  %ebp  /* restore EBP */
-
-    /* jump to context */
-    jmp *%ecx
-.size ontop_fcontext,.-ontop_fcontext
-
-/* Mark that we don't need executable stack.  */
-.section .note.GNU-stack,"",%progbits
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/****************************************************************************************
+ *                                                                                      *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  | fc_mxcsr|fc_x87_cw|   EDI   |   ESI   |   EBX    |   EBP   |   EIP   |  hidden |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    8    |    9    |    10   |    11   |    12    |    13   |    14   |    15   |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x20  |   0x24  |                                                            |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    to   |   data  |                                                            |  *
+ *  ----------------------------------------------------------------------------------  *
+ *                                                                                      *
+ ****************************************************************************************/
+
+.text
+.globl ontop_fcontext
+.align 2
+.type ontop_fcontext,@function
+ontop_fcontext:
+    leal  -0x18(%esp), %esp  /* prepare stack */
+
+#if !defined(BOOST_USE_TSX)
+    stmxcsr  (%esp)     /* save MMX control- and status-word */
+    fnstcw   0x4(%esp)  /* save x87 control-word */
+#endif
+
+    movl  %edi, 0x8(%esp)  /* save EDI */
+    movl  %esi, 0xc(%esp)  /* save ESI */
+    movl  %ebx, 0x10(%esp)  /* save EBX */
+    movl  %ebp, 0x14(%esp)  /* save EBP */
+
+    /* store ESP (pointing to context-data) in ECX */
+    movl  %esp, %ecx
+
+    /* first arg of ontop_fcontext() == fcontext to jump to */
+    movl  0x20(%esp), %eax
+
+    /* pass parent fcontext_t */
+    movl  %ecx, 0x20(%eax)
+
+    /* second arg of ontop_fcontext() == data to be transferred */
+    movl  0x24(%esp), %ecx
+
+    /* pass data */
+    movl %ecx, 0x24(%eax)
+
+    /* third arg of ontop_fcontext() == ontop-function */
+    movl  0x28(%esp), %ecx
+
+    /* restore ESP (pointing to context-data) from EAX */
+    movl  %eax, %esp
+
+    /* address of returned transport_t */
+    movl 0x1c(%esp), %eax
+    /* return parent fcontext_t */
+    movl  %ecx, (%eax)
+    /* return data */
+    movl %edx, 0x4(%eax)
+
+#if !defined(BOOST_USE_TSX)
+    ldmxcsr  (%esp)     /* restore MMX control- and status-word */
+    fldcw    0x4(%esp)  /* restore x87 control-word */
+#endif
+
+    movl  0x8(%esp), %edi  /* restore EDI */
+    movl  0xc(%esp), %esi  /* restore ESI */
+    movl  0x10(%esp), %ebx  /* restore EBX */
+    movl  0x14(%esp), %ebp  /* restore EBP */
+
+    leal  0x18(%esp), %esp  /* prepare stack */
+
+    /* jump to context */
+    jmp *%ecx
+.size ontop_fcontext,.-ontop_fcontext
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 81 - 56
modules/std/fiber/native/asm/ontop_i386_sysv_macho_gas.S

@@ -1,56 +1,81 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*****************************************************************************************
- *                                                                                       *
- *  -----------------------------------------------------------------------------------  *
- *  |    0    |    1    |    2    |    3    |    4     |    5    |    6     |    7    |  *
- *  -----------------------------------------------------------------------------------  *
- *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18   |   0x1c  |  *
- *  -----------------------------------------------------------------------------------  *
- *  |   EDI   |   ESI   |   EBX   |   EBP   |   EIP    |  hidden |    to    |   data  |  *
- *  -----------------------------------------------------------------------------------  *
- *                                                                                       *
- *****************************************************************************************/
-
-.text
-.globl _ontop_fcontext
-.align 2
-_ontop_fcontext:
-    pushl  %ebp  /* save EBP */
-    pushl  %ebx  /* save EBX */
-    pushl  %esi  /* save ESI */
-    pushl  %edi  /* save EDI */
-
-    /* store fcontext_t in ECX */
-    movl  %esp, %ecx
-
-    /* first arg of ontop_fcontext() == fcontext to jump to */
-    movl  0x18(%esp), %eax
-
-    /* pass parent fcontext_t */
-    movl  %ecx, 0x18(%eax)
-
-    /* second arg of ontop_fcontext() == data to be transferred */
-    movl  0x1c(%esp), %ecx
-
-    /* pass data */
-    movl %ecx, 0x1c(%eax)
-
-    /* third arg of ontop_fcontext() == ontop-function */
-    movl  0x20(%esp), %ecx
-
-    /* restore ESP (pointing to context-data) from EDX */
-    movl  %eax, %esp
-
-    popl  %edi  /* restore EDI */
-    popl  %esi  /* restore ESI */
-    popl  %ebx  /* restore EBX */
-    popl  %ebp  /* restore EBP */
-
-    /* jump to context */
-    jmp *%ecx
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/****************************************************************************************
+ *                                                                                      *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  | fc_mxcsr|fc_x87_cw|   EDI   |   ESI   |   EBX    |   EBP   |   EIP   |    to   |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    8    |    9    |    10   |    11   |    12    |    13   |    14   |    15   |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x20  |                                                                      |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   data  |                                                                      |  *
+ *  ----------------------------------------------------------------------------------  *
+ *                                                                                      *
+ ****************************************************************************************/
+
+.text
+.globl _ontop_fcontext
+.align 2
+_ontop_fcontext:
+    leal  -0x18(%esp), %esp  /* prepare stack */
+
+#if !defined(BOOST_USE_TSX)
+    stmxcsr  (%esp)     /* save MMX control- and status-word */
+    fnstcw   0x4(%esp)  /* save x87 control-word */
+#endif
+
+    movl  %edi, 0x8(%esp)  /* save EDI */
+    movl  %esi, 0xc(%esp)  /* save ESI */
+    movl  %ebx, 0x10(%esp)  /* save EBX */
+    movl  %ebp, 0x14(%esp)  /* save EBP */
+
+    /* store ESP (pointing to context-data) in ECX */
+    movl  %esp, %ecx
+
+    /* first arg of ontop_fcontext() == fcontext to jump to */
+    movl  0x1c(%esp), %eax
+
+    /* pass parent fcontext_t */
+    movl  %ecx, 0x1c(%eax)
+
+    /* second arg of ontop_fcontext() == data to be transferred */
+    movl  0x20(%esp), %ecx
+
+    /* pass data */
+    movl %ecx, 0x20(%eax)
+
+    /* third arg of ontop_fcontext() == ontop-function */
+    movl  0x24(%esp), %ecx
+
+    /* restore ESP (pointing to context-data) from EAX */
+    movl  %eax, %esp
+
+    /* return parent fcontext_t */
+    movl  %ecx, %eax
+    /* returned data is stored in EDX */
+
+#if !defined(BOOST_USE_TSX)
+    ldmxcsr  (%esp)     /* restore MMX control- and status-word */
+    fldcw    0x4(%esp)  /* restore x87 control-word */
+#endif
+
+    movl  0x8(%esp), %edi  /* restore EDI */
+    movl  0xc(%esp), %esi  /* restore ESI */
+    movl  0x10(%esp), %ebx  /* restore EBX */
+    movl  0x14(%esp), %ebp  /* restore EBP */
+
+    leal  0x18(%esp), %esp  /* prepare stack */
+
+    /* jump to context */
+    jmp *%ecx

+ 16 - 16
modules/std/fiber/native/asm/ontop_i386_x86_64_sysv_macho_gas.S

@@ -1,16 +1,16 @@
-/*
-            Copyright Sergue E. Leontiev 2013.
-   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)
-*/
-
-// Stub file for universal binary
-
-#if defined(__i386__)
-    #include "ontop_i386_sysv_macho_gas.S"
-#elif defined(__x86_64__)
-    #include "ontop_x86_64_sysv_macho_gas.S"
-#else
-    #error "No arch's"
-#endif
+/*
+            Copyright Sergue E. Leontiev 2013.
+   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)
+*/
+
+// Stub file for universal binary
+
+#if defined(__i386__)
+    #include "ontop_i386_sysv_macho_gas.S"
+#elif defined(__x86_64__)
+    #include "ontop_x86_64_sysv_macho_gas.S"
+#else
+    #error "No arch's"
+#endif

+ 119 - 87
modules/std/fiber/native/asm/ontop_mips32_o32_elf_gas.S

@@ -1,87 +1,119 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
- *  -------------------------------------------------  *
- *  |  S0 |  S1 |  S2 |  S3 |  S4 |  S5 |  S6 |  S7 |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
- *  -------------------------------------------------  *
- *  |  FP |hiddn|  RA |  PC |  GP | FCTX| DATA|     |  *
- *  -------------------------------------------------  *
- *                                                     *
- * *****************************************************/
-
-.text
-.globl ontop_fcontext
-.align 2
-.type ontop_fcontext,@function
-.ent ontop_fcontext
-ontop_fcontext:
-    # reserve space on stack
-    addiu $sp, $sp, -112
-
-    sw  $s0, ($sp)  # save S0
-    sw  $s1, 4($sp)  # save S1
-    sw  $s2, 8($sp)  # save S2
-    sw  $s3, 12($sp)  # save S3
-    sw  $s4, 16($sp)  # save S4
-    sw  $s5, 20($sp)  # save S5
-    sw  $s6, 24($sp)  # save S6
-    sw  $s7, 28($sp)  # save S7
-    sw  $fp, 32($sp)  # save FP
-    sw  $a0, 36($sp)  # save hidden, address of returned transfer_t
-    sw  $ra, 40($sp)  # save RA
-    sw  $ra, 44($sp)  # save RA as PC
-
-    # store SP (pointing to context-data) in A0
-    move  $a0, $sp
-
-    # restore SP (pointing to context-data) from A1
-    move  $sp, $a1
-
-    lw  $s0, ($sp)  # restore S0
-    lw  $s1, 4($sp)  # restore S1
-    lw  $s2, 8($sp)  # restore S2
-    lw  $s3, 12($sp)  # restore S3
-    lw  $s4, 16($sp)  # restore S4
-    lw  $s5, 20($sp)  # restore S5
-    lw  $s6, 24($sp)  # restore S6
-    lw  $s7, 28($sp)  # restore S7
-    lw  $fp, 32($sp)  # restore FP
-    lw  $t0, 36($sp)  # restore hidden, address of returned transfer_t
-    lw  $ra, 40($sp)  # restore RA
-
-    # load PC
-    lw  $t9, 44($sp)
-
-    # adjust stack
-    addiu $sp, $sp, 112
-    
-    # return transfer_t from jump
-    sw  $a0, ($t0)  # fctx of transfer_t
-    sw  $a2, 4($t0) # data of transfer_t
-    # pass transfer_t as first arg in context function
-    # A0 == hidden, A1 == fctx, A2 == data
-    move  $a1, $a0 
-    move  $a0, $t0 
-
-    # jump to context
-    jr  $a3
-.end ontop_fcontext
-.size ontop_fcontext, .-ontop_fcontext
-
-/* Mark that we don't need executable stack.  */
-.section .note.GNU-stack,"",%progbits
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    F20    |    F22    |    F24    |    F26    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    F28    |    F30    |  S0 |  S1 |  S2 |  S3 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |  S4 |  S5 |  S6 |  S7 |  FP |hiddn|  RA |  PC |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |  GP | FCTX| DATA|     |     |     |     |     |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ * *****************************************************/
+
+.text
+.globl ontop_fcontext
+.align 2
+.type ontop_fcontext,@function
+.ent ontop_fcontext
+ontop_fcontext:
+    # reserve space on stack
+    addiu $sp, $sp, -96
+
+    sw  $s0, 48($sp)  # save S0
+    sw  $s1, 52($sp)  # save S1
+    sw  $s2, 56($sp)  # save S2
+    sw  $s3, 60($sp)  # save S3
+    sw  $s4, 64($sp)  # save S4
+    sw  $s5, 68($sp)  # save S5
+    sw  $s6, 72($sp)  # save S6
+    sw  $s7, 76($sp)  # save S7
+    sw  $fp, 80($sp)  # save FP
+    sw  $a0, 84($sp)  # save hidden, address of returned transfer_t
+    sw  $ra, 88($sp)  # save RA
+    sw  $ra, 92($sp)  # save RA as PC
+
+#if defined(__mips_hard_float)
+    s.d  $f20, ($sp)  # save F20
+    s.d  $f22, 8($sp)  # save F22
+    s.d  $f24, 16($sp)  # save F24
+    s.d  $f26, 24($sp)  # save F26
+    s.d  $f28, 32($sp)  # save F28
+    s.d  $f30, 40($sp)  # save F30
+#endif
+
+    # store SP (pointing to context-data) in A0
+    move  $a0, $sp
+
+    # restore SP (pointing to context-data) from A1
+    move  $sp, $a1
+
+#if defined(__mips_hard_float)
+    l.d  $f20, ($sp)  # restore F20
+    l.d  $f22, 8($sp)  # restore F22
+    l.d  $f24, 16($sp)  # restore F24
+    l.d  $f26, 24($sp)  # restore F26
+    l.d  $f28, 32($sp)  # restore F28
+    l.d  $f30, 40($sp)  # restore F30
+#endif
+
+    lw  $s0, 48($sp)  # restore S0
+    lw  $s1, 52($sp)  # restore S1
+    lw  $s2, 56($sp)  # restore S2
+    lw  $s3, 60($sp)  # restore S3
+    lw  $s4, 64($sp)  # restore S4
+    lw  $s5, 68($sp)  # restore S5
+    lw  $s6, 72($sp)  # restore S6
+    lw  $s7, 76($sp)  # restore S7
+    lw  $fp, 80($sp)  # restore FP
+    lw  $t0, 84($sp)  # restore hidden, address of returned transfer_t
+    lw  $ra, 88($sp)  # restore RA
+
+    # load PC
+    lw  $t9, 44($sp)
+
+    # adjust stack
+    addiu $sp, $sp, 96
+    
+    # return transfer_t from jump
+    sw  $a0, ($t0)  # fctx of transfer_t
+    sw  $a2, 4($t0) # data of transfer_t
+    # pass transfer_t as first arg in context function
+    # A0 == hidden, A1 == fctx, A2 == data
+    move  $a1, $a0 
+    move  $a0, $t0 
+
+    # jump to context
+    jr  $a3
+.end ontop_fcontext
+.size ontop_fcontext, .-ontop_fcontext
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 16 - 16
modules/std/fiber/native/asm/ontop_ppc32_ppc64_sysv_macho_gas.S

@@ -1,16 +1,16 @@
-/*
-            Copyright Sergue E. Leontiev 2013.
-   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)
-*/
-
-// Stub file for universal binary
-
-#if defined(__ppc__)
-    #include "ontop_ppc32_sysv_macho_gas.S"
-#elif defined(__ppc64__)
-    #include "ontop_ppc64_sysv_macho_gas.S"
-#else
-    #error "No arch's"
-#endif
+/*
+            Copyright Sergue E. Leontiev 2013.
+   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)
+*/
+
+// Stub file for universal binary
+
+#if defined(__ppc__)
+    #include "ontop_ppc32_sysv_macho_gas.S"
+#elif defined(__ppc64__)
+    #include "ontop_ppc64_sysv_macho_gas.S"
+#else
+    #error "No arch's"
+#endif

+ 206 - 129
modules/std/fiber/native/asm/ontop_ppc32_sysv_elf_gas.S

@@ -1,129 +1,206 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
- *  -------------------------------------------------  *
- *  | R13 | R14 | R15 | R16 | R17 | R18 | R19 | R20 |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
- *  -------------------------------------------------  *
- *  | R21 | R22 | R23 | R24 | R25 | R26 | R27 | R28 |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
- *  -------------------------------------------------  *
- *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
- *  -------------------------------------------------  *
- *  | R29 | R30 | R31 |hiddn|  CR |  LR |  PC | FCTX|  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
- *  -------------------------------------------------  *
- *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
- *  -------------------------------------------------  *
- *  | DATA|     |     |     |                       |  * 
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.text
-.globl ontop_fcontext
-.align 2
-.type ontop_fcontext,@function
-ontop_fcontext:
-    # reserve space on stack
-    subi  %r1, %r1, 92
-
-    stw  %r13, 0(%r1)  # save R13
-    stw  %r14, 4(%r1)  # save R14
-    stw  %r15, 8(%r1)  # save R15
-    stw  %r16, 12(%r1)  # save R16
-    stw  %r17, 16(%r1)  # save R17
-    stw  %r18, 20(%r1)  # save R18
-    stw  %r19, 24(%r1)  # save R19
-    stw  %r20, 28(%r1)  # save R20
-    stw  %r21, 32(%r1)  # save R21
-    stw  %r22, 36(%r1)  # save R22
-    stw  %r23, 40(%r1)  # save R23
-    stw  %r24, 44(%r1)  # save R24
-    stw  %r25, 48(%r1)  # save R25
-    stw  %r26, 52(%r1)  # save R26
-    stw  %r27, 56(%r1)  # save R27
-    stw  %r28, 60(%r1)  # save R28
-    stw  %r29, 64(%r1)  # save R29
-    stw  %r30, 68(%r1)  # save R30
-    stw  %r31, 72(%r1)  # save R31
-    stw  %r3,  76(%r1)  # save hidden
-
-    # save CR
-    mfcr  %r0
-    stw   %r0, 80(%r1)
-    # save LR
-    mflr  %r0
-    stw   %r0, 84(%r1)
-    # save LR as PC
-    stw   %r0, 88(%r1)
-
-    # store RSP (pointing to context-data) in R7
-    mr  %r7, %r1
-
-    # restore RSP (pointing to context-data) from R4
-    mr  %r1, %r4
-
-    lwz  %r13, 0(%r1)  # restore R13
-    lwz  %r14, 4(%r1)  # restore R14
-    lwz  %r15, 8(%r1)  # restore R15
-    lwz  %r16, 12(%r1)  # restore R16
-    lwz  %r17, 16(%r1)  # restore R17
-    lwz  %r18, 20(%r1)  # restore R18
-    lwz  %r19, 24(%r1)  # restore R19
-    lwz  %r20, 28(%r1)  # restore R20
-    lwz  %r21, 32(%r1)  # restore R21
-    lwz  %r22, 36(%r1)  # restore R22
-    lwz  %r23, 40(%r1)  # restore R23
-    lwz  %r24, 44(%r1)  # restore R24
-    lwz  %r25, 48(%r1)  # restore R25
-    lwz  %r26, 52(%r1)  # restore R26
-    lwz  %r27, 56(%r1)  # restore R27
-    lwz  %r28, 60(%r1)  # restore R28
-    lwz  %r29, 64(%r1)  # restore R29
-    lwz  %r30, 68(%r1)  # restore R30
-    lwz  %r31, 72(%r1)  # restore R31
-    lwz  %r4,  76(%r1)  # restore hidden
-
-    # restore CR
-    lwz   %r0, 80(%r1)
-    mtcr  %r0
-    # restore LR
-    lwz   %r0, 84(%r1)
-    mtlr  %r0
-    # ignore PC
-
-    # adjust stack
-    addi  %r1, %r1, 92
-
-    # return transfer_t 
-    stw  %r7, 0(%r4)
-    stw  %r5, 4(%r4)
-
-    # restore CTR
-    mtctr %r6
-
-    # jump to ontop-function
-    bctr
-.size ontop_fcontext, .-ontop_fcontext
-
-/* Mark that we don't need executable stack.  */
-.section .note.GNU-stack,"",%progbits
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    F14    |    F15    |    F16    |    F17    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    F18    |    F19    |    F20    |    F21    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |    F22    |    F23    |    F24    |    F25    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |    F26    |    F27    |    F28    |    F29    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
+ *  -------------------------------------------------  *
+ *  |    F30    |    F31    |   fpscr   | R13 | R14 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
+ *  -------------------------------------------------  *
+ *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
+ *  -------------------------------------------------  *
+ *  | R15 | R16 | R17 | R18 | R19 | R20 | R21 | R22 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
+ *  -------------------------------------------------  *
+ *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
+ *  -------------------------------------------------  *
+ *  | R23 | R24 | R25 | R26 | R27 | R28 | R29 | R30 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
+ *  -------------------------------------------------  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
+ *  -------------------------------------------------  *
+ *  | R31 |hiddn|  CR |  LR |  PC |bchai|linkr| FCTX|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  64 |                                         |  *
+ *  -------------------------------------------------  *
+ *  | 256 |                                         |  *
+ *  -------------------------------------------------  *
+ *  | DATA|                                         |  * 
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl ontop_fcontext
+.align 2
+.type ontop_fcontext,@function
+ontop_fcontext:
+    # reserve space on stack
+    subi  %r1, %r1, 244
+
+    stfd  %f14, 0(%r1)  # save F14
+    stfd  %f15, 8(%r1)  # save F15
+    stfd  %f16, 16(%r1)  # save F16
+    stfd  %f17, 24(%r1)  # save F17
+    stfd  %f18, 32(%r1)  # save F18
+    stfd  %f19, 40(%r1)  # save F19
+    stfd  %f20, 48(%r1)  # save F20
+    stfd  %f21, 56(%r1)  # save F21
+    stfd  %f22, 64(%r1)  # save F22
+    stfd  %f23, 72(%r1)  # save F23
+    stfd  %f24, 80(%r1)  # save F24
+    stfd  %f25, 88(%r1)  # save F25
+    stfd  %f26, 96(%r1)  # save F26
+    stfd  %f27, 104(%r1)  # save F27
+    stfd  %f28, 112(%r1)  # save F28
+    stfd  %f29, 120(%r1)  # save F29
+    stfd  %f30, 128(%r1)  # save F30
+    stfd  %f31, 136(%r1)  # save F31
+    mffs  %f0  # load FPSCR
+    stfd  %f0, 144(%r1)  # save FPSCR
+
+    stw  %r13, 152(%r1)  # save R13
+    stw  %r14, 156(%r1)  # save R14
+    stw  %r15, 160(%r1)  # save R15
+    stw  %r16, 164(%r1)  # save R16
+    stw  %r17, 168(%r1)  # save R17
+    stw  %r18, 172(%r1)  # save R18
+    stw  %r19, 176(%r1)  # save R19
+    stw  %r20, 180(%r1)  # save R20
+    stw  %r21, 184(%r1)  # save R21
+    stw  %r22, 188(%r1)  # save R22
+    stw  %r23, 192(%r1)  # save R23
+    stw  %r24, 196(%r1)  # save R24
+    stw  %r25, 200(%r1)  # save R25
+    stw  %r26, 204(%r1)  # save R26
+    stw  %r27, 208(%r1)  # save R27
+    stw  %r28, 212(%r1)  # save R28
+    stw  %r29, 216(%r1)  # save R29
+    stw  %r30, 220(%r1)  # save R30
+    stw  %r31, 224(%r1)  # save R31
+    stw  %r3,  228(%r1)  # save hidden
+
+    # save CR
+    mfcr  %r0
+    stw   %r0, 232(%r1)
+    # save LR
+    mflr  %r0
+    stw   %r0, 236(%r1)
+    # save LR as PC
+    stw   %r0, 240(%r1)
+
+    # store RSP (pointing to context-data) in R7
+    mr  %r7, %r1
+
+    # restore RSP (pointing to context-data) from R4
+    mr  %r1, %r4
+
+    lfd  %f14, 0(%r1)  # restore F14
+    lfd  %f15, 8(%r1)  # restore F15
+    lfd  %f16, 16(%r1)  # restore F16
+    lfd  %f17, 24(%r1)  # restore F17
+    lfd  %f18, 32(%r1)  # restore F18
+    lfd  %f19, 40(%r1)  # restore F19
+    lfd  %f20, 48(%r1)  # restore F20
+    lfd  %f21, 56(%r1)  # restore F21
+    lfd  %f22, 64(%r1)  # restore F22
+    lfd  %f23, 72(%r1)  # restore F23
+    lfd  %f24, 80(%r1)  # restore F24
+    lfd  %f25, 88(%r1)  # restore F25
+    lfd  %f26, 96(%r1)  # restore F26
+    lfd  %f27, 104(%r1)  # restore F27
+    lfd  %f28, 112(%r1)  # restore F28
+    lfd  %f29, 120(%r1)  # restore F29
+    lfd  %f30, 128(%r1)  # restore F30
+    lfd  %f31, 136(%r1)  # restore F31
+    lfd  %f0,  144(%r1)  # load FPSCR
+    mtfsf  0xff, %f0  # restore FPSCR
+
+    lwz  %r13, 152(%r1)  # restore R13
+    lwz  %r14, 156(%r1)  # restore R14
+    lwz  %r15, 160(%r1)  # restore R15
+    lwz  %r16, 164(%r1)  # restore R16
+    lwz  %r17, 168(%r1)  # restore R17
+    lwz  %r18, 172(%r1)  # restore R18
+    lwz  %r19, 176(%r1)  # restore R19
+    lwz  %r20, 180(%r1)  # restore R20
+    lwz  %r21, 184(%r1)  # restore R21
+    lwz  %r22, 188(%r1)  # restore R22
+    lwz  %r23, 192(%r1)  # restore R23
+    lwz  %r24, 196(%r1)  # restore R24
+    lwz  %r25, 200(%r1)  # restore R25
+    lwz  %r26, 204(%r1)  # restore R26
+    lwz  %r27, 208(%r1)  # restore R27
+    lwz  %r28, 212(%r1)  # restore R28
+    lwz  %r29, 216(%r1)  # restore R29
+    lwz  %r30, 220(%r1)  # restore R30
+    lwz  %r31, 224(%r1)  # restore R31
+    lwz  %r4,  228(%r1)  # restore hidden
+
+    # restore CR
+    lwz   %r0, 232(%r1)
+    mtcr  %r0
+    # restore LR
+    lwz   %r0, 236(%r1)
+    mtlr  %r0
+    # ignore PC
+
+    # adjust stack
+    addi  %r1, %r1, 244
+
+    # return transfer_t 
+    stw  %r7, 0(%r4)
+    stw  %r5, 4(%r4)
+
+    # restore CTR
+    mtctr %r6
+
+    # jump to ontop-function
+    bctr
+.size ontop_fcontext, .-ontop_fcontext
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 201 - 124
modules/std/fiber/native/asm/ontop_ppc32_sysv_macho_gas.S

@@ -1,124 +1,201 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
- *  -------------------------------------------------  *
- *  | R13 | R14 | R15 | R16 | R17 | R18 | R19 | R20 |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
- *  -------------------------------------------------  *
- *  | R21 | R22 | R23 | R24 | R25 | R26 | R27 | R28 |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
- *  -------------------------------------------------  *
- *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
- *  -------------------------------------------------  *
- *  | R29 | R30 | R31 |hiddn|  CR |  LR |  PC | FCTX|  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
- *  -------------------------------------------------  *
- *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
- *  -------------------------------------------------  *
- *  | DATA|     |     |     |                       |  * 
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.text
-.globl _ontop_fcontext
-.align 2
-_ontop_fcontext:
-    # reserve space on stack
-    subi  r1, r1, 92
-
-    stw  r13, 0(r1)  # save R13
-    stw  r14, 4(r1)  # save R14
-    stw  r15, 8(r1)  # save R15
-    stw  r16, 12(r1)  # save R16
-    stw  r17, 16(r1)  # save R17
-    stw  r18, 20(r1)  # save R18
-    stw  r19, 24(r1)  # save R19
-    stw  r20, 28(r1)  # save R20
-    stw  r21, 32(r1)  # save R21
-    stw  r22, 36(r1)  # save R22
-    stw  r23, 40(r1)  # save R23
-    stw  r24, 44(r1)  # save R24
-    stw  r25, 48(r1)  # save R25
-    stw  r26, 52(r1)  # save R26
-    stw  r27, 56(r1)  # save R27
-    stw  r28, 60(r1)  # save R28
-    stw  r29, 64(r1)  # save R29
-    stw  r30, 68(r1)  # save R30
-    stw  r31, 72(r1)  # save R31
-    stw  r3,  76(r1)  # save hidden
-
-    # save CR
-    mfcr  r0
-    stw   r0, 80(r1)
-    # save LR
-    mflr  r0
-    stw   r0, 84(r1)
-    # save LR as PC
-    stw   r0, 88(r1)
-
-    # store RSP (pointing to context-data) in R7
-    mr  r7, r1
-
-    # restore RSP (pointing to context-data) from R4
-    mr  r1, r4
-
-    lwz  r13, 0(r1)  # restore R13
-    lwz  r14, 4(r1)  # restore R14
-    lwz  r15, 8(r1)  # restore R15
-    lwz  r16, 12(r1)  # restore R16
-    lwz  r17, 16(r1)  # restore R17
-    lwz  r18, 20(r1)  # restore R18
-    lwz  r19, 24(r1)  # restore R19
-    lwz  r20, 28(r1)  # restore R20
-    lwz  r21, 32(r1)  # restore R21
-    lwz  r22, 36(r1)  # restore R22
-    lwz  r23, 40(r1)  # restore R23
-    lwz  r24, 44(r1)  # restore R24
-    lwz  r25, 48(r1)  # restore R25
-    lwz  r26, 52(r1)  # restore R26
-    lwz  r27, 56(r1)  # restore R27
-    lwz  r28, 60(r1)  # restore R28
-    lwz  r29, 64(r1)  # restore R29
-    lwz  r30, 68(r1)  # restore R30
-    lwz  r31, 72(r1)  # restore R31
-    lwz  r4,  76(r1)  # restore hidden
-
-    # restore CR
-    lwz   r0, 80(r1)
-    mtcr  r0
-    # restore LR
-    lwz   r0, 84(r1)
-    mtlr  r0
-    # ignore PC
-
-    # adjust stack
-    addi  r1, r1, 92
-
-    # return transfer_t 
-    stw  r7, 0(r4)
-    stw  r5, 4(r4)
-
-    # restore CTR
-    mtctr r6
-
-    # jump to ontop-function
-    bctr
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    F14    |    F15    |    F16    |    F17    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    F18    |    F19    |    F20    |    F21    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |    F22    |    F23    |    F24    |    F25    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |    F26    |    F27    |    F28    |    F29    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
+ *  -------------------------------------------------  *
+ *  |    F30    |    F31    |   fpscr   | R13 | R14 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
+ *  -------------------------------------------------  *
+ *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
+ *  -------------------------------------------------  *
+ *  | R15 | R16 | R17 | R18 | R19 | R20 | R21 | R22 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
+ *  -------------------------------------------------  *
+ *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
+ *  -------------------------------------------------  *
+ *  | R23 | R24 | R25 | R26 | R27 | R28 | R29 | R30 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
+ *  -------------------------------------------------  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
+ *  -------------------------------------------------  *
+ *  | R31 |hiddn|  CR |  LR |  PC |bchai|linkr| FCTX|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  64 |                                         |  *
+ *  -------------------------------------------------  *
+ *  | 256 |                                         |  *
+ *  -------------------------------------------------  *
+ *  | DATA|                                         |  * 
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.globl _ontop_fcontext
+.align 2
+_ontop_fcontext:
+    # reserve space on stack
+    subi  r1, r1, 244
+
+    stfd  f14, 0(r1)  # save F14
+    stfd  f15, 8(r1)  # save F15
+    stfd  f16, 16(r1)  # save F16
+    stfd  f17, 24(r1)  # save F17
+    stfd  f18, 32(r1)  # save F18
+    stfd  f19, 40(r1)  # save F19
+    stfd  f20, 48(r1)  # save F20
+    stfd  f21, 56(r1)  # save F21
+    stfd  f22, 64(r1)  # save F22
+    stfd  f23, 72(r1)  # save F23
+    stfd  f24, 80(r1)  # save F24
+    stfd  f25, 88(r1)  # save F25
+    stfd  f26, 96(r1)  # save F26
+    stfd  f27, 104(r1)  # save F27
+    stfd  f28, 112(r1)  # save F28
+    stfd  f29, 120(r1)  # save F29
+    stfd  f30, 128(r1)  # save F30
+    stfd  f31, 136(r1)  # save F31
+    mffs  f0  # load FPSCR
+    stfd  f0, 144(r1)  # save FPSCR
+
+    stw  r13, 152(r1)  # save R13
+    stw  r14, 156(r1)  # save R14
+    stw  r15, 160(r1)  # save R15
+    stw  r16, 164(r1)  # save R16
+    stw  r17, 168(r1)  # save R17
+    stw  r18, 172(r1)  # save R18
+    stw  r19, 176(r1)  # save R19
+    stw  r20, 180(r1)  # save R20
+    stw  r21, 184(r1)  # save R21
+    stw  r22, 188(r1)  # save R22
+    stw  r23, 192(r1)  # save R23
+    stw  r24, 196(r1)  # save R24
+    stw  r25, 200(r1)  # save R25
+    stw  r26, 204(r1)  # save R26
+    stw  r27, 208(r1)  # save R27
+    stw  r28, 212(r1)  # save R28
+    stw  r29, 216(r1)  # save R29
+    stw  r30, 220(r1)  # save R30
+    stw  r31, 224(r1)  # save R31
+    stw  r3,  228(r1)  # save hidden
+
+    # save CR
+    mfcr  r0
+    stw   r0, 232(r1)
+    # save LR
+    mflr  r0
+    stw   r0, 236(r1)
+    # save LR as PC
+    stw   r0, 240(r1)
+
+    # store RSP (pointing to context-data) in R7
+    mr  r7, r1
+
+    # restore RSP (pointing to context-data) from R4
+    mr  r1, r4
+
+    lfd  f14, 0(r1)  # restore F14
+    lfd  f15, 8(r1)  # restore F15
+    lfd  f16, 16(r1)  # restore F16
+    lfd  f17, 24(r1)  # restore F17
+    lfd  f18, 32(r1)  # restore F18
+    lfd  f19, 40(r1)  # restore F19
+    lfd  f20, 48(r1)  # restore F20
+    lfd  f21, 56(r1)  # restore F21
+    lfd  f22, 64(r1)  # restore F22
+    lfd  f23, 72(r1)  # restore F23
+    lfd  f24, 80(r1)  # restore F24
+    lfd  f25, 88(r1)  # restore F25
+    lfd  f26, 96(r1)  # restore F26
+    lfd  f27, 104(r1)  # restore F27
+    lfd  f28, 112(r1)  # restore F28
+    lfd  f29, 120(r1)  # restore F29
+    lfd  f30, 128(r1)  # restore F30
+    lfd  f31, 136(r1)  # restore F31
+    lfd  f0,  144(r1)  # load FPSCR
+    mtfsf  0xff, f0  # restore FPSCR
+
+    lwz  r13, 152(r1)  # restore R13
+    lwz  r14, 156(r1)  # restore R14
+    lwz  r15, 160(r1)  # restore R15
+    lwz  r16, 164(r1)  # restore R16
+    lwz  r17, 168(r1)  # restore R17
+    lwz  r18, 172(r1)  # restore R18
+    lwz  r19, 176(r1)  # restore R19
+    lwz  r20, 180(r1)  # restore R20
+    lwz  r21, 184(r1)  # restore R21
+    lwz  r22, 188(r1)  # restore R22
+    lwz  r23, 192(r1)  # restore R23
+    lwz  r24, 196(r1)  # restore R24
+    lwz  r25, 200(r1)  # restore R25
+    lwz  r26, 204(r1)  # restore R26
+    lwz  r27, 208(r1)  # restore R27
+    lwz  r28, 212(r1)  # restore R28
+    lwz  r29, 216(r1)  # restore R29
+    lwz  r30, 220(r1)  # restore R30
+    lwz  r31, 224(r1)  # restore R31
+    lwz  r4,  228(r1)  # restore hidden
+
+    # restore CR
+    lwz   r0, 232(r1)
+    mtcr  r0
+    # restore LR
+    lwz   r0, 236(r1)
+    mtlr  r0
+    # ignore PC
+
+    # adjust stack
+    addi  r1, r1, 244
+
+    # return transfer_t 
+    stw  r7, 0(r4)
+    stw  r5, 4(r4)
+
+    # restore CTR
+    mtctr r6
+
+    # jump to ontop-function
+    bctr

+ 203 - 87
modules/std/fiber/native/asm/ontop_ppc32_sysv_xcoff_gas.S

@@ -1,87 +1,203 @@
-.globl .ontop_fcontext
-.globl  ontop_fcontext[DS]
-.align 2 
-.csect	ontop_fcontext[DS]
-ontop_fcontext:
-  .long	.ontop_fcontext
-.ontop_fcontext:
-    # reserve space on stack
-    subi 1, 1, 92
-
-    stw  13, 0(1)  # save R13
-    stw  14, 4(1)  # save R14
-    stw  15, 8(1)  # save R15
-    stw  16, 12(1)  # save R16
-    stw  17, 16(1)  # save R17
-    stw  18, 20(1)  # save R18
-    stw  19, 24(1)  # save R19
-    stw  20, 28(1)  # save R20
-    stw  21, 32(1)  # save R21
-    stw  22, 36(1)  # save R22
-    stw  23, 40(1)  # save R23
-    stw  24, 44(1)  # save R24
-    stw  25, 48(1)  # save R25
-    stw  26, 52(1)  # save R26
-    stw  27, 56(1)  # save R27
-    stw  28, 60(1)  # save R28
-    stw  29, 64(1)  # save R29
-    stw  30, 68(1)  # save R30
-    stw  31, 72(1)  # save R31
-    stw  3,  76(1)  # save hidden
-
-    # save CR
-    mfcr 0
-    stw 0, 80(1)
-    # save LR
-    mflr 0
-    stw 0, 84(1)
-    # save LR as PC
-    stw 0, 88(1)
-
-    # store RSP (pointing to context-data) in R6
-    mr  7, 1
-
-    # restore RSP (pointing to context-data) from R4
-    mr  1, 4
-
-    lwz  13, 0(1)  # restore R13
-    lwz  14, 4(1)  # restore R14
-    lwz  15, 8(1)  # restore R15
-    lwz  16, 12(1)  # restore R16
-    lwz  17, 16(1)  # restore R17
-    lwz  18, 20(1)  # restore R18
-    lwz  19, 24(1)  # restore R19
-    lwz  20, 28(1)  # restore R20
-    lwz  21, 32(1)  # restore R21
-    lwz  22, 36(1)  # restore R22
-    lwz  23, 40(1)  # restore R23
-    lwz  24, 44(1)  # restore R24
-    lwz  25, 48(1)  # restore R25
-    lwz  26, 52(1)  # restore R26
-    lwz  27, 56(1)  # restore R27
-    lwz  28, 60(1)  # restore R28
-    lwz  29, 64(1)  # restore R29
-    lwz  30, 68(1)  # restore R30
-    lwz  31, 72(1)  # restore R31
-    lwz  4,  76(1)  # restore hidden
-
-    # restore CR
-    lwz 0, 80(1)
-    mtcr 0
-    # restore LR
-    lwz 0, 84(1)
-    mtlr 0
-    # ignore PC
-
-    # adjust stack
-    addi 1, 1, 92
-
-    # return transfer_t 
-    stw  7, 0(3)
-    stw  5, 4(3)
-
-    # restore CTR
-    mtctr 6
-
-    # jump to context
-    bctr
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    F14    |    F15    |    F16    |    F17    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    F18    |    F19    |    F20    |    F21    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |    F22    |    F23    |    F24    |    F25    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |    F26    |    F27    |    F28    |    F29    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
+ *  -------------------------------------------------  *
+ *  |    F30    |    F31    |   fpscr   | R13 | R14 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
+ *  -------------------------------------------------  *
+ *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
+ *  -------------------------------------------------  *
+ *  | R15 | R16 | R17 | R18 | R19 | R20 | R21 | R22 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
+ *  -------------------------------------------------  *
+ *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
+ *  -------------------------------------------------  *
+ *  | R23 | R24 | R25 | R26 | R27 | R28 | R29 | R30 |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
+ *  -------------------------------------------------  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
+ *  -------------------------------------------------  *
+ *  | R31 |hiddn|  CR |  LR |  PC |bchai|linkr| FCTX|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  64 |                                         |  *
+ *  -------------------------------------------------  *
+ *  | 256 |                                         |  *
+ *  -------------------------------------------------  *
+ *  | DATA|                                         |  * 
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+.globl .ontop_fcontext
+.globl  ontop_fcontext[DS]
+.align 2 
+.csect	ontop_fcontext[DS]
+ontop_fcontext:
+  .long	.ontop_fcontext
+.ontop_fcontext:
+    # reserve space on stack
+    subi  r1, r1, 244
+
+    stfd  f14, 0(r1)  # save F14
+    stfd  f15, 8(r1)  # save F15
+    stfd  f16, 16(r1)  # save F16
+    stfd  f17, 24(r1)  # save F17
+    stfd  f18, 32(r1)  # save F18
+    stfd  f19, 40(r1)  # save F19
+    stfd  f20, 48(r1)  # save F20
+    stfd  f21, 56(r1)  # save F21
+    stfd  f22, 64(r1)  # save F22
+    stfd  f23, 72(r1)  # save F23
+    stfd  f24, 80(r1)  # save F24
+    stfd  f25, 88(r1)  # save F25
+    stfd  f26, 96(r1)  # save F26
+    stfd  f27, 104(r1)  # save F27
+    stfd  f28, 112(r1)  # save F28
+    stfd  f29, 120(r1)  # save F29
+    stfd  f30, 128(r1)  # save F30
+    stfd  f31, 136(r1)  # save F31
+    mffs  f0  # load FPSCR
+    stfd  f0, 144(r1)  # save FPSCR
+
+    stw  r13, 152(r1)  # save R13
+    stw  r14, 156(r1)  # save R14
+    stw  r15, 160(r1)  # save R15
+    stw  r16, 164(r1)  # save R16
+    stw  r17, 168(r1)  # save R17
+    stw  r18, 172(r1)  # save R18
+    stw  r19, 176(r1)  # save R19
+    stw  r20, 180(r1)  # save R20
+    stw  r21, 184(r1)  # save R21
+    stw  r22, 188(r1)  # save R22
+    stw  r23, 192(r1)  # save R23
+    stw  r24, 196(r1)  # save R24
+    stw  r25, 200(r1)  # save R25
+    stw  r26, 204(r1)  # save R26
+    stw  r27, 208(r1)  # save R27
+    stw  r28, 212(r1)  # save R28
+    stw  r29, 216(r1)  # save R29
+    stw  r30, 220(r1)  # save R30
+    stw  r31, 224(r1)  # save R31
+    stw  r3,  228(r1)  # save hidden
+
+    # save CR
+    mfcr  r0
+    stw   r0, 232(r1)
+    # save LR
+    mflr  r0
+    stw   r0, 236(r1)
+    # save LR as PC
+    stw   r0, 240(r1)
+
+    # store RSP (pointing to context-data) in R7
+    mr  r7, r1
+
+    # restore RSP (pointing to context-data) from R4
+    mr  r1, r4
+
+    lfd  f14, 0(r1)  # restore F14
+    lfd  f15, 8(r1)  # restore F15
+    lfd  f16, 16(r1)  # restore F16
+    lfd  f17, 24(r1)  # restore F17
+    lfd  f18, 32(r1)  # restore F18
+    lfd  f19, 40(r1)  # restore F19
+    lfd  f20, 48(r1)  # restore F20
+    lfd  f21, 56(r1)  # restore F21
+    lfd  f22, 64(r1)  # restore F22
+    lfd  f23, 72(r1)  # restore F23
+    lfd  f24, 80(r1)  # restore F24
+    lfd  f25, 88(r1)  # restore F25
+    lfd  f26, 96(r1)  # restore F26
+    lfd  f27, 104(r1)  # restore F27
+    lfd  f28, 112(r1)  # restore F28
+    lfd  f29, 120(r1)  # restore F29
+    lfd  f30, 128(r1)  # restore F30
+    lfd  f31, 136(r1)  # restore F31
+    lfd  f0,  144(r1)  # load FPSCR
+    mtfsf  0xff, f0  # restore FPSCR
+
+    lwz  r13, 152(r1)  # restore R13
+    lwz  r14, 156(r1)  # restore R14
+    lwz  r15, 160(r1)  # restore R15
+    lwz  r16, 164(r1)  # restore R16
+    lwz  r17, 168(r1)  # restore R17
+    lwz  r18, 172(r1)  # restore R18
+    lwz  r19, 176(r1)  # restore R19
+    lwz  r20, 180(r1)  # restore R20
+    lwz  r21, 184(r1)  # restore R21
+    lwz  r22, 188(r1)  # restore R22
+    lwz  r23, 192(r1)  # restore R23
+    lwz  r24, 196(r1)  # restore R24
+    lwz  r25, 200(r1)  # restore R25
+    lwz  r26, 204(r1)  # restore R26
+    lwz  r27, 208(r1)  # restore R27
+    lwz  r28, 212(r1)  # restore R28
+    lwz  r29, 216(r1)  # restore R29
+    lwz  r30, 220(r1)  # restore R30
+    lwz  r31, 224(r1)  # restore R31
+    lwz  r4,  228(r1)  # restore hidden
+
+    # restore CR
+    lwz   r0, 232(r1)
+    mtcr  r0
+    # restore LR
+    lwz   r0, 236(r1)
+    mtlr  r0
+    # ignore PC
+
+    # adjust stack
+    addi  r1, r1, 244
+
+    # return transfer_t 
+    stw  r7, 0(r4)
+    stw  r5, 4(r4)
+
+    # restore CTR
+    mtctr r6
+
+    # jump to ontop-function
+    bctr

+ 240 - 194
modules/std/fiber/native/asm/ontop_ppc64_sysv_elf_gas.S

@@ -1,194 +1,240 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
- *  -------------------------------------------------  *
- *  |    TOC    |    R14    |    R15    |    R16    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
- *  -------------------------------------------------  *
- *  |    R17    |    R18    |     R19   |    R20    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
- *  -------------------------------------------------  *
- *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
- *  -------------------------------------------------  *
- *  |    R21    |    R22    |    R23    |    R24    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
- *  -------------------------------------------------  *
- *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
- *  -------------------------------------------------  *
- *  |    R25    |    R26    |    R27    |    R28    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
- *  -------------------------------------------------  *
- *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
- *  -------------------------------------------------  *
- *  |    R29    |    R30    |    R31    |   hidden  |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
- *  -------------------------------------------------  *
- *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
- *  -------------------------------------------------  *
- *  |     CR    |     LR    |     PC    | back-chain|  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
- *  -------------------------------------------------  *
- *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
- *  -------------------------------------------------  *
- *  |  cr saved |  lr saved |  compiler |   linker  |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
- *  -------------------------------------------------  *
- *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
- *  -------------------------------------------------  *
- *  | TOC saved |    FCTX   |    DATA   |           |  *
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.globl ontop_fcontext
-#if _CALL_ELF == 2
-	.text
-	.align 2
-ontop_fcontext:
-        addis   %r2, %r12, .TOC.-ontop_fcontext@ha
-        addi    %r2, %r2, .TOC.-ontop_fcontext@l
-        .localentry ontop_fcontext, . - ontop_fcontext
-#else
-	.section ".opd","aw"
-	.align 3
-ontop_fcontext:
-# ifdef _CALL_LINUX
-        .quad   .L.ontop_fcontext,.TOC.@tocbase,0
-        .type   ontop_fcontext,@function
-        .text
-        .align 2
-.L.ontop_fcontext:
-# else
-        .hidden .ontop_fcontext
-        .globl  .ontop_fcontext
-        .quad   .ontop_fcontext,.TOC.@tocbase,0
-        .size   ontop_fcontext,24
-        .type   .ontop_fcontext,@function
-        .text
-        .align 2
-.ontop_fcontext:
-# endif
-#endif
-    # reserve space on stack
-    subi  %r1, %r1, 184
-
-#if _CALL_ELF != 2
-    std  %r2,  0(%r1)  # save TOC
-#endif
-    std  %r14, 8(%r1)  # save R14
-    std  %r15, 16(%r1)  # save R15
-    std  %r16, 24(%r1)  # save R16
-    std  %r17, 32(%r1)  # save R17
-    std  %r18, 40(%r1)  # save R18
-    std  %r19, 48(%r1)  # save R19
-    std  %r20, 56(%r1)  # save R20
-    std  %r21, 64(%r1)  # save R21
-    std  %r22, 72(%r1)  # save R22
-    std  %r23, 80(%r1)  # save R23
-    std  %r24, 88(%r1)  # save R24
-    std  %r25, 96(%r1)  # save R25
-    std  %r26, 104(%r1)  # save R26
-    std  %r27, 112(%r1)  # save R27
-    std  %r29, 120(%r1)  # save R28
-    std  %r29, 128(%r1)  # save R29
-    std  %r30, 136(%r1)  # save R30
-    std  %r31, 144(%r1)  # save R31
-    std  %r3,  152(%r1)  # save hidden
-
-    # save CR
-    mfcr  %r0
-    std   %r0, 160(%r1)
-    # save LR
-    mflr  %r0
-    std   %r0, 168(%r1)
-    # save LR as PC
-    std   %r0, 176(%r1)
-
-    # store RSP (pointing to context-data) in R7
-    mr  %r7, %r1
-
-    # restore RSP (pointing to context-data) from R4
-    mr  %r1, %r4
-
-#if _CALL_ELF != 2
-    ld  %r2,  0(%r1)  # restore TOC
-#endif
-    ld  %r14, 8(%r1)  # restore R14
-    ld  %r15, 16(%r1)  # restore R15
-    ld  %r16, 24(%r1)  # restore R16
-    ld  %r17, 32(%r1)  # restore R17
-    ld  %r18, 40(%r1)  # restore R18
-    ld  %r19, 48(%r1)  # restore R19
-    ld  %r20, 56(%r1)  # restore R20
-    ld  %r21, 64(%r1)  # restore R21
-    ld  %r22, 72(%r1)  # restore R22
-    ld  %r23, 80(%r1)  # restore R23
-    ld  %r24, 88(%r1)  # restore R24
-    ld  %r25, 96(%r1)  # restore R25
-    ld  %r26, 104(%r1)  # restore R26
-    ld  %r27, 112(%r1)  # restore R27
-    ld  %r28, 120(%r1)  # restore R28
-    ld  %r29, 128(%r1)  # restore R29
-    ld  %r30, 136(%r1)  # restore R30
-    ld  %r31, 144(%r1)  # restore R31
-    ld  %r4,  152(%r1)  # restore hidden
-
-    # restore CR
-    ld  %r0, 160(%r1)
-    mtcr  %r0
-    # restore LR
-    ld  %r0, 168(%r1)
-    mtlr  %r0
-    # ignore PC
-
-    # adjust stack
-    addi  %r1, %r1, 184
-
-    # return transfer_t
-    std  %r7, 0(%r4)
-    std  %r5, 8(%r4)
-
-    # restore CTR
-    mtctr  %r6
-
-    # jump to context
-    bctr
-#if _CALL_ELF == 2
-	.size ontop_fcontext, .-ontop_fcontext
-#else
-# ifdef _CALL_LINUX
-	.size .ontop_fcontext, .-.L.ontop_fcontext
-# else
-	.size .ontop_fcontext, .-.ontop_fcontext
-# endif
-#endif
-
-
-/* Mark that we don't need executable stack.  */
-.section .note.GNU-stack,"",%progbits
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    TOC    |    R14    |    R15    |    R16    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    R17    |    R18    |     R19   |    R20    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |    R21    |    R22    |    R23    |    R24    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |    R25    |    R26    |    R27    |    R28    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
+ *  -------------------------------------------------  *
+ *  |    R29    |    R30    |    R31    |   hidden  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
+ *  -------------------------------------------------  *
+ *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
+ *  -------------------------------------------------  *
+ *  |     CR    |     LR    |     PC    | back-chain|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
+ *  -------------------------------------------------  *
+ *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
+ *  -------------------------------------------------  *
+ *  |  cr saved |  lr saved |  compiler |   linker  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
+ *  -------------------------------------------------  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
+ *  -------------------------------------------------  *
+ *  | TOC saved |    FCTX   |    DATA   |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.globl ontop_fcontext
+#if _CALL_ELF == 2
+	.text
+	.align 2
+ontop_fcontext:
+        addis   %r2, %r12, .TOC.-ontop_fcontext@ha
+        addi    %r2, %r2, .TOC.-ontop_fcontext@l
+        .localentry ontop_fcontext, . - ontop_fcontext
+#else
+	.section ".opd","aw"
+	.align 3
+ontop_fcontext:
+# ifdef _CALL_LINUX
+        .quad   .L.ontop_fcontext,.TOC.@tocbase,0
+        .type   ontop_fcontext,@function
+        .text
+        .align 2
+.L.ontop_fcontext:
+# else
+        .hidden .ontop_fcontext
+        .globl  .ontop_fcontext
+        .quad   .ontop_fcontext,.TOC.@tocbase,0
+        .size   ontop_fcontext,24
+        .type   .ontop_fcontext,@function
+        .text
+        .align 2
+.ontop_fcontext:
+# endif
+#endif
+    # reserve space on stack
+    subi  %r1, %r1, 184
+
+#if _CALL_ELF != 2
+    std  %r2,  0(%r1)  # save TOC
+#endif
+    std  %r14, 8(%r1)  # save R14
+    std  %r15, 16(%r1)  # save R15
+    std  %r16, 24(%r1)  # save R16
+    std  %r17, 32(%r1)  # save R17
+    std  %r18, 40(%r1)  # save R18
+    std  %r19, 48(%r1)  # save R19
+    std  %r20, 56(%r1)  # save R20
+    std  %r21, 64(%r1)  # save R21
+    std  %r22, 72(%r1)  # save R22
+    std  %r23, 80(%r1)  # save R23
+    std  %r24, 88(%r1)  # save R24
+    std  %r25, 96(%r1)  # save R25
+    std  %r26, 104(%r1)  # save R26
+    std  %r27, 112(%r1)  # save R27
+    std  %r28, 120(%r1)  # save R28
+    std  %r29, 128(%r1)  # save R29
+    std  %r30, 136(%r1)  # save R30
+    std  %r31, 144(%r1)  # save R31
+#if _CALL_ELF != 2
+    std  %r3,  152(%r1)  # save hidden
+#endif
+
+    # save CR
+    mfcr  %r0
+    std   %r0, 160(%r1)
+    # save LR
+    mflr  %r0
+    std   %r0, 168(%r1)
+    # save LR as PC
+    std   %r0, 176(%r1)
+
+    # store RSP (pointing to context-data) in R7
+    mr  %r7, %r1
+
+#if _CALL_ELF == 2
+    # restore RSP (pointing to context-data) from R3
+    mr  %r1, %r3
+#else
+    # restore RSP (pointing to context-data) from R4
+    mr  %r1, %r4
+#endif
+
+    ld  %r14, 8(%r1)  # restore R14
+    ld  %r15, 16(%r1)  # restore R15
+    ld  %r16, 24(%r1)  # restore R16
+    ld  %r17, 32(%r1)  # restore R17
+    ld  %r18, 40(%r1)  # restore R18
+    ld  %r19, 48(%r1)  # restore R19
+    ld  %r20, 56(%r1)  # restore R20
+    ld  %r21, 64(%r1)  # restore R21
+    ld  %r22, 72(%r1)  # restore R22
+    ld  %r23, 80(%r1)  # restore R23
+    ld  %r24, 88(%r1)  # restore R24
+    ld  %r25, 96(%r1)  # restore R25
+    ld  %r26, 104(%r1)  # restore R26
+    ld  %r27, 112(%r1)  # restore R27
+    ld  %r28, 120(%r1)  # restore R28
+    ld  %r29, 128(%r1)  # restore R29
+    ld  %r30, 136(%r1)  # restore R30
+    ld  %r31, 144(%r1)  # restore R31
+#if _CALL_ELF != 2
+    ld  %r3,  152(%r1)  # restore hidden
+#endif
+
+    # restore CR
+    ld  %r0, 160(%r1)
+    mtcr  %r0
+
+#if _CALL_ELF == 2
+    # restore CTR
+    mtctr  %r5
+
+    # copy transfer_t into ontop_fn arg registers
+    mr  %r3, %r7
+    # arg pointer already in %r4
+#else
+    # copy transfer_t into ontop_fn arg registers
+    mr  %r4, %r7
+    # arg pointer already in %r5
+    # hidden arg already in %r3
+
+    # restore CTR
+    ld   %r7, 0(%r6)
+    mtctr  %r7
+    # restore TOC
+    ld   %r2, 8(%r6)
+
+    # zero in r3 indicates first jump to context-function
+    cmpdi  %r3, 0
+    beq  use_entry_arg
+#endif
+
+return_to_ctx:
+    # restore LR
+    ld  %r0, 168(%r1)
+    mtlr  %r0
+
+    # adjust stack
+    addi  %r1, %r1, 184
+
+    # jump to context
+    bctr
+
+#if _CALL_ELF == 2
+	.size ontop_fcontext, .-ontop_fcontext
+#else
+use_entry_arg:
+    # compute return-value struct address
+    # (passed has hidden arg to ontop_fn)
+    addi  %r3, %r1, 8
+
+    # jump to context and update LR
+    bctrl
+
+    # restore CTR
+    ld   %r7, 176(%r1)
+    mtctr  %r7
+#if _CALL_ELF != 2
+    # restore TOC
+    ld   %r2, 0(%r1)
+#endif
+
+    # copy returned transfer_t into entry_fn arg registers
+    ld  %r3, 8(%r1)
+    ld  %r4, 16(%r1)
+
+    b  return_to_ctx
+# ifdef _CALL_LINUX
+	.size .ontop_fcontext, .-.L.ontop_fcontext
+# else
+	.size .ontop_fcontext, .-.ontop_fcontext
+# endif
+#endif
+
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 151 - 151
modules/std/fiber/native/asm/ontop_ppc64_sysv_macho_gas.S

@@ -1,151 +1,151 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/*******************************************************
- *                                                     *
- *  -------------------------------------------------  *
- *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
- *  -------------------------------------------------  *
- *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
- *  -------------------------------------------------  *
- *  |    TOC    |    R14    |    R15    |    R16    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
- *  -------------------------------------------------  *
- *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
- *  -------------------------------------------------  *
- *  |    R17    |    R18    |     R19   |    R20    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
- *  -------------------------------------------------  *
- *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
- *  -------------------------------------------------  *
- *  |    R21    |    R22    |    R23    |    R24    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
- *  -------------------------------------------------  *
- *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
- *  -------------------------------------------------  *
- *  |    R25    |    R26    |    R27    |    R28    |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
- *  -------------------------------------------------  *
- *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
- *  -------------------------------------------------  *
- *  |    R29    |    R30    |    R31    |   hidden  |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
- *  -------------------------------------------------  *
- *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
- *  -------------------------------------------------  *
- *  |     CR    |     LR    |     PC    | back-chain|  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
- *  -------------------------------------------------  *
- *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
- *  -------------------------------------------------  *
- *  |  cr saved |  lr saved |  compiler |   linker  |  *
- *  -------------------------------------------------  *
- *  -------------------------------------------------  *
- *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
- *  -------------------------------------------------  *
- *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
- *  -------------------------------------------------  *
- *  | TOC saved |    FCTX   |    DATA   |           |  *
- *  -------------------------------------------------  *
- *                                                     *
- *******************************************************/
-
-.text
-.align 2
-.globl ontop_fcontext
-
-_ontop_fcontext:
-    ; reserve space on stack
-    subi  r1, r1, 184
-
-    std  %r14, 8(%r1)  ; save R14
-    std  %r15, 16(%r1)  ; save R15
-    std  %r16, 24(%r1)  ; save R16
-    std  %r17, 32(%r1)  ; save R17
-    std  %r18, 40(%r1)  ; save R18
-    std  %r19, 48(%r1)  ; save R19
-    std  %r20, 56(%r1)  ; save R20
-    std  %r21, 64(%r1)  ; save R21
-    std  %r22, 72(%r1)  ; save R22
-    std  %r23, 80(%r1)  ; save R23
-    std  %r24, 88(%r1)  ; save R24
-    std  %r25, 96(%r1)  ; save R25
-    std  %r26, 104(%r1)  ; save R26
-    std  %r27, 112(%r1)  ; save R27
-    std  %r29, 120(%r1)  ; save R28
-    std  %r29, 128(%r1)  ; save R29
-    std  %r30, 136(%r1)  ; save R30
-    std  %r31, 144(%r1)  ; save R31
-    std  %r3,  152(%r1)  ; save hidden
-
-    ; save CR
-    mfcr  r0
-    std  r0, 160(r1)
-    ; save LR
-    mflr  r0
-    std  r0, 168(r1)
-    ; save LR as PC
-    std  r0, 176(r1)
-
-    ; store RSP (pointing to context-data) in R7
-    mr  %r7, %r1
-
-    ; restore RSP (pointing to context-data) from R4
-    mr  r1, r4
-
-    ld  %r14, 8(%r1)  ; restore R14
-    ld  %r15, 16(%r1)  ; restore R15
-    ld  %r16, 24(%r1)  ; restore R16
-    ld  %r17, 32(%r1)  ; restore R17
-    ld  %r18, 40(%r1)  ; restore R18
-    ld  %r19, 48(%r1)  ; restore R19
-    ld  %r20, 56(%r1)  ; restore R20
-    ld  %r21, 64(%r1)  ; restore R21
-    ld  %r22, 72(%r1)  ; restore R22
-    ld  %r23, 80(%r1)  ; restore R23
-    ld  %r24, 88(%r1)  ; restore R24
-    ld  %r25, 96(%r1)  ; restore R25
-    ld  %r26, 104(%r1)  ; restore R26
-    ld  %r27, 112(%r1)  ; restore R27
-    ld  %r28, 120(%r1)  ; restore R28
-    ld  %r29, 128(%r1)  ; restore R29
-    ld  %r30, 136(%r1)  ; restore R30
-    ld  %r31, 144(%r1)  ; restore R31
-    ld  %r4,  152(%r1)  ; restore hidden
-
-    ; restore CR
-    ld  r0, 160(r1)
-    mtcr  r0
-    ; restore LR
-    ld  r0, 168(r1)
-    mtlr  r0
-    ; ignore PC
-
-    ; adjust stack
-    addi  r1, r1, 184
-
-    ; return transfer_t
-    std  %r7, 0(%r4)
-    std  %r5, 8(%r4)
-
-    ; restore CTR
-    mtctr  r6
-
-    ; jump to context
-    bctr
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/*******************************************************
+ *                                                     *
+ *  -------------------------------------------------  *
+ *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  *
+ *  -------------------------------------------------  *
+ *  |  0  |  4  |  8  |  12 |  16 |  20 |  24 |  28 |  *
+ *  -------------------------------------------------  *
+ *  |    TOC    |    R14    |    R15    |    R16    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  8  |  9  |  10 |  11 |  12 |  13 |  14 |  15 |  *
+ *  -------------------------------------------------  *
+ *  |  32 |  36 |  40 |  44 |  48 |  52 |  56 |  60 |  *
+ *  -------------------------------------------------  *
+ *  |    R17    |    R18    |     R19   |    R20    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  *
+ *  -------------------------------------------------  *
+ *  |  64 |  68 |  72 |  76 |  80 |  84 |  88 |  92 |  *
+ *  -------------------------------------------------  *
+ *  |    R21    |    R22    |    R23    |    R24    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  *
+ *  -------------------------------------------------  *
+ *  |  96 | 100 | 104 | 108 | 112 | 116 | 120 | 124 |  *
+ *  -------------------------------------------------  *
+ *  |    R25    |    R26    |    R27    |    R28    |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
+ *  -------------------------------------------------  *
+ *  | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
+ *  -------------------------------------------------  *
+ *  |    R29    |    R30    |    R31    |   hidden  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  *
+ *  -------------------------------------------------  *
+ *  | 160 | 164 | 168 | 172 | 176 | 180 | 184 | 188 |  *
+ *  -------------------------------------------------  *
+ *  |     CR    |     LR    |     PC    | back-chain|  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
+ *  -------------------------------------------------  *
+ *  | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
+ *  -------------------------------------------------  *
+ *  |  cr saved |  lr saved |  compiler |   linker  |  *
+ *  -------------------------------------------------  *
+ *  -------------------------------------------------  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  *
+ *  -------------------------------------------------  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |  *
+ *  -------------------------------------------------  *
+ *  | TOC saved |    FCTX   |    DATA   |           |  *
+ *  -------------------------------------------------  *
+ *                                                     *
+ *******************************************************/
+
+.text
+.align 2
+.globl _ontop_fcontext
+
+_ontop_fcontext:
+    ; reserve space on stack
+    subi  r1, r1, 184
+
+    std  r14, 8(r1)  ; save R14
+    std  r15, 16(r1)  ; save R15
+    std  r16, 24(r1)  ; save R16
+    std  r17, 32(r1)  ; save R17
+    std  r18, 40(r1)  ; save R18
+    std  r19, 48(r1)  ; save R19
+    std  r20, 56(r1)  ; save R20
+    std  r21, 64(r1)  ; save R21
+    std  r22, 72(r1)  ; save R22
+    std  r23, 80(r1)  ; save R23
+    std  r24, 88(r1)  ; save R24
+    std  r25, 96(r1)  ; save R25
+    std  r26, 104(r1)  ; save R26
+    std  r27, 112(r1)  ; save R27
+    std  r28, 120(r1)  ; save R28
+    std  r29, 128(r1)  ; save R29
+    std  r30, 136(r1)  ; save R30
+    std  r31, 144(r1)  ; save R31
+    std  r3,  152(r1)  ; save hidden
+
+    ; save CR
+    mfcr  r0
+    std   r0, 160(r1)
+    ; save LR
+    mflr  r0
+    std   r0, 168(r1)
+    ; save LR as PC
+    std   r0, 176(r1)
+
+    ; store RSP (pointing to context-data) in R7
+    mr  r7, r1
+
+    ; restore RSP (pointing to context-data) from R4
+    mr  r1, r4
+
+    ld  r14, 8(r1)  ; restore R14
+    ld  r15, 16(r1)  ; restore R15
+    ld  r16, 24(r1)  ; restore R16
+    ld  r17, 32(r1)  ; restore R17
+    ld  r18, 40(r1)  ; restore R18
+    ld  r19, 48(r1)  ; restore R19
+    ld  r20, 56(r1)  ; restore R20
+    ld  r21, 64(r1)  ; restore R21
+    ld  r22, 72(r1)  ; restore R22
+    ld  r23, 80(r1)  ; restore R23
+    ld  r24, 88(r1)  ; restore R24
+    ld  r25, 96(r1)  ; restore R25
+    ld  r26, 104(r1)  ; restore R26
+    ld  r27, 112(r1)  ; restore R27
+    ld  r28, 120(r1)  ; restore R28
+    ld  r29, 128(r1)  ; restore R29
+    ld  r30, 136(r1)  ; restore R30
+    ld  r31, 144(r1)  ; restore R31
+    ld  r4,  152(r1)  ; restore hidden
+
+    ; restore CR
+    ld  r0, 160(r1)
+    mtcr  r0
+    ; restore LR
+    ld  r0, 168(r1)
+    mtlr  r0
+    ; ignore PC
+
+    ; adjust stack
+    addi  r1, r1, 184
+
+    ; return transfer_t
+    std  r7, 0(r4)
+    std  r5, 8(r4)
+
+    ; restore CTR
+    mtctr  r6
+
+    ; jump to context
+    bctr

+ 83 - 83
modules/std/fiber/native/asm/ontop_ppc64_sysv_xcoff_gas.S

@@ -1,83 +1,83 @@
-.align 2
-.globl .jump_fcontext
-.jump_fcontext:
-    # reserve space on stack
-    subi  1, 1, 184
-
-    std  13, 0(1)  # save R13
-    std  14, 8(1)  # save R14
-    std  15, 16(1)  # save R15
-    std  16, 24(1)  # save R16
-    std  17, 32(1)  # save R17
-    std  18, 40(1)  # save R18
-    std  19, 48(1)  # save R19
-    std  20, 56(1)  # save R20
-    std  21, 64(1)  # save R21
-    std  22, 72(1)  # save R22
-    std  23, 80(1)  # save R23
-    std  24, 88(1)  # save R24
-    std  25, 96(1)  # save R25
-    std  26, 104(1)  # save R26
-    std  27, 112(1)  # save R27
-    std  29, 120(1)  # save R28
-    std  29, 128(1)  # save R29
-    std  30, 136(1)  # save R30
-    std  31, 144(1)  # save R31
-    std  3,  152(1)  # save hidden
-
-    # save CR
-    mfcr  0
-    std  0, 160(1)
-    # save LR
-    mflr  0
-    std  0, 168(1)
-    # save LR as PC
-    std  0, 176(1)
-
-    # store RSP (pointing to context-data) in R7
-    mr  7, 1
-
-    # restore RSP (pointing to context-data) from R4
-    mr  1, 4
-
-    ld  13, 0(1)  # restore R13
-    ld  14, 8(1)  # restore R14
-    ld  15, 16(1)  # restore R15
-    ld  16, 24(1)  # restore R16
-    ld  17, 32(1)  # restore R17
-    ld  18, 40(1)  # restore R18
-    ld  19, 48(1)  # restore R19
-    ld  20, 56(1)  # restore R20
-    ld  21, 64(1)  # restore R21
-    ld  22, 72(1)  # restore R22
-    ld  23, 80(1)  # restore R23
-    ld  24, 88(1)  # restore R24
-    ld  25, 96(1)  # restore R25
-    ld  26, 104(1)  # restore R26
-    ld  27, 112(1)  # restore R27
-    ld  28, 120(1)  # restore R28
-    ld  29, 128(1)  # restore R29
-    ld  30, 136(1)  # restore R30
-    ld  31, 144(1)  # restore R31
-    ld  4,  152(1)  # restore hidden
-
-    # restore CR
-    ld  0, 160(1)
-    mtcr  0
-    # restore LR
-    ld  0, 168(1)
-    mtlr  0
-    # ignore PC
-
-    # adjust stack
-    addi  1, 1, 184
-
-    # return transfer_t
-    std  7, 0(4)
-    std  5, 8(4)
-
-    # restore CTR
-    mtctr  6
-
-    # jump to context
-    bctr
+.align 2
+.globl .ontop_fcontext
+.ontop_fcontext:
+    # reserve space on stack
+    subi  1, 1, 184
+
+    std  13, 0(1)  # save R13
+    std  14, 8(1)  # save R14
+    std  15, 16(1)  # save R15
+    std  16, 24(1)  # save R16
+    std  17, 32(1)  # save R17
+    std  18, 40(1)  # save R18
+    std  19, 48(1)  # save R19
+    std  20, 56(1)  # save R20
+    std  21, 64(1)  # save R21
+    std  22, 72(1)  # save R22
+    std  23, 80(1)  # save R23
+    std  24, 88(1)  # save R24
+    std  25, 96(1)  # save R25
+    std  26, 104(1)  # save R26
+    std  27, 112(1)  # save R27
+    std  29, 120(1)  # save R28
+    std  29, 128(1)  # save R29
+    std  30, 136(1)  # save R30
+    std  31, 144(1)  # save R31
+    std  3,  152(1)  # save hidden
+
+    # save CR
+    mfcr  0
+    std  0, 160(1)
+    # save LR
+    mflr  0
+    std  0, 168(1)
+    # save LR as PC
+    std  0, 176(1)
+
+    # store RSP (pointing to context-data) in R7
+    mr  7, 1
+
+    # restore RSP (pointing to context-data) from R4
+    mr  1, 4
+
+    ld  13, 0(1)  # restore R13
+    ld  14, 8(1)  # restore R14
+    ld  15, 16(1)  # restore R15
+    ld  16, 24(1)  # restore R16
+    ld  17, 32(1)  # restore R17
+    ld  18, 40(1)  # restore R18
+    ld  19, 48(1)  # restore R19
+    ld  20, 56(1)  # restore R20
+    ld  21, 64(1)  # restore R21
+    ld  22, 72(1)  # restore R22
+    ld  23, 80(1)  # restore R23
+    ld  24, 88(1)  # restore R24
+    ld  25, 96(1)  # restore R25
+    ld  26, 104(1)  # restore R26
+    ld  27, 112(1)  # restore R27
+    ld  28, 120(1)  # restore R28
+    ld  29, 128(1)  # restore R29
+    ld  30, 136(1)  # restore R30
+    ld  31, 144(1)  # restore R31
+    ld  4,  152(1)  # restore hidden
+
+    # restore CR
+    ld  0, 160(1)
+    mtcr  0
+    # restore LR
+    ld  0, 168(1)
+    mtlr  0
+    # ignore PC
+
+    # adjust stack
+    addi  1, 1, 184
+
+    # return transfer_t
+    std  7, 0(4)
+    std  5, 8(4)
+
+    # restore CTR
+    mtctr  6
+
+    # jump to context
+    bctr

+ 211 - 142
modules/std/fiber/native/asm/ontop_x86_64_ms_pe_gas.asm

@@ -1,142 +1,211 @@
-/*
-            Copyright Oliver Kowalke 2009.
-            Copyright Thomas Sailer 2013.
-   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)
-*/
-
-/**************************************************************************************
- *                                                                                    *
- * ---------------------------------------------------------------------------------- *
- * |     0   |     1   |     2    |     3   |     4   |     5   |     6   |     7   | *
- * ---------------------------------------------------------------------------------- *
- * |    0x0  |    0x4  |    0x8   |    0xc  |   0x10  |   0x14  |   0x18  |   0x1c  | *
- * ---------------------------------------------------------------------------------- *
- * |      fbr_strg     |      fc_dealloc    |       limit       |        base       | *
- * ---------------------------------------------------------------------------------- *
- * ---------------------------------------------------------------------------------- *
- * |     8   |    9    |    10    |    11   |    12   |    13   |    14   |    15   | *
- * ---------------------------------------------------------------------------------- *
- * |   0x20  |  0x24   |   0x28   |   0x2c  |   0x30  |   0x34  |   0x38  |   0x3c  | *
- * ---------------------------------------------------------------------------------- *
- * |        R12        |         R13        |        R14        |        R15        | *
- * ---------------------------------------------------------------------------------- *
- * ---------------------------------------------------------------------------------- *
- * |    16   |    17   |    18   |    19    |    20   |    21   |    22   |    23   | *
- * ---------------------------------------------------------------------------------- *
- * |   0xe40  |   0x44 |   0x48  |   0x4c   |   0x50  |   0x54  |   0x58  |   0x5c  | *
- * ---------------------------------------------------------------------------------- *
- * |        RDI         |       RSI         |        RBX        |        RBP        | *
- * ---------------------------------------------------------------------------------- *
- * ---------------------------------------------------------------------------------- *
- * |    24   |   25    |    26    |   27    |    28   |    29   |    30   |    31   | *
- * ---------------------------------------------------------------------------------- *
- * |   0x60  |   0x64  |   0x68   |   0x6c  |   0x70  |   0x74  |   0x78  |   0x7c  | *
- * ---------------------------------------------------------------------------------- *
- * |        hidden     |         RIP        |        EXIT       |   parameter area  | *
- * ---------------------------------------------------------------------------------- *
- * ---------------------------------------------------------------------------------- *
- * |    32   |   32    |    33    |   34    |    35   |    36   |    37   |    38   | *
- * ---------------------------------------------------------------------------------- *
- * |   0x80  |   0x84  |   0x88   |   0x8c  |   0x90  |   0x94  |   0x98  |   0x9c  | *
- * ---------------------------------------------------------------------------------- *
- * |                       parameter area                       |        FCTX       | *
- * ---------------------------------------------------------------------------------- *
- * ---------------------------------------------------------------------------------- *
- * |    39   |   40    |    41    |   42    |    43   |    44   |    45   |    46   | *
- * ---------------------------------------------------------------------------------- *
- * |   0xa0  |   0xa4  |   0xa8   |   0xac  |   0xb0  |   0xb4  |   0xb8  |   0xbc  | *
- * ---------------------------------------------------------------------------------- *
- * |       DATA        |                    |                   |                   | *
- * ---------------------------------------------------------------------------------- *
- *                                                                                    *
- * ***********************************************************************************/
-
-.file	"ontop_x86_64_ms_pe_gas.asm"
-.text
-.p2align 4,,15
-.globl	ontop_fcontext
-.def	ontop_fcontext;	.scl	2;	.type	32;	.endef
-.seh_proc	ontop_fcontext
-ontop_fcontext:
-.seh_endprologue
-
-    pushq  %rcx  /* save hidden address of transport_t */
-
-    pushq  %rbp  /* save RBP */
-    pushq  %rbx  /* save RBX */
-    pushq  %rsi  /* save RSI */
-    pushq  %rdi  /* save RDI */
-    pushq  %r15  /* save R15 */
-    pushq  %r14  /* save R14 */
-    pushq  %r13  /* save R13 */
-    pushq  %r12  /* save R12 */
-
-    /* load NT_TIB */
-    movq  %gs:(0x30), %r10
-    /* save current stack base */
-    movq  0x08(%r10), %rax
-    pushq  %rax
-    /* save current stack limit */
-    movq  0x10(%r10), %rax
-    pushq  %rax
-    /* save current deallocation stack */
-    movq  0x1478(%r10), %rax
-    pushq  %rax
-    /* save fiber local storage */
-    movq  0x18(%r10), %rax
-    pushq  %rax
-
-    /* preserve RSP (pointing to context-data) in RCX */
-    movq  %rsp, %rcx
-
-    /* restore RSP (pointing to context-data) from RDX */
-    movq  %rdx, %rsp
-
-    /* load NT_TIB */
-    movq  %gs:(0x30), %r10
-    /* restore fiber local storage */
-    popq  %rax
-    movq  %rax, 0x18(%r10)
-    /* restore deallocation stack */
-    popq  %rax
-    movq  %rax, 0x1478(%r10)
-    /* restore stack limit */
-    popq  %rax
-    movq  %rax, 0x10(%r10)
-    /* restore stack base */
-    popq  %rax
-    movq  %rax, 0x8(%r10)
-
-    popq  %r12  /* restore R12 */
-    popq  %r13  /* restore R13 */
-    popq  %r14  /* restore R14 */
-    popq  %r15  /* restore R15 */
-    popq  %rdi  /* restore RDI */
-    popq  %rsi  /* restore RSI */
-    popq  %rbx  /* restore RBX */
-    popq  %rbp  /* restore RBP */
-
-    popq  %rax  /* restore hidden address of transport_t */
-
-    /* keep return-address on stack */
-
-    /* transport_t returned in RAX */
-    /* return parent fcontext_t */
-    movq  %rcx, (%rax)
-    /* return data */
-    movq  %r8, 0x8(%rax)
-
-    /* transport_t as 1.arg of context-function */
-    /* RCX contains address of returned (hidden) transfer_t */
-    movq  %rax, %rcx
-    /* RDX contains address of passed transfer_t */
-    movq  %rax, %rdx
-
-    /* indirect jump to context */
-    jmp  *%r9
-.seh_endproc
-
-.section .drectve
-.ascii " -export:\"ontop_fcontext\""
+/*
+            Copyright Oliver Kowalke 2009.
+            Copyright Thomas Sailer 2013.
+   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)
+*/
+
+/*************************************************************************************
+* ---------------------------------------------------------------------------------- *
+* |     0   |     1   |     2    |     3   |     4   |     5   |     6   |     7   | *
+* ---------------------------------------------------------------------------------- *
+* |    0x0  |    0x4  |    0x8   |    0xc  |   0x10  |   0x14  |   0x18  |   0x1c  | *
+* ---------------------------------------------------------------------------------- *
+* |                          SEE registers (XMM6-XMM15)                            | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |     8   |    9    |    10    |    11   |    12   |    13   |    14   |    15   | *
+* ---------------------------------------------------------------------------------- *
+* |   0x20  |  0x24   |   0x28   |   0x2c  |   0x30  |   0x34  |   0x38  |   0x3c  | *
+* ---------------------------------------------------------------------------------- *
+* |                          SEE registers (XMM6-XMM15)                            | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    16   |    17   |    18   |    19    |    20   |    21   |    22   |    23   | *
+* ---------------------------------------------------------------------------------- *
+* |   0xe40  |   0x44 |   0x48  |   0x4c   |   0x50  |   0x54  |   0x58  |   0x5c  | *
+* ---------------------------------------------------------------------------------- *
+* |                          SEE registers (XMM6-XMM15)                            | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    24   |   25    |    26    |   27    |    28   |    29   |    30   |    31   | *
+* ---------------------------------------------------------------------------------- *
+* |   0x60  |   0x64  |   0x68   |   0x6c  |   0x70  |   0x74  |   0x78  |   0x7c  | *
+* ---------------------------------------------------------------------------------- *
+* |                          SEE registers (XMM6-XMM15)                            | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    32   |   32    |    33    |   34    |    35   |    36   |    37   |    38   | *
+* ---------------------------------------------------------------------------------- *
+* |   0x80  |   0x84  |   0x88   |   0x8c  |   0x90  |   0x94  |   0x98  |   0x9c  | *
+* ---------------------------------------------------------------------------------- *
+* |                          SEE registers (XMM6-XMM15)                            | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    39   |   40    |    41    |   42    |    43   |    44   |    45   |    46   | *
+* ---------------------------------------------------------------------------------- *
+* |   0xa0  |   0xa4  |   0xa8   |   0xac  |   0xb0  |   0xb4  |   0xb8  |   0xbc  | *
+* ---------------------------------------------------------------------------------- *
+* | fc_mxcsr|fc_x87_cw|     <alignment>    |       fbr_strg    |      fc_dealloc   | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    47   |   48    |    49    |   50    |    51   |    52   |    53   |    54   | *
+* ---------------------------------------------------------------------------------- *
+* |   0xc0  |   0xc4  |   0xc8   |   0xcc  |   0xd0  |   0xd4  |   0xd8  |   0xdc  | *
+* ---------------------------------------------------------------------------------- *
+* |        limit      |         base       |         R12       |         R13       | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    55   |   56    |    57    |   58    |    59   |    60   |    61   |    62   | *
+* ---------------------------------------------------------------------------------- *
+* |   0xe0  |   0xe4  |   0xe8   |   0xec  |   0xf0  |   0xf4  |   0xf8  |   0xfc  | *
+* ---------------------------------------------------------------------------------- *
+* |        R14        |         R15        |         RDI       |        RSI        | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    63   |   64    |    65    |   66    |    67   |    68   |    69   |    70   | *
+* ---------------------------------------------------------------------------------- *
+* |  0x100  |  0x104  |  0x108   |  0x10c  |  0x110  |  0x114  |  0x118  |  0x11c  | *
+* ---------------------------------------------------------------------------------- *
+* |        RBX        |         RBP        |       hidden      |        RIP        | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    71   |   72    |    73    |   74    |    75   |    76   |    77   |    78   | *
+* ---------------------------------------------------------------------------------- *
+* |  0x120  |  0x124  |  0x128   |  0x12c  |  0x130  |  0x134  |  0x138  |  0x13c  | *
+* ---------------------------------------------------------------------------------- *
+* |                                   parameter area                               | *
+* ---------------------------------------------------------------------------------- *
+* ---------------------------------------------------------------------------------- *
+* |    79   |   80    |    81    |   82    |    83   |    84   |    85   |    86   | *
+* ---------------------------------------------------------------------------------- *
+* |  0x140  |  0x144  |  0x148   |  0x14c  |  0x150  |  0x154  |  0x158  |  0x15c  | *
+* ---------------------------------------------------------------------------------- *
+* |       FCTX        |        DATA        |                                       | *
+* ---------------------------------------------------------------------------------- *
+**************************************************************************************/
+
+.file	"ontop_x86_64_ms_pe_gas.asm"
+.text
+.p2align 4,,15
+.globl	ontop_fcontext
+.def	ontop_fcontext;	.scl	2;	.type	32;	.endef
+.seh_proc	ontop_fcontext
+ontop_fcontext:
+.seh_endprologue
+
+    leaq  -0x118(%rsp), %rsp /* prepare stack */
+
+#if !defined(BOOST_USE_TSX)
+    /* save XMM storage */
+    movaps  %xmm6, 0x0(%rsp)
+    movaps  %xmm7, 0x10(%rsp)
+    movaps  %xmm8, 0x20(%rsp)
+    movaps  %xmm9, 0x30(%rsp)
+    movaps  %xmm10, 0x40(%rsp)
+    movaps  %xmm11, 0x50(%rsp)
+    movaps  %xmm12, 0x60(%rsp)
+    movaps  %xmm13, 0x70(%rsp)
+    movaps  %xmm14, 0x80(%rsp)
+    movaps  %xmm15, 0x90(%rsp)
+    stmxcsr  0xa0(%rsp)  /* save MMX control- and status-word */
+    fnstcw   0xa4(%rsp)  /* save x87 control-word */
+#endif
+
+    /* load NT_TIB */
+    movq  %gs:(0x30), %r10
+    /* save fiber local storage */
+    movq  0x20(%r10), %rax
+    movq  %rax, 0xb0(%rsp)
+    /* save current deallocation stack */
+    movq  0x1478(%r10), %rax
+    movq  %rax, 0xb8(%rsp)
+    /* save current stack limit */
+    movq  0x10(%r10), %rax
+    movq  %rax, 0xc0(%rsp)
+    /* save current stack base */
+    movq  0x08(%r10), %rax
+    movq  %rax, 0xc8(%rsp)
+
+    movq  %r12, 0xd0(%rsp)  /* save R12 */
+    movq  %r13, 0xd8(%rsp)  /* save R13 */
+    movq  %r14, 0xe0(%rsp)  /* save R14 */
+    movq  %r15, 0xe8(%rsp)  /* save R15 */
+    movq  %rdi, 0xf0(%rsp)  /* save RDI */
+    movq  %rsi, 0xf8(%rsp)  /* save RSI */
+    movq  %rbx, 0x100(%rsp)  /* save RBX */
+    movq  %rbp, 0x108(%rsp)  /* save RBP */
+
+    movq  %rcx, 0x110(%rsp)  /* save hidden address of transport_t */
+
+    /* preserve RSP (pointing to context-data) in RCX */
+    movq  %rsp, %rcx
+
+    /* restore RSP (pointing to context-data) from RDX */
+    movq  %rdx, %rsp
+
+#if !defined(BOOST_USE_TSX)
+    /* restore XMM storage */
+    movaps  0x0(%rsp), %xmm6
+    movaps  0x10(%rsp), %xmm7
+    movaps  0x20(%rsp), %xmm8
+    movaps  0x30(%rsp), %xmm9
+    movaps  0x40(%rsp), %xmm10
+    movaps  0x50(%rsp), %xmm11
+    movaps  0x60(%rsp), %xmm12
+    movaps  0x70(%rsp), %xmm13
+    movaps  0x80(%rsp), %xmm14
+    movaps  0x90(%rsp), %xmm15
+ 	ldmxcsr 0xa0(%rsp) /* restore MMX control- and status-word */
+ 	fldcw   0xa4(%rsp) /* restore x87 control-word */
+#endif
+
+    /* load NT_TIB */
+    movq  %gs:(0x30), %r10
+    /* restore fiber local storage */
+    movq  0xb0(%rsp), %rax
+    movq  %rax, 0x20(%r10)
+    /* restore current deallocation stack */
+    movq  0xb8(%rsp), %rax
+    movq  %rax, 0x1478(%r10)
+    /* restore current stack limit */
+    movq  0xc0(%rsp), %rax
+    movq  %rax, 0x10(%r10)
+    /* restore current stack base */
+    movq  0xc8(%rsp), %rax
+    movq  %rax, 0x08(%r10)
+
+    movq  0xd0(%rsp),  %r12  /* restore R12 */
+    movq  0xd8(%rsp),  %r13  /* restore R13 */
+    movq  0xe0(%rsp),  %r14  /* restore R14 */
+    movq  0xe8(%rsp),  %r15  /* restore R15 */
+    movq  0xf0(%rsp),  %rdi  /* restore RDI */
+    movq  0xf8(%rsp),  %rsi  /* restore RSI */
+    movq  0x100(%rsp), %rbx  /* restore RBX */
+    movq  0x108(%rsp), %rbp  /* restore RBP */
+
+    movq  0x110(%rsp), %rax  /* restore hidden address of transport_t */
+
+    leaq  0x118(%rsp), %rsp /* prepare stack */
+
+    /* keep return-address on stack */
+
+    /* transport_t returned in RAX */
+    /* return parent fcontext_t */
+    movq  %rcx, 0x0(%rax)
+    /* return data */
+    movq  %r8, 0x8(%rax)
+
+    /* transport_t as 1.arg of context-function */
+    /* RCX contains address of returned (hidden) transfer_t */
+    movq  %rax, %rcx
+    /* RDX contains address of passed transfer_t */
+    movq  %rax, %rdx
+
+    /* indirect jump to context */
+    jmp  *%r9
+.seh_endproc
+
+.section .drectve
+.ascii " -export:\"ontop_fcontext\""

+ 207 - 130
modules/std/fiber/native/asm/ontop_x86_64_ms_pe_masm.asm

@@ -1,130 +1,207 @@
-
-;           Copyright Oliver Kowalke 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)
-
-;  ----------------------------------------------------------------------------------
-;  |     0   |     1   |     2    |     3   |     4   |     5   |     6   |     7   |
-;  ----------------------------------------------------------------------------------
-;  |    0x0  |    0x4  |    0x8   |    0xc  |   0x10  |   0x14  |   0x18  |   0x1c  |
-;  ----------------------------------------------------------------------------------
-;  |      fbr_strg     |      fc_dealloc    |       limit       |        base       |
-;  ----------------------------------------------------------------------------------
-;  ----------------------------------------------------------------------------------
-;  |     8   |    9    |    10    |    11   |    12   |    13   |    14   |    15   |
-;  ----------------------------------------------------------------------------------
-;  |   0x20  |  0x24   |   0x28   |   0x2c  |   0x30  |   0x34  |   0x38  |   0x3c  |
-;  ----------------------------------------------------------------------------------
-;  |        R12        |         R13        |        R14        |        R15        |
-;  ----------------------------------------------------------------------------------
-;  ----------------------------------------------------------------------------------
-;  |    16   |    17   |    18   |    19    |    20   |    21   |    22   |    23   |
-;  ----------------------------------------------------------------------------------
-;  |   0xe40  |   0x44 |   0x48  |   0x4c   |   0x50  |   0x54  |   0x58  |   0x5c  |
-;  ----------------------------------------------------------------------------------
-;  |        RDI         |       RSI         |        RBX        |        RBP        |
-;  ----------------------------------------------------------------------------------
-;  ----------------------------------------------------------------------------------
-;  |    24   |   25    |    26    |   27    |    28   |    29   |    30   |    31   |
-;  ----------------------------------------------------------------------------------
-;  |   0x60  |   0x64  |   0x68   |   0x6c  |   0x70  |   0x74  |   0x78  |   0x7c  |
-;  ----------------------------------------------------------------------------------
-;  |        hidden     |         RIP        |       EXIT        |   parameter area  |
-;  ----------------------------------------------------------------------------------
-;  ----------------------------------------------------------------------------------
-;  |    32   |   32    |    33    |   34    |    35   |    36   |    37   |    38   |
-;  ----------------------------------------------------------------------------------
-;  |   0x80  |   0x84  |   0x88   |   0x8c  |   0x90  |   0x94  |   0x98  |   0x9c  |
-;  ----------------------------------------------------------------------------------
-;  |                       parameter area                       |        FCTX       |
-;  ----------------------------------------------------------------------------------
-;  ----------------------------------------------------------------------------------
-;  |    39   |   40    |    41    |   42    |    43   |    44   |    45   |    46   |
-;  ----------------------------------------------------------------------------------
-;  |   0xa0  |   0xa4  |   0xa8   |   0xac  |   0xb0  |   0xb4  |   0xb8  |   0xbc  |
-;  ----------------------------------------------------------------------------------
-;  |       DATA        |                    |                   |                   |
-;  ----------------------------------------------------------------------------------
-
-.code
-
-ontop_fcontext PROC BOOST_CONTEXT_EXPORT FRAME
-    .endprolog
-
-    push  rcx  ; save hidden address of transport_t
-
-    push  rbp  ; save RBP
-    push  rbx  ; save RBX
-    push  rsi  ; save RSI
-    push  rdi  ; save RDI
-    push  r15  ; save R15
-    push  r14  ; save R14
-    push  r13  ; save R13
-    push  r12  ; save R12
-
-    ; load NT_TIB
-    mov  r10,  gs:[030h]
-    ; save current stack base
-    mov  rax,  [r10+08h]
-    push  rax
-    ; save current stack limit
-    mov  rax, [r10+010h]
-    push  rax
-    ; save current deallocation stack
-    mov  rax, [r10+01478h]
-    push  rax
-    ; save fiber local storage
-    mov  rax, [r10+018h]
-    push  rax
-
-    ; preserve RSP (pointing to context-data) in RCX
-    mov  rcx, rsp
-
-    ; restore RSP (pointing to context-data) from RDX
-    mov  rsp, rdx
-
-    ; load NT_TIB
-    mov  r10, gs:[030h]
-    ; restore fiber local storage
-    pop  rax
-    mov  [r10+018h], rax
-    ; restore deallocation stack
-    pop  rax
-    mov  [r10+01478h], rax
-    ; restore stack limit
-    pop  rax
-    mov  [r10+010h], rax
-    ; restore stack base
-    pop  rax
-    mov  [r10+08h], rax
-
-    pop  r12  ; restore R12
-    pop  r13  ; restore R13
-    pop  r14  ; restore R14
-    pop  r15  ; restore R15
-    pop  rdi  ; restore RDI
-    pop  rsi  ; restore RSI
-    pop  rbx  ; restore RBX
-    pop  rbp  ; restore RBP
-
-    pop  rax  ; restore hidden address of transport_t
-
-    ; keep return-address on stack
-
-    ; transport_t returned in RAX
-    ; return parent fcontext_t
-    mov  [rax], rcx
-    ; return data
-    mov  [rax+08h], r8
-
-    ; transport_t as 1.arg of context-function
-    ; RCX contains address of returned (hidden) transfer_t
-    mov rcx,  rax  
-    ; RDX contains address of passed transfer_t
-    mov rdx,  rax
-
-    ; indirect jump to context
-    jmp  r9
-ontop_fcontext ENDP
-END
+
+;           Copyright Oliver Kowalke 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)
+
+;  ----------------------------------------------------------------------------------
+;  |     0   |     1   |     2    |     3   |     4   |     5   |     6   |     7   |
+;  ----------------------------------------------------------------------------------
+;  |    0x0  |    0x4  |    0x8   |    0xc  |   0x10  |   0x14  |   0x18  |   0x1c  |
+;  ----------------------------------------------------------------------------------
+;  |                          SEE registers (XMM6-XMM15)                            |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |     8   |    9    |    10    |    11   |    12   |    13   |    14   |    15   |
+;  ----------------------------------------------------------------------------------
+;  |   0x20  |  0x24   |   0x28   |   0x2c  |   0x30  |   0x34  |   0x38  |   0x3c  |
+;  ----------------------------------------------------------------------------------
+;  |                          SEE registers (XMM6-XMM15)                            |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    16   |    17   |    18   |    19    |    20   |    21   |    22   |    23   |
+;  ----------------------------------------------------------------------------------
+;  |   0xe40  |   0x44 |   0x48  |   0x4c   |   0x50  |   0x54  |   0x58  |   0x5c  |
+;  ----------------------------------------------------------------------------------
+;  |                          SEE registers (XMM6-XMM15)                            |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    24   |   25    |    26    |   27    |    28   |    29   |    30   |    31   |
+;  ----------------------------------------------------------------------------------
+;  |   0x60  |   0x64  |   0x68   |   0x6c  |   0x70  |   0x74  |   0x78  |   0x7c  |
+;  ----------------------------------------------------------------------------------
+;  |                          SEE registers (XMM6-XMM15)                            |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    32   |   32    |    33    |   34    |    35   |    36   |    37   |    38   |
+;  ----------------------------------------------------------------------------------
+;  |   0x80  |   0x84  |   0x88   |   0x8c  |   0x90  |   0x94  |   0x98  |   0x9c  |
+;  ----------------------------------------------------------------------------------
+;  |                          SEE registers (XMM6-XMM15)                            |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    39   |   40    |    41    |   42    |    43   |    44   |    45   |    46   |
+;  ----------------------------------------------------------------------------------
+;  |   0xa0  |   0xa4  |   0xa8   |   0xac  |   0xb0  |   0xb4  |   0xb8  |   0xbc  |
+;  ----------------------------------------------------------------------------------
+;  | fc_mxcsr|fc_x87_cw|     <alignment>    |       fbr_strg    |      fc_dealloc   |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    47   |   48    |    49    |   50    |    51   |    52   |    53   |    54   |
+;  ----------------------------------------------------------------------------------
+;  |   0xc0  |   0xc4  |   0xc8   |   0xcc  |   0xd0  |   0xd4  |   0xd8  |   0xdc  |
+;  ----------------------------------------------------------------------------------
+;  |        limit      |         base       |         R12       |         R13       |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    55   |   56    |    57    |   58    |    59   |    60   |    61   |    62   |
+;  ----------------------------------------------------------------------------------
+;  |   0xe0  |   0xe4  |   0xe8   |   0xec  |   0xf0  |   0xf4  |   0xf8  |   0xfc  |
+;  ----------------------------------------------------------------------------------
+;  |        R14        |         R15        |         RDI       |        RSI        |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    63   |   64    |    65    |   66    |    67   |    68   |    69   |    70   |
+;  ----------------------------------------------------------------------------------
+;  |  0x100  |  0x104  |  0x108   |  0x10c  |  0x110  |  0x114  |  0x118  |  0x11c  |
+;  ----------------------------------------------------------------------------------
+;  |        RBX        |         RBP        |       hidden      |        RIP        |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    71   |   72    |    73    |   74    |    75   |    76   |    77   |    78   |
+;  ----------------------------------------------------------------------------------
+;  |  0x120  |  0x124  |  0x128   |  0x12c  |  0x130  |  0x134  |  0x138  |  0x13c  |
+;  ----------------------------------------------------------------------------------
+;  |                                   parameter area                               |
+;  ----------------------------------------------------------------------------------
+;  ----------------------------------------------------------------------------------
+;  |    79   |   80    |    81    |   82    |    83   |    84   |    85   |    86   |
+;  ----------------------------------------------------------------------------------
+;  |  0x140  |  0x144  |  0x148   |  0x14c  |  0x150  |  0x154  |  0x158  |  0x15c  |
+;  ----------------------------------------------------------------------------------
+;  |       FCTX        |        DATA        |                                       |
+;  ----------------------------------------------------------------------------------
+
+.code
+
+ontop_fcontext PROC BOOST_CONTEXT_EXPORT FRAME
+    .endprolog
+
+    ; prepare stack
+    lea rsp, [rsp-0118h]
+
+IFNDEF BOOST_USE_TSX
+    ; save XMM storage
+    movaps  [rsp], xmm6
+    movaps  [rsp+010h], xmm7
+    movaps  [rsp+020h], xmm8
+    movaps  [rsp+030h], xmm9
+    movaps  [rsp+040h], xmm10
+    movaps  [rsp+050h], xmm11
+    movaps  [rsp+060h], xmm12
+    movaps  [rsp+070h], xmm13
+    movaps  [rsp+080h], xmm14
+    movaps  [rsp+090h], xmm15
+    ; save MMX control- and status-word
+    stmxcsr  [rsp+0a0h]
+    ; save x87 control-word
+    fnstcw  [rsp+0a4h]
+ENDIF
+
+    ; load NT_TIB
+    mov  r10,  gs:[030h]
+    ; save fiber local storage
+    mov  rax, [r10+020h]
+    mov  [rsp+0b0h], rax
+    ; save current deallocation stack
+    mov  rax, [r10+01478h]
+    mov  [rsp+0b8h], rax
+    ; save current stack limit
+    mov  rax, [r10+010h]
+    mov  [rsp+0c0h], rax
+    ; save current stack base
+    mov  rax,  [r10+08h]
+    mov  [rsp+0c8h], rax
+
+    mov [rsp+0d0h], r12  ; save R12
+    mov [rsp+0d8h], r13  ; save R13
+    mov [rsp+0e0h], r14  ; save R14
+    mov [rsp+0e8h], r15  ; save R15
+    mov [rsp+0f0h], rdi  ; save RDI
+    mov [rsp+0f8h], rsi  ; save RSI
+    mov [rsp+0100h], rbx  ; save RBX
+    mov [rsp+0108h], rbp  ; save RBP
+
+    mov [rsp+0110h], rcx  ; save hidden address of transport_t
+
+    ; preserve RSP (pointing to context-data) in RCX
+    mov  rcx, rsp
+
+    ; restore RSP (pointing to context-data) from RDX
+    mov  rsp, rdx
+
+IFNDEF BOOST_USE_TSX
+    ; restore XMM storage
+    movaps  xmm6, [rsp]
+    movaps  xmm7, [rsp+010h]
+    movaps  xmm8, [rsp+020h]
+    movaps  xmm9, [rsp+030h]
+    movaps  xmm10, [rsp+040h]
+    movaps  xmm11, [rsp+050h]
+    movaps  xmm12, [rsp+060h]
+    movaps  xmm13, [rsp+070h]
+    movaps  xmm14, [rsp+080h]
+    movaps  xmm15, [rsp+090h]
+    ; restore MMX control- and status-word
+    ldmxcsr  [rsp+0a0h]
+    ; save x87 control-word
+    fldcw   [rsp+0a4h]
+ENDIF
+
+    ; load NT_TIB
+    mov  r10,  gs:[030h]
+    ; restore fiber local storage
+    mov  rax, [rsp+0b0h]
+    mov  [r10+020h], rax
+    ; restore current deallocation stack
+    mov  rax, [rsp+0b8h]
+    mov  [r10+01478h], rax
+    ; restore current stack limit
+    mov  rax, [rsp+0c0h]
+    mov  [r10+010h], rax
+    ; restore current stack base
+    mov  rax, [rsp+0c8h]
+    mov  [r10+08h], rax
+
+    mov r12, [rsp+0d0h]  ; restore R12
+    mov r13, [rsp+0d8h]  ; restore R13
+    mov r14, [rsp+0e0h]  ; restore R14
+    mov r15, [rsp+0e8h]  ; restore R15
+    mov rdi, [rsp+0f0h]  ; restore RDI
+    mov rsi, [rsp+0f8h]  ; restore RSI
+    mov rbx, [rsp+0100h]  ; restore RBX
+    mov rbp, [rsp+0108h]  ; restore RBP
+
+    mov rax, [rsp+0110h] ; restore hidden address of transport_t
+
+    ; prepare stack
+    lea rsp, [rsp+0118h]
+
+    ; keep return-address on stack
+
+    ; transport_t returned in RAX
+    ; return parent fcontext_t
+    mov  [rax], rcx
+    ; return data
+    mov  [rax+08h], r8
+
+    ; transport_t as 1.arg of context-function
+    ; RCX contains address of returned (hidden) transfer_t
+    mov rcx,  rax  
+    ; RDX contains address of passed transfer_t
+    mov rdx,  rax
+
+    ; indirect jump to context
+    jmp  r9
+ontop_fcontext ENDP
+END

+ 83 - 69
modules/std/fiber/native/asm/ontop_x86_64_sysv_elf_gas.S

@@ -1,69 +1,83 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/****************************************************************************************
- *                                                                                      *
- *  ----------------------------------------------------------------------------------  *
- *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
- *  ----------------------------------------------------------------------------------  *
- *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
- *  ----------------------------------------------------------------------------------  *
- *  |        R12        |         R13       |         R14        |        R15        |  *
- *  ----------------------------------------------------------------------------------  *
- *  ----------------------------------------------------------------------------------  *
- *  |    8    |    9    |   10    |   11    |    12    |    13   |    14   |    15   |  *
- *  ----------------------------------------------------------------------------------  *
- *  |   0x20  |   0x24  |   0x28  |  0x2c   |   0x30   |   0x34  |   0x38  |   0x3c  |  *
- *  ----------------------------------------------------------------------------------  *
- *  |        RBX        |         RBP       |         RIP        |       EXIT        |  *
- *  ----------------------------------------------------------------------------------  *
- *                                                                                      *
- ****************************************************************************************/
-
-.text
-.globl ontop_fcontext
-.type ontop_fcontext,@function
-.align 16
-ontop_fcontext:
-    pushq  %rbp  /* save RBP */
-    pushq  %rbx  /* save RBX */
-    pushq  %r15  /* save R15 */
-    pushq  %r14  /* save R14 */
-    pushq  %r13  /* save R13 */
-    pushq  %r12  /* save R12 */
-
-    /* store RSP (pointing to context-data) in RAX */
-    movq  %rsp, %rax
-
-    /* restore RSP (pointing to context-data) from RDI */
-    movq  %rdi, %rsp
-
-    popq  %r12  /* restrore R12 */
-    popq  %r13  /* restrore R13 */
-    popq  %r14  /* restrore R14 */
-    popq  %r15  /* restrore R15 */
-    popq  %rbx  /* restrore RBX */
-    popq  %rbp  /* restrore RBP */
-
-    /* preserve ontop-function in R8 */
-    movq  %rdx, %r8
-
-    /* return transfer_t from jump */
-    /* RAX == fctx, RDX == data */
-    movq  %rsi, %rdx
-    /* pass transfer_t as first arg in context function */
-    /* RDI == fctx, RSI == data */
-    movq  %rax, %rdi
-
-    /* keep return-address on stack */
-
-    /* indirect jump to context */
-    jmp  *%r8
-.size ontop_fcontext,.-ontop_fcontext
-
-/* Mark that we don't need executable stack.  */
-.section .note.GNU-stack,"",%progbits
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/****************************************************************************************
+ *                                                                                      *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  | fc_mxcsr|fc_x87_cw|        R12        |         R13        |        R14        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    8    |    9    |   10    |   11    |    12    |    13   |    14   |    15   |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x20  |   0x24  |   0x28  |  0x2c   |   0x30   |   0x34  |   0x38  |   0x3c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |        R15        |        RBX        |         RBP        |        RIP        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *                                                                                      *
+ ****************************************************************************************/
+
+.text
+.globl ontop_fcontext
+.type ontop_fcontext,@function
+.align 16
+ontop_fcontext:
+    /* preserve ontop-function in R8 */
+    movq  %rdx, %r8
+
+    leaq  -0x38(%rsp), %rsp /* prepare stack */
+
+#if !defined(BOOST_USE_TSX)
+    stmxcsr  (%rsp)     /* save MMX control- and status-word */
+    fnstcw   0x4(%rsp)  /* save x87 control-word */
+#endif
+
+    movq  %r12, 0x8(%rsp)  /* save R12 */
+    movq  %r13, 0x10(%rsp)  /* save R13 */
+    movq  %r14, 0x18(%rsp)  /* save R14 */
+    movq  %r15, 0x20(%rsp)  /* save R15 */
+    movq  %rbx, 0x28(%rsp)  /* save RBX */
+    movq  %rbp, 0x30(%rsp)  /* save RBP */
+
+    /* store RSP (pointing to context-data) in RAX */
+    movq  %rsp, %rax
+
+    /* restore RSP (pointing to context-data) from RDI */
+    movq  %rdi, %rsp
+
+#if !defined(BOOST_USE_TSX)
+    ldmxcsr  (%rsp)     /* restore MMX control- and status-word */
+    fldcw    0x4(%rsp)  /* restore x87 control-word */
+#endif
+
+    movq  0x8(%rsp), %r12  /* restore R12 */
+    movq  0x10(%rsp), %r13  /* restore R13 */
+    movq  0x18(%rsp), %r14  /* restore R14 */
+    movq  0x20(%rsp), %r15  /* restore R15 */
+    movq  0x28(%rsp), %rbx  /* restore RBX */
+    movq  0x30(%rsp), %rbp  /* restore RBP */
+
+    leaq  0x38(%rsp), %rsp /* prepare stack */
+
+    /* return transfer_t from jump */
+    /* RAX == fctx, RDX == data */
+    movq  %rsi, %rdx
+    /* pass transfer_t as first arg in context function */
+    /* RDI == fctx, RSI == data */
+    movq  %rax, %rdi
+
+    /* keep return-address on stack */
+
+    /* indirect jump to context */
+    jmp  *%r8
+.size ontop_fcontext,.-ontop_fcontext
+
+/* Mark that we don't need executable stack.  */
+.section .note.GNU-stack,"",%progbits

+ 78 - 64
modules/std/fiber/native/asm/ontop_x86_64_sysv_macho_gas.S

@@ -1,64 +1,78 @@
-/*
-            Copyright Oliver Kowalke 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)
-*/
-
-/****************************************************************************************
- *                                                                                      *
- *  ----------------------------------------------------------------------------------  *
- *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
- *  ----------------------------------------------------------------------------------  *
- *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
- *  ----------------------------------------------------------------------------------  *
- *  |        R12        |         R13       |         R14        |        R15        |  *
- *  ----------------------------------------------------------------------------------  *
- *  ----------------------------------------------------------------------------------  *
- *  |    8    |    9    |   10    |   11    |    12    |    13   |    14   |    15   |  *
- *  ----------------------------------------------------------------------------------  *
- *  |   0x20  |   0x24  |   0x28  |  0x2c   |   0x30   |   0x34  |   0x38  |   0x3c  |  *
- *  ----------------------------------------------------------------------------------  *
- *  |        RBX        |         RBP       |         RIP        |       EXIT        |  *
- *  ----------------------------------------------------------------------------------  *
- *                                                                                      *
- ****************************************************************************************/
-
-.text
-.globl _ontop_fcontext
-.align 8
-_ontop_fcontext:
-    pushq  %rbp  /* save RBP */
-    pushq  %rbx  /* save RBX */
-    pushq  %r15  /* save R15 */
-    pushq  %r14  /* save R14 */
-    pushq  %r13  /* save R13 */
-    pushq  %r12  /* save R12 */
-
-    /* store RSP (pointing to context-data) in RAX */
-    movq  %rsp, %rax
-
-    /* restore RSP (pointing to context-data) from RDI */
-    movq  %rdi, %rsp
-
-    popq  %r12  /* restrore R12 */
-    popq  %r13  /* restrore R13 */
-    popq  %r14  /* restrore R14 */
-    popq  %r15  /* restrore R15 */
-    popq  %rbx  /* restrore RBX */
-    popq  %rbp  /* restrore RBP */
-
-    /* preserve ontop-function in R8 */
-    movq  %rdx, %r8
-
-    /* return transfer_t from jump */
-    /* RAX == fctx, RDX == data */
-    movq  %rsi, %rdx
-    /* pass transfer_t as first arg in context function */
-    /* RDI == fctx, RSI == data */
-    movq  %rax, %rdi
-
-    /* keep return-address on stack */
-
-    /* indirect jump to context */
-    jmp  *%r8
+/*
+            Copyright Oliver Kowalke 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)
+*/
+
+/****************************************************************************************
+ *                                                                                      *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    0    |    1    |    2    |    3    |    4     |    5    |    6    |    7    |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x0   |   0x4   |   0x8   |   0xc   |   0x10   |   0x14  |   0x18  |   0x1c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  | fc_mxcsr|fc_x87_cw|        R12        |         R13        |        R14        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |    8    |    9    |   10    |   11    |    12    |    13   |    14   |    15   |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |   0x20  |   0x24  |   0x28  |  0x2c   |   0x30   |   0x34  |   0x38  |   0x3c  |  *
+ *  ----------------------------------------------------------------------------------  *
+ *  |        R15        |        RBX        |         RBP        |        RIP        |  *
+ *  ----------------------------------------------------------------------------------  *
+ *                                                                                      *
+ ****************************************************************************************/
+
+.text
+.globl _ontop_fcontext
+.align 8
+_ontop_fcontext:
+    /* preserve ontop-function in R8 */
+    movq  %rdx, %r8
+
+    leaq  -0x38(%rsp), %rsp /* prepare stack */
+
+#if !defined(BOOST_USE_TSX)
+    stmxcsr  (%rsp)     /* save MMX control- and status-word */
+    fnstcw   0x4(%rsp)  /* save x87 control-word */
+#endif
+
+    movq  %r12, 0x8(%rsp)  /* save R12 */
+    movq  %r13, 0x10(%rsp)  /* save R13 */
+    movq  %r14, 0x18(%rsp)  /* save R14 */
+    movq  %r15, 0x20(%rsp)  /* save R15 */
+    movq  %rbx, 0x28(%rsp)  /* save RBX */
+    movq  %rbp, 0x30(%rsp)  /* save RBP */
+
+    /* store RSP (pointing to context-data) in RAX */
+    movq  %rsp, %rax
+
+    /* restore RSP (pointing to context-data) from RDI */
+    movq  %rdi, %rsp
+
+#if !defined(BOOST_USE_TSX)
+    ldmxcsr  (%rsp)     /* restore MMX control- and status-word */
+    fldcw    0x4(%rsp)  /* restore x87 control-word */
+#endif
+
+    movq  0x8(%rsp), %r12  /* restore R12 */
+    movq  0x10(%rsp), %r13  /* restore R13 */
+    movq  0x18(%rsp), %r14  /* restore R14 */
+    movq  0x20(%rsp), %r15  /* restore R15 */
+    movq  0x28(%rsp), %rbx  /* restore RBX */
+    movq  0x30(%rsp), %rbp  /* restore RBP */
+
+    leaq  0x38(%rsp), %rsp /* prepare stack */
+
+    /* return transfer_t from jump */
+    /* RAX == fctx, RDX == data */
+    movq  %rsi, %rdx
+    /* pass transfer_t as first arg in context function */
+    /* RDI == fctx, RSI == data */
+    movq  %rax, %rdi
+
+    /* keep return-address on stack */
+
+    /* indirect jump to context */
+    jmp  *%r8