aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/i386/sync.md
AgeCommit message (Collapse)AuthorFilesLines
2020-07-24i386: Emit mfence_sse2 for -Os [PR95750]Uros Bizjak1-1/+2
2020-07-24 Uroš Bizjak <ubizjak@gmail.com> gcc/ChangeLog: PR target/95750 * config/i386/sync.md (mmem_thread_fence): Emit mfence_sse2 for -Os.
2020-07-21i386: Fix insn conditions of mfence patterns [PR95750]Uros Bizjak1-4/+2
2020-07-21 Uroš Bizjak <ubizjak@gmail.com> gcc/ChangeLog: PR target/95750 * config/i386/sync.md (mfence_sse2): Enable for TARGET_64BIT and TARGET_SSE2. (mfence_nosse): Always enable.
2020-07-20i386: Use lock prefixed insn instead of MFENCE [PR95750]Uros Bizjak1-7/+14
Currently, __atomic_thread_fence(seq_cst) on x86 and x86-64 generates mfence instruction. A dummy atomic instruction (a lock-prefixed instruction or xchg with a memory operand) would provide the same sequential consistency guarantees while being more efficient on most current CPUs. The mfence instruction additionally orders non-temporal stores, which is not relevant for atomic operations and are not ordered by seq_cst atomic operations anyway. 2020-07-20 Uroš Bizjak <ubizjak@gmail.com> gcc/ChangeLog: PR target/95750 * config/i386/i386.h (TARGET_AVOID_MFENCE): Rename from TARGET_USE_XCHG_FOR_ATOMIC_STORE. * config/i386/sync.md (mfence_sse2): Disable for TARGET_AVOID_MFENCE. (mfence_nosse): Enable also for TARGET_AVOID_MFENCE. Emit stack referred memory in word_mode. (mem_thread_fence): Do not generate mfence_sse2 pattern when TARGET_AVOID_MFENCE is true. (atomic_store<mode>): Update for rename. * config/i386/x86-tune.def (X86_TUNE_AVOID_MFENCE): Rename from X86_TUNE_USE_XCHG_FOR_ATOMIC_STORE. gcc/testsuite/ChangeLog: PR target/95750 * gcc.target/i386/pr95750.c: New test.
2020-07-16i386: Additional peephole2 to use flags from CMPXCHG more [PR96189]Uros Bizjak1-0/+34
CMPXCHG instruction sets ZF flag if the values in the destination operand and EAX register are equal; otherwise the ZF flag is cleared and value from destination operand is loaded to EAX. Following assembly: xorl %eax, %eax lock cmpxchgl %edx, (%rdi) testl %eax, %eax sete %al can be optimized by removing the unneeded comparison, since set ZF flag signals that no update to EAX happened. This patch adds peephole2 pattern to also handle XOR zeroing and load of -1 by OR. 2020-07-16 Uroš Bizjak <ubizjak@gmail.com> gcc/ChangeLog: PR target/96189 * config/i386/sync.md (peephole2 to remove unneded compare after CMPXCHG): New pattern, also handle XOR zeroing and load of -1 by OR. gcc/testsuite/ChangeLog: PR target/96189 * gcc.target/i386/pr96189-1.c: New test.
2020-07-15i386: Introduce peephole2 to use flags from CMPXCHG more [PR96189]Uros Bizjak1-0/+35
CMPXCHG instruction sets ZF flag if the values in the destination operand and EAX register are equal; otherwise the ZF flag is cleared and value from destination operand is loaded to EAX. Following assembly: movl %esi, %eax lock cmpxchgl %edx, (%rdi) cmpl %esi, %eax sete %al can be optimized by removing the unneeded comparison, since set ZF flag signals that no update to EAX happened. 2020-15-07 Uroš Bizjak <ubizjak@gmail.com> gcc/ChangeLog: PR target/95355 * config/i386/sync.md (peephole2 to remove unneded compare after CMPXCHG): New pattern. gcc/testsuite/ChangeLog: PR target/95355 * gcc.target/i386/pr96189.c: New test.
2020-01-01Update copyright years.Jakub Jelinek1-1/+1
From-SVN: r279813
2019-09-16* config/i386/sync.md (atomic_store<mode>): Improve comment.Uros Bizjak1-2/+2
From-SVN: r275755
2019-09-16re PR target/91719 (gcc compiles seq_cst store on x86-64 differently from ↵Uros Bizjak1-2/+5
clang/icc) PR target/91719 * config/i386/i386.h (TARGET_USE_XCHG_FOR_ATOMIC_STORE): New macro. * config/i386/x86-tune.def (X86_TUNE_USE_XCHG_FOR_ATOMIC_STORE): New. * config/i386/sync.md (atomic_store<mode>): emit XCHG for TARGET_USE_XCHG_FOR_ATOMIC_STORE. From-SVN: r275754
2019-01-01Update copyright years.Jakub Jelinek1-1/+1
From-SVN: r267494
2018-01-03Update copyright years.Jakub Jelinek1-1/+1
From-SVN: r256169
2017-10-14sync.md (FILD_ATOMIC/FIST_ATOMIC FP load peephole2): Use ↵Uros Bizjak1-8/+92
any_fp_register_operand as operand[3] predicate. * config/i386/sync.md (FILD_ATOMIC/FIST_ATOMIC FP load peephole2): Use any_fp_register_operand as operand[3] predicate. Simplify equality test for operands[2] and operands[4] memory location. (LDX_ATOMIC/STX_ATOMIC FP load peephole2): Ditto. (FILD_ATOMIC/FIST_ATOMIC FP load peephole2 with mem blockage): New. (LDX_ATOMIC/LDX_ATOMIC FP load peephole2 with mem blockage): Ditto. (FILD_ATOMIC/FIST_ATOMIC FP store peephole2): Use any_fp_register_operand as operand[1] predicate. Simplify equality test for operands[0] and operands[3] memory location. (LDX_ATOMIC/STX_ATOMIC FP store peephole2): Ditto. (FILD_ATOMIC/FIST_ATOMIC FP store peephole2 with mem blockage): New. (LDX_ATOMIC/LDX_ATOMIC FP storepeephole2 with mem blockage): Ditto. From-SVN: r253751
2017-05-11re PR target/80706 (peephole2 uses uninitialized stack variables on i686)Uros Bizjak1-15/+46
PR target/80706 * config/i386/sync.md (UNSPEC_LDX_ATOMIC): New unspec. (UNSPEC_STX_ATOMIC): Ditto. (loaddi_via_sse): New insn. (storedi_via_sse): Ditto. (atomic_loaddi_fpu): Emit loaddi_via_sse and storedi_via_sse. Update corresponding peephole2 patterns. (atomic_storedi_fpu): Ditto. testsuite/ChangeLog: PR target/80706 * gcc.target/i386/pr80706.c: New test. From-SVN: r247921
2017-02-19Revert:Uros Bizjak1-1/+1
2016-05-30 Uros Bizjak <ubizjak@gmail.com> * config/i386/sync.md (mfence_nosse): Use "lock orl $0, -4(%esp)". From-SVN: r245577
2017-01-01Update copyright years.Jakub Jelinek1-1/+1
From-SVN: r243994
2016-05-30sync.md (mfence_nosse): Use "lock orl $0, -4(%esp)".Uros Bizjak1-1/+1
* config/i386/sync.md (mfence_nosse): Use "lock orl $0, -4(%esp)". From-SVN: r236895
2016-05-29re PR target/71245 (std::atomic<double> load/store bounces the data to the ↵Uros Bizjak1-0/+56
stack using fild/fistp) PR target/71245 * config/i386/sync.md (define_peephole2 atomic_storedi_fpu): New peepholes to remove unneeded fild/fistp pairs. (define_peephole2 atomic_loaddi_fpu): Ditto. testsuite/ChangeLog: PR target/71245 * gcc.target/i386/pr71245-1.c: New test. * gcc.target/i386/pr71245-2.c: Ditto. From-SVN: r236863
2016-05-03re PR target/49244 (__sync or __atomic builtins will not emit 'lock ↵Jakub Jelinek1-0/+111
bts/btr/btc') PR target/49244 * tree-ssa-ccp.c: Include stor-layout.h and optabs-query.h. (optimize_atomic_bit_test_and): New function. (pass_fold_builtins::execute): Use it. * optabs.def (atomic_bit_test_and_set_optab, atomic_bit_test_and_complement_optab, atomic_bit_test_and_reset_optab): New optabs. * internal-fn.def (ATOMIC_BIT_TEST_AND_SET, ATOMIC_BIT_TEST_AND_COMPLEMENT, ATOMIC_BIT_TEST_AND_RESET): New ifns. * builtins.h (expand_ifn_atomic_bit_test_and): New prototype. * builtins.c (expand_ifn_atomic_bit_test_and): New function. * internal-fn.c (expand_ATOMIC_BIT_TEST_AND_SET, expand_ATOMIC_BIT_TEST_AND_COMPLEMENT, expand_ATOMIC_BIT_TEST_AND_RESET): New functions. * doc/md.texi (atomic_bit_test_and_set@var{mode}, atomic_bit_test_and_complement@var{mode}, atomic_bit_test_and_reset@var{mode}): Document. * config/i386/sync.md (atomic_bit_test_and_set<mode>, atomic_bit_test_and_complement<mode>, atomic_bit_test_and_reset<mode>): New expanders. (atomic_bit_test_and_set<mode>_1, atomic_bit_test_and_complement<mode>_1, atomic_bit_test_and_reset<mode>_1): New insns. * gcc.target/i386/pr49244-1.c: New test. * gcc.target/i386/pr49244-2.c: New test. From-SVN: r235813
2016-04-28re PR target/70821 (x86_64: __atomic_fetch_add/sub() uses XADD rather than ↵Jakub Jelinek1-0/+30
DECL in some cases) PR target/70821 * config/i386/sync.md (define_peephole2 *atomic_fetch_add_cmp<mode>): Add new peephole2 where the first insn is *mov<mode>_or instead of *mov<mode>_internal. * gcc.target/i386/pr70821.c: New test. From-SVN: r235586
2016-01-04Update copyright years.Jakub Jelinek1-1/+1
From-SVN: r232055
2015-05-12re PR target/65697 (__atomic memory barriers not strong enough for __sync ↵Andrew MacLeod1-5/+5
builtins) 2015-05-12 Andrew MacLeod <amacleod@redhat.com> PR target/65697 * coretypes.h (MEMMODEL_SYNC, MEMMODEL_BASE_MASK): New macros. (enum memmodel): Add SYNC_{ACQUIRE,RELEASE,SEQ_CST}. * tree.h (memmodel_from_int, memmodel_base, is_mm_relaxed, is_mm_consume,is_mm_acquire, is_mm_release, is_mm_acq_rel, is_mm_seq_cst, is_mm_sync): New accessor functions. * builtins.c (expand_builtin_sync_operation, expand_builtin_compare_and_swap): Use MEMMODEL_SYNC_SEQ_CST. (expand_builtin_sync_lock_release): Use MEMMODEL_SYNC_RELEASE. (get_memmodel, expand_builtin_atomic_compare_exchange, expand_builtin_atomic_load, expand_builtin_atomic_store, expand_builtin_atomic_clear): Use new accessor routines. (expand_builtin_sync_synchronize): Use MEMMODEL_SYNC_SEQ_CST. * optabs.c (expand_compare_and_swap_loop): Use MEMMODEL_SYNC_SEQ_CST. (maybe_emit_sync_lock_test_and_set): Use new accessors and MEMMODEL_SYNC_ACQUIRE. (expand_sync_lock_test_and_set): Use MEMMODEL_SYNC_ACQUIRE. (expand_mem_thread_fence, expand_mem_signal_fence, expand_atomic_load, expand_atomic_store): Use new accessors. * emit-rtl.c (need_atomic_barrier_p): Add additional enum cases. * tsan.c (instrument_builtin_call): Update check for memory model beyond final enum to use MEMMODEL_LAST. * c-family/c-common.c: Use new accessor for memmodel_base. * config/aarch64/aarch64.c (aarch64_expand_compare_and_swap): Use new accessors. * config/aarch64/atomics.md (atomic_load<mode>,atomic_store<mode>, arch64_load_exclusive<mode>, aarch64_store_exclusive<mode>, mem_thread_fence, *dmb): Likewise. * config/alpha/alpha.c (alpha_split_compare_and_swap, alpha_split_compare_and_swap_12): Likewise. * config/arm/arm.c (arm_expand_compare_and_swap, arm_split_compare_and_swap, arm_split_atomic_op): Likewise. * config/arm/sync.md (atomic_load<mode>, atomic_store<mode>, atomic_loaddi): Likewise. * config/i386/i386.c (ix86_destroy_cost_data, ix86_memmodel_check): Likewise. * config/i386/sync.md (mem_thread_fence, atomic_store<mode>): Likewise. * config/ia64/ia64.c (ia64_expand_atomic_op): Add new memmodel cases and use new accessors. * config/ia64/sync.md (mem_thread_fence, atomic_load<mode>, atomic_store<mode>, atomic_compare_and_swap<mode>, atomic_exchange<mode>): Use new accessors. * config/mips/mips.c (mips_process_sync_loop): Likewise. * config/pa/pa.md (atomic_loaddi, atomic_storedi): Likewise. * config/rs6000/rs6000.c (rs6000_pre_atomic_barrier, rs6000_post_atomic_barrier): Add new cases. (rs6000_expand_atomic_compare_and_swap): Use new accessors. * config/rs6000/sync.md (mem_thread_fence): Add new cases. (atomic_load<mode>): Add new cases and use new accessors. (store_quadpti): Add new cases. * config/s390/s390.md (mem_thread_fence, atomic_store<mode>): Use new accessors. * config/sparc/sparc.c (sparc_emit_membar_for_model): Use new accessors. * doc/extend.texi: Update docs to indicate 16 bits are used for memory model, not 8. From-SVN: r223096
2015-04-02sync.md (UNSPEC_FILD_ATOMIC, [...]): New.Uros Bizjak1-2/+7
* config/i386/sync.md (UNSPEC_FILD_ATOMIC, UNSPEC_FIST_ATOMIC): New. (loaddi_via_fpu): Use UNSPEC_FILD_ATOMIC. (storedi_via_fpu): Use UNSPEC_FIST_ATOMIC. * reg-stack.c (get_true_reg): Change UNSPEC_LDA to UNSPEC_FILD_ATOMIC. (subst_stack_regs_pat): Change UNSPEC_STA to UNSPEC_FIST_ATOMIC. From-SVN: r221830
2015-04-01sync.md (UNSPEC_MOVA): Remove.Uros Bizjak1-11/+25
* config/i386/sync.md (UNSPEC_MOVA): Remove. (atomic_load<mode>): Change operand 0 predicate to nonimmediate_operand and fix up the destination when needed. Use UNSPEC_LDA. (atomic_loaddi_fpu): Use UNSPEC_LDA. (atomic_store<mode>): Change operand 1 predicate to nonimmendate_operand and move the source to register when needed. Use UNSPEC_STA. (atomic_store<mode>_1): Use UNSPEC_STA. (atomic_storedi_fpu): Change operand 1 to nonimmediate_operand. Fix moves from memory operand. Use UNSPEC_STA. From-SVN: r221811
2015-03-31re PR target/58945 (Improve atomic_compare_and_swap*_doubleword pattern)Uros Bizjak1-39/+25
PR target/58945 * config/i386/sync.md (atomic_compare_and_swap<dwi>_doubleword): Do not split operands 0 and operands 2 to halfmode. (atomic_compare_and_swap<mode>): Update for atomic_compare_and_swap<dwi>_doubleword changes. From-SVN: r221798
2015-01-05Update copyright years.Jakub Jelinek1-1/+1
From-SVN: r219188
2014-10-29decl.c, [...]: Remove redundant enum from machine_mode.Richard Sandiford1-1/+1
gcc/ada/ * gcc-interface/decl.c, gcc-interface/gigi.h, gcc-interface/misc.c, gcc-interface/trans.c, gcc-interface/utils.c, gcc-interface/utils2.c: Remove redundant enum from machine_mode. gcc/c-family/ * c-common.c, c-common.h, c-cppbuiltin.c, c-lex.c: Remove redundant enum from machine_mode. gcc/c/ * c-decl.c, c-tree.h, c-typeck.c: Remove redundant enum from machine_mode. gcc/cp/ * constexpr.c: Remove redundant enum from machine_mode. gcc/fortran/ * trans-types.c, trans-types.h: Remove redundant enum from machine_mode. gcc/go/ * go-lang.c: Remove redundant enum from machine_mode. gcc/java/ * builtins.c, java-tree.h, typeck.c: Remove redundant enum from machine_mode. gcc/lto/ * lto-lang.c: Remove redundant enum from machine_mode. gcc/ * addresses.h, alias.c, asan.c, auto-inc-dec.c, bt-load.c, builtins.c, builtins.h, caller-save.c, calls.c, calls.h, cfgexpand.c, cfgloop.h, cfgrtl.c, combine.c, compare-elim.c, config/aarch64/aarch64-builtins.c, config/aarch64/aarch64-protos.h, config/aarch64/aarch64-simd.md, config/aarch64/aarch64.c, config/aarch64/aarch64.h, config/aarch64/aarch64.md, config/alpha/alpha-protos.h, config/alpha/alpha.c, config/arc/arc-protos.h, config/arc/arc.c, config/arc/arc.h, config/arc/predicates.md, config/arm/aarch-common-protos.h, config/arm/aarch-common.c, config/arm/arm-protos.h, config/arm/arm.c, config/arm/arm.h, config/arm/arm.md, config/arm/neon.md, config/arm/thumb2.md, config/avr/avr-log.c, config/avr/avr-protos.h, config/avr/avr.c, config/avr/avr.md, config/bfin/bfin-protos.h, config/bfin/bfin.c, config/c6x/c6x-protos.h, config/c6x/c6x.c, config/c6x/c6x.md, config/cr16/cr16-protos.h, config/cr16/cr16.c, config/cris/cris-protos.h, config/cris/cris.c, config/cris/cris.md, config/darwin-protos.h, config/darwin.c, config/epiphany/epiphany-protos.h, config/epiphany/epiphany.c, config/epiphany/epiphany.md, config/fr30/fr30.c, config/frv/frv-protos.h, config/frv/frv.c, config/frv/predicates.md, config/h8300/h8300-protos.h, config/h8300/h8300.c, config/i386/i386-builtin-types.awk, config/i386/i386-protos.h, config/i386/i386.c, config/i386/i386.md, config/i386/predicates.md, config/i386/sse.md, config/i386/sync.md, config/ia64/ia64-protos.h, config/ia64/ia64.c, config/iq2000/iq2000-protos.h, config/iq2000/iq2000.c, config/iq2000/iq2000.md, config/lm32/lm32-protos.h, config/lm32/lm32.c, config/m32c/m32c-protos.h, config/m32c/m32c.c, config/m32r/m32r-protos.h, config/m32r/m32r.c, config/m68k/m68k-protos.h, config/m68k/m68k.c, config/mcore/mcore-protos.h, config/mcore/mcore.c, config/mcore/mcore.md, config/mep/mep-protos.h, config/mep/mep.c, config/microblaze/microblaze-protos.h, config/microblaze/microblaze.c, config/mips/mips-protos.h, config/mips/mips.c, config/mmix/mmix-protos.h, config/mmix/mmix.c, config/mn10300/mn10300-protos.h, config/mn10300/mn10300.c, config/moxie/moxie.c, config/msp430/msp430-protos.h, config/msp430/msp430.c, config/nds32/nds32-cost.c, config/nds32/nds32-intrinsic.c, config/nds32/nds32-md-auxiliary.c, config/nds32/nds32-protos.h, config/nds32/nds32.c, config/nios2/nios2-protos.h, config/nios2/nios2.c, config/pa/pa-protos.h, config/pa/pa.c, config/pdp11/pdp11-protos.h, config/pdp11/pdp11.c, config/rl78/rl78-protos.h, config/rl78/rl78.c, config/rs6000/altivec.md, config/rs6000/rs6000-c.c, config/rs6000/rs6000-protos.h, config/rs6000/rs6000.c, config/rs6000/rs6000.h, config/rx/rx-protos.h, config/rx/rx.c, config/s390/predicates.md, config/s390/s390-protos.h, config/s390/s390.c, config/s390/s390.h, config/s390/s390.md, config/sh/predicates.md, config/sh/sh-protos.h, config/sh/sh.c, config/sh/sh.md, config/sparc/predicates.md, config/sparc/sparc-protos.h, config/sparc/sparc.c, config/sparc/sparc.md, config/spu/spu-protos.h, config/spu/spu.c, config/stormy16/stormy16-protos.h, config/stormy16/stormy16.c, config/tilegx/tilegx-protos.h, config/tilegx/tilegx.c, config/tilegx/tilegx.md, config/tilepro/tilepro-protos.h, config/tilepro/tilepro.c, config/v850/v850-protos.h, config/v850/v850.c, config/v850/v850.md, config/vax/vax-protos.h, config/vax/vax.c, config/vms/vms-c.c, config/xtensa/xtensa-protos.h, config/xtensa/xtensa.c, coverage.c, cprop.c, cse.c, cselib.c, cselib.h, dbxout.c, ddg.c, df-problems.c, dfp.c, dfp.h, doc/md.texi, doc/rtl.texi, doc/tm.texi, doc/tm.texi.in, dojump.c, dse.c, dwarf2cfi.c, dwarf2out.c, dwarf2out.h, emit-rtl.c, emit-rtl.h, except.c, explow.c, expmed.c, expmed.h, expr.c, expr.h, final.c, fixed-value.c, fixed-value.h, fold-const.c, function.c, function.h, fwprop.c, gcse.c, gengenrtl.c, genmodes.c, genopinit.c, genoutput.c, genpreds.c, genrecog.c, gensupport.c, gimple-ssa-strength-reduction.c, graphite-clast-to-gimple.c, haifa-sched.c, hooks.c, hooks.h, ifcvt.c, internal-fn.c, ira-build.c, ira-color.c, ira-conflicts.c, ira-costs.c, ira-emit.c, ira-int.h, ira-lives.c, ira.c, ira.h, jump.c, langhooks.h, libfuncs.h, lists.c, loop-doloop.c, loop-invariant.c, loop-iv.c, loop-unroll.c, lower-subreg.c, lower-subreg.h, lra-assigns.c, lra-constraints.c, lra-eliminations.c, lra-int.h, lra-lives.c, lra-spills.c, lra.c, lra.h, machmode.h, omp-low.c, optabs.c, optabs.h, output.h, postreload.c, print-tree.c, read-rtl.c, real.c, real.h, recog.c, recog.h, ree.c, reg-stack.c, regcprop.c, reginfo.c, regrename.c, regs.h, reload.c, reload.h, reload1.c, rtl.c, rtl.h, rtlanal.c, rtlhash.c, rtlhooks-def.h, rtlhooks.c, sched-deps.c, sel-sched-dump.c, sel-sched-ir.c, sel-sched-ir.h, sel-sched.c, simplify-rtx.c, stmt.c, stor-layout.c, stor-layout.h, target.def, targhooks.c, targhooks.h, tree-affine.c, tree-call-cdce.c, tree-complex.c, tree-data-ref.c, tree-dfa.c, tree-if-conv.c, tree-inline.c, tree-outof-ssa.c, tree-scalar-evolution.c, tree-ssa-address.c, tree-ssa-ccp.c, tree-ssa-loop-ivopts.c, tree-ssa-loop-ivopts.h, tree-ssa-loop-manip.c, tree-ssa-loop-prefetch.c, tree-ssa-math-opts.c, tree-ssa-reassoc.c, tree-ssa-sccvn.c, tree-streamer-in.c, tree-switch-conversion.c, tree-vect-data-refs.c, tree-vect-generic.c, tree-vect-loop.c, tree-vect-patterns.c, tree-vect-slp.c, tree-vect-stmts.c, tree-vrp.c, tree.c, tree.h, tsan.c, ubsan.c, valtrack.c, var-tracking.c, varasm.c: Remove redundant enum from machine_mode. gcc/ * gengtype.c (main): Treat machine_mode as a scalar typedef. * genmodes.c (emit_insn_modes_h): Hide inline functions if USED_FOR_TARGET. From-SVN: r216834
2014-10-15re PR go/59432 (sync/atomic FAILs on 32bit x86 systems without .cfi directives)Uros Bizjak1-45/+11
PR go/59432 * config/i386/sync.md (atomic_compare_and_swap<dwi>_doubleword): Remove the second alternative. (regprefix): Remove mode attribute. (atomic_compare_and_swap<mode>): Do not fixup operand 2. * config/i386/predicates.md (cmpxchg8b_pic_memory_operand): Remove. Revert: 2013-11-05 Ian Lance Taylor <iant@google.com> * config/i386/sync.md (atomic_compare_and_swap<dwi>_doubleword): If possible, add .cfi directives to record change to bx. * config/i386/i386.c (ix86_emit_cfi): New function. * config/i386/i386-protos.h (ix86_emit_cfi): Declare. From-SVN: r216281
2014-01-02Update copyright years in gcc/Richard Sandiford1-1/+1
From-SVN: r206289
2013-11-06sync.md (atomic_compare_and_swap<dwi>_doubleword): If possible, add .cfi ↵Ian Lance Taylor1-2/+13
directives to record change to bx. * config/i386/sync.md (atomic_compare_and_swap<dwi>_doubleword): If possible, add .cfi directives to record change to bx. * config/i386/i386.c (ix86_emit_cfi): New function. * config/i386/i386-protos.h (ix86_emit_cfi): Declare. From-SVN: r204433
2013-01-17re PR target/55981 (std::atomic store is split in two smaller stores)Uros Bizjak1-9/+6
PR target/55981 * config/i386/sync.md (atomic_store<mode>): Always generate SWImode store through atomic_store<mode>_1. (atomic_store<mode>_1): Macroize insn using SWI mode iterator. testsuite/ChangeLog: PR target/55981 * gcc.target/pr55981.c: New test. From-SVN: r195273
2013-01-14re PR target/55948 (__atomic_clear / __atomic_store_n ignore HLE_RELEASE flags)Uros Bizjak1-2/+14
PR target/55948 * config/i386/sync.md (atomic_store<mode>_1): New pattern. (atomic_store<mode>): Call atomic_store<mode>_1 for IX86_HLE_RELEASE memmodel flag. testsuite/ChangeLog PR target/55948 * gcc.target/i386/hle-clear-rel.c: New file * gcc.target/i386/hle-store-rel.c: New file. From-SVN: r195155
2013-01-13sync.md (mem_thread_fence): Mask operands[0] with MEMMODEL_MASK to determine ↵Uros Bizjak1-2/+4
memory model. * config/i386/sync.md (mem_thread_fence): Mask operands[0] with MEMMODEL_MASK to determine memory model. (atomic_store<mode>): Ditto from operands[2]. * config/i386/i386.c (ix86_memmodel_check): Declare "strong" as bool. From-SVN: r195137
2013-01-10Update copyright years in gcc/Richard Sandiford1-2/+1
From-SVN: r195098
2013-01-04Update Copyright years for files modified in 2011 and/or 2012.Jakub Jelinek1-1/+1
From-SVN: r194903
2012-11-06i386.c (TARGET_INSTANTIATE_DECLS): New define.Uros Bizjak1-6/+2
* config/i386/i386.c (TARGET_INSTANTIATE_DECLS): New define. (ix86_instantiate_decls): New function. (ix86_expand_builtin) <case IX86_BUILTIN_LDMXCSR>: Use SLOT_TEMP stack slot instead of SLOT_VIRTUAL. <case IX86_BUILTIN_STMXCSR>: Ditto. (assign_386_stack_local): Do not assert when virtual slot is valid. * config/i386/i386.h (enum ix86_stack_slot): Remove SLOT_VIRTUAL. * config/i386/i386.md (truncdfsf2): Do not use SLOT_VIRTUAL stack slot. (truncxf<mode>2): Ditto. (floatunssi<mode>2): Ditto. (isinf<mode>2): Ditto. * config/i386/sync.md (atomic_load<mode>): Ditto. (atomic_store<mode>): Ditto. From-SVN: r193244
2012-09-02sync.md (atomic_compare_and_swap<dwi>_doubleword): Improve insn output code.Uros Bizjak1-4/+3
* config/i386/sync.md (atomic_compare_and_swap<dwi>_doubleword): Improve insn output code. From-SVN: r190861
2012-08-27re PR target/46254 (ICE: in find_reloads, at reload.c:3806 (unable to ↵Uros Bizjak1-66/+53
generate reloads) with -fPIC -mcmodel={medium|large} and __sync_val_compare_and_swap) PR target/46254 * config/i386/predicates.md (cmpxchg8b_pic_memory_operand): Return true for TARGET_64BIT or !flag_pic. * config/i386/sync.md (*atomic_compare_and_swap_doubledi_pic): Remove. (atomic_compare_and_swap_double<mode>): Change operand 2 predicate to cmpxchg8b_pic_memory_operand. Use DWIH mode iterator. Add insn constraint. Conditionally emit xchg asm insns. (atomic_compare_and_swap<mode>): Update calls. Check only cmpxchg8b_pic_memory_operand in memory address fixup. (DCASMODE): Remove. (CASHMODE): Rename from DCASHMODE. (doublemodesuffix): Update modes. (regprefix): New mode attribute. (unspecv) <UNSPECV_CMPXCHG_{1,2,3,4}>: Remove. <UNSPECV_CMPXCHG>: New constant. (atomic_compare_and_swap<mode>_1): Rename from atomic_compare_and_swap_single<mode>. Update calls and unspec_volatile constants. (atomic_compare_and_swap<mode>_doubleword): Rename from atomic_compare_and_swap_double<mode>. Update calls and unspec_volatile constants. testsuite/ChangeLog: PR target/46254 * gcc.target/i386/pr46254.c: New test. From-SVN: r190732
2012-08-25i386.h (FP_REG_P): Remove macro.Uros Bizjak1-2/+2
* config/i386/i386.h (FP_REG_P): Remove macro. (FP_REGNO_P): Ditto. (HARD_REGNO_NREGS): Use STACK_REGNO_P instead of FP_REGNO_P. (HARD_REGNO_NREGS_HAS_PADDING): Ditto. (ANY_FP_REGNO_P): Ditto. (HARD_REGNO_RENAME_OK): Use STACK_REGNO_P. * config/i386/i386.c (output_387_ffreep): Use STACK_REGNO_P instead of FP_REGNO_P. (ix86_hard_regno_mode_ok): Ditto. * config/i386/predicates.md (fp_register_operand): Ditto. (register_and_not_fp_reg_operand): Ditto. * config/i386/sync.md (atomic_loaddi_fpu): Use STACK_REG_P instead of FP_REG_P. * reg-stack.c (get_true_reg): Use STACK_REG_P instead of FP_REG_P. From-SVN: r190667
2012-08-03sync.md (*atomic_fetch_add_cmp<mode>): Use incdec_operand predicate to ↵Uros Bizjak1-17/+27
return INC or DEC insn mnemonic. * config/i386/sync.md (*atomic_fetch_add_cmp<mode>): Use incdec_operand predicate to return INC or DEC insn mnemonic. Add %K operand modifier. (atomic_add<mode>): Use incdec_operand predicate to return INC or DEC insn mnemonic. (atomic_dec<mode>): Ditto. From-SVN: r190132
2012-05-02ChangeLog entry:Kirill Yukhin1-22/+27
* coretypes (MEMMODEL_MASK): New. * builtins.c (get_memmodel): Add val. Call target.memmodel_check and return new variable. (expand_builtin_atomic_exchange): Mask memmodel values. (expand_builtin_atomic_compare_exchange): Ditto. (expand_builtin_atomic_load): Ditto. (expand_builtin_atomic_store): Ditto. (expand_builtin_atomic_clear): Ditto. * doc/extend.texi: Mention port-dependent memory model flags. * config/i386/cpuid.h (bit_HLE): New. * config/i386/driver-i386.c (host_detect_local_cpu): Detect HLE support. * config/i386/i386-protos.h (ix86_generate_hle_prefix): New. * config/i386/i386-c.c (ix86_target_macros_internal): Set HLE defines. (ix86_target_string)<-mhle>: New. (ix86_valid_target_attribute_inner_p)<OPT_mhle>: Ditto. * config/i386/i386.c (ix86_target_string)<OPTION_MASK_ISA_HLE>: New. (ix86_valid_target_attribute_inner_p)<OPT_mhle>: Ditto. (ix86_option_override_internal)<PTA_HLE>: New switch, set it enabled for generic, generic64 and core-avx2. (ix86_print_operand): Generate HLE lock prefixes. (ix86_memmodel_check): New. (TARGET_MEMMODEL_CHECK): Ditto. * config/i386/i386.h (OPTION_ISA_HLE): Ditto. (IX86_HLE_ACQUIRE): Ditto. (IX86_HLE_RELEASE): Ditto. * config/i386/i386.h (ix86_generate_hle_prefix): Ditto. * config/i386/i386.opt (mhle): Ditto. * config/i386/sync.md(atomic_compare_and_swap<mode>): Pass success model to instruction emitter. (atomic_fetch_add<mode>): Ditto. (atomic_exchange<mode>): Ditto. (atomic_add<mode>): Ditto. (atomic_sub<mode>): Ditto. (atomic_<code><mode>): Ditto. (*atomic_compare_and_swap_doubledi_pic): Ditto. (atomic_compare_and_swap_single<mode>): Define and use argument for success model. (atomic_compare_and_swap_double<mode>): Ditto. * configure.ac: Check if assembler support HLE prefixes. * configure: Regenerate. * config.in: Ditto. testsuite/ChangeLog entry: * gcc.target/i386/hle-cmpxchg-acq-1.c: New. * gcc.target/i386/hle-cmpxchg-rel-1.c: Ditto. * gcc.target/i386/hle-add-acq-1.c: Ditto. * gcc.target/i386/hle-add-rel-1.c: Ditto. * gcc.target/i386/hle-and-acq-1.c: Ditto. * gcc.target/i386/hle-and-rel-1.c: Ditto. * gcc.target/i386/hle-or-acq-1.c: Ditto. * gcc.target/i386/hle-or-rel-1.c: Ditto. * gcc.target/i386/hle-sub-acq-1.c: Ditto. * gcc.target/i386/hle-sub-rel-1.c: Ditto. * gcc.target/i386/hle-xadd-acq-1.c: Ditto. * gcc.target/i386/hle-xadd-rel-1.c: Ditto. * gcc.target/i386/hle-xchg-acq-1.c: Ditto. * gcc.target/i386/hle-xchg-rel-1.c: Ditto. * gcc.target/i386/hle-xor-acq-1.c: Ditto. * gcc.target/i386/hle-xor-rel-1.c: Ditto. Co-Authored-By: Andi Kleen <ak@linux.intel.com> From-SVN: r187051
2012-04-17re PR target/53020 (__atomic_fetch_or doesn't generate `1 insn` variant)Uros Bizjak1-1/+1
PR target/53020 * config/i386/sync.md (atomic_<code><mode>): Rename to atomic_<logic><mode>. From-SVN: r186542
2012-03-18i386.md: Remove empty predicates and/or constraints.Uros Bizjak1-38/+38
* config/i386/i386.md: Remove empty predicates and/or constraints. * config/i386/sync.md: Ditto. * config/i386/sse.md: Ditto. * config/i386/mmx.md: Ditto. * config/i386/pentium.md: Ditto. * config/i386/athlon.md: Ditto. From-SVN: r185505
2011-11-29sync.md (UNSPEC_LDA, UNSPEC_STA): New unspecs.Uros Bizjak1-9/+27
* config/i386/sync.md (UNSPEC_LDA, UNSPEC_STA): New unspecs. (movdi_via_fpu): Remove. (loaddi_via_fpu): New insn pattern. (storedi_via_fpu): Ditto. (atomic_loaddi_fpu): Use loaddi_via_fpu and storedi_via_fpu. (atomic_storedi_fpu): Ditto. * reg-stack.c (get_true_reg): Handle UNSPEC_LDA. (subst_stack_regs_pat): Handle UNSPEC_STA. From-SVN: r181812
2011-11-26sync.md (movdi_via_fpu): Add %Z insn suffixes.Uros Bizjak1-2/+2
* config/i386/sync.md (movdi_via_fpu): Add %Z insn suffixes. From-SVN: r181739
2011-11-21mmx.md (unspec): Move from config/i386/i386.md (unspecv) <UNSPECV_EMMS, ↵Uros Bizjak1-16/+93
UNSPECV_FEMMS>: Ditto. * config/i386/mmx.md (unspec) <UNSPEC_MOVNTQ, UNSPEC_PFRCP, UNSPEC_PFRCPIT1, UNSPEC_PFRCPIT2, UNSPEC_PFRSQRT, UNSPEC_PFRSQIT1>: Move from config/i386/i386.md (unspecv) <UNSPECV_EMMS, UNSPECV_FEMMS>: Ditto. * config/i386/sse.md (unspec) <UNSPEC_MOVNT,UNSPEC_MOVU, UNSPEC_LDDQU, UNSPEC_PSHUFB, UNSPEC_PSIGN, UNSPEC_PALIGNR, UNSPEC_EXTRQI, UNSPEC_EXTRQ, UNSPEC_INSERTQI, UNSPEC_INSERTQ, UNSPEC_BLENDV, UNSPEC_INSERTPS, UNSPEC_DP, UNSPEC_MOVNTDQA, UNSPEC_MPSADBW, UNSPEC_PHMINPOSUW, UNSPEC_PTEST, UNSPEC_PCMPESTR, UNSPEC_PCMPISTR, UNSPEC_FMADDSUB, UNSPEC_XOP_UNSIGNED_CMP, UNSPEC_XOP_TRUEFALSE, UNSPEC_XOP_PERMUTE, UNSPEC_FRCZ, UNSPEC_AESENC, UNSPEC_AESENCLAST, UNSPEC_AESDEC, UNSPEC_AESDECLAST, UNSPEC_AESIMC, UNSPEC_AESKEYGENASSIST, UNSPEC_PCLMUL, UNSPEC_PCMP, UNSPEC_VPERMIL, UNSPEC_VPERMIL2, UNSPEC_VPERMIL2F128, UNSPEC_CAST, UNSPEC_VTESTP, UNSPEC_VCVTPH2PS, UNSPEC_VCVTPS2PH, UNSPEC_VPERMSI, UNSPEC_VPERMDF, UNSPEC_VPERMSF, UNSPEC_VPERMTI, UNSPEC_GATHER, UNSPEC_VSIBADDR>: Ditto. (unspecv) <UNSPECV_LDMXCSR, UNSPECV_STMXCSR, UNSPECV_CLFLUSH, UNSPECV_MONITOR, UNSPECV_MWAIT, UNSPECV_VZEROALL, UNSPECV_VZEROUPPER>: Ditto. * config/i386/sync.md (unspec) <UNSPEC_LFENCE, UNSPEC_SFENCE, UNSPEC_MFENCE, UNSPEC_MOVA>: Ditto. (unspecv) <UNSPECV_CMPXCHG_1, UNSPECV_CMPXCHG_2, UNSPECV_CMPXCHG_3, UNSPECV_CMPXCHG_4, UNSPECV_XCHG, UNSPECV_LOCK>: Ditto. (sse2_lfence): Move from config/i386/sse.md. (*sse2_lfence): Ditto. (sse_sfence): Ditto. (*sse_sfence): Ditto. (sse2_mfence): Ditto. (mfence_sse2): Ditto. Rename from *sse2_mfence. Enable also for TARGET_64BIT. (mem_thread_fence): Use mfence_sse2. From-SVN: r181590
2011-11-06Check in patch/merge from cxx-mem-model BranchAndrew Macleod1-129/+326
From-SVN: r181031
2011-05-17re PR target/48986 (Missed optimization in atomic decrement on x86/x64)Jakub Jelinek1-2/+59
PR target/48986 * config/i386/sync.md (sync_old_add<mode>): Relax operand 2 predicate to allow CONST_INT. (*sync_old_add_cmp<mode>): New insn and peephole2 for it. From-SVN: r173816
2010-05-17re PR target/44074 (Solaris 2.9 x86 Sun assembler doesn't like rep/lock ↵Rainer Orth1-14/+14
prefixes on same line) PR target/44074 * configure.ac (HAVE_AS_IX86_REP_LOCK_PREFIX): New test. * configure: Regenerate. * config.in: Regenerate. * config/i386/i386.c (print_operand) <case ;>: Also print ; if !HAVE_AS_IX86_REP_LOCK_PREFIX. Don't emit whitespace. * config/i386/i386.md (*rep_movdi_rex64): Use {%;} after rep. (*rep_movsi): Likewise. (*rep_movsi_rex64): Likewise. (*rep_movqi): Likewise. (*rep_movqi_rex64): Likewise. (*rep_stosdi_rex64): Likewise. (*rep_stossi): Likewise. (*rep_stossi_rex64): Likewise. (*rep_stosqi): Likewise. (*rep_stosqi_rex64): Likewise. (*cmpstrnqi_nz_1): Use {%;} after repz. (*cmpstrnqi_nz_rex_1): Likewise. (*cmpstrnqi_1): Likewise. (*cmpstrnqi_rex_1): Likewise. (*strlenqi_1): Use {%;} after repnz. (*strlenqi_rex_1): Likewise. * config/i386/sync.md (memory_barrier_nosse): Replace {%;| } by {%;} . (*sync_compare_and_swap<mode>): Likewise. (sync_double_compare_and_swap<mode>): Likewise. (*sync_double_compare_and_swapdi_pic): Likewise. (sync_old_add<mode>): Likewise. (sync_add<mode>): Likewise. (sync_sub<mode>): Likewise. (sync_<code><mode>): Likewise. From-SVN: r159512
2010-04-14i386.md (maxmin_int): Rename code attribute from maxminiprefix and update ↵Uros Bizjak1-1/+1
all users. * config/i386/i386.md (maxmin_int): Rename code attribute from maxminiprefix and update all users. (maxmin_float): Ditto from maxminfprefix. (logic): Ditto from logicprefix. (absneg_mnemonic): Ditto from absnegprefix. * config/i386/mmx.md: Update all users of maxminiprefix, maxminfprefix and loficprefix for rename. * config/i386/sse.md: Ditto. * config/i386/sync.md (sync_<code><mode>): Update for logicprefix rename. From-SVN: r158350
2010-04-06i386-protos.h (x86_maybe_negate_const_int): Declare.Uros Bizjak1-0/+3
* config/i386/i386-protos.h (x86_maybe_negate_const_int): Declare. * config/i386/i386.c (x86_maybe_negate_const_int): New. (x86_output_mi_thunk): Use x86_maybe_negate_const_int. * config/i386/i386.md (*add<mode>_1, *addsi_1_zext, *addhi_1, *addhi_1_lea, *addqi_1, *addqi_1_lea, *addqi_1_slp, *add<mode>_2, *addsi_2_zext, *addhi_2, *addqi_2, *add<mode>_3, *addsi_3_zext, *addhi_3, *addqi_3,*add<mode>_5, *addhi_5, *addqi_5): Use x86_maybe_negate_const_int to output insn mnemonic. (*adddi_4, *addsi_4, *addhi_4, *addqi_4): Ditto. Remove overflow check from instruction predicate. Update comments. * config/i386/sync.md (sync_add<mode>): Use x86_maybe_negate_const_int to output insn mnemonic. From-SVN: r158013
2009-12-17sync.md (IMODE): Remove mode iterator.Uros Bizjak1-65/+41
* config/i386/sync.md (IMODE): Remove mode iterator. (modesuffix): Remove mode attribute. (modeconstraint): Ditto. (immconstraint): Ditto. (*sync_compare_and_swap<mode>): Use SWI mode iterator instead of IMODE mode iterator, imodesuffix mode attribute instead of modesuffix, <r> mode attribute instead of modeconstraint and <i> mode attribute instead of immconstraint. (sync_double_compare_and_swap<mode>): Ditto. (sync_old_add<mode>): Ditto. (sync_lock_test_and_set<mode>): Ditto. (sync_add<mode>): Ditto. (sync_sub<mode>): Ditto. (sync_and<mode>): Ditto. (sync_ior<mode>): Ditto. (sync_xor<mode>): Ditto. (sync_<code><mode>): Macroize insn pattern from sync_{and,ior,xor}<mode> using any_logic code iterator. From-SVN: r155304