Commit 9d74caf2 by H.J. Lu

i386: Use ix86_output_ssemov for SFmode TYPE_SSEMOV

There is no need to set mode attribute to V16SFmode since ix86_output_ssemov
can properly encode xmm16-xmm31 registers with and without AVX512VL.

gcc/

	PR target/89229
	* config/i386/i386.c (ix86_output_ssemov): Handle MODE_SI and
	MODE_SF.
	* config/i386/i386.md (*movsf_internal): Call ix86_output_ssemov
	for TYPE_SSEMOV.  Remove TARGET_PREFER_AVX256, TARGET_AVX512VL
	and ext_sse_reg_operand check.

gcc/testsuite/

	PR target/89229
	* gcc.target/i386/pr89229-6a.c: New test.
	* gcc.target/i386/pr89229-6b.c: Likewise.
	* gcc.target/i386/pr89229-6c.c: Likewise.
parent ced66da3
2020-03-15 H.J. Lu <hongjiu.lu@intel.com>
PR target/89229
* config/i386/i386.c (ix86_output_ssemov): Handle MODE_SI and
MODE_SF.
* config/i386/i386.md (*movsf_internal): Call ix86_output_ssemov
for TYPE_SSEMOV. Remove TARGET_PREFER_AVX256, TARGET_AVX512VL
and ext_sse_reg_operand check.
2020-03-15 Lewis Hyatt <lhyatt@gmail.com> 2020-03-15 Lewis Hyatt <lhyatt@gmail.com>
* common.opt: Avoid redundancy in the help text. * common.opt: Avoid redundancy in the help text.
......
...@@ -5127,12 +5127,21 @@ ix86_output_ssemov (rtx_insn *insn, rtx *operands) ...@@ -5127,12 +5127,21 @@ ix86_output_ssemov (rtx_insn *insn, rtx *operands)
else else
return "%vmovq\t{%1, %0|%0, %1}"; return "%vmovq\t{%1, %0|%0, %1}";
case MODE_SI:
return "%vmovd\t{%1, %0|%0, %1}";
case MODE_DF: case MODE_DF:
if (TARGET_AVX && REG_P (operands[0]) && REG_P (operands[1])) if (TARGET_AVX && REG_P (operands[0]) && REG_P (operands[1]))
return "vmovsd\t{%d1, %0|%0, %d1}"; return "vmovsd\t{%d1, %0|%0, %d1}";
else else
return "%vmovsd\t{%1, %0|%0, %1}"; return "%vmovsd\t{%1, %0|%0, %1}";
case MODE_SF:
if (TARGET_AVX && REG_P (operands[0]) && REG_P (operands[1]))
return "vmovss\t{%d1, %0|%0, %d1}";
else
return "%vmovss\t{%1, %0|%0, %1}";
case MODE_V1DF: case MODE_V1DF:
gcc_assert (!TARGET_AVX); gcc_assert (!TARGET_AVX);
return "movlpd\t{%1, %0|%0, %1}"; return "movlpd\t{%1, %0|%0, %1}";
......
...@@ -3490,24 +3490,7 @@ ...@@ -3490,24 +3490,7 @@
return standard_sse_constant_opcode (insn, operands); return standard_sse_constant_opcode (insn, operands);
case TYPE_SSEMOV: case TYPE_SSEMOV:
switch (get_attr_mode (insn)) return ix86_output_ssemov (insn, operands);
{
case MODE_SF:
if (TARGET_AVX && REG_P (operands[0]) && REG_P (operands[1]))
return "vmovss\t{%d1, %0|%0, %d1}";
return "%vmovss\t{%1, %0|%0, %1}";
case MODE_V16SF:
return "vmovaps\t{%g1, %g0|%g0, %g1}";
case MODE_V4SF:
return "%vmovaps\t{%1, %0|%0, %1}";
case MODE_SI:
return "%vmovd\t{%1, %0|%0, %1}";
default:
gcc_unreachable ();
}
case TYPE_MMXMOV: case TYPE_MMXMOV:
switch (get_attr_mode (insn)) switch (get_attr_mode (insn))
...@@ -3579,12 +3562,7 @@ ...@@ -3579,12 +3562,7 @@
better to maintain the whole registers in single format better to maintain the whole registers in single format
to avoid problems on using packed logical operations. */ to avoid problems on using packed logical operations. */
(eq_attr "alternative" "6") (eq_attr "alternative" "6")
(cond [(and (ior (not (match_test "TARGET_PREFER_AVX256")) (cond [(ior (match_test "TARGET_SSE_PARTIAL_REG_DEPENDENCY")
(not (match_test "TARGET_AVX512VL")))
(ior (match_operand 0 "ext_sse_reg_operand")
(match_operand 1 "ext_sse_reg_operand")))
(const_string "V16SF")
(ior (match_test "TARGET_SSE_PARTIAL_REG_DEPENDENCY")
(match_test "TARGET_SSE_SPLIT_REGS")) (match_test "TARGET_SSE_SPLIT_REGS"))
(const_string "V4SF") (const_string "V4SF")
] ]
......
2020-03-15 H.J. Lu <hongjiu.lu@intel.com>
PR target/89229
* gcc.target/i386/pr89229-6a.c: New test.
* gcc.target/i386/pr89229-6b.c: Likewise.
* gcc.target/i386/pr89229-6c.c: Likewise.
2020-03-15 Lewis Hyatt <lhyatt@gmail.com> 2020-03-15 Lewis Hyatt <lhyatt@gmail.com>
* gcc.misc-tests/help.exp: Adapt to new output for * gcc.misc-tests/help.exp: Adapt to new output for
......
/* { dg-do compile { target { ! ia32 } } } */
/* { dg-options "-O2 -march=skylake-avx512" } */
extern float d;
void
foo1 (float x)
{
register float xmm16 __asm ("xmm16") = x;
asm volatile ("" : "+v" (xmm16));
register float xmm17 __asm ("xmm17") = xmm16;
asm volatile ("" : "+v" (xmm17));
d = xmm17;
}
/* { dg-final { scan-assembler-not "%zmm\[0-9\]+" } } */
/* { dg-do compile { target { ! ia32 } } } */
/* { dg-options "-O2 -march=skylake-avx512 -mno-avx512vl" } */
#include "pr89229-6a.c"
/* { dg-final { scan-assembler-times "vmovaps\[^\n\r]*zmm1\[67]\[^\n\r]*zmm1\[67]" 1 } } */
/* { dg-do compile { target { ! ia32 } } } */
/* { dg-options "-O2 -march=skylake-avx512 -mprefer-vector-width=512" } */
#include "pr89229-6a.c"
/* { dg-final { scan-assembler-not "%zmm\[0-9\]+" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment