Adds libgcc/config/i386/i386-asm.h to manage common cpp and gas macros.
stubs use the following naming convention:

  (sav|res)ms64[f][x]

    save|res    Save or restore
    ms64        Avoid possible name collisions with future stubs
                (specific to 64-bit msabi --> sysv scenario)
    [f]         Variant for hard frame pointer (and stack realignment)
    [x]         Tail-call variant (is the return from function)
---
 libgcc/config.host             |  2 +-
 libgcc/config/i386/i386-asm.h  | 82 ++++++++++++++++++++++++++++++++++++++++++
 libgcc/config/i386/resms64.S   | 63 ++++++++++++++++++++++++++++++++
 libgcc/config/i386/resms64f.S  | 59 ++++++++++++++++++++++++++++++
 libgcc/config/i386/resms64fx.S | 61 +++++++++++++++++++++++++++++++
 libgcc/config/i386/resms64x.S  | 65 +++++++++++++++++++++++++++++++++
 libgcc/config/i386/savms64.S   | 63 ++++++++++++++++++++++++++++++++
 libgcc/config/i386/savms64f.S  | 64 +++++++++++++++++++++++++++++++++
 libgcc/config/i386/t-msabi     |  7 ++++
 9 files changed, 465 insertions(+), 1 deletion(-)
 create mode 100644 libgcc/config/i386/i386-asm.h
 create mode 100644 libgcc/config/i386/resms64.S
 create mode 100644 libgcc/config/i386/resms64f.S
 create mode 100644 libgcc/config/i386/resms64fx.S
 create mode 100644 libgcc/config/i386/resms64x.S
 create mode 100644 libgcc/config/i386/savms64.S
 create mode 100644 libgcc/config/i386/savms64f.S
 create mode 100644 libgcc/config/i386/t-msabi

diff --git a/libgcc/config.host b/libgcc/config.host
index 64beb21..07bb269 100644
--- a/libgcc/config.host
+++ b/libgcc/config.host
@@ -1335,7 +1335,7 @@ case ${host} in
 i[34567]86-*-linux* | x86_64-*-linux* | \
   i[34567]86-*-kfreebsd*-gnu | x86_64-*-kfreebsd*-gnu | \
   i[34567]86-*-gnu*)
-       tmake_file="${tmake_file} t-tls i386/t-linux t-slibgcc-libgcc"
+       tmake_file="${tmake_file} t-tls i386/t-linux i386/t-msabi 
t-slibgcc-libgcc"
        if test "$libgcc_cv_cfi" = "yes"; then
                tmake_file="${tmake_file} t-stack i386/t-stack-i386"
        fi
diff --git a/libgcc/config/i386/i386-asm.h b/libgcc/config/i386/i386-asm.h
new file mode 100644
index 0000000..73acf5c
--- /dev/null
+++ b/libgcc/config/i386/i386-asm.h
@@ -0,0 +1,82 @@
+/* Defines common perprocessor and assembly macros for use by various stubs.
+ *
+ *   Copyright (C) 2016 Free Software Foundation, Inc.
+ *   Written By Daniel Santos <daniel.san...@pobox.com>
+ *
+ * This file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 3, or (at your option) any
+ * later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * Under Section 7 of GPL version 3, you are granted additional
+ * permissions described in the GCC Runtime Library Exception, version
+ * 3.1, as published by the Free Software Foundation.
+ *
+ * You should have received a copy of the GNU General Public License and
+ * a copy of the GCC Runtime Library Exception along with this program;
+ * see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef I386_ASM_H
+#define I386_ASM_H
+
+#ifdef __ELF__
+# define ELFFN(fn) .type fn,@function
+#else
+# define ELFFN(fn)
+#endif
+
+#define FUNC_START(fn) \
+       .global fn;     \
+       ELFFN (fn);     \
+fn:
+
+#define HIDDEN_FUNC(fn)\
+       FUNC_START (fn) \
+       .hidden fn;     \
+
+#define FUNC_END(fn) .size fn,.-fn
+
+#ifdef __SSE2__
+# ifdef __AVX__
+#  define MOVAPS vmovaps
+# else
+#  define MOVAPS movaps
+# endif
+
+/* Save SSE registers 6-15. off is the offset of rax to get to xmm6.  */
+.macro SSE_SAVE off=0
+       MOVAPS %xmm15,(\off - 0x90)(%rax)
+       MOVAPS %xmm14,(\off - 0x80)(%rax)
+       MOVAPS %xmm13,(\off - 0x70)(%rax)
+       MOVAPS %xmm12,(\off - 0x60)(%rax)
+       MOVAPS %xmm11,(\off - 0x50)(%rax)
+       MOVAPS %xmm10,(\off - 0x40)(%rax)
+       MOVAPS %xmm9, (\off - 0x30)(%rax)
+       MOVAPS %xmm8, (\off - 0x20)(%rax)
+       MOVAPS %xmm7, (\off - 0x10)(%rax)
+       MOVAPS %xmm6, \off(%rax)
+.endm
+
+/* Restore SSE registers 6-15. off is the offset of rsi to get to xmm6.  */
+.macro SSE_RESTORE off=0
+       MOVAPS (\off - 0x90)(%rsi), %xmm15
+       MOVAPS (\off - 0x80)(%rsi), %xmm14
+       MOVAPS (\off - 0x70)(%rsi), %xmm13
+       MOVAPS (\off - 0x60)(%rsi), %xmm12
+       MOVAPS (\off - 0x50)(%rsi), %xmm11
+       MOVAPS (\off - 0x40)(%rsi), %xmm10
+       MOVAPS (\off - 0x30)(%rsi), %xmm9
+       MOVAPS (\off - 0x20)(%rsi), %xmm8
+       MOVAPS (\off - 0x10)(%rsi), %xmm7
+       MOVAPS \off(%rsi), %xmm6
+.endm
+
+#endif /* __SSE2__ */
+#endif /* I386_ASM_H */
diff --git a/libgcc/config/i386/resms64.S b/libgcc/config/i386/resms64.S
new file mode 100644
index 0000000..57065ba
--- /dev/null
+++ b/libgcc/config/i386/resms64.S
@@ -0,0 +1,63 @@
+/* Epilogue stub for 64-bit ms/sysv clobbers: restore
+ *
+ *   Copyright (C) 2016 Free Software Foundation, Inc.
+ *   Written By Daniel Santos <daniel.san...@pobox.com>
+ *
+ * This file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 3, or (at your option) any
+ * later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * Under Section 7 of GPL version 3, you are granted additional
+ * permissions described in the GCC Runtime Library Exception, version
+ * 3.1, as published by the Free Software Foundation.
+ *
+ * You should have received a copy of the GNU General Public License and
+ * a copy of the GCC Runtime Library Exception along with this program;
+ * see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef __x86_64__
+#include "i386-asm.h"
+
+/* Epilogue routine for restoring 64-bit ms/sysv registers.
+ *
+ * typical use:
+ * lea         xxx(%rsp), %rsi         # xxx = SP adjustment to point to -0x70
+ *                                     # offset for data
+ * callq       __resms64_<nregs>
+ * subq                $xxx,%rsp               # xxx = SP adjustment to 
restore stack
+ */
+       .text
+HIDDEN_FUNC(__resms64_18)
+       mov     -0x70(%rsi),%r15
+HIDDEN_FUNC(__resms64_17)
+       mov     -0x68(%rsi),%r14
+HIDDEN_FUNC(__resms64_16)
+       mov     -0x60(%rsi),%r13
+HIDDEN_FUNC(__resms64_15)
+       mov     -0x58(%rsi),%r12
+HIDDEN_FUNC(__resms64_14)
+       mov     -0x50(%rsi),%rbp
+HIDDEN_FUNC(__resms64_13)
+       mov     -0x48(%rsi),%rbx
+HIDDEN_FUNC(__resms64_12)
+       mov     -0x40(%rsi),%rdi
+       SSE_RESTORE off=0x60
+       mov     -0x38(%rsi),%rsi
+       ret
+FUNC_END(__resms64_12)
+FUNC_END(__resms64_13)
+FUNC_END(__resms64_14)
+FUNC_END(__resms64_15)
+FUNC_END(__resms64_16)
+FUNC_END(__resms64_17)
+FUNC_END(__resms64_18)
+
+#endif /* __x86_64__ */
diff --git a/libgcc/config/i386/resms64f.S b/libgcc/config/i386/resms64f.S
new file mode 100644
index 0000000..7317906
--- /dev/null
+++ b/libgcc/config/i386/resms64f.S
@@ -0,0 +1,59 @@
+/* Epilogue stub for 64-bit ms/sysv clobbers: restore (with hard frame pointer)
+ *
+ *   Copyright (C) 2016 Free Software Foundation, Inc.
+ *   Written By Daniel Santos <daniel.san...@pobox.com>
+ *
+ * This file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 3, or (at your option) any
+ * later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * Under Section 7 of GPL version 3, you are granted additional
+ * permissions described in the GCC Runtime Library Exception, version
+ * 3.1, as published by the Free Software Foundation.
+ *
+ * You should have received a copy of the GNU General Public License and
+ * a copy of the GCC Runtime Library Exception along with this program;
+ * see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef __x86_64__
+#include "i386-asm.h"
+
+/* Epilogue routine for restoring 64-bit ms/sysv registers when hard frame
+ * pointer is  used.
+ *
+ * TODO: Will this routine ever be used? Hard frame pointers disable sibling
+ * calls, in which case the epilogue will use the "x" (returning from fn)
+ * version of the stub.
+ */
+       .text
+HIDDEN_FUNC(__resms64f_17)
+       mov     -0x68(%rsi),%r15
+HIDDEN_FUNC(__resms64f_16)
+       mov     -0x60(%rsi),%r14
+HIDDEN_FUNC(__resms64f_15)
+       mov     -0x58(%rsi),%r13
+HIDDEN_FUNC(__resms64f_14)
+       mov     -0x50(%rsi),%r12
+HIDDEN_FUNC(__resms64f_13)
+       mov     -0x48(%rsi),%rbx
+HIDDEN_FUNC(__resms64f_12)
+       mov     -0x40(%rsi),%rdi
+       SSE_RESTORE off=0x60
+       mov     -0x38(%rsi),%rsi
+       ret
+FUNC_END(__resms64f_12)
+FUNC_END(__resms64f_13)
+FUNC_END(__resms64f_14)
+FUNC_END(__resms64f_15)
+FUNC_END(__resms64f_16)
+FUNC_END(__resms64f_17)
+
+#endif /* __x86_64__ */
diff --git a/libgcc/config/i386/resms64fx.S b/libgcc/config/i386/resms64fx.S
new file mode 100644
index 0000000..18a43b1
--- /dev/null
+++ b/libgcc/config/i386/resms64fx.S
@@ -0,0 +1,61 @@
+/* Epilogue stub for 64-bit ms/sysv clobbers: restore, leave and return
+ *
+ *   Copyright (C) 2016 Free Software Foundation, Inc.
+ *   Written By Daniel Santos <daniel.san...@pobox.com>
+ *
+ * This file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 3, or (at your option) any
+ * later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * Under Section 7 of GPL version 3, you are granted additional
+ * permissions described in the GCC Runtime Library Exception, version
+ * 3.1, as published by the Free Software Foundation.
+ *
+ * You should have received a copy of the GNU General Public License and
+ * a copy of the GCC Runtime Library Exception along with this program;
+ * see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef __x86_64__
+#include "i386-asm.h"
+
+/* Epilogue routine for 64-bit ms/sysv registers when hard frame pointer
+ * used -- restores registers, restores frame pointer and return from the
+ * function.
+ *
+ * typical use:
+ * lea    xxx(%rsp),%rsi
+ * jmp    __resms64fx_<nregs>
+ */
+       .text
+HIDDEN_FUNC(__resms64fx_17)
+       mov     -0x68(%rsi),%r15
+HIDDEN_FUNC(__resms64fx_16)
+       mov     -0x60(%rsi),%r14
+HIDDEN_FUNC(__resms64fx_15)
+       mov     -0x58(%rsi),%r13
+HIDDEN_FUNC(__resms64fx_14)
+       mov     -0x50(%rsi),%r12
+HIDDEN_FUNC(__resms64fx_13)
+       mov     -0x48(%rsi),%rbx
+HIDDEN_FUNC(__resms64fx_12)
+       mov     -0x40(%rsi),%rdi
+       SSE_RESTORE off=0x60
+       mov     -0x38(%rsi),%rsi
+       leaveq
+       ret
+FUNC_END(__resms64fx_12)
+FUNC_END(__resms64fx_13)
+FUNC_END(__resms64fx_14)
+FUNC_END(__resms64fx_15)
+FUNC_END(__resms64fx_16)
+FUNC_END(__resms64fx_17)
+
+#endif /* __x86_64__ */
diff --git a/libgcc/config/i386/resms64x.S b/libgcc/config/i386/resms64x.S
new file mode 100644
index 0000000..bec02f0
--- /dev/null
+++ b/libgcc/config/i386/resms64x.S
@@ -0,0 +1,65 @@
+/* Epilogue stub for 64-bit ms/sysv clobbers: restore and return
+ *
+ *   Copyright (C) 2016 Free Software Foundation, Inc.
+ *   Written By Daniel Santos <daniel.san...@pobox.com>
+ *
+ * This file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 3, or (at your option) any
+ * later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * Under Section 7 of GPL version 3, you are granted additional
+ * permissions described in the GCC Runtime Library Exception, version
+ * 3.1, as published by the Free Software Foundation.
+ *
+ * You should have received a copy of the GNU General Public License and
+ * a copy of the GCC Runtime Library Exception along with this program;
+ * see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef __x86_64__
+#include "i386-asm.h"
+
+/* Epilogue routine for restoring 64-bit ms/sysv registers and returning from
+ * function.
+ *
+ * typical use:
+ * lea    xxx(%rsp), %rsi      # xxx = SP adjustment to point to -0x70 offset
+ *                             # for data
+ * lea    xxx(%rsp), r10       # xxx = SP adjustment to restore stack
+ * jmp    __resms64x_<nregs>
+ */
+       .text
+HIDDEN_FUNC(__resms64x_18)
+       mov     -0x70(%rsi),%r15
+HIDDEN_FUNC(__resms64x_17)
+       mov     -0x68(%rsi),%r14
+HIDDEN_FUNC(__resms64x_16)
+       mov     -0x60(%rsi),%r13
+HIDDEN_FUNC(__resms64x_15)
+       mov     -0x58(%rsi),%r12
+HIDDEN_FUNC(__resms64x_14)
+       mov     -0x50(%rsi),%rbp
+HIDDEN_FUNC(__resms64x_13)
+       mov     -0x48(%rsi),%rbx
+HIDDEN_FUNC(__resms64x_12)
+       mov     -0x40(%rsi),%rdi
+       SSE_RESTORE off=0x60
+       mov     -0x38(%rsi),%rsi
+       mov     %r10,%rsp
+       ret
+FUNC_END(__resms64x_12)
+FUNC_END(__resms64x_13)
+FUNC_END(__resms64x_14)
+FUNC_END(__resms64x_15)
+FUNC_END(__resms64x_16)
+FUNC_END(__resms64x_17)
+FUNC_END(__resms64x_18)
+
+#endif /* __x86_64__ */
diff --git a/libgcc/config/i386/savms64.S b/libgcc/config/i386/savms64.S
new file mode 100644
index 0000000..18bd6f1
--- /dev/null
+++ b/libgcc/config/i386/savms64.S
@@ -0,0 +1,63 @@
+/* Prologue stub for 64-bit ms/sysv clobbers: save
+ *
+ *   Copyright (C) 2016 Free Software Foundation, Inc.
+ *   Written By Daniel Santos <daniel.san...@pobox.com>
+ *
+ * This file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 3, or (at your option) any
+ * later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * Under Section 7 of GPL version 3, you are granted additional
+ * permissions described in the GCC Runtime Library Exception, version
+ * 3.1, as published by the Free Software Foundation.
+ *
+ * You should have received a copy of the GNU General Public License and
+ * a copy of the GCC Runtime Library Exception along with this program;
+ * see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef __x86_64__
+#include "i386-asm.h"
+
+/* Prologue routine for saving 64-bit ms/sysv registers.
+ *
+ * typical use:
+ * lea    -xxx(%rsp), %rax     # xxx is 0x70 or 0x78 (depending upon incoming
+ *                             # stack alignment offset)
+ * subq   $xxx, %rsp           # xxx is however much stack space the fn needs
+ * callq  __savms64_<nregs>
+ */
+       .text
+HIDDEN_FUNC(__savms64_18)
+       mov     %r15,-0x70(%rax)
+HIDDEN_FUNC(__savms64_17)
+       mov     %r14,-0x68(%rax)
+HIDDEN_FUNC(__savms64_16)
+       mov     %r13,-0x60(%rax)
+HIDDEN_FUNC(__savms64_15)
+       mov     %r12,-0x58(%rax)
+HIDDEN_FUNC(__savms64_14)
+       mov     %rbp,-0x50(%rax)
+HIDDEN_FUNC(__savms64_13)
+       mov     %rbx,-0x48(%rax)
+HIDDEN_FUNC(__savms64_12)
+       mov     %rdi,-0x40(%rax)
+       mov     %rsi,-0x38(%rax)
+       SSE_SAVE off=0x60
+       ret
+FUNC_END(__savms64_12)
+FUNC_END(__savms64_13)
+FUNC_END(__savms64_14)
+FUNC_END(__savms64_15)
+FUNC_END(__savms64_16)
+FUNC_END(__savms64_17)
+FUNC_END(__savms64_18)
+
+#endif /* __x86_64__ */
diff --git a/libgcc/config/i386/savms64f.S b/libgcc/config/i386/savms64f.S
new file mode 100644
index 0000000..f1e4a41
--- /dev/null
+++ b/libgcc/config/i386/savms64f.S
@@ -0,0 +1,64 @@
+/* Prologue stub for 64-bit ms/sysv clobbers: save (with hard frame pointer)
+ *
+ *   Copyright (C) 2016 Free Software Foundation, Inc.
+ *   Written By Daniel Santos <daniel.san...@pobox.com>
+ *
+ * This file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 3, or (at your option) any
+ * later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * Under Section 7 of GPL version 3, you are granted additional
+ * permissions described in the GCC Runtime Library Exception, version
+ * 3.1, as published by the Free Software Foundation.
+ *
+ * You should have received a copy of the GNU General Public License and
+ * a copy of the GCC Runtime Library Exception along with this program;
+ * see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#ifdef __x86_64__
+#include "i386-asm.h"
+
+/* Prologue routine for saving 64-bit ms/sysv registers when realignment is
+ * needed and hard frame pointer used.
+ *
+ * typical use:
+ * push   %rbp
+ * mov    %rsp,%rbp
+ * lea    -xxx(%rsp), %rax     # xxx is 0x70 or 0x78 (depending upon incoming
+ *                             # stack alignment offset)
+ * and    $0xfffffffffffffff0,%rax
+ * lea    -xxx(%rax),%rsp      # xxx additional stack space is needed
+ * callq  __savms64f_<nregs>
+ */
+       .text
+HIDDEN_FUNC(__savms64f_17)
+       mov     %r15,-0x68(%rax)
+HIDDEN_FUNC(__savms64f_16)
+       mov     %r14,-0x60(%rax)
+HIDDEN_FUNC(__savms64f_15)
+       mov     %r13,-0x58(%rax)
+HIDDEN_FUNC(__savms64f_14)
+       mov     %r12,-0x50(%rax)
+HIDDEN_FUNC(__savms64f_13)
+       mov     %rbx,-0x48(%rax)
+HIDDEN_FUNC(__savms64f_12)
+       mov     %rdi,-0x40(%rax)
+       mov     %rsi,-0x38(%rax)
+       SSE_SAVE off=0x60
+       ret
+FUNC_END(__savms64f_12)
+FUNC_END(__savms64f_13)
+FUNC_END(__savms64f_14)
+FUNC_END(__savms64f_15)
+FUNC_END(__savms64f_16)
+FUNC_END(__savms64f_17)
+
+#endif /* __x86_64__ */
diff --git a/libgcc/config/i386/t-msabi b/libgcc/config/i386/t-msabi
new file mode 100644
index 0000000..dbb0fa0
--- /dev/null
+++ b/libgcc/config/i386/t-msabi
@@ -0,0 +1,7 @@
+# Makefile fragment to support -foutline-msabi-xlogue
+LIB2ADD_ST += $(srcdir)/config/i386/savms64.S \
+             $(srcdir)/config/i386/resms64.S \
+             $(srcdir)/config/i386/resms64x.S \
+             $(srcdir)/config/i386/savms64f.S \
+             $(srcdir)/config/i386/resms64f.S \
+             $(srcdir)/config/i386/resms64fx.S
-- 
2.9.0

Reply via email to