From 1c173a32b193c4c75062cc8c3953e329d5cd7e88 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Sun, 21 Sep 2014 17:13:14 +0200 Subject: [PATCH] i386.c (ix86_expand_call): Generate MS->SYSV extra clobbered registers using clobber_reg. * config/i386/i386.c (ix86_expand_call): Generate MS->SYSV extra clobbered registers using clobber_reg. Remove UNSPEC decoration. * config/i386/i386.md (unspec) : Remove. (*call_rex64_ms_sysv): Remove. (*call_value_rex64_ms_sysv): Ditto. * config/i386/predicates.md (call_rex64_ms_sysv_operation): Remove. testsuite/ChangeLog: * gcc.target/i386/avx-vzeroupper-16.c (dg-final): Remove check for call_value_rex64_ms_sysv. * gcc.target/i386/avx-vzeroupper-17.c (dg-final): Ditto. * gcc.target/i386/avx-vzeroupper-18.c (dg-final): Remove check for call_rex64_ms_sysv. From-SVN: r215428 --- gcc/ChangeLog | 9 ++++++ gcc/config/i386/i386.c | 14 ++++----- gcc/config/i386/i386.md | 20 ------------- gcc/config/i386/predicates.md | 30 ------------------- gcc/testsuite/ChangeLog | 8 +++++ .../gcc.target/i386/avx-vzeroupper-16.c | 1 - .../gcc.target/i386/avx-vzeroupper-17.c | 1 - .../gcc.target/i386/avx-vzeroupper-18.c | 1 - 8 files changed, 22 insertions(+), 62 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cb70297a823..b60797c0775 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2014-09-21 Uros Bizjak + + * config/i386/i386.c (ix86_expand_call): Generate MS->SYSV extra + clobbered registers using clobber_reg. Remove UNSPEC decoration. + * config/i386/i386.md (unspec) : Remove. + (*call_rex64_ms_sysv): Remove. + (*call_value_rex64_ms_sysv): Ditto. + * config/i386/predicates.md (call_rex64_ms_sysv_operation): Remove. + 2014-09-20 Joern Rennecke * config/epiphany/epiphany.md (sub_f_add_imm): Change constraint of diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 6337aa5b43b..c9324367c2b 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -24865,9 +24865,7 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1, rtx callarg2, rtx pop, bool sibcall) { - unsigned int const cregs_size - = ARRAY_SIZE (x86_64_ms_sysv_extra_clobbered_registers); - rtx vec[3 + cregs_size]; + rtx vec[3]; rtx use = NULL, call; unsigned int vec_len = 0; @@ -24930,18 +24928,16 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1, if (TARGET_64BIT_MS_ABI && (!callarg2 || INTVAL (callarg2) != -2)) { - unsigned i; - - vec[vec_len++] = gen_rtx_UNSPEC (VOIDmode, gen_rtvec (1, const0_rtx), - UNSPEC_MS_TO_SYSV_CALL); + int const cregs_size + = ARRAY_SIZE (x86_64_ms_sysv_extra_clobbered_registers); + int i; for (i = 0; i < cregs_size; i++) { int regno = x86_64_ms_sysv_extra_clobbered_registers[i]; enum machine_mode mode = SSE_REGNO_P (regno) ? TImode : DImode; - vec[vec_len++] - = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (mode, regno)); + clobber_reg (&use, gen_rtx_REG (mode, regno)); } } diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index d5588c80b2a..004302df4f0 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -106,7 +106,6 @@ UNSPEC_LD_MPIC ; load_macho_picbase UNSPEC_TRUNC_NOOP UNSPEC_DIV_ALREADY_SPLIT - UNSPEC_MS_TO_SYSV_CALL UNSPEC_PAUSE UNSPEC_LEA_ADDR UNSPEC_XBEGIN_ABORT @@ -11477,15 +11476,6 @@ "* return ix86_output_call_insn (insn, operands[0]);" [(set_attr "type" "call")]) -(define_insn "*call_rex64_ms_sysv" - [(match_parallel 2 "call_rex64_ms_sysv_operation" - [(call (mem:QI (match_operand:DI 0 "call_insn_operand" "rBwBz")) - (match_operand 1)) - (unspec [(const_int 0)] UNSPEC_MS_TO_SYSV_CALL)])] - "TARGET_64BIT && !SIBLING_CALL_P (insn)" - "* return ix86_output_call_insn (insn, operands[0]);" - [(set_attr "type" "call")]) - (define_insn "*sibcall" [(call (mem:QI (match_operand:W 0 "sibcall_insn_operand" "UBsBz")) (match_operand 1))] @@ -11693,16 +11683,6 @@ (match_dup 3))) (unspec [(const_int 0)] UNSPEC_PEEPSIB)])]) -(define_insn "*call_value_rex64_ms_sysv" - [(match_parallel 3 "call_rex64_ms_sysv_operation" - [(set (match_operand 0) - (call (mem:QI (match_operand:DI 1 "call_insn_operand" "rBwBz")) - (match_operand 2))) - (unspec [(const_int 0)] UNSPEC_MS_TO_SYSV_CALL)])] - "TARGET_64BIT && !SIBLING_CALL_P (insn)" - "* return ix86_output_call_insn (insn, operands[1]);" - [(set_attr "type" "callv")]) - (define_expand "call_value_pop" [(parallel [(set (match_operand 0) (call (match_operand:QI 1) diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md index 62970bea8c4..690bed5f70b 100644 --- a/gcc/config/i386/predicates.md +++ b/gcc/config/i386/predicates.md @@ -609,36 +609,6 @@ (and (not (match_test "TARGET_X32")) (match_operand 0 "sibcall_memory_operand")))) -;; Return true if OP is a call from MS ABI to SYSV ABI function. -(define_predicate "call_rex64_ms_sysv_operation" - (match_code "parallel") -{ - unsigned creg_size = ARRAY_SIZE (x86_64_ms_sysv_extra_clobbered_registers); - unsigned i; - - if ((unsigned) XVECLEN (op, 0) != creg_size + 2) - return false; - - for (i = 0; i < creg_size; i++) - { - rtx elt = XVECEXP (op, 0, i+2); - enum machine_mode mode; - unsigned regno; - - if (GET_CODE (elt) != CLOBBER - || GET_CODE (SET_DEST (elt)) != REG) - return false; - - regno = x86_64_ms_sysv_extra_clobbered_registers[i]; - mode = SSE_REGNO_P (regno) ? TImode : DImode; - - if (GET_MODE (SET_DEST (elt)) != mode - || REGNO (SET_DEST (elt)) != regno) - return false; - } - return true; -}) - ;; Match exactly zero. (define_predicate "const0_operand" (match_code "const_int,const_double,const_vector") diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0ec7ad7ffa9..61b15e08757 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2014-09-21 Uros Bizjak + + * gcc.target/i386/avx-vzeroupper-16.c (dg-final): Remove check + for call_value_rex64_ms_sysv. + * gcc.target/i386/avx-vzeroupper-17.c (dg-final): Ditto. + * gcc.target/i386/avx-vzeroupper-18.c (dg-final): Remove check + for call_rex64_ms_sysv. + 2014-09-20 Alessandro Fanfarillo Tobias Burnus diff --git a/gcc/testsuite/gcc.target/i386/avx-vzeroupper-16.c b/gcc/testsuite/gcc.target/i386/avx-vzeroupper-16.c index 66c8446686c..f445a6910b2 100644 --- a/gcc/testsuite/gcc.target/i386/avx-vzeroupper-16.c +++ b/gcc/testsuite/gcc.target/i386/avx-vzeroupper-16.c @@ -14,4 +14,3 @@ foo (void) } /* { dg-final { scan-assembler-times "avx_vzeroupper" 1 } } */ -/* { dg-final { scan-assembler-times "\\*call_value_rex64_ms_sysv" 1 } } */ diff --git a/gcc/testsuite/gcc.target/i386/avx-vzeroupper-17.c b/gcc/testsuite/gcc.target/i386/avx-vzeroupper-17.c index acb432945ec..6dc0dc05321 100644 --- a/gcc/testsuite/gcc.target/i386/avx-vzeroupper-17.c +++ b/gcc/testsuite/gcc.target/i386/avx-vzeroupper-17.c @@ -14,4 +14,3 @@ foo (void) } /* { dg-final { scan-assembler-times "avx_vzeroupper" 1 } } */ -/* { dg-final { scan-assembler-times "\\*call_value_rex64_ms_sysv" 1 } } */ diff --git a/gcc/testsuite/gcc.target/i386/avx-vzeroupper-18.c b/gcc/testsuite/gcc.target/i386/avx-vzeroupper-18.c index 6f67f3ee322..0749181fd2b 100644 --- a/gcc/testsuite/gcc.target/i386/avx-vzeroupper-18.c +++ b/gcc/testsuite/gcc.target/i386/avx-vzeroupper-18.c @@ -14,4 +14,3 @@ foo (void) } /* { dg-final { scan-assembler-not "avx_vzeroupper" } } */ -/* { dg-final { scan-assembler-times "\\*call_rex64_ms_sysv" 1 } } */ -- 2.30.2