[Bug target/70721] Suboptimal code generated when using _mm_min_sd

hjl.tools at gmail dot com gcc-bugzilla@gcc.gnu.org
Tue Apr 19 02:46:00 GMT 2016


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70721

H.J. Lu <hjl.tools at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2016-04-19
                 CC|                            |ubizjak at gmail dot com
   Target Milestone|---                         |7.0
     Ever confirmed|0                           |1

--- Comment #1 from H.J. Lu <hjl.tools at gmail dot com> ---
This is NOT the fix.  But you should get the idea:

[hjl@gnu-6 pr70708]$ cat y.c
#include <emmintrin.h>

double
__attribute ((noinline, noclone))
foo (double a, double b)
{
   __m128d x = _mm_set_sd(a);
   __m128d y = _mm_set_sd(b);
   return _mm_cvtsd_f64(_mm_min_sd(x, y));
}
[hjl@gnu-6 pr70708]$ make y.s
/export/build/gnu/gcc/build-x86_64-linux/gcc/xgcc
-B/export/build/gnu/gcc/build-x86_64-linux/gcc/ -O2 -S -o y.s y.c
[hjl@gnu-6 pr70708]$ cat y.s
        .file   "y.c"
        .text
        .p2align 4,,15
        .globl  foo
        .type   foo, @function
foo:
.LFB525:
        .cfi_startproc
        minsd   %xmm1, %xmm0
        ret
        .cfi_endproc
.LFE525:
        .size   foo, .-foo
        .ident  "GCC: (GNU) 7.0.0 20160418 (experimental)"
        .section        .note.GNU-stack,"",@progbits
[hjl@gnu-6 pr70708]$ cat /tmp/x
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index a66cfc4..167a564 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -32934,7 +32934,7 @@ static const struct builtin_description bdesc_args[] =

   { OPTION_MASK_ISA_SSE2, CODE_FOR_sminv2df3, "__builtin_ia32_minpd",
IX86_BUILTIN_MINPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
   { OPTION_MASK_ISA_SSE2, CODE_FOR_smaxv2df3, "__builtin_ia32_maxpd",
IX86_BUILTIN_MAXPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
-  { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsminv2df3, "__builtin_ia32_minsd",
IX86_BUILTIN_MINSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
+  { OPTION_MASK_ISA_SSE2, CODE_FOR_xx_vmsminv2df3, "__builtin_ia32_minsd",
IX86_BUILTIN_MINSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
   { OPTION_MASK_ISA_SSE2, CODE_FOR_sse2_vmsmaxv2df3, "__builtin_ia32_maxsd",
IX86_BUILTIN_MAXSD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },

   { OPTION_MASK_ISA_SSE2, CODE_FOR_andv2df3, "__builtin_ia32_andpd",
IX86_BUILTIN_ANDPD, UNKNOWN, (int) V2DF_FTYPE_V2DF_V2DF },
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index 78c28c5..c8ce275 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -1656,6 +1656,28 @@
    (set_attr "prefix" "<round_saeonly_prefix>")
    (set_attr "mode" "<ssescalarmode>")])

+(define_insn "xx_vm<code>v2df3"
+  [(set (match_operand:V2DF 0 "register_operand" "=x,v")
+        (vec_concat:V2DF
+         (smaxmin:DF
+           (vec_select:DF
+             (match_operand:V2DF 1 "register_operand" "0,v")
+             (parallel [(const_int 0)]))
+           (vec_select:DF
+             (match_operand:V2DF 2 "vector_operand" "xm,vm")
+             (parallel [(const_int 0)])))
+         (vec_select:DF (match_dup 0)
+                        (parallel [(const_int 1)]))))]
+  "TARGET_SSE2"
+  "@
+   <maxmin_float>sd\t{%2, %0|%0, %2}
+   v<maxmin_float>sd\t{%2, %1, %0|%0, %1, %2}"
+  [(set_attr "isa" "noavx,avx")
+   (set_attr "type" "sse")
+   (set_attr "prefix" "orig,vex")
+   (set_attr "btver2_sse_attr" "maxmin")
+   (set_attr "mode" "DF")])
+
 ;; These versions of the min/max patterns implement exactly the operations
 ;;   min = (op1 < op2 ? op1 : op2)
 ;;   max = (!(op1 < op2) ? op1 : op2)
[hjl@gnu-6 pr70708]$


More information about the Gcc-bugs mailing list