Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r78155 - trunk/libs/context/src/asm
From: oliver.kowalke_at_[hidden]
Date: 2012-04-23 07:48:48


Author: olli
Date: 2012-04-23 07:48:47 EDT (Mon, 23 Apr 2012)
New Revision: 78155
URL: http://svn.boost.org/trac/boost/changeset/78155

Log:
context: fpu enve preserving in i386 too

Text files modified:
   trunk/libs/context/src/asm/fcontext_i386_ms_pe_masm.asm | 32 ++++++++++++++++++--------------
   trunk/libs/context/src/asm/fcontext_i386_sysv_elf_gas.S | 38 ++++++++++++++++++++------------------
   trunk/libs/context/src/asm/fcontext_i386_sysv_macho_gas.S | 38 ++++++++++++++++++++------------------
   3 files changed, 58 insertions(+), 50 deletions(-)

Modified: trunk/libs/context/src/asm/fcontext_i386_ms_pe_masm.asm
==============================================================================
--- trunk/libs/context/src/asm/fcontext_i386_ms_pe_masm.asm (original)
+++ trunk/libs/context/src/asm/fcontext_i386_ms_pe_masm.asm 2012-04-23 07:48:47 EDT (Mon, 23 Apr 2012)
@@ -72,15 +72,22 @@
     mov eax, [esp] ; load return address
     mov [ecx+014h], eax ; save return address
 
-; stmxcsr [ecx+028h] ; save MMX control word
-; fnstcw [ecx+02ch] ; save x87 control word
-
- mov ecx, [esp+08h] ; load address of the second fcontext_t arg
- mov edi, [ecx] ; restore EDI
- mov esi, [ecx+04h] ; restore ESI
- mov ebx, [ecx+08h] ; restore EBX
- mov ebp, [ecx+0ch] ; restore EBP
-
+ mov edx, [esp+08h] ; load address of the second fcontext_t arg
+ mov edi, [edx] ; restore EDI
+ mov esi, [edx+04h] ; restore ESI
+ mov ebx, [edx+08h] ; restore EBX
+ mov ebp, [edx+0ch] ; restore EBP
+
+ movl eax, [esp+010h] ; check if fpu enve preserving was requested
+ cmp 0, eax
+ je 1f
+
+ stmxcsr [ecx+028h] ; save MMX control word
+ fnstcw [ecx+02ch] ; save x87 control word
+ ldmxcsr [edx+028h] ; restore MMX control word
+ fldcw [edx+02ch] ; restore x87 control word
+1:
+ mov ecx, edx
     assume fs:nothing
     mov edx, fs:[018h] ; load NT_TIB
     assume fs:error
@@ -93,9 +100,6 @@
     mov eax, [ecx+024h] ; load fiber local storage
     mov [edx+010h], eax ; restore fiber local storage
 
-; ldmxcsr [ecx+028h] ; restore MMX control word
-; fldcw [ecx+02ch] ; restore x87 control word
-
     mov eax, [esp+0ch] ; use third arg as return value after jump
 
     mov esp, [ecx+010h] ; restore ESP
@@ -129,8 +133,8 @@
     lea ecx, [edx+08h] ; load address of next SEH item
     mov [eax+02ch], ecx ; save next SEH
 
-; stmxcsr [eax+028h] ; save MMX control word
-; fnstcw [eax+02ch] ; save x87 control word
+ stmxcsr [eax+028h] ; save MMX control word
+ fnstcw [eax+02ch] ; save x87 control word
 
     mov ecx, finish ; address of finish
     mov [edx], ecx

Modified: trunk/libs/context/src/asm/fcontext_i386_sysv_elf_gas.S
==============================================================================
--- trunk/libs/context/src/asm/fcontext_i386_sysv_elf_gas.S (original)
+++ trunk/libs/context/src/asm/fcontext_i386_sysv_elf_gas.S 2012-04-23 07:48:47 EDT (Mon, 23 Apr 2012)
@@ -42,31 +42,33 @@
     movl %ebx, 0x8(%ecx) /* save EBX */
     movl %ebp, 0xc(%ecx) /* save EBP */
 
-/* stmxcsr 0x20(%ecx) */ /* save MMX control and status word */
-/* fnstcw 0x24(%ecx) */ /* save x87 control word */
-
     leal 0x4(%esp), %eax /* exclude the return address */
     movl %eax, 0x10(%ecx) /* save as stack pointer */
     movl (%esp), %eax /* load return address */
     movl %eax, 0x14(%ecx) /* save return address */
 
-
- movl 0x8(%esp), %ecx /* load address of the second fcontext_t arg */
- movl (%ecx), %edi /* restore EDI */
- movl 0x4(%ecx), %esi /* restore ESI */
- movl 0x8(%ecx), %ebx /* restore EBX */
- movl 0xc(%ecx), %ebp /* restore EBP */
-
-/* ldmxcsr 0x20(%ecx) */ /* restore MMX control and status word */
-/* fldcw 0x24(%ecx) */ /* restore x87 control word */
-
+ movl 0x8(%esp), %edx /* load address of the second fcontext_t arg */
+ movl (%edx), %edi /* restore EDI */
+ movl 0x4(%edx), %esi /* restore ESI */
+ movl 0x8(%edx), %ebx /* restore EBX */
+ movl 0xc(%edx), %ebp /* restore EBP */
+
+ movl 0x10(%esp), %eax /* check if fpu enve preserving was requested */
+ cmp $0, %eax
+ je 1f
+
+ stmxcsr 0x20(%ecx) /* save MMX control and status word */
+ fnstcw 0x24(%ecx) /* save x87 control word */
+ ldmxcsr 0x20(%edx) /* restore MMX control and status word */
+ fldcw 0x24(%edx) /* restore x87 control word */
+1:
     movl 0xc(%esp), %eax /* use third arg as return value after jump */
 
- movl 0x10(%ecx), %esp /* restore ESP */
+ movl 0x10(%edx), %esp /* restore ESP */
     movl %eax, 0x4(%esp) /* use third arg as first arg in context function */
- movl 0x14(%ecx), %ecx /* fetch the address to return to */
+ movl 0x14(%edx), %edx /* fetch the address to return to */
 
- jmp *%ecx /* indirect jump to context */
+ jmp *%edx /* indirect jump to context */
 .size jump_fcontext,.-jump_fcontext
 
 .text
@@ -95,8 +97,8 @@
     leal -0x14(%edx), %edx /* reserve space for the last frame on stack, (ESP + 4) % 16 == 0 */
     movl %edx, 0x10(%eax) /* save the aligned stack base */
 
-; stmxcsr 0x20(%eax) /* save MMX control and status word */
-; fnstcw 0x24(%eax) /* save x87 control word */
+ stmxcsr 0x20(%eax) /* save MMX control and status word */
+ fnstcw 0x24(%eax) /* save x87 control word */
 
     call 2f
 2: popl %ecx /* address of label 2 */

Modified: trunk/libs/context/src/asm/fcontext_i386_sysv_macho_gas.S
==============================================================================
--- trunk/libs/context/src/asm/fcontext_i386_sysv_macho_gas.S (original)
+++ trunk/libs/context/src/asm/fcontext_i386_sysv_macho_gas.S 2012-04-23 07:48:47 EDT (Mon, 23 Apr 2012)
@@ -41,31 +41,33 @@
     movl %ebx, 0x8(%ecx) /* save EBX */
     movl %ebp, 0xc(%ecx) /* save EBP */
 
-/* stmxcsr 0x20(%ecx) */ /* save MMX control and status word */
-/* fnstcw 0x24(%ecx) */ /* save x87 control word */
-
     leal 0x4(%esp), %eax /* exclude the return address */
     movl %eax, 0x10(%ecx) /* save as stack pointer */
     movl (%esp), %eax /* load return address */
     movl %eax, 0x14(%ecx) /* save return address */
 
-
- movl 0x8(%esp), %ecx /* load address of the second fcontext_t arg */
- movl (%ecx), %edi /* restore EDI */
- movl 0x4(%ecx), %esi /* restore ESI */
- movl 0x8(%ecx), %ebx /* restore EBX */
- movl 0xc(%ecx), %ebp /* restore EBP */
-
-/* ldmxcsr 0x20(%ecx) */ /* restore MMX control and status word */
-/* fldcw 0x24(%ecx) */ /* restore x87 control word */
-
+ movl 0x8(%esp), %edx /* load address of the second fcontext_t arg */
+ movl (%edx), %edi /* restore EDI */
+ movl 0x4(%edx), %esi /* restore ESI */
+ movl 0x8(%edx), %ebx /* restore EBX */
+ movl 0xc(%edx), %ebp /* restore EBP */
+
+ movl 0x10(%esp), %eax /* check if fpu enve preserving was requested */
+ cmp $0, %eax
+ je 1f
+
+ stmxcsr 0x20(%ecx) /* save MMX control and status word */
+ fnstcw 0x24(%ecx) /* save x87 control word */
+ ldmxcsr 0x20(%edx) /* restore MMX control and status word */
+ fldcw 0x24(%edx) /* restore x87 control word */
+1:
     movl 0xc(%esp), %eax /* use third arg as return value after jump */
 
- movl 0x10(%ecx), %esp /* restore ESP */
+ movl 0x10(%edx), %esp /* restore ESP */
     movl %eax, 0x4(%esp) /* use third arg as first arg in context function */
- movl 0x14(%ecx), %ecx /* fetch the address to return to */
+ movl 0x14(%edx), %edx /* fetch the address to return to */
 
- jmp *%ecx /* indirect jump to context */
+ jmp *%edx /* indirect jump to context */
 
 .text
 .globl _make_fcontext
@@ -92,8 +94,8 @@
     leal -0x14(%edx), %edx /* reserve space for the last frame on stack, (ESP + 4) % 16 == 0 */
     movl %edx, 0x10(%eax) /* save the aligned stack base */
 
-; stmxcsr 0x20(%eax) /* save MMX control and status word */
-; fnstcw 0x24(%eax) /* save x87 control word */
+ stmxcsr 0x20(%eax) /* save MMX control and status word */
+ fnstcw 0x24(%eax) /* save x87 control word */
 
     call 2f
 2: popl %ecx /* address of label 2 */


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk