$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r78152 - trunk/libs/context/src/asm
From: oliver.kowalke_at_[hidden]
Date: 2012-04-23 04:12:26
Author: olli
Date: 2012-04-23 04:12:19 EDT (Mon, 23 Apr 2012)
New Revision: 78152
URL: http://svn.boost.org/trac/boost/changeset/78152
Log:
context: conditional preserving of fpu env
Text files modified: 
   trunk/libs/context/src/asm/fcontext_arm_aapcs_elf_gas.S     |    10 +++++---                                
   trunk/libs/context/src/asm/fcontext_mips32_o32_elf_gas.S    |    19 ++++++++--------                        
   trunk/libs/context/src/asm/fcontext_ppc32_sysv_elf_gas.S    |    45 +++++++++++++++++++++------------------ 
   trunk/libs/context/src/asm/fcontext_ppc64_sysv_elf_gas.S    |    45 +++++++++++++++++++++------------------ 
   trunk/libs/context/src/asm/fcontext_x86_64_ms_pe_masm.asm   |    32 ++++++++++++++++------------            
   trunk/libs/context/src/asm/fcontext_x86_64_sysv_elf_gas.S   |    22 +++++++++++--------                     
   trunk/libs/context/src/asm/fcontext_x86_64_sysv_macho_gas.S |    18 +++++++++------                         
   7 files changed, 105 insertions(+), 86 deletions(-)
Modified: trunk/libs/context/src/asm/fcontext_arm_aapcs_elf_gas.S
==============================================================================
--- trunk/libs/context/src/asm/fcontext_arm_aapcs_elf_gas.S	(original)
+++ trunk/libs/context/src/asm/fcontext_arm_aapcs_elf_gas.S	2012-04-23 04:12:19 EDT (Mon, 23 Apr 2012)
@@ -53,17 +53,19 @@
     stmia   a1, {v1-v8,sp-lr}       @ save V1-V8,SP-LR
     str     lr, [a1,#40]            @ save LR as PC
 #if (defined(__VFP_FP__) && !defined(__SOFTFP__))
+    cmp     a4, #0                  @ test if fpu env should be preserved
+    be      1f
+
     ldr     a4, [a1,#52]
     stmia   a4, {s16-s31}           @ save S16-S31
-#endif
 
-	mov		a1, a3                  @ use third arg as return value after jump
-	                                @ and as first arg in context function
-#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
     ldr     a4, [a2,#52]
     ldmia   a4, {s16-s31}           @ restore S16-S31
+1:
 #endif
 
+	mov		a1, a3                  @ use third arg as return value after jump
+	                                @ and as first arg in context function
     ldmia   a2, {v1-v8,sp-pc}       @ restore v1-V8,SP-PC
 .size jump_fcontext,.-jump_fcontext
 
Modified: trunk/libs/context/src/asm/fcontext_mips32_o32_elf_gas.S
==============================================================================
--- trunk/libs/context/src/asm/fcontext_mips32_o32_elf_gas.S	(original)
+++ trunk/libs/context/src/asm/fcontext_mips32_o32_elf_gas.S	2012-04-23 04:12:19 EDT (Mon, 23 Apr 2012)
@@ -59,14 +59,22 @@
     sw      $ra, 96($a0)    # save RA as PC
 
 #if defined(__mips_hard_float)
+    beqz    $a3,  1f        # test if fpu env should be preserved 
     s.d     $f20, 120($a0)  # save F20
     s.d     $f22, 128($a0)  # save F22
     s.d     $f24, 136($a0)  # save F24
     s.d     $f26, 144($a0)  # save F26
     s.d     $f28, 152($a0)  # save F28
     s.d     $f30, 160($a0)  # save F30
-#endif
 
+    l.d     $f20, 120($a1)  # restore F20
+    l.d     $f22, 128($a1)  # restore F22
+    l.d     $f24, 136($a1)  # restore F24
+    l.d     $f26, 144($a1)  # restore F26
+    l.d     $f28, 152($a1)  # restore F28
+    l.d     $f30, 160($a1)  # restore F30
+1:
+#endif
 
     lw      $s0, ($a1)      # restore S0
     lw      $s1, 8($a1)     # restore S1
@@ -82,15 +90,6 @@
     lw      $ra, 88($a1)    # restore RA
     move    $a0, $s2        # restore void pointer as argument
 
-#if defined(__mips_hard_float)
-    l.d     $f20, 120($a1)  # restore F20
-    l.d     $f22, 128($a1)  # restore F22
-    l.d     $f24, 136($a1)  # restore F24
-    l.d     $f26, 144($a1)  # restore F26
-    l.d     $f28, 152($a1)  # restore F28
-    l.d     $f30, 160($a1)  # restore F30
-#endif
-
     move    $v0, $a2        # use third arg as return value after jump
     move    $a0, $a2        # use third arg as first arg in context function
 
Modified: trunk/libs/context/src/asm/fcontext_ppc32_sysv_elf_gas.S
==============================================================================
--- trunk/libs/context/src/asm/fcontext_ppc32_sysv_elf_gas.S	(original)
+++ trunk/libs/context/src/asm/fcontext_ppc32_sysv_elf_gas.S	2012-04-23 04:12:19 EDT (Mon, 23 Apr 2012)
@@ -98,6 +98,9 @@
     stw     %r0,   84(%r3)      # save LR
     stw     %r0,   88(%r3)      # save LR as PC
 
+    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
@@ -119,6 +122,27 @@
     mffs    %f0                 # load FPSCR
     stfd    %f0,   244(%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
+    mtfsf   0xff,  %f0          # restore FPSCR
+1:
 
     lwz     %r13,  0(%r4)       # restore R13
     lwz     %r14,  4(%r4)       # restore R14
@@ -146,27 +170,6 @@
     lwz     %r0,   84(%r4)      # load LR
     mtlr    %r0                 # restore LR
 
-    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
-    mtfsf   0xff,  %f0          # restore FPSCR
-
     mr.     %r3,   %r5          # use third arg as return value after jump
                                 # and as first arg in context function
 
Modified: trunk/libs/context/src/asm/fcontext_ppc64_sysv_elf_gas.S
==============================================================================
--- trunk/libs/context/src/asm/fcontext_ppc64_sysv_elf_gas.S	(original)
+++ trunk/libs/context/src/asm/fcontext_ppc64_sysv_elf_gas.S	2012-04-23 04:12:19 EDT (Mon, 23 Apr 2012)
@@ -119,6 +119,9 @@
     std     %r0,   168(%r3)     # save LR
     std     %r0,   176(%r3)     # save LR as PC
 
+    cmpwi   cr7,   r6,   0      # test if fpu env should be preserved
+    beq     cr7,   1f
+
     stfd    %f14,  200(%r3)     # save F14
     stfd    %f15,  208(%r3)     # save F15
     stfd    %f16,  216(%r3)     # save F16
@@ -140,6 +143,27 @@
     mffs    %f0                 # load FPSCR
     stfd    %f0,   344(%r3)     # save FPSCR
 
+    lfd     %f14,  200(%r4)     # restore F14
+    lfd     %f15,  208(%r4)     # restore F15
+    lfd     %f16,  216(%r4)     # restore F16
+    lfd     %f17,  224(%r4)     # restore F17
+    lfd     %f18,  232(%r4)     # restore F18
+    lfd     %f19,  240(%r4)     # restore F19
+    lfd     %f20,  248(%r4)     # restore F20
+    lfd     %f21,  256(%r4)     # restore F21
+    lfd     %f22,  264(%r4)     # restore F22
+    lfd     %f23,  272(%r4)     # restore F23
+    lfd     %f24,  280(%r4)     # restore F24
+    lfd     %f25,  288(%r4)     # restore F25
+    lfd     %f26,  296(%r4)     # restore F26
+    lfd     %f27,  304(%r4)     # restore F27
+    lfd     %f28,  312(%r4)     # restore F28
+    lfd     %f29,  320(%r4)     # restore F29
+    lfd     %f30,  328(%r4)     # restore F30
+    lfd     %f31,  336(%r4)     # restore F31
+    lfd     %f0,   344(%r4)     # load FPSCR
+    mtfsf   0xff,  %f0          # restore FPSCR
+1:
 
     ld      %r13,  0(%r4)       # restore R13
     ld      %r14,  8(%r4)       # restore R14
@@ -167,27 +191,6 @@
     ld      %r0,   168(%r4)     # load LR
     mtlr    %r0                 # restore LR
 
-    lfd     %f14,  200(%r4)     # restore F14
-    lfd     %f15,  208(%r4)     # restore F15
-    lfd     %f16,  216(%r4)     # restore F16
-    lfd     %f17,  224(%r4)     # restore F17
-    lfd     %f18,  232(%r4)     # restore F18
-    lfd     %f19,  240(%r4)     # restore F19
-    lfd     %f20,  248(%r4)     # restore F20
-    lfd     %f21,  256(%r4)     # restore F21
-    lfd     %f22,  264(%r4)     # restore F22
-    lfd     %f23,  272(%r4)     # restore F23
-    lfd     %f24,  280(%r4)     # restore F24
-    lfd     %f25,  288(%r4)     # restore F25
-    lfd     %f26,  296(%r4)     # restore F26
-    lfd     %f27,  304(%r4)     # restore F27
-    lfd     %f28,  312(%r4)     # restore F28
-    lfd     %f29,  320(%r4)     # restore F29
-    lfd     %f30,  328(%r4)     # restore F30
-    lfd     %f31,  336(%r4)     # restore F31
-    lfd     %f0,   344(%r4)     # load FPSCR
-    mtfsf   0xff,  %f0          # restore FPSCR
-
     mr.     %r3,   %r5          # use third arg as return value after jump
                                 # and as first arg in context function
 
Modified: trunk/libs/context/src/asm/fcontext_x86_64_ms_pe_masm.asm
==============================================================================
--- trunk/libs/context/src/asm/fcontext_x86_64_ms_pe_masm.asm	(original)
+++ trunk/libs/context/src/asm/fcontext_x86_64_ms_pe_masm.asm	2012-04-23 04:12:19 EDT (Mon, 23 Apr 2012)
@@ -107,6 +107,9 @@
     mov     rax,         [r10+018h] ; load fiber local storage
     mov     [rcx+060h],  rax        ; save fiber local storage
 
+    cmp     r9,          0
+    je      1f
+
     stmxcsr [rcx+068h]              ; save MMX control and status word
     fnstcw  [rcx+06ch]              ; save x87 control word
         mov	    r10,         [rcx+070h] ; address of aligned XMM storage
@@ -121,6 +124,21 @@
     movaps  [r10+080h],  xmm14
     movaps  [r10+090h],  xmm15
 
+    ldmxcsr [rdx+068h]              ; restore MMX control and status word
+    fldcw   [rdx+06ch]              ; restore x87 control word
+	mov	    r10,         [rdx+070h] ; address of aligned XMM storage
+    movaps  xmm6,        [r10]
+    movaps  xmm7,        [r10+010h]
+    movaps  xmm8,        [r10+020h]
+    movaps  xmm9,        [r10+030h]
+    movaps  xmm10,       [r10+040h]
+    movaps  xmm11,       [r10+050h]
+    movaps  xmm12,       [r10+060h]
+    movaps  xmm13,       [r10+070h]
+    movaps  xmm14,       [r10+080h]
+    movaps  xmm15,       [r10+090h]
+1:
+
     lea     rax,         [rsp+08h]  ; exclude the return address
     mov     [rcx+040h],  rax        ; save as stack pointer
     mov     rax,         [rsp]      ; load return address
@@ -143,20 +161,6 @@
     mov     rax,        [rdx+060h]  ; load fiber local storage
     mov     [r10+018h], rax         ; restore fiber local storage
 
-    ldmxcsr [rdx+068h]              ; restore MMX control and status word
-    fldcw   [rdx+06ch]              ; restore x87 control word
-	mov	    r10,         [rdx+070h] ; address of aligned XMM storage
-    movaps  xmm6,        [r10]
-    movaps  xmm7,        [r10+010h]
-    movaps  xmm8,        [r10+020h]
-    movaps  xmm9,        [r10+030h]
-    movaps  xmm10,       [r10+040h]
-    movaps  xmm11,       [r10+050h]
-    movaps  xmm12,       [r10+060h]
-    movaps  xmm13,       [r10+070h]
-    movaps  xmm14,       [r10+080h]
-    movaps  xmm15,       [r10+090h]
-
     mov     rsp,        [rdx+040h]  ; restore RSP
     mov     r10,        [rdx+048h]  ; fetch the address to returned to
 
Modified: trunk/libs/context/src/asm/fcontext_x86_64_sysv_elf_gas.S
==============================================================================
--- trunk/libs/context/src/asm/fcontext_x86_64_sysv_elf_gas.S	(original)
+++ trunk/libs/context/src/asm/fcontext_x86_64_sysv_elf_gas.S	2012-04-23 04:12:19 EDT (Mon, 23 Apr 2012)
@@ -50,13 +50,20 @@
     movq     %r15,       0x20(%rdi)     /* save R15 */
     movq     %rbp,       0x28(%rdi)     /* save RBP */
 
-    stmxcsr  0x50(%rdi)                 /* save MMX control and status word */
-    fnstcw   0x54(%rdi)                 /* save x87 control word */
+    cmp      $0,         %rcx
+    je       1f
 
-    leaq     0x8(%rsp),  %rax           /* exclude the return address and save as stack pointer */
-    movq     %rax,       0x30(%rdi)     /* save as stack pointer */
-    movq     (%rsp),     %rax           /* save return address */
-    movq     %rax,       0x38(%rdi)     /* save return address as RIP */
+    stmxcsr  0x50(%rdi)             /* save MMX control and status word */
+    fnstcw   0x54(%rdi)             /* save x87 control word */
+
+    ldmxcsr  0x50(%rsi)             /* restore MMX control and status word */
+    fldcw    0x54(%rsi)             /* restore x87 control word */
+1:
+
+    leaq     0x8(%rsp),  %rax       /* exclude the return address and save as stack pointer */
+    movq     %rax,       0x30(%rdi) /* save as stack pointer */
+    movq     (%rsp),     %rax       /* save return address */
+    movq     %rax,       0x38(%rdi) /* save return address as RIP */
 
     movq     (%rsi),      %rbx      /* restore RBX */
     movq     0x8(%rsi),   %r12      /* restore R12 */
@@ -65,9 +72,6 @@
     movq     0x20(%rsi),  %r15      /* restore R15 */
     movq     0x28(%rsi),  %rbp      /* restore RBP */
 
-    ldmxcsr  0x50(%rsi)             /* restore MMX control and status word */
-    fldcw    0x54(%rsi)             /* restore x87 control word */
-
     movq     0x30(%rsi),  %rsp      /* restore RSP */
     movq     0x38(%rsi),  %rcx      /* fetch the address to return to */
 
Modified: trunk/libs/context/src/asm/fcontext_x86_64_sysv_macho_gas.S
==============================================================================
--- trunk/libs/context/src/asm/fcontext_x86_64_sysv_macho_gas.S	(original)
+++ trunk/libs/context/src/asm/fcontext_x86_64_sysv_macho_gas.S	2012-04-23 04:12:19 EDT (Mon, 23 Apr 2012)
@@ -49,13 +49,20 @@
     movq     %r15,       0x20(%rdi)     /* save R15 */
     movq     %rbp,       0x28(%rdi)     /* save RBP */
 
+    cmp      $0,         %rcx
+    je       1f
+
     stmxcsr  0x50(%rdi)             /* save MMX control and status word */
     fnstcw   0x54(%rdi)             /* save x87 control word */
 
-    leaq     0x8(%rsp),  %rax           /* exclude the return address and save as stack pointer */
-    movq     %rax,       0x30(%rdi)     /* save as stack pointer */
-    movq     (%rsp),     %rax           /* save return address */
-    movq     %rax,       0x38(%rdi)     /* save return address as RIP */
+    ldmxcsr  0x50(%rsi)             /* restore MMX control and status word */
+    fldcw    0x54(%rsi)             /* restore x87 control word */
+1:
+
+    leaq     0x8(%rsp),  %rax       /* exclude the return address and save as stack pointer */
+    movq     %rax,       0x30(%rdi) /* save as stack pointer */
+    movq     (%rsp),     %rax       /* save return address */
+    movq     %rax,       0x38(%rdi) /* save return address as RIP */
 
     movq     (%rsi),      %rbx      /* restore RBX */
     movq     0x8(%rsi),   %r12      /* restore R12 */
@@ -64,9 +71,6 @@
     movq     0x20(%rsi),  %r15      /* restore R15 */
     movq     0x28(%rsi),  %rbp      /* restore RBP */
 
-    ldmxcsr  0x50(%rsi)             /* restore MMX control and status word */
-    fldcw    0x54(%rsi)             /* restore x87 control word */
-
     movq     0x30(%rsi),  %rsp      /* restore RSP */
     movq     0x38(%rsi),  %rcx      /* fetch the address to return to */