aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2019-08-15 12:55:52 +0200
committerUros Bizjak <uros@gcc.gnu.org>2019-08-15 12:55:52 +0200
commitc839844a42e5386ea4ea5ef664bd9477cb69f58a (patch)
tree945a9a34cc23f236839dadf39c0f57a98dbb391a
parentc7cf3a9bb00b6d64ba0c0e0761f000758e9428a6 (diff)
downloadgcc-c839844a42e5386ea4ea5ef664bd9477cb69f58a.zip
gcc-c839844a42e5386ea4ea5ef664bd9477cb69f58a.tar.gz
gcc-c839844a42e5386ea4ea5ef664bd9477cb69f58a.tar.bz2
i386-features.c (general_scalar_chain::convert_insn): Revert 2019-08-14 change.
* config/i386/i386-features.c (general_scalar_chain::convert_insn) <case COMPARE>: Revert 2019-08-14 change. (convertible_comparison_p): Revert 2019-08-14 change. Return false for (TARGET_64BIT || mode != DImode). From-SVN: r274526
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/i386/i386-features.c26
2 files changed, 23 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4f9f044..f43819b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2019-08-15 Uroš Bizjak <ubizjak@gmail.com>
+
+ * config/i386/i386-features.c (general_scalar_chain::convert_insn)
+ <case COMPARE>: Revert 2019-08-14 change.
+ (convertible_comparison_p): Revert 2019-08-14 change. Return false
+ for (TARGET_64BIT || mode != DImode).
+
2019-08-15 Aldy Hernandez <aldyh@redhat.com>
* tree-vrp.c (value_range_base::set): Merge in code from
@@ -272,7 +279,7 @@
* config/i386/i386-expand.c (ix86_expand_vector_init_one_nonzero)
<case E_V8QImode>: Use vector_set path for
TARGET_MMX_WITH_SSE && TARGET_SSE4_1.
- (ix86_expand_vector_init_one_nonzero) <case E_V8QImode>:
+ (ix86_expand_vector_init_one_var) <case E_V8QImode>:
Do not widen for TARGET_MMX_WITH_SSE && TARGET_SSE4_1.
2019-08-14 Bernd Edlinger <bernd.edlinger@hotmail.de>
diff --git a/gcc/config/i386/i386-features.c b/gcc/config/i386/i386-features.c
index 6884007..f45c47f 100644
--- a/gcc/config/i386/i386-features.c
+++ b/gcc/config/i386/i386-features.c
@@ -1030,11 +1030,11 @@ general_scalar_chain::convert_insn (rtx_insn *insn)
case COMPARE:
src = SUBREG_REG (XEXP (XEXP (src, 0), 0));
- gcc_assert ((REG_P (src) && GET_MODE (src) == GET_MODE_INNER (vmode))
- || (SUBREG_P (src) && GET_MODE (src) == vmode));
+ gcc_assert ((REG_P (src) && GET_MODE (src) == DImode)
+ || (SUBREG_P (src) && GET_MODE (src) == V2DImode));
if (REG_P (src))
- subreg = gen_rtx_SUBREG (vmode, src, 0);
+ subreg = gen_rtx_SUBREG (V2DImode, src, 0);
else
subreg = copy_rtx_if_shared (src);
emit_insn_before (gen_vec_interleave_lowv2di (copy_rtx_if_shared (subreg),
@@ -1273,8 +1273,12 @@ has_non_address_hard_reg (rtx_insn *insn)
(const_int 0 [0]))) */
static bool
-convertible_comparison_p (rtx_insn *insn, enum machine_mode mode)
+convertible_comparison_p (rtx_insn *insn, machine_mode mode)
{
+ /* ??? Currently convertible for double-word DImode chain only. */
+ if (TARGET_64BIT || mode != DImode)
+ return false;
+
if (!TARGET_SSE4_1)
return false;
@@ -1306,12 +1310,12 @@ convertible_comparison_p (rtx_insn *insn, enum machine_mode mode)
if (!SUBREG_P (op1)
|| !SUBREG_P (op2)
- || GET_MODE (op1) != mode
- || GET_MODE (op2) != mode
+ || GET_MODE (op1) != SImode
+ || GET_MODE (op2) != SImode
|| ((SUBREG_BYTE (op1) != 0
- || SUBREG_BYTE (op2) != GET_MODE_SIZE (mode))
+ || SUBREG_BYTE (op2) != GET_MODE_SIZE (SImode))
&& (SUBREG_BYTE (op2) != 0
- || SUBREG_BYTE (op1) != GET_MODE_SIZE (mode))))
+ || SUBREG_BYTE (op1) != GET_MODE_SIZE (SImode))))
return false;
op1 = SUBREG_REG (op1);
@@ -1319,13 +1323,13 @@ convertible_comparison_p (rtx_insn *insn, enum machine_mode mode)
if (op1 != op2
|| !REG_P (op1)
- || GET_MODE (op1) != GET_MODE_WIDER_MODE (mode).else_blk ())
+ || GET_MODE (op1) != DImode)
return false;
return true;
}
-/* The DImode version of scalar_to_vector_candidate_p. */
+/* The general version of scalar_to_vector_candidate_p. */
static bool
general_scalar_to_vector_candidate_p (rtx_insn *insn, enum machine_mode mode)
@@ -1344,7 +1348,7 @@ general_scalar_to_vector_candidate_p (rtx_insn *insn, enum machine_mode mode)
if (GET_CODE (src) == COMPARE)
return convertible_comparison_p (insn, mode);
- /* We are interested in DImode promotion only. */
+ /* We are interested in "mode" only. */
if ((GET_MODE (src) != mode
&& !CONST_INT_P (src))
|| GET_MODE (dst) != mode)