Add x32 support to config/i386/morestack.S.
authorH.J. Lu <hongjiu.lu@intel.com>
Fri, 29 Jul 2011 04:09:17 +0000 (04:09 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Fri, 29 Jul 2011 04:09:17 +0000 (21:09 -0700)
2011-07-28  H.J. Lu  <hongjiu.lu@intel.com>

* config/i386/morestack.S (X86_64_SAVE_NEW_STACK_BOUNDARY): New.
Use X86_64_SAVE_NEW_STACK_BOUNDARY to save the new stack boundary
for x86-64.  Properly check __x86_64__ and __LP64__.

From-SVN: r176912

libgcc/ChangeLog
libgcc/config/i386/morestack.S

index 99235b78f62b5571aef1a3e3dcaab4e29c061097..d0b6d7deb71d7f47fe8f3e0fb72ebb613212f96d 100644 (file)
@@ -1,3 +1,9 @@
+2011-07-28  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * config/i386/morestack.S (X86_64_SAVE_NEW_STACK_BOUNDARY): New.
+       Use X86_64_SAVE_NEW_STACK_BOUNDARY to save the new stack boundary
+       for x86-64.  Properly check __x86_64__ and __LP64__.
+
 2010-07-28  H.J. Lu  <hongjiu.lu@intel.com>
 
        * config/i386/64/sfp-machine.h (_FP_W_TYPE): Always use _WIN64
index 16279c7800cf2865297af886678b94f16517e2bf..b09ac76d0601f76eea9b03a0ef1842cd301bfb57 100644 (file)
@@ -353,7 +353,13 @@ __morestack:
        # FIXME: The offset must match
        # TARGET_THREAD_SPLIT_STACK_OFFSET in
        # gcc/config/i386/linux64.h.
-       movq    %rax,%fs:0x70           # Save the new stack boundary.
+       # Macro to save the new stack boundary.
+#ifdef __LP64__
+#define X86_64_SAVE_NEW_STACK_BOUNDARY(reg)    movq    %r##reg,%fs:0x70
+#else
+#define X86_64_SAVE_NEW_STACK_BOUNDARY(reg)    movl    %e##reg,%fs:0x40
+#endif
+       X86_64_SAVE_NEW_STACK_BOUNDARY (ax)
 
        call    __morestack_unblock_signals
 
@@ -391,7 +397,7 @@ __morestack:
        subq    0(%rsp),%rax            # Subtract available space.
        addq    $BACKOFF,%rax           # Back off 1024 bytes.
 .LEHE0:
-       movq    %rax,%fs:0x70           # Save the new stack boundary.
+       X86_64_SAVE_NEW_STACK_BOUNDARY (ax)
 
        addq    $16,%rsp                # Remove values from stack.
 
@@ -433,7 +439,7 @@ __morestack:
        movq    %rbp,%rcx               # Get the stack pointer.
        subq    %rax,%rcx               # Subtract available space.
        addq    $BACKOFF,%rcx           # Back off 1024 bytes.
-       movq    %rcx,%fs:0x70           # Save new stack boundary.
+       X86_64_SAVE_NEW_STACK_BOUNDARY (cx)
        movq    (%rsp),%rdi             # Restore exception data for call.
 #ifdef __PIC__
        call    _Unwind_Resume@PLT      # Resume unwinding.
@@ -493,7 +499,7 @@ __x86.get_pc_thunk.bx:
        .section .data.DW.ref.__gcc_personality_v0,"awG",@progbits,DW.ref.__gcc_personality_v0,comdat
        .type   DW.ref.__gcc_personality_v0, @object
 DW.ref.__gcc_personality_v0:
-#ifndef __x86_64
+#ifndef __LP64__
        .align 4
        .size   DW.ref.__gcc_personality_v0, 4
        .long   __gcc_personality_v0
@@ -504,7 +510,7 @@ DW.ref.__gcc_personality_v0:
 #endif
 #endif
 
-#ifdef __x86_64__
+#if defined __x86_64__ && defined __LP64__
 
 # This entry point is used for the large model.  With this entry point
 # the upper 32 bits of %r10 hold the argument size and the lower 32
@@ -537,7 +543,7 @@ __morestack_large_model:
        .size   __morestack_large_model, . - __morestack_large_model
 #endif
 
-#endif /* __x86_64__ */
+#endif /* __x86_64__ && __LP64__ */
 
 # Initialize the stack test value when the program starts or when a
 # new thread starts.  We don't know how large the main stack is, so we
@@ -570,7 +576,7 @@ __stack_split_initialize:
 #else /* defined(__x86_64__) */
 
        leaq    -16000(%rsp),%rax       # We should have at least 16K.
-       movq    %rax,%fs:0x70
+       X86_64_SAVE_NEW_STACK_BOUNDARY (ax)
        movq    %rsp,%rdi
        movq    $16000,%rsi
 #ifdef __PIC__
@@ -592,7 +598,7 @@ __stack_split_initialize:
 
        .section        .ctors.65535,"aw",@progbits
 
-#ifndef __x86_64__
+#ifndef __LP64__
        .align  4
        .long   __stack_split_initialize
        .long   __morestack_load_mmap