aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2014-09-21 17:13:14 +0200
committerUros Bizjak <uros@gcc.gnu.org>2014-09-21 17:13:14 +0200
commit1c173a32b193c4c75062cc8c3953e329d5cd7e88 (patch)
treed1a5ebfb093cb66d6fd22ec255f0f3ce2ed508ca
parent1dc7b1f2086931a2b885ebb3cd09cc7a7639c276 (diff)
downloadgcc-1c173a32b193c4c75062cc8c3953e329d5cd7e88.zip
gcc-1c173a32b193c4c75062cc8c3953e329d5cd7e88.tar.gz
gcc-1c173a32b193c4c75062cc8c3953e329d5cd7e88.tar.bz2
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) <UNSPEC_MS_TO_SYSV_CALL>: 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
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/i386/i386.c14
-rw-r--r--gcc/config/i386/i386.md20
-rw-r--r--gcc/config/i386/predicates.md30
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.target/i386/avx-vzeroupper-16.c1
-rw-r--r--gcc/testsuite/gcc.target/i386/avx-vzeroupper-17.c1
-rw-r--r--gcc/testsuite/gcc.target/i386/avx-vzeroupper-18.c1
8 files changed, 22 insertions, 62 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cb70297..b60797c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2014-09-21 Uros Bizjak <ubizjak@gmail.com>
+
+ * config/i386/i386.c (ix86_expand_call): Generate MS->SYSV extra
+ clobbered registers using clobber_reg. Remove UNSPEC decoration.
+ * config/i386/i386.md (unspec) <UNSPEC_MS_TO_SYSV_CALL>: 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 <joern.rennecke@embecosm.com>
* 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 6337aa5..c932436 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 d5588c8..004302d 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 62970be..690bed5 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 0ec7ad7..61b15e0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+2014-09-21 Uros Bizjak <ubizjak@gmail.com>
+
+ * 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 <fanfarillo.gcc@gmail.com>
Tobias Burnus <burnus@net-b.de>
diff --git a/gcc/testsuite/gcc.target/i386/avx-vzeroupper-16.c b/gcc/testsuite/gcc.target/i386/avx-vzeroupper-16.c
index 66c8446..f445a69 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 acb4329..6dc0dc0 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 6f67f3e..0749181 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 } } */