From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 87341 invoked by alias); 6 Feb 2017 03:11:53 -0000 Mailing-List: contact gcc-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-owner@gcc.gnu.org Received: (qmail 85442 invoked by uid 89); 6 Feb 2017 03:10:31 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.3 required=5.0 tests=AWL,BAYES_00,SPF_NEUTRAL autolearn=no version=3.3.2 spammy=collisions, tmake_file, sk:540bfa9, 615 X-HELO: eggs.gnu.org Received: from eggs.gnu.org (HELO eggs.gnu.org) (208.118.235.92) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 06 Feb 2017 03:10:21 +0000 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1caZh3-0000Xd-7K for gcc@gcc.gnu.org; Sun, 05 Feb 2017 22:10:19 -0500 Received: from pb-smtp2.pobox.com ([64.147.108.71]:52046 helo=sasl.smtp.pobox.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1caZh3-0000XY-1B for gcc@gcc.gnu.org; Sun, 05 Feb 2017 22:10:17 -0500 Received: from sasl.smtp.pobox.com (unknown [127.0.0.1]) by pb-smtp2.pobox.com (Postfix) with ESMTP id 7B02B67154; Sun, 5 Feb 2017 22:10:16 -0500 (EST) Received: from pb-smtp2.nyi.icgroup.com (unknown [127.0.0.1]) by pb-smtp2.pobox.com (Postfix) with ESMTP id 68D8E67153; Sun, 5 Feb 2017 22:10:16 -0500 (EST) Received: from localhost.localdomain (unknown [76.215.41.237]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by pb-smtp2.pobox.com (Postfix) with ESMTPSA id 633E46714F; Sun, 5 Feb 2017 22:10:14 -0500 (EST) From: Daniel Santos To: gcc , Uros Bizjak , Jan Hubicka Subject: [PATCH 7/8] [i386] Add msabi pro/epilogue stubs to libgcc Date: Mon, 06 Feb 2017 03:11:00 -0000 Message-Id: <20170206031349.1440-7-daniel.santos@pobox.com> In-Reply-To: References: X-Pobox-Relay-ID: C80E7BF6-EC19-11E6-BBCD-A7617B1B28F4-06139138!pb-smtp2.pobox.com X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 64.147.108.71 X-IsSubscribed: yes X-SW-Source: 2017-02/txt/msg00014.txt.bz2 Adds libgcc/config/i386/i386-asm.h to manage common cpp and gas macros. Adds assembly stubs. 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) Signed-off-by: Daniel Santos --- libgcc/config.host | 2 +- libgcc/config/i386/i386-asm.h | 82 ++++++++++++++++++++++++++++++++++++++++++ libgcc/config/i386/resms64.S | 57 +++++++++++++++++++++++++++++ libgcc/config/i386/resms64f.S | 55 ++++++++++++++++++++++++++++ libgcc/config/i386/resms64fx.S | 57 +++++++++++++++++++++++++++++ libgcc/config/i386/resms64x.S | 59 ++++++++++++++++++++++++++++++ libgcc/config/i386/savms64.S | 57 +++++++++++++++++++++++++++++ libgcc/config/i386/savms64f.S | 55 ++++++++++++++++++++++++++++ libgcc/config/i386/t-msabi | 7 ++++ 9 files changed, 430 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 540bfa96358..6c497b13a27 100644 --- a/libgcc/config.host +++ b/libgcc/config.host @@ -1339,7 +1339,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 00000000000..c613e9fd83d --- /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-2017 Free Software Foundation, Inc. + Contributed by Daniel Santos + +This file is part of GCC. + +GCC 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. + +GCC 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 +. */ + +#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 00000000000..f47e2f066fb --- /dev/null +++ b/libgcc/config/i386/resms64.S @@ -0,0 +1,57 @@ +/* Epilogue stub for 64-bit ms/sysv clobbers: restore + Copyright (C) 2016-2017 Free Software Foundation, Inc. + Contributed by Daniel Santos + +This file is part of GCC. + +GCC 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. + +GCC 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 +. */ + +#ifdef __x86_64__ +#include "i386-asm.h" + +/* Epilogue routine for restoring 64-bit ms/sysv registers. */ + + .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 00000000000..817da60cf15 --- /dev/null +++ b/libgcc/config/i386/resms64f.S @@ -0,0 +1,55 @@ +/* Epilogue stub for 64-bit ms/sysv clobbers: restore (with hard frame pointer) + Copyright (C) 2016-2017 Free Software Foundation, Inc. + Contributed by Daniel Santos + +This file is part of GCC. + +GCC 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. + +GCC 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 +. */ + +#ifdef __x86_64__ +#include "i386-asm.h" + +/* Epilogue routine for restoring 64-bit ms/sysv registers when hard frame + pointer is used. */ + + .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 00000000000..5dba5848dee --- /dev/null +++ b/libgcc/config/i386/resms64fx.S @@ -0,0 +1,57 @@ +/* Epilogue stub for 64-bit ms/sysv clobbers: restore, leave and return + Copyright (C) 2016-2017 Free Software Foundation, Inc. + Contributed by Daniel Santos + +This file is part of GCC. + +GCC 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. + +GCC 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 +. */ + +#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 then returns + * from the function. */ + + .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 00000000000..7770447cf38 --- /dev/null +++ b/libgcc/config/i386/resms64x.S @@ -0,0 +1,59 @@ +/* Epilogue stub for 64-bit ms/sysv clobbers: restore and return + Copyright (C) 2016-2017 Free Software Foundation, Inc. + Contributed by Daniel Santos + +This file is part of GCC. + +GCC 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. + +GCC 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 +. */ + +#ifdef __x86_64__ +#include "i386-asm.h" + +/* Epilogue routine for restoring 64-bit ms/sysv registers and returning from + * function. */ + + .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 00000000000..2067dd8614f --- /dev/null +++ b/libgcc/config/i386/savms64.S @@ -0,0 +1,57 @@ +/* Prologue stub for 64-bit ms/sysv clobbers: save + Copyright (C) 2016-2017 Free Software Foundation, Inc. + Contributed by Daniel Santos + +This file is part of GCC. + +GCC 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. + +GCC 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 +. */ + +#ifdef __x86_64__ +#include "i386-asm.h" + +/* Prologue routine for saving 64-bit ms/sysv registers. */ + + .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 00000000000..81583b6eb68 --- /dev/null +++ b/libgcc/config/i386/savms64f.S @@ -0,0 +1,55 @@ +/* Prologue stub for 64-bit ms/sysv clobbers: save (with hard frame pointer) + Copyright (C) 2016-2017 Free Software Foundation, Inc. + Contributed by Daniel Santos + +This file is part of GCC. + +GCC 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. + +GCC 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 +. */ + +#ifdef __x86_64__ +#include "i386-asm.h" + +/* Prologue routine for saving 64-bit ms/sysv registers when realignment is + * needed or hard frame pointer used. */ + + .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 00000000000..dbb0fa0a697 --- /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.11.0