i386.c (ix86_canonicalize_comparison): New function.
authorUros Bizjak <uros@gcc.gnu.org>
Wed, 11 Oct 2017 21:15:59 +0000 (23:15 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Wed, 11 Oct 2017 21:15:59 +0000 (23:15 +0200)
* config/i386/i386.c (ix86_canonicalize_comparison): New function.
(TARGET_CANONICALIZE_COMPARISON): Define.

testsuite/ChangeLog:

* gcc.target/i386/387-ficom-2.c: New test.

From-SVN: r253663

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/387-ficom-2.c [new file with mode: 0644]

index deda4e554acd40b8d0c2c64d90c5228c4bb5b3ac..4e0d71e9435878af16b35c803018966a2d55e9c7 100644 (file)
@@ -1,3 +1,8 @@
+2017-10-11  Uros Bizjak  <ubizjak@gmail.com>
+
+       * config/i386/i386.c (ix86_canonicalize_comparison): New function.
+       (TARGET_CANONICALIZE_COMPARISON): Define.
+
 2017-10-11  Qing Zhao  <qing.zhao@oracle.com>
 
        PR target/81422
        (ix86_min_insn_size): ... this one; export.
        (core2i7_first_cycle_multipass_begin): Move to x86-tune-sched-core.c.
        (core2i7_first_cycle_multipass_issue): Move to x86-tune-sched-core.c.
-       (core2i7_first_cycle_multipass_backtrack): Move to x86-tune-sched-core.c.
+       (core2i7_first_cycle_multipass_backtrack): Move to
+       x86-tune-sched-core.c.
        (core2i7_first_cycle_multipass_end): Move to x86-tune-sched-core.c.
        (core2i7_first_cycle_multipass_fini): Move to x86-tune-sched-core.c.
        (ix86_sched_init_global): Break up logic to ix86_core2i7_init_hooks.
 
        * builtins.def (BUILT_IN_SETJMP): Revert latest change.
 
-2017-10-08  Jan Hubicka  <hubicka@ucw.cz>
 2017-10-08  Jan Hubicka  <hubicka@ucw.cz>
 
        * i386.c (ix86_expand_set_or_movmem): Disable 512bit loops for targets
        (znver1_cost): Set scalar reassoc width to 4 and vector to 3 and 6
        for int and fp.
        (atom_cost): Set reassociation width to 2.
-       (slm_cost, generic_cost): Set fp reassociation width to 2 and 1 otherwise.
+       (slm_cost, generic_cost): Set fp reassociation width
+       to 2 and 1 otherwise.
        (intel_cost): Set fp reassociation width to 4 and 1 otherwise.
        (core_cost): Set fp reassociation width to 4 and vector to 2.
        (ix86_reassociation_width): Rewrite using cost table; special case
        (class dom_opt_dom_walker): Initialize m_dummy_cond member in the
        class ctor.
        (pass_dominator:execute): Build the dummy_cond here and pass it
-       to the dom_opt_dom_walker ctor. 
+       to the dom_opt_dom_walker ctor.
        (test_for_singularity): New function.
 
 2017-09-30  Krister Walfridsson  <krister.walfridsson@gmail.com>
        * rs6000.md (allocate_stack): Handle -fstack-clash-protection.
        (probe_stack_range<P:mode>): Operand 0 is now early-clobbered.
        Add additional operand and pass it to output_probe_stack_range.
-    
+
 2017-09-25  Bin Cheng  <bin.cheng@arm.com>
 
        PR tree-optimization/82163
 
 2017-09-22  Sergey Shalnov  <sergey.shalnov@intel.com>
 
-        * config/i386/sse.md ("mov<mode>_internal"): Use <sseinsnmode>
+       * config/i386/sse.md ("mov<mode>_internal"): Use <sseinsnmode>
        mode attribute for TARGET_AVX512VL.
 
 2017-09-21  Sergey Shalnov  <sergey.shalnov@intel.com>
        (ix86_expand_prologue): Dump stack clash info as needed.
        Call ix86_adjust_stack_and_probe_stack_clash as needed.
 
-        * function.c (dump_stack_clash_frame_info): New function.
-        * function.h (dump_stack_clash_frame_info): Prototype.
-        (enum stack_clash_probes): New enum.
+       * function.c (dump_stack_clash_frame_info): New function.
+       * function.h (dump_stack_clash_frame_info): Prototype.
+       (enum stack_clash_probes): New enum.
 
        * config/alpha/alpha.c (alpha_expand_prologue): Also check
        flag_stack_clash_protection.
index ca060b529d2c74dc54d5862557bbdc63960fa4d8..d7482bc9a679bd1b44353d3706ad3ccaa306adff 100644 (file)
@@ -4792,6 +4792,30 @@ ix86_conditional_register_usage (void)
       fixed_regs[i] = call_used_regs[i] = 1, reg_names[i] = "";
 }
 
+/* Canonicalize a comparison from one we don't have to one we do have.  */
+
+static void
+ix86_canonicalize_comparison (int *code, rtx *op0, rtx *op1,
+                             bool op0_preserve_value)
+{
+  /* The order of operands in x87 ficom compare is forced by combine in
+     simplify_comparison () function. Float operator is treated as RTX_OBJ
+     with a precedence over other operators and is always put in the first
+     place. Swap condition and operands to match ficom instruction.  */
+  if (!op0_preserve_value
+      && GET_CODE (*op0) == FLOAT && MEM_P (XEXP (*op0, 0)) && REG_P (*op1))
+    {
+      enum rtx_code scode = swap_condition ((enum rtx_code) *code);
+
+      /* We are called only for compares that are split to SAHF instruction.
+        Ensure that we have setcc/jcc insn for the swapped condition.  */
+      if (ix86_fp_compare_code_to_integer (scode) != UNKNOWN)
+       {
+         std::swap (*op0, *op1);
+         *code = (int) scode;
+       }
+    }
+}
 \f
 /* Save the current options */
 
@@ -49649,6 +49673,9 @@ ix86_run_selftests (void)
 #undef TARGET_CONDITIONAL_REGISTER_USAGE
 #define TARGET_CONDITIONAL_REGISTER_USAGE ix86_conditional_register_usage
 
+#undef TARGET_CANONICALIZE_COMPARISON
+#define TARGET_CANONICALIZE_COMPARISON ix86_canonicalize_comparison
+
 #undef TARGET_LOOP_UNROLL_ADJUST
 #define TARGET_LOOP_UNROLL_ADJUST ix86_loop_unroll_adjust
 
index 7ea4bd22ac7889c2372abe941901a12576d908aa..a2daea4d8bdac93687c78d7aa655a6d319586c38 100644 (file)
@@ -1,3 +1,7 @@
+2017-10-11  Uros Bizjak  <ubizjak@gmail.com>
+
+       * gcc.target/i386/387-ficom-2.c: New test.
+
 2017-10-11  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/80421
@@ -18,7 +22,7 @@
 2017-10-11  Qing Zhao  <qing.zhao@oracle.com>
 
        PR target/81422
-       * gcc.target/aarch64/pr81422.C: New test.
+       * gcc.target/aarch64/pr81422.C: New test.
 
 2017-10-11  Vladimir Makarov  <vmakarov@redhat.com>
 
 
 2017-09-22  Sergey Shalnov  <sergey.shalnov@intel.com>
 
-        * gcc.target/i386/avx512f-constant-set.c: New test.
+       * gcc.target/i386/avx512f-constant-set.c: New test.
 
 2017-09-21  Sergey Shalnov  <sergey.shalnov@intel.com>
 
 
 2017-08-23  Richard Biener  <rguenther@suse.de>
 
-        PR target/81921
+       PR target/81921
        * gcc.target/i386/pr81921.c: New testcase.
 
 2017-08-23  Daniel Santos  <daniel.santos@pobox.com>
 
 2017-08-22  Yvan Roux  <yvan.roux@linaro.org>
 
-        PR c++/80287
-        * g++.dg/pr80287.C: New test.
+       PR c++/80287
+       * g++.dg/pr80287.C: New test.
 
 2017-08-22  Richard Biener  <rguenther@suse.de>
 
diff --git a/gcc/testsuite/gcc.target/i386/387-ficom-2.c b/gcc/testsuite/gcc.target/i386/387-ficom-2.c
new file mode 100644 (file)
index 0000000..4190eba
--- /dev/null
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target ia32 } */
+/* { dg-skip-if "" { *-*-* } { "-march=*" } { "-march=i386" } } */
+/* { dg-options "-Os -march=i386 -ffast-math -masm=att" } */
+
+#include "387-ficom-1.c"
+
+/* { dg-final { scan-assembler-times "ficomps" 3 } } */
+/* { dg-final { scan-assembler-times "ficompl" 3 } } */