$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r81595 - in trunk: boost/context boost/context/detail libs/context/build libs/context/example libs/context/src libs/context/src/asm
From: oliver.kowalke_at_[hidden]
Date: 2012-11-27 15:11:35
Author: olli
Date: 2012-11-27 15:11:33 EST (Tue, 27 Nov 2012)
New Revision: 81595
URL: http://svn.boost.org/trac/boost/changeset/81595
Log:
context: replace align_stack() bay assembler
Removed:
   trunk/libs/context/src/fcontext.cpp
Text files modified: 
   trunk/boost/context/detail/fcontext_x86_64_win.hpp      |    15 -----                                   
   trunk/boost/context/fcontext.hpp                        |     5 --                                      
   trunk/libs/context/build/Jamfile.v2                     |    33 ++++--------                            
   trunk/libs/context/example/exit.cpp                     |    40 ++++++++-------                         
   trunk/libs/context/src/asm/jump_i386_ms_pe_masm.asm     |     1                                         
   trunk/libs/context/src/asm/jump_ppc32_sysv_elf_gas.S    |   100 ++++++++++++++++++++--------------------
   trunk/libs/context/src/asm/jump_ppc64_sysv_elf_gas.S    |     2                                         
   trunk/libs/context/src/asm/jump_x86_64_ms_pe_masm.asm   |    53 ++++++++++++--------                    
   trunk/libs/context/src/asm/make_arm_aapcs_elf_gas.S     |    37 +++++++-------                          
   trunk/libs/context/src/asm/make_i386_ms_pe_masm.asm     |    25 +++------                               
   trunk/libs/context/src/asm/make_i386_sysv_elf_gas.S     |    26 ++-------                               
   trunk/libs/context/src/asm/make_i386_sysv_macho_gas.S   |    24 +++------                               
   trunk/libs/context/src/asm/make_mips32_o32_elf_gas.S    |    28 +++-------                              
   trunk/libs/context/src/asm/make_ppc32_sysv_elf_gas.S    |    58 ++++++++++-------------                 
   trunk/libs/context/src/asm/make_ppc64_sysv_elf_gas.S    |    30 ++++-------                             
   trunk/libs/context/src/asm/make_x86_64_ms_pe_masm.asm   |    68 +++++++++------------------             
   trunk/libs/context/src/asm/make_x86_64_sysv_elf_gas.S   |    29 +++--------                             
   trunk/libs/context/src/asm/make_x86_64_sysv_macho_gas.S |    22 ++------                                
   18 files changed, 242 insertions(+), 354 deletions(-)
Modified: trunk/boost/context/detail/fcontext_x86_64_win.hpp
==============================================================================
--- trunk/boost/context/detail/fcontext_x86_64_win.hpp	(original)
+++ trunk/boost/context/detail/fcontext_x86_64_win.hpp	2012-11-27 15:11:33 EST (Tue, 27 Nov 2012)
@@ -45,25 +45,12 @@
     {}
 };
 
-struct fp_t
-{
-    boost::uint32_t     fc_freg[2];
-    void            *   fc_xmm;
-    char                fc_buffer[175];
-
-    fp_t() :
-        fc_freg(),
-        fc_xmm( 0),
-        fc_buffer()
-	{}
-};
-
 struct fcontext_t
 {
     boost::uint64_t     fc_greg[10];
     stack_t             fc_stack;
     void            *   fc_local_storage;
-    fp_t                fc_fp;
+    boost::uint64_t     fc_fp[24];
 
     fcontext_t() :
         fc_greg(),
Modified: trunk/boost/context/fcontext.hpp
==============================================================================
--- trunk/boost/context/fcontext.hpp	(original)
+++ trunk/boost/context/fcontext.hpp	2012-11-27 15:11:33 EST (Tue, 27 Nov 2012)
@@ -61,11 +61,6 @@
 
 namespace boost {
 namespace context {
-namespace detail {
-
-extern "C" BOOST_CONTEXT_DECL void * BOOST_CONTEXT_CALLDECL align_stack( void * vp);
-
-}
 
 extern "C" BOOST_CONTEXT_DECL
 intptr_t BOOST_CONTEXT_CALLDECL jump_fcontext( fcontext_t * ofc, fcontext_t const* nfc, intptr_t vp, bool preserve_fpu = true);
Modified: trunk/libs/context/build/Jamfile.v2
==============================================================================
--- trunk/libs/context/build/Jamfile.v2	(original)
+++ trunk/libs/context/build/Jamfile.v2	2012-11-27 15:11:33 EST (Tue, 27 Nov 2012)
@@ -281,7 +281,8 @@
    ;
 
 alias asm_context_sources
-   : asm/make_i386_ms_pe_masm.asm
+   : seh.cpp
+     asm/make_i386_ms_pe_masm.asm
      asm/jump_i386_ms_pe_masm.asm
    : <abi>ms
      <address-model>32
@@ -292,7 +293,8 @@
    ;
 
 alias asm_context_sources
-   : asm/make_i386_ms_pe_masm.asm
+   : seh.cpp
+     asm/make_i386_ms_pe_masm.asm
      asm/jump_i386_ms_pe_masm.asm
    : <abi>ms
      <address-model>32
@@ -303,7 +305,8 @@
    ;
 
 alias asm_context_sources
-   : [ make asm/make_i386_ms_pe_masm.o : asm/make_i386_ms_pe_masm.asm : @masm ]
+   : seh.cpp
+     [ make asm/make_i386_ms_pe_masm.o : asm/make_i386_ms_pe_masm.asm : @masm ]
      [ make asm/jump_i386_ms_pe_masm.o : asm/jump_i386_ms_pe_masm.asm : @masm ]
    : <abi>ms
      <address-model>32
@@ -385,7 +388,8 @@
    ;
 
 alias asm_context_sources
-   : asm/make_x86_64_ms_pe_masm.asm
+   : seh.cpp
+     asm/make_x86_64_ms_pe_masm.asm
      asm/jump_x86_64_ms_pe_masm.asm
    : <abi>ms
      <address-model>64
@@ -396,7 +400,8 @@
    ;
 
 alias asm_context_sources
-   : asm/make_x86_64_ms_pe_masm.asm
+   : seh.cpp
+     asm/make_x86_64_ms_pe_masm.asm
      asm/jump_x86_64_ms_pe_masm.asm
    : <abi>ms
      <address-model>64
@@ -407,7 +412,8 @@
    ;
 
 alias asm_context_sources
-   : [ make asm/make_x86_64_ms_pe_masm.o : asm/make_x86_64_ms_pe_masm.asm : @masm64 ]
+   : seh.cpp
+     [ make asm/make_x86_64_ms_pe_masm.o : asm/make_x86_64_ms_pe_masm.asm : @masm64 ]
      [ make asm/jump_x86_64_ms_pe_masm.o : asm/jump_x86_64_ms_pe_masm.asm : @masm64 ]
    : <abi>ms
      <address-model>64
@@ -418,32 +424,17 @@
 
 explicit asm_context_sources ;
 
-
 alias select_asm_context_sources
   : asm_context_sources
   : [ architecture.architecture ]
     [ architecture.address-model ]
   ;
 
-
-alias context_sources
-   : fcontext.cpp
-     seh.cpp
-   : <target-os>windows
-   ;
-
-alias context_sources
-   : fcontext.cpp
-   ;
-
 explicit context_sources ;
 
-
 lib boost_context
    : select_asm_context_sources
-     context_sources
    : <link>shared:<define>BOOST_CONTEXT_DYN_LINK=1
    ;
 
-
 boost-install boost_context ;
Modified: trunk/libs/context/example/exit.cpp
==============================================================================
--- trunk/libs/context/example/exit.cpp	(original)
+++ trunk/libs/context/example/exit.cpp	2012-11-27 15:11:33 EST (Tue, 27 Nov 2012)
@@ -27,36 +27,38 @@
 
 void f1( intptr_t)
 {
-        std::cout << "f1: entered" << std::endl;
-        std::cout << "f1: call jump_fcontext( fc1, fc2, 0)" << std::endl;
-        ctx::jump_fcontext( fc1, fc2, 0);
-        std::cout << "f1: return" << std::endl;
+    std::cout << "f1: entered" << std::endl;
+    std::cout << "f1: call jump_fcontext( fc1, fc2, 0)" << std::endl;
+    ctx::jump_fcontext( fc1, fc2, 0);
+    std::cout << "f1: return" << std::endl;
 }
 
 void f2( intptr_t)
 {
-        std::cout << "f2: entered" << std::endl;
-        std::cout << "f2: call jump_fcontext( fc2, fc1, 0)" << std::endl;
-        ctx::jump_fcontext( fc2, fc1, 0);
-        BOOST_ASSERT( false && ! "f2: never returns");
+    std::cout << "f2: entered" << std::endl;
+    std::cout << "f2: call jump_fcontext( fc2, fc1, 0)" << std::endl;
+    ctx::jump_fcontext( fc2, fc1, 0);
+    BOOST_ASSERT( false && ! "f2: never returns");
 }
 
 int main( int argc, char * argv[])
 {
-        ctx::fcontext_t fcm;
-        stack_allocator alloc;
+    std::cout << "size: 0x" << std::hex << sizeof( ctx::fcontext_t) << std::endl;
 
-        void * sp1 = alloc.allocate( stack_allocator::default_stacksize());
-        fc1 = ctx::make_fcontext( sp1, stack_allocator::default_stacksize(), f1);
+    ctx::fcontext_t fcm;
+    stack_allocator alloc;
 
-        void * sp2 = alloc.allocate( stack_allocator::default_stacksize());
-        fc2 = ctx::make_fcontext( sp2, stack_allocator::default_stacksize(), f2);
+    void * sp1 = alloc.allocate( stack_allocator::default_stacksize());
+    fc1 = ctx::make_fcontext( sp1, stack_allocator::default_stacksize(), f1);
 
-        std::cout << "main: call start_fcontext( & fcm, fc1, 0)" << std::endl;
-        ctx::jump_fcontext( & fcm, fc1, 0);
+    void * sp2 = alloc.allocate( stack_allocator::default_stacksize());
+    fc2 = ctx::make_fcontext( sp2, stack_allocator::default_stacksize(), f2);
 
-        std::cout << "main: done" << std::endl;
-        BOOST_ASSERT( false && ! "main: never returns");
+    std::cout << "main: call start_fcontext( & fcm, fc1, 0)" << std::endl;
+    ctx::jump_fcontext( & fcm, fc1, 0);
 
-        return EXIT_SUCCESS;
+    std::cout << "main: done" << std::endl;
+    BOOST_ASSERT( false && ! "main: never returns");
+
+    return EXIT_SUCCESS;
 }
Modified: trunk/libs/context/src/asm/jump_i386_ms_pe_masm.asm
==============================================================================
--- trunk/libs/context/src/asm/jump_i386_ms_pe_masm.asm	(original)
+++ trunk/libs/context/src/asm/jump_i386_ms_pe_masm.asm	2012-11-27 15:11:33 EST (Tue, 27 Nov 2012)
@@ -44,7 +44,6 @@
 .XMM
 .model flat, c
 _exit PROTO, value:SDWORD 
-align_stack PROTO, vp:DWORD
 seh_fcontext PROTO, except:DWORD, frame:DWORD, context:DWORD, dispatch:DWORD
 .code
 
Modified: trunk/libs/context/src/asm/jump_ppc32_sysv_elf_gas.S
==============================================================================
--- trunk/libs/context/src/asm/jump_ppc32_sysv_elf_gas.S	(original)
+++ trunk/libs/context/src/asm/jump_ppc32_sysv_elf_gas.S	2012-11-27 15:11:33 EST (Tue, 27 Nov 2012)
@@ -29,37 +29,37 @@
  *  |  CR |  LR |  PC |                                         |  *
  *  -------------------------------------------------------------  *
  *  -------------------------------------------------------------  *
- *  |  23 |  24 |                                               |  *
+ *  |  23 |  24 |  25 |                                         |  *
  *  -------------------------------------------------------------  *
- *  |  92 |  96 |                                               |  *
+ *  |  92 |  96 | 100 |                                         |  *
  *  -------------------------------------------------------------  *
- *  |  sp | size|                                               |  *
+ *  |  sp | size|<pad>|                                         |  *
  *  -------------------------------------------------------------  *
  *  -------------------------------------------------------------  *
- *  |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  32 |  33 |  34 |  *
+ *  |  26 |  27 |  28 |  29 |  30 |  31 |  32 |  33 |  34 |  35 |  *
  *  -------------------------------------------------------------  *
- *  | 100 | 104 | 108 | 112 | 116 | 120 | 124 | 128 | 132 | 136 |  *
+ *  | 104 | 108 | 112 | 116 | 120 | 124 | 128 | 132 | 136 | 140 |  *
  *  -------------------------------------------------------------  *
  *  |    F14    |    F15    |    F16    |    F17    |    F18    |  *
  *  -------------------------------------------------------------  *
  *  -------------------------------------------------------------  *
- *  |  35 |  36 |  37 |  38 |  39 |  40 |  41 |  42 |  43 |  44 |  *
+ *  |  36 |  37 |  38 |  39 |  40 |  41 |  42 |  43 |  44 |  45 |  *
  *  -------------------------------------------------------------  *
- *  | 140 | 144 | 148 | 152 | 156 | 160 | 164 | 168 | 172 | 176 |  *
+ *  | 144 | 148 | 152 | 156 | 160 | 164 | 168 | 172 | 176 | 180 |  *
  *  -------------------------------------------------------------  *
  *  |    F19    |    F20    |    F21    |    F22    |    F23    |  *
  *  -------------------------------------------------------------  *
  *  -------------------------------------------------------------  *
- *  |  45 |  46 |  47 |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  *
+ *  |  46 |  47 |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
  *  -------------------------------------------------------------  *
- *  | 180 | 184 | 188 | 192 | 196 | 200 | 204 | 208 | 212 | 216 |  *
+ *  | 184 | 188 | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
  *  -------------------------------------------------------------  *
  *  |    F24    |    F25    |    F26    |    F27    |    F28    |  *
  *  -------------------------------------------------------------  *
  *  -------------------------------------------------------------  *
- *  |  55 |  56 |  57 |  58 |  59 |  60 |  61 |  62 |           |  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |           |  *
  *  -------------------------------------------------------------  *
- *  | 220 | 224 | 228 | 232 | 236 | 240 | 244 | 248 |           |  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |           |  *
  *  -------------------------------------------------------------  *
  *  |    F29    |    F30    |    F31    |   fpscr   |           |  *
  *  -------------------------------------------------------------  *
@@ -101,46 +101,46 @@
     cmpwi   cr7,   %r6,  0      # test if fpu env should be preserved
     beq     cr7,   1f
 
-    stfd    %f14,  100(%r3)     # save F14
-    stfd    %f15,  108(%r3)     # save F15
-    stfd    %f16,  116(%r3)     # save F16
-    stfd    %f17,  124(%r3)     # save F17
-    stfd    %f18,  132(%r3)     # save F18
-    stfd    %f19,  140(%r3)     # save F19
-    stfd    %f20,  148(%r3)     # save F20
-    stfd    %f21,  156(%r3)     # save F21
-    stfd    %f22,  164(%r3)     # save F22
-    stfd    %f23,  172(%r3)     # save F23
-    stfd    %f24,  180(%r3)     # save F24
-    stfd    %f25,  188(%r3)     # save F25
-    stfd    %f26,  196(%r3)     # save F26
-    stfd    %f27,  204(%r3)     # save F27
-    stfd    %f28,  212(%r3)     # save F28
-    stfd    %f29,  220(%r3)     # save F29
-    stfd    %f30,  228(%r3)     # save F30
-    stfd    %f31,  236(%r3)     # save F31
+    stfd    %f14,  104(%r3)     # save F14
+    stfd    %f15,  112(%r3)     # save F15
+    stfd    %f16,  120(%r3)     # save F16
+    stfd    %f17,  128(%r3)     # save F17
+    stfd    %f18,  136(%r3)     # save F18
+    stfd    %f19,  144(%r3)     # save F19
+    stfd    %f20,  152(%r3)     # save F20
+    stfd    %f21,  160(%r3)     # save F21
+    stfd    %f22,  168(%r3)     # save F22
+    stfd    %f23,  176(%r3)     # save F23
+    stfd    %f24,  184(%r3)     # save F24
+    stfd    %f25,  192(%r3)     # save F25
+    stfd    %f26,  200(%r3)     # save F26
+    stfd    %f27,  208(%r3)     # save F27
+    stfd    %f28,  216(%r3)     # save F28
+    stfd    %f29,  224(%r3)     # save F29
+    stfd    %f30,  232(%r3)     # save F30
+    stfd    %f31,  240(%r3)     # save F31
     mffs    %f0                 # load FPSCR
-    stfd    %f0,   244(%r3)     # save FPSCR
+    stfd    %f0,   248(%r3)     # save FPSCR
 
-    lfd     %f14,  100(%r4)     # restore F14
-    lfd     %f15,  108(%r4)     # restore F15
-    lfd     %f16,  116(%r4)     # restore F16
-    lfd     %f17,  124(%r4)     # restore F17
-    lfd     %f18,  132(%r4)     # restore F18
-    lfd     %f19,  140(%r4)     # restore F19
-    lfd     %f20,  148(%r4)     # restore F20
-    lfd     %f21,  156(%r4)     # restore F21
-    lfd     %f22,  164(%r4)     # restore F22
-    lfd     %f23,  172(%r4)     # restore F23
-    lfd     %f24,  180(%r4)     # restore F24
-    lfd     %f25,  188(%r4)     # restore F25
-    lfd     %f26,  196(%r4)     # restore F26
-    lfd     %f27,  204(%r4)     # restore F27
-    lfd     %f28,  212(%r4)     # restore F28
-    lfd     %f29,  220(%r4)     # restore F29
-    lfd     %f30,  228(%r4)     # restore F30
-    lfd     %f31,  236(%r4)     # restore F31
-    lfd     %f0,   244(%r4)     # load FPSCR
+    lfd     %f14,  104(%r4)     # restore F14
+    lfd     %f15,  112(%r4)     # restore F15
+    lfd     %f16,  120(%r4)     # restore F16
+    lfd     %f17,  128(%r4)     # restore F17
+    lfd     %f18,  136(%r4)     # restore F18
+    lfd     %f19,  144(%r4)     # restore F19
+    lfd     %f20,  152(%r4)     # restore F20
+    lfd     %f21,  160(%r4)     # restore F21
+    lfd     %f22,  168(%r4)     # restore F22
+    lfd     %f23,  176(%r4)     # restore F23
+    lfd     %f24,  184(%r4)     # restore F24
+    lfd     %f25,  192(%r4)     # restore F25
+    lfd     %f26,  200(%r4)     # restore F26
+    lfd     %f27,  208(%r4)     # restore F27
+    lfd     %f28,  216(%r4)     # restore F28
+    lfd     %f29,  224(%r4)     # restore F29
+    lfd     %f30,  232(%r4)     # restore F30
+    lfd     %f31,  240(%r4)     # restore F31
+    lfd     %f0,   248(%r4)     # load FPSCR
     mtfsf   0xff,  %f0          # restore FPSCR
 1:
 
@@ -170,7 +170,7 @@
     lwz     %r0,   84(%r4)      # load LR
     mtlr    %r0                 # restore LR
 
-    mr.     %r3,   %r5          # use third arg as return value after jump
+    mr      %r3,   %r5          # use third arg as return value after jump
                                 # and as first arg in context function
 
     lwz     %r0,   88(%r4)      # load PC
Modified: trunk/libs/context/src/asm/jump_ppc64_sysv_elf_gas.S
==============================================================================
--- trunk/libs/context/src/asm/jump_ppc64_sysv_elf_gas.S	(original)
+++ trunk/libs/context/src/asm/jump_ppc64_sysv_elf_gas.S	2012-11-27 15:11:33 EST (Tue, 27 Nov 2012)
@@ -191,7 +191,7 @@
     ld      %r0,   168(%r4)     # load LR
     mtlr    %r0                 # restore LR
 
-    mr.     %r3,   %r5          # use third arg as return value after jump
+    mr      %r3,   %r5          # use third arg as return value after jump
                                 # and as first arg in context function
 
     ld      %r0,   176(%r4)     # load PC
Modified: trunk/libs/context/src/asm/jump_x86_64_ms_pe_masm.asm
==============================================================================
--- trunk/libs/context/src/asm/jump_x86_64_ms_pe_masm.asm	(original)
+++ trunk/libs/context/src/asm/jump_x86_64_ms_pe_masm.asm	2012-11-27 15:11:33 EST (Tue, 27 Nov 2012)
@@ -40,50 +40,49 @@
 ;  |      fbr_strg     |                                                            |
 ;  ----------------------------------------------------------------------------------
 ;  ----------------------------------------------------------------------------------
-;  |    28   |   29    |    30   |    31   |                                        |
+;  |    28   |   29    |    30   |    31   |    32    |    33   |   34    |   35    |
 ;  ----------------------------------------------------------------------------------
-;  |   0x70  |   0x74  |   0x78  |   0x7c  |                                        |
+;  |   0x70  |   0x74  |   0x78  |   0x7c  |   0x80   |   0x84  |  0x88   |  0x8c   |
 ;  ----------------------------------------------------------------------------------
-;  | fc_mxcsr|fc_x87_cw|      fc_xmm       |                                        |
+;  | fc_mxcsr|fc_x87_cw|      fc_xmm       |      SEE registers (XMM6-XMM15)        |
 ;  ----------------------------------------------------------------------------------
 ;  ----------------------------------------------------------------------------------
-;  |    32    |   33   |   34    |   35    |   36     |   37    |    38   |    39   |
+;  |   36    |    37   |    38   |    39   |    40    |    41   |   42    |   43    |
 ;  ----------------------------------------------------------------------------------
-;  |   0x80   |  0x84  |  0x88   |  0x8c   |   0x90   |   0x94  |   0x98  |   0x9c  |
+;  |  0x90   |   0x94  |   0x98  |   0x9c  |   0x100  |  0x104  |  0x108  |  0x10c  |
 ;  ----------------------------------------------------------------------------------
-;  |                  XMM6                 |                   XMM7                 |
+;  |                          SEE registers (XMM6-XMM15)                            |
 ;  ----------------------------------------------------------------------------------
 ;  ----------------------------------------------------------------------------------
-;  |    40    |   41   |   42    |   43    |    44    |   45    |    46   |    47   |
+;  |    44    |   45    |    46   |    47  |    48    |    49   |   50    |   51    |
 ;  ----------------------------------------------------------------------------------
-;  |   0x100  |  0x104  |  0x108  |  0x10c |   0x110  |  0x114  |  0x118  |  0x11c  |
+;  |   0x110  |  0x114  |  0x118  |  0x11c |   0x120  |   0x124 |  0x128  |  0x12c  |
 ;  ----------------------------------------------------------------------------------
-;  |                  XMM8                 |                   XMM9                 |
+;  |                          SEE registers (XMM6-XMM15)                            |
 ;  ----------------------------------------------------------------------------------
 ;  ----------------------------------------------------------------------------------
-;  |    48    |   49   |   50    |   51    |    52    |   53    |    54   |    55   |
+;  |    52    |   53    |    54   |    55  |    56    |    57   |   58    |   59    |
 ;  ----------------------------------------------------------------------------------
-;  |   0x120  |  0x124 |  0x128  |  0x12c  |   0x130  |  0x134  |   0x138 |   0x13c |
+;  |   0x130  |  0x134  |   0x138 |   0x13c|   0x140  |  0x144  |  0x148  |  0x14c  |
 ;  ----------------------------------------------------------------------------------
-;  |                 XMM10                 |                  XMM11                 |
+;  |                          SEE registers (XMM6-XMM15)                            |
 ;  ----------------------------------------------------------------------------------
 ;  ----------------------------------------------------------------------------------
-;  |    56    |   57   |   58    |   59    |    60   |    61   |    62    |    63   |
+;  |    60   |    61   |    62    |    63  |    64    |    65   |   66    |   67    |
 ;  ----------------------------------------------------------------------------------
-;  |  0x140  |  0x144  |  0x148  |  0x14c  |   0x150  |  0x154 |   0x158  |   0x15c |
+;  |  0x150  |  0x154  |   0x158  |  0x15c |   0x160  |  0x164  |  0x168  |  0x16c  |
 ;  ----------------------------------------------------------------------------------
-;  |                 XMM12                 |                  XMM13                 |
+;  |                          SEE registers (XMM6-XMM15)                            |
 ;  ----------------------------------------------------------------------------------
 ;  ----------------------------------------------------------------------------------
-;  |    64    |   65   |   66    |   67    |    68    |   69    |    70   |    71   |
+;  |    68   |    69   |    70    |    71  |    72    |    73   |   74    |   75    |
 ;  ----------------------------------------------------------------------------------
-;  |  0x160  |  0x164  |  0x168  |  0x16c  |   0x170  |  0x174  |  0x178  |   0x17c |
+;  |  0x170  |  0x174  |   0x178  |  0x17c |   0x180  |  0x184  |  0x188  |  0x18c  |
 ;  ----------------------------------------------------------------------------------
-;  |                 XMM14                 |                  XMM15                 |
+;  |                          SEE registers (XMM6-XMM15)                            |
 ;  ----------------------------------------------------------------------------------
 
 EXTERN  _exit:PROC            ; standard C library function
-EXTERN  align_stack:PROC      ; stack alignment
 EXTERN  seh_fcontext:PROC     ; exception handler
 .code
 
@@ -113,7 +112,12 @@
     stmxcsr [rcx+070h]              ; save MMX control and status word
     fnstcw  [rcx+074h]              ; save x87 control word
     ; save XMM storage
-	mov     r10,         [rcx+078h] ; load start address of XMM storage into R10
+    ; save start address of SSE register block in R10
+    lea     r10,          [rcx+090h]
+    ; shift address in R10 to lower 16 byte boundary
+    ; == pointer to SEE register block
+    and     r10,         -0fh
+
     movaps  [r10],       xmm6
     movaps  [r10+010h],  xmm7
     movaps  [r10+020h],  xmm8
@@ -128,7 +132,12 @@
     ldmxcsr [rdx+070h]              ; restore MMX control and status word
     fldcw   [rdx+074h]              ; restore x87 control word
     ; restore XMM storage
-	mov     r10,         [rdx+078h] ; load start address of XMM storage into R10
+	; save start address of SSE register block in R10
+    lea     r10,          [rdx+090h]
+    ; shift address in R10 to lower 16 byte boundary
+    ; == pointer to SEE register block
+    and     r10,         -0fh
+
     movaps  xmm6,        [r10]
     movaps  xmm7,        [r10+010h]
     movaps  xmm8,        [r10+020h]
@@ -139,8 +148,8 @@
     movaps  xmm13,       [r10+070h]
     movaps  xmm14,       [r10+080h]
     movaps  xmm15,       [r10+090h]
-nxt:
 
+nxt:
     lea     rax,         [rsp+08h]  ; exclude the return address
     mov     [rcx+040h],  rax        ; save as stack pointer
     mov     rax,         [rsp]      ; load return address
Modified: trunk/libs/context/src/asm/make_arm_aapcs_elf_gas.S
==============================================================================
--- trunk/libs/context/src/asm/make_arm_aapcs_elf_gas.S	(original)
+++ trunk/libs/context/src/asm/make_arm_aapcs_elf_gas.S	2012-11-27 15:11:33 EST (Tue, 27 Nov 2012)
@@ -50,26 +50,27 @@
 .align 2
 .type make_fcontext,%function
 make_fcontext:
-    stmfd   sp!, {a1-a3,lr}     @ save arguments of make_fcontext and return address on stack, SP % 8 == 0
-    sub     a1, #116            @ reserve space for fcontext_t at top of context stack
-    bl      align_stack_at_PLT     @ call align_stack, A1 contains address at 16 byte boundary after return
-                                @ == pointer to fcontext_t and address of context stack
-
-    ldmfd   sp!, {a2-a4,lr}     @ restore arguments of make_fcontext and return address from stack
-    str     a2, [a1,#44]        @ save address of context stack (base) in fcontext_t
-    str     a3, [a1,#48]        @ save context stack size in fcontext_t
-    str     a4, [a1,#40]        @ save address of context function in fcontext_t
-
-    str     a1, [a1,#32]        @ save address in A1 as stack pointer for context function
-
-    adr     a2, finish          @ compute abs address of label finish
-    str     a2, [a1,#36]        @ save address of finish as return address for context function
-                                @ entered after context function returns
+    mov     a4, a1          @ save address of context stack (base) A4
+    sub     a1, #116        @ reserve space for fcontext_t at top of context stack
+
+    @ shift address in A1 to lower 16 byte boundary
+    @ == pointer to fcontext_t and address of context stack
+    bic     a1, a1, #15
+
+    str     a4, [a1,#44]    @ save address of context stack (base) in fcontext_t
+    str     a2, [a1,#48]    @ save context stack size in fcontext_t
+    str     a3, [a1,#40]    @ save address of context function in fcontext_t
+
+    str     a1, [a1,#32]    @ save address in A4 as stack pointer for context function
+
+    adr     a2, finish      @ compute abs address of label finish
+    str     a2, [a1,#36]    @ save address of finish as return address for context function
+                            @ entered after context function returns
 
     bx      lr
 
 finish:
-    @ SP points to same address as SP on entry of context function
-    mov     a1, #0              @ exit code is zero
-    bl      _exit_at_PLT           @ exit application
+    @ SP points to same addras SP on entry of context function
+    mov     a1, #0          @ exit code is zero
+    bl      _exit_at_PLT       @ exit application
 .size make_fcontext,.-make_fcontext
Modified: trunk/libs/context/src/asm/make_i386_ms_pe_masm.asm
==============================================================================
--- trunk/libs/context/src/asm/make_i386_ms_pe_masm.asm	(original)
+++ trunk/libs/context/src/asm/make_i386_ms_pe_masm.asm	2012-11-27 15:11:33 EST (Tue, 27 Nov 2012)
@@ -43,30 +43,26 @@
 .386
 .XMM
 .model flat, c
-_exit PROTO, value:SDWORD 
-align_stack PROTO, vp:DWORD
+_exit PROTO, value:SDWORD
 seh_fcontext PROTO, except:DWORD, frame:DWORD, context:DWORD, dispatch:DWORD
 .code
 
 make_fcontext PROC EXPORT
-    push ebp                        ; save previous frame pointer; get the stack 16 byte aligned
-    mov  ebp,         esp           ; set EBP to ESP 
-    sub  esp,         010h          ; allocate stack space
-
-    mov  eax,         [ebp+08h]     ; load 1. arg of make_fcontext, pointer to context stack (base)
+    mov  eax,         [esp+04h]     ; load 1. arg of make_fcontext, pointer to context stack (base)
     lea  eax,         [eax-034h]    ; reserve space for fcontext_t at top of context stack
-    mov  [esp],       eax           ; address in EAX becomes 1.arg of align_stack
-    call  align_stack               ; call align_stack, EAX contains address at 16 byte boundary after return
-                                    ; == pointer to fcontext_t and address of context stack
 
-    mov  ecx,         [ebp+08h]     ; load 1. arg of make_fcontext, pointer to context stack (base)
+    ; shift address in EAX to lower 16 byte boundary
+    ; == pointer to fcontext_t and address of context stack
+    and    eax,       -0fh
+
+    mov  ecx,         [esp+04h]     ; load 1. arg of make_fcontext, pointer to context stack (base)
     mov  [eax+018h],  ecx           ; save address of context stack (base) in fcontext_t
-    mov  edx,         [ebp+0ch]     ; load 2. arg of make_fcontext, context stack size
+    mov  edx,         [esp+08h]     ; load 2. arg of make_fcontext, context stack size
     mov  [eax+01ch],  edx           ; save context stack size in fcontext_t
     neg  edx                        ; negate stack size for LEA instruction (== substraction)
     lea  ecx,         [ecx+edx]     ; compute bottom address of context stack (limit)
     mov  [eax+020h],  ecx           ; save address of context stack (limit) in fcontext_t
-    mov  ecx,         [ebp+010h]    ; load 3. arg of make_fcontext, pointer to context function
+    mov  ecx,         [esp+0ch]     ; load 3. arg of make_fcontext, pointer to context function
     mov  [eax+014h],  ecx           ; save address of context function in fcontext_t
 
     stmxcsr [eax+02ch]              ; save MMX control word
@@ -86,9 +82,6 @@
     mov  [edx],       ecx           ; save address of finish as return address for context function
                                     ; entered after context function returns
 
-    add  esp,         010h          ; deallocate stack space
-    pop  ebp
-
     ret
 
 finish:
Modified: trunk/libs/context/src/asm/make_i386_sysv_elf_gas.S
==============================================================================
--- trunk/libs/context/src/asm/make_i386_sysv_elf_gas.S	(original)
+++ trunk/libs/context/src/asm/make_i386_sysv_elf_gas.S	2012-11-27 15:11:33 EST (Tue, 27 Nov 2012)
@@ -36,27 +36,18 @@
 .align 2
 .type make_fcontext,@function
 make_fcontext:
-    pushl  %ebp                         /* save previous frame pointer; get the stack 16 byte aligned */
-    movl   %esp,           %ebp         /* set EBP to ESP */
-    subl   $0x10,          %esp         /* allocate stack space */
-
-    movl   %ebx,           0x4(%esp)    /* save EBX */
-    movl   0x8(%ebp),      %eax         /* load 1. arg of make_fcontext, pointer to context stack (base) */
+    movl   0x4(%esp),      %eax         /* load 1. arg of make_fcontext, pointer to context stack (base) */
     leal   -0x28(%eax),    %eax         /* reserve space for fcontext_t at top of context stack */
-    movl   %eax,           (%esp)       /* address in EAX becomes 1. arg of align_stack */
 
-    call   1f
-1:  popl   %ebx                                    /* address of label 1 */
-    addl   $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx     /* compute address of GOT and store it in EBX */
-    call   align_stack_at_PLT                         /* call align_stack, EAX contains address at 16 byte boundary after return */
-                                                   /* == pointer to fcontext_t and address of context stack */
-    movl   0x4(%esp),      %ebx                    /* restore EBX */
+    /* shift address in EAX to lower 16 byte boundary */
+    /* == pointer to fcontext_t and address of context stack */
+    andl   $-0xf,          %eax
 
-    movl   0x8(%ebp),      %edx         /* load 1. arg of make_fcontext, pointer to context stack (base) */
+    movl   0x4(%esp),      %edx         /* load 1. arg of make_fcontext, pointer to context stack (base) */
     movl   %edx,           0x18(%eax)   /* save address of context stack (base) in fcontext_t */
-    movl   0xc(%ebp),      %edx         /* load 2. arg of make_fcontext, context stack size */
+    movl   0x8(%esp),      %edx         /* load 2. arg of make_fcontext, context stack size */
     movl   %edx,           0x1c(%eax)   /* save stack size in fcontext_t */
-    movl   0x10(%ebp),     %edx         /* load 3. arg of make_fcontext, pointer to context function */
+    movl   0xc(%esp),      %edx         /* load 3. arg of make_fcontext, pointer to context function */
     movl   %edx,           0x14(%eax)   /* save address of context function in fcontext_t */
 
     stmxcsr  0x20(%eax)                 /* save MMX control and status word */
@@ -71,9 +62,6 @@
     movl   %ecx, (%edx)                /* save address of finish as return address for context functions */
                                        /* entered after context function returns */
 
-    addl   $0x10,          %esp        /* deallocate stack space */
-    pop    %ebp
-
     ret
 
 finish:
Modified: trunk/libs/context/src/asm/make_i386_sysv_macho_gas.S
==============================================================================
--- trunk/libs/context/src/asm/make_i386_sysv_macho_gas.S	(original)
+++ trunk/libs/context/src/asm/make_i386_sysv_macho_gas.S	2012-11-27 15:11:33 EST (Tue, 27 Nov 2012)
@@ -35,21 +35,18 @@
 .globl _make_fcontext
 .align 2
 _make_fcontext:
-    pushl  %ebp                         /* save previous frame pointer */
-    movl   %esp,           %ebp         /* set EBP to ESP */
-    subl   $0x8,           %esp         /* allocate stack space */
-
-    movl   0x8(%ebp),      %eax         /* load 1. arg of make_fcontext, pointer to context stack (base) */
+    movl   0x4(%esp),      %eax         /* load 1. arg of make_fcontext, pointer to context stack (base) */
     leal   -0x28(%eax),    %eax         /* reserve space for fcontext_t at top of context stack */
-    movl   %eax,           (%esp)       /* address in EAX becomes 1. arg of align_stack */
-    call   _align_stack                 /* call align_stack, EAX contains address at 16 byte boundary after return */
-                                        /* ==pointer to fcontext_t and address of context stack */
 
-    movl   0x8(%ebp),      %edx         /* load 1. arg of make_fcontext, pointer to context stack (base) */
+    /* shift address in EAX to lower 16 byte boundary */
+    /* == pointer to fcontext_t and address of context stack */
+    andl   $-0xf,           %eax
+
+    movl   0x4(%esp),      %edx         /* load 1. arg of make_fcontext, pointer to context stack (base) */
     movl   %edx,           0x18(%eax)   /* save address of stack pointer (base) in fcontext_t */
-    movl   0xc(%ebp),      %edx         /* load 2. arg of make_fcontext, context stack size */
+    movl   0x8(%esp),      %edx         /* load 2. arg of make_fcontext, context stack size */
     movl   %edx,           0x1c(%eax)   /* save stack size in fcontext_t */
-    movl   0x10(%ebp),     %edx         /* load 3. arg of make_fcontext, pointer to context function */
+    movl   0xc(%esp),      %edx         /* load 3. arg of make_fcontext, pointer to context function */
     movl   %edx,           0x14(%eax)   /* save address of context fcuntion in fcontext_t */
 
     stmxcsr  0x20(%eax)                 /* save MMX control and status word */
@@ -60,13 +57,10 @@
 
     call   1f
 1:  popl   %ecx                         /* address of label 1 */
-    addl   $finish-1b,     %ecx         /* compute abs address of label finish */
+    addl   $finish-2b,     %ecx         /* compute abs address of label finish */
     movl   %ecx, (%edx)                 /* save address of finish as return address for context function */
                                         /* entered after context function returns */
 
-    addl   $0x8,           %esp         /* deallocate stack space */
-    popl   %ebp
-
     ret
 
 finish:
Modified: trunk/libs/context/src/asm/make_mips32_o32_elf_gas.S
==============================================================================
--- trunk/libs/context/src/asm/make_mips32_o32_elf_gas.S	(original)
+++ trunk/libs/context/src/asm/make_mips32_o32_elf_gas.S	2012-11-27 15:11:33 EST (Tue, 27 Nov 2012)
@@ -49,22 +49,16 @@
 .cpload $t9
 .set    reorder
 #endif
-    addiu   $sp, $sp, -48       # allocate stack space (contains shadow space for subroutines)
-    sw      $ra, 44($sp)        # save return address
-    sw      $fp, 40($sp)        # save frame pointer
-
-    sw      $a2, 48($sp)        # save 3. arg of make_fcontnext, pointer to context function
-    sw      $a1, 52($sp)        # save 2. arg of make_fcontext, context stack size
-    sw      $a0, 56($sp)        # save 1. arg of make_fcontext, pointer to context stack (base)
-    addiu   $a0, $a0, -104      # reserve space for fcontext_t at top of context stack
-    lw      $t9, %call16(align_stack)($gp) # compute adddress of align_stack via global pointer
-    jalr    $t9                 # call align_stack, V0 contains address at 16 byte boundary after return
-                                # == pointer to fcontext_t and address of context stack
-    lw      $a0, 56($sp)        # restore pointer to context stack (base)
-    lw      $a1, 52($sp)        # restore context stack size
-    lw      $a2, 48($sp)        # restore pointer to context function
+    move    $v0, $a0
+    addiu   $v0, $v0, -104      # reserve space for fcontext_t at top of context stack
 
-    sw      $a0, 48($v0)        # save address of context stack (base) in fcontext_t 
+    # shift address in V0 to lower 16 byte boundary
+    # == pointer to fcontext_t and address of context stack
+    move    $v1, $v0
+    li      $v0, -16            # 0xfffffffffffffff0
+    and     $v0, $v1, $v0
+
+    sw      $a0, 48($v0)        # save address of context stack (base) in fcontext_t
     sw      $a1, 52($v0)        # save context stack size in fcontext_t 
     sw      $a2, 44($v0)        # save address of context function in fcontext_t 
     sw      $gp, ($v0)          # save global pointer in fcontext_t, S0 will contain address of global pointer
@@ -76,10 +70,6 @@
     sw      $t9, 40($v0)        # save address of finish as return address for context function
                                 # entered after context function returns
 
-    lw      $fp, 40($sp)        # restore frame pointer
-    lw      $ra, 44($sp)        # restore return address
-    addiu   $sp, $sp, 48        # deallocate stack space
-
     jr      $ra
 
 finish:
Modified: trunk/libs/context/src/asm/make_ppc32_sysv_elf_gas.S
==============================================================================
--- trunk/libs/context/src/asm/make_ppc32_sysv_elf_gas.S	(original)
+++ trunk/libs/context/src/asm/make_ppc32_sysv_elf_gas.S	2012-11-27 15:11:33 EST (Tue, 27 Nov 2012)
@@ -29,37 +29,37 @@
  *  |  CR |  LR |  PC |                                         |  *
  *  -------------------------------------------------------------  *
  *  -------------------------------------------------------------  *
- *  |  23 |  24 |                                               |  *
+ *  |  23 |  24 |  25 |                                         |  *
  *  -------------------------------------------------------------  *
- *  |  92 |  96 |                                               |  *
+ *  |  92 |  96 | 100 |                                         |  *
  *  -------------------------------------------------------------  *
- *  |  sp | size|                                               |  *
+ *  |  sp | size|<pad>|                                         |  *
  *  -------------------------------------------------------------  *
  *  -------------------------------------------------------------  *
- *  |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  32 |  33 |  34 |  *
+ *  |  26 |  27 |  28 |  29 |  30 |  31 |  32 |  33 |  34 |  35 |  *
  *  -------------------------------------------------------------  *
- *  | 100 | 104 | 108 | 112 | 116 | 120 | 124 | 128 | 132 | 136 |  *
+ *  | 104 | 108 | 112 | 116 | 120 | 124 | 128 | 132 | 136 | 140 |  *
  *  -------------------------------------------------------------  *
  *  |    F14    |    F15    |    F16    |    F17    |    F18    |  *
  *  -------------------------------------------------------------  *
  *  -------------------------------------------------------------  *
- *  |  35 |  36 |  37 |  38 |  39 |  40 |  41 |  42 |  43 |  44 |  *
+ *  |  36 |  37 |  38 |  39 |  40 |  41 |  42 |  43 |  44 |  45 |  *
  *  -------------------------------------------------------------  *
- *  | 140 | 144 | 148 | 152 | 156 | 160 | 164 | 168 | 172 | 176 |  *
+ *  | 144 | 148 | 152 | 156 | 160 | 164 | 168 | 172 | 176 | 180 |  *
  *  -------------------------------------------------------------  *
  *  |    F19    |    F20    |    F21    |    F22    |    F23    |  *
  *  -------------------------------------------------------------  *
  *  -------------------------------------------------------------  *
- *  |  45 |  46 |  47 |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  *
+ *  |  46 |  47 |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  *
  *  -------------------------------------------------------------  *
- *  | 180 | 184 | 188 | 192 | 196 | 200 | 204 | 208 | 212 | 216 |  *
+ *  | 184 | 188 | 192 | 196 | 200 | 204 | 208 | 212 | 216 | 220 |  *
  *  -------------------------------------------------------------  *
  *  |    F24    |    F25    |    F26    |    F27    |    F28    |  *
  *  -------------------------------------------------------------  *
  *  -------------------------------------------------------------  *
- *  |  55 |  56 |  57 |  58 |  59 |  60 |  61 |  62 |           |  *
+ *  |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |           |  *
  *  -------------------------------------------------------------  *
- *  | 220 | 224 | 228 | 232 | 236 | 240 | 244 | 248 |           |  *
+ *  | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 |           |  *
  *  -------------------------------------------------------------  *
  *  |    F29    |    F30    |    F31    |   fpscr   |           |  *
  *  -------------------------------------------------------------  *
@@ -71,27 +71,21 @@
 .align 2
 .type make_fcontext,@function
 make_fcontext:
-    mflr    %r0                 # save return address into R0
-    stw     %r0, 4(%r1)         # save return address on stack, set up stack frame
-    stwu    %r1, -48(%r1)       # allocate stack space, SP % 16 == 0
+    mflr    %r6                 # save return address into R6
+
+    mr      %r0, %r3
+    subi    %r3, %r3, 256       # reserve space for fcontext_t at top of context stack
+
+    # call align_stack, R3 contains address at 16 byte boundary after return
+    # == pointer to fcontext_t and address of context stack
+    rlwinm  %r3, %r3, 0, 0, 27
 
-    stw     %r5, 32(%r1)        # save 3. arg of make_fcontext, pointer to context function 
-    stw     %r4, 28(%r1)        # save 2. arg of make_fcontext, context stack size 
-    stw     %r3, 24(%r1)        # save 1. arg of make_fcontext, pointer to context stack (base) 
-
-    subi    %r3, %r3, 252       # reserve space for fcontext_t at top of context stack
-    bl      align_stack_at_plt     # call align_stack, R3 contains address at 16 byte boundary after return
-                                # == pointer to fcontext_t and address of context stack
-    lwz     %r4, 24(%r1)        # restore pointer to context stack (base)
-    lwz     %r5, 28(%r1)        # restore context stack size
-    lwz     %r6, 32(%r1)        # restore pointer to context function
-
-    stw     %r4, 92(%r3)        # save address of context stack (base) in fcontext_t
-    stw     %r5, 96(%r3)        # save context stack size in fcontext_t
-    stw     %r6, 88(%r3)        # save address of context function in fcontext_t
+    stw     %r0, 92(%r3)        # save address of context stack (base) in fcontext_t
+    stw     %r4, 96(%r3)        # save context stack size in fcontext_t
+    stw     %r5, 88(%r3)        # save address of context function in fcontext_t
 
-    subi    %r0, %r3, 64        # reserve 64 bytes (linkage + parameter area), R0 % 16 == 0
-    stw     %r0, 76(%r3)        # save address in R0 as stack pointer for context function
+    subi    %r0, %r3, 64        # reserve 64 bytes (linkage + parameter area), R4 % 16 == 0
+    stw     %r0, 76(%r3)        # save address in R3 as stack pointer for context function
 
     mflr    %r0                 # load LR
     bl      1f                  # jump to label 1
@@ -102,9 +96,7 @@
     stw     %r4, 84(%r3)             # save address of finish as return address for context function
                                      # entered after context function returns
 
-    addi    %r1, %r1, 48        # deallocate stack space
-    lwz     %r0, 4(%r1)         # load return address from stack, destroy stack frame
-    mtlr    %r0                 # restore return address
+    mtlr    %r6                 # restore return address from R6
 
     blr
 
Modified: trunk/libs/context/src/asm/make_ppc64_sysv_elf_gas.S
==============================================================================
--- trunk/libs/context/src/asm/make_ppc64_sysv_elf_gas.S	(original)
+++ trunk/libs/context/src/asm/make_ppc64_sysv_elf_gas.S	2012-11-27 15:11:33 EST (Tue, 27 Nov 2012)
@@ -92,24 +92,18 @@
 .type .make_fcontext,@function
 .globl .make_fcontext
 .make_fcontext:
-    mflr    %r0                 # save return address into R0
-    std     %r0, 8(%r1)         # save return address on stack, set up stack frame
-    stdu    %r1, -96(%r1)       # allocate stack space, SP % 16 == 0
-
-    std     %r5, 64(%r1)        # save 3. arg of make_fcontext, pointer to context function 
-    std     %r4, 56(%r1)        # save 2. arg of make_fcontext, context stack size 
-    std     %r3, 48(%r1)        # save 1. arg of make_fcontext, pointer to context stack (base) 
+    mflr    %r6                 # save return address into R6
 
+    mr      %r0, %r3
     subi    %r3, %r3, 352       # reserve space for fcontext_t at top of context stack
-    bl      align_stack_at_plt     # call align_stack, R3 contains address at 16 byte boundary after return
-                                # == pointer to fcontext_t and address of context stack
-    ld      %r4, 48(%r1)        # restore pointer to context stack (base)
-    ld      %r5, 56(%r1)        # restore context stack size
-    ld      %r6, 64(%r1)        # restore pointer to context function
-
-    std     %r4, 184(%r3)       # save address of context stack (base) in fcontext_t
-    std     %r5, 192(%r3)       # save context stack size in fcontext_t
-    std     %r6, 176(%r3)       # save address of context function in fcontext_t
+
+    # call align_stack, R3 contains address at 16 byte boundary after return
+    # == pointer to fcontext_t and address of context stack
+    rlwinm  %r3, %r3, 0, 0, 27
+
+    std     %r0, 184(%r3)       # save address of context stack (base) in fcontext_t
+    std     %r4, 192(%r3)       # save context stack size in fcontext_t
+    std     %r5, 176(%r3)       # save address of context function in fcontext_t
 
     subf    %r0, %r3, 64        # 64 bytes on stack for parameter area (== 8 registers)
     std     %r0, 152(%r3)       # save the stack base
@@ -123,9 +117,7 @@
     std     %r4, 168(%r3)            # save address of finish as return address for context function
                                      # entered after context function returns
 
-    addi    %r1, %r1, 64        # deallocate stack space
-    lwz     %r0, 8(%r1)         # load return address from stack, destroy stack frame
-    mtlr    %r0                 # restore return address
+    mtlr    %r6                 # restore return address from R6
 
     blr
 
Modified: trunk/libs/context/src/asm/make_x86_64_ms_pe_masm.asm
==============================================================================
--- trunk/libs/context/src/asm/make_x86_64_ms_pe_masm.asm	(original)
+++ trunk/libs/context/src/asm/make_x86_64_ms_pe_masm.asm	2012-11-27 15:11:33 EST (Tue, 27 Nov 2012)
@@ -40,70 +40,59 @@
 ;  |      fbr_strg     |                                                            |
 ;  ----------------------------------------------------------------------------------
 ;  ----------------------------------------------------------------------------------
-;  |    28   |   29    |    30   |    31   |                                        |
+;  |    28   |   29    |    30   |    31   |    32    |    33   |   34    |   35    |
 ;  ----------------------------------------------------------------------------------
-;  |   0x70  |   0x74  |   0x78  |   0x7c  |                                        |
+;  |   0x70  |   0x74  |   0x78  |   0x7c  |   0x80   |   0x84  |  0x88   |  0x8c   |
 ;  ----------------------------------------------------------------------------------
-;  | fc_mxcsr|fc_x87_cw|      fc_xmm       |                                        |
+;  | fc_mxcsr|fc_x87_cw|      fc_xmm       |      SEE registers (XMM6-XMM15)        |
 ;  ----------------------------------------------------------------------------------
 ;  ----------------------------------------------------------------------------------
-;  |    32    |   33   |   34    |   35    |   36     |   37    |    38   |    39   |
+;  |   36    |    37   |    38   |    39   |    40    |    41   |   42    |   43    |
 ;  ----------------------------------------------------------------------------------
-;  |   0x80   |  0x84  |  0x88   |  0x8c   |   0x90   |   0x94  |   0x98  |   0x9c  |
+;  |  0x90   |   0x94  |   0x98  |   0x9c  |   0x100  |  0x104  |  0x108  |  0x10c  |
 ;  ----------------------------------------------------------------------------------
-;  |                  XMM6                 |                   XMM7                 |
+;  |                          SEE registers (XMM6-XMM15)                            |
 ;  ----------------------------------------------------------------------------------
 ;  ----------------------------------------------------------------------------------
-;  |    40    |   41   |   42    |   43    |    44    |   45    |    46   |    47   |
+;  |    44    |   45    |    46   |    47  |    48    |    49   |   50    |   51    |
 ;  ----------------------------------------------------------------------------------
-;  |   0x100  |  0x104  |  0x108  |  0x10c |   0x110  |  0x114  |  0x118  |  0x11c  |
+;  |   0x110  |  0x114  |  0x118  |  0x11c |   0x120  |   0x124 |  0x128  |  0x12c  |
 ;  ----------------------------------------------------------------------------------
-;  |                  XMM8                 |                   XMM9                 |
+;  |                          SEE registers (XMM6-XMM15)                            |
 ;  ----------------------------------------------------------------------------------
 ;  ----------------------------------------------------------------------------------
-;  |    48    |   49   |   50    |   51    |    52    |   53    |    54   |    55   |
+;  |    52    |   53    |    54   |    55  |    56    |    57   |   58    |   59    |
 ;  ----------------------------------------------------------------------------------
-;  |   0x120  |  0x124 |  0x128  |  0x12c  |   0x130  |  0x134  |   0x138 |   0x13c |
+;  |   0x130  |  0x134  |   0x138 |   0x13c|   0x140  |  0x144  |  0x148  |  0x14c  |
 ;  ----------------------------------------------------------------------------------
-;  |                 XMM10                 |                  XMM11                 |
+;  |                          SEE registers (XMM6-XMM15)                            |
 ;  ----------------------------------------------------------------------------------
 ;  ----------------------------------------------------------------------------------
-;  |    56    |   57   |   58    |   59    |    60   |    61   |    62    |    63   |
+;  |    60   |    61   |    62    |    63  |    64    |    65   |   66    |   67    |
 ;  ----------------------------------------------------------------------------------
-;  |  0x140  |  0x144  |  0x148  |  0x14c  |   0x150  |  0x154 |   0x158  |   0x15c |
+;  |  0x150  |  0x154  |   0x158  |  0x15c |   0x160  |  0x164  |  0x168  |  0x16c  |
 ;  ----------------------------------------------------------------------------------
-;  |                 XMM12                 |                  XMM13                 |
+;  |                          SEE registers (XMM6-XMM15)                            |
 ;  ----------------------------------------------------------------------------------
 ;  ----------------------------------------------------------------------------------
-;  |    64    |   65   |   66    |   67    |    68    |   69    |    70   |    71   |
+;  |    68   |    69   |    70    |    71  |    72    |    73   |   74    |   75    |
 ;  ----------------------------------------------------------------------------------
-;  |  0x160  |  0x164  |  0x168  |  0x16c  |   0x170  |  0x174  |  0x178  |   0x17c |
+;  |  0x170  |  0x174  |   0x178  |  0x17c |   0x180  |  0x184  |  0x188  |  0x18c  |
 ;  ----------------------------------------------------------------------------------
-;  |                 XMM14                 |                  XMM15                 |
+;  |                          SEE registers (XMM6-XMM15)                            |
 ;  ----------------------------------------------------------------------------------
 
 EXTERN  _exit:PROC            ; standard C library function
-EXTERN  align_stack:PROC      ; stack alignment
-EXTERN  seh_fcontext:PROC     ; exception handler
 .code
 
 make_fcontext PROC EXPORT FRAME  ; generate function table entry in .pdata and unwind information in
     .endprolog                   ; .xdata for a function's structured exception handling unwind behavior
 
-    push rbp                     ; save previous frame pointer; get the stack 16 byte aligned
-    mov  rbp,        rsp         ; set RBP to RSP
-    sub  rsp,        040h        ; allocate stack space (contains shadow space for subroutines)
-
-    mov  [rbp-08h],  r8          ; save 3. arg of make_fcontext, pointer to context function
-    mov  [rbp-010h], rdx         ; save 2. arg of make_fcontext, context stack size
-    mov  [rbp-018h], rcx         ; save 1. arg of make_fcontext, pointer to context stack (base)
-    lea  rcx,        [rcx-0180h] ; reserve space for fcontext_t at top of context stack
-    call align_stack             ; align context stack, RAX contains address at 16 byte boundary
-                                 ; == pointer to fcontext_t and address of context stack
-
-    mov  r8,         [rbp-08h]   ; restore pointer to context function
-    mov  rdx,        [rbp-010h]  ; restore context stack size
-    mov  rcx,        [rbp-018h]  ; restore pointer to context stack (base)
+    lea  rax,        [rcx-0130h] ; reserve space for fcontext_t at top of context stack
+
+    ; shift address in RAX to lower 16 byte boundary
+    ; == pointer to fcontext_t and address of context stack
+    and  rax,        -0fh
 
     mov  [rax+048h], r8          ; save address of context function in fcontext_t
     mov  [rax+058h], rdx         ; save context stack size in fcontext_t
@@ -116,14 +105,6 @@
     stmxcsr [rax+070h]           ; save MMX control and status word
     fnstcw  [rax+074h]           ; save x87 control word
 
-
-	mov  r8,         rax         ; preserve pointer to fcontext_t
-	lea  rcx,        [rax+090h]  ; beginning of XMM block
-	call align_stack             ; align XMM pointer on 16byte boundary
-	mov  [r8 + 078h], rax        ; store address of XMM block in fc_xmm
-	mov  rax,        r8          ; restore pointer to fcontext_t in RAX
-
-
     lea  rdx,        [rax-028h]  ; reserve 32byte shadow space + return address on stack, (RSP - 0x8) % 16 == 0
     mov  [rax+040h], rdx         ; save address in RDX as stack pointer for context function
 
@@ -131,9 +112,6 @@
     mov  [rdx],      rcx         ; save address of finish as return address for context function
                                  ; entered after context function returns
 
-    add  rsp,        040h        ; deallocate shadow space
-    pop  rbp                     ; restore previous frame pointer
-
     ret
 
 finish:
Modified: trunk/libs/context/src/asm/make_x86_64_sysv_elf_gas.S
==============================================================================
--- trunk/libs/context/src/asm/make_x86_64_sysv_elf_gas.S	(original)
+++ trunk/libs/context/src/asm/make_x86_64_sysv_elf_gas.S	2012-11-27 15:11:33 EST (Tue, 27 Nov 2012)
@@ -43,23 +43,15 @@
 .type make_fcontext,@function
 .align 16
 make_fcontext:
-    pushq   %rbp                       /* save previous frame pointer; get the stack 16 byte aligned */
-    movq    %rsp,           %rbp       /* set RBP to RSP */
-    subq    $0x20,          %rsp       /* allocate stack space */
-
-    movq   %rdx,            0x10(%rsp) /* save 3. arg of make_fcontext, pointer to context function */
-    movq   %rsi,            0x8(%rsp)  /* save 2. arg of make_fcontext, context stack size */
-    movq   %rdi,            (%rsp)     /* save 1. arg of make_fcontext, pointer to context stack (base) */
-    leaq   -0x58(%rdi),     %rdi       /* reserve space for fcontext_t at top of context stack */
-    call   align_stack_at_PLT             /* align context stack, RAX contains address at 16 byte boundary afte return */
-                                       /* == pointer to fcontext_t and address of context stack */
-    movq   (%rsp),          %rdi       /* restore pointer to context stack (base) */
-    movq   0x8(%rsp),       %rsi       /* restore context stack size */
-    movq   0x10(%rsp),      %rdx       /* restore pointer to context function */
-
-    movq   %rdi,            0x40(%rax) /* save address of context stack pointer (base) in fcontext_t */
-    movq   %rsi,            0x48(%rax) /* save context stack size in fcontext_t */
-    movq   %rdx,            0x38(%rax) /* save address of context function in fcontext_t */
+    leaq   -0x58(%rdi),    %rax        /* reserve space for fcontext_t at top of context stack */
+
+    /* shift address in RAX to lower 16 byte boundary */
+    /* == pointer to fcontext_t and address of context stack */
+    andq   $-0xf,          %rax
+
+    movq   %rdi,           0x40(%rax) /* save address of context stack pointer (base) in fcontext_t */
+    movq   %rsi,           0x48(%rax) /* save context stack size in fcontext_t */
+    movq   %rdx,           0x38(%rax) /* save address of context function in fcontext_t */
 
     stmxcsr  0x50(%rax)                /* save MMX control and status word */
     fnstcw   0x54(%rax)                /* save x87 control word */
@@ -71,9 +63,6 @@
     movq   %rcx,            (%rdx)     /* save address of finish as return address for context function */
                                        /* entered after context function returns */
 
-    addq   $0x20,           %rsp       /* deallocate shadow space */      
-    popq   %rbp                        /* restore previous frame pointer */
-
     ret                                /* return pointer to fcontext_t placed on context stack */
 
 finish:
Modified: trunk/libs/context/src/asm/make_x86_64_sysv_macho_gas.S
==============================================================================
--- trunk/libs/context/src/asm/make_x86_64_sysv_macho_gas.S	(original)
+++ trunk/libs/context/src/asm/make_x86_64_sysv_macho_gas.S	2012-11-27 15:11:33 EST (Tue, 27 Nov 2012)
@@ -41,20 +41,11 @@
 .text
 .globl _make_fcontext
 .align 8
-_make_fcontext:
-    pushq   %rbp                       /* save previous frame pointer; get the stack 16 byte aligned */
-    movq    %rsp,           %rbp       /* set RBP to RSP */
-    subq    $0x20,          %rsp       /* allocate stack space */
-
-    movq   %rdx,            0x10(%rsp) /* save 3. arg of make_fcontext, pointer to context function */
-    movq   %rsi,            0x8(%rsp)  /* save 2. arg of make_fcontext, context stack size */
-    movq   %rdi,            (%rsp)     /* save 1. arg of make_fcontext, pointer to context stack (base) */
-    leaq   -0x58(%rdi),     %rdi       /* reserve space for fcontext_t at top of context stack */
-    call   _align_stack                /* align context stack, RAX contains address at 16 byte boundary */
-                                       /* == pointer to fcontext_t and address of context stack */
-    movq   (%rsp),          %rdi       /* restore pointer to context stack (base) */
-    movq   0x8(%rsp),       %rsi       /* restore context stack size */
-    movq   0x10(%rsp),      %rdx       /* restore pointer to context function */
+    leaq   -0x58(%rdi),    %r8        /* reserve space for fcontext_t at top of context stack */
+
+    /* shift address in RAX to lower 16 byte boundary */
+    /* == pointer to fcontext_t and address of context stack */
+    andq   $-0xf,           %rax
 
     movq   %rdi,            0x40(%rax) /* save address of stack pointer (base) in fcontext_t */
     movq   %rsi,            0x48(%rax) /* save stack size in fcontext_t */
@@ -70,9 +61,6 @@
     movq   %rcx,            (%rdx)     /* save address of finish as return address for context function */
                                        /* entered after context function returns */
 
-    addq   $0x20,           %rsp       /* deallocate shadow space */      
-    popq   %rbp                        /* restore previous frame pointer */
-
     ret                                /* return pointer to fcontext_t placed on context stack */
 
 finish:
Deleted: trunk/libs/context/src/fcontext.cpp
==============================================================================
--- trunk/libs/context/src/fcontext.cpp	2012-11-27 15:11:33 EST (Tue, 27 Nov 2012)
+++ (empty file)
@@ -1,36 +0,0 @@
-
-//          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)
-
-#define BOOST_CONTEXT_SOURCE
-
-#include <boost/context/fcontext.hpp>
-
-#include <cstddef>
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_PREFIX
-#endif
-
-namespace boost {
-namespace context {
-namespace detail {
-
-extern "C" BOOST_CONTEXT_DECL
-void * BOOST_CONTEXT_CALLDECL align_stack( void * vp)
-{
-    void * base = vp;
-    if ( 0 != ( ( ( uintptr_t) base) & 15) )
-        base = ( char * ) ( ( ( ( uintptr_t) base) - 15) & ~0x0F);
-    return base;
-}
-
-}
-
-}}
-
-#ifdef BOOST_HAS_ABI_HEADERS
-#  include BOOST_ABI_SUFFIX
-#endif