Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
/* Lower vector operations to scalar operations.
|
2013-01-10 20:38:27 +00:00
|
|
|
|
Copyright (C) 2004-2013 Free Software Foundation, Inc.
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
|
|
|
|
|
This file is part of GCC.
|
2009-11-25 10:55:54 +00:00
|
|
|
|
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
GCC is free software; you can redistribute it and/or modify it
|
|
|
|
|
under the terms of the GNU General Public License as published by the
|
2007-07-26 08:37:01 +00:00
|
|
|
|
Free Software Foundation; either version 3, or (at your option) any
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
later version.
|
2009-11-25 10:55:54 +00:00
|
|
|
|
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
GCC is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
|
|
|
for more details.
|
2009-11-25 10:55:54 +00:00
|
|
|
|
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
You should have received a copy of the GNU General Public License
|
2007-07-26 08:37:01 +00:00
|
|
|
|
along with GCC; see the file COPYING3. If not see
|
|
|
|
|
<http://www.gnu.org/licenses/>. */
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
|
|
|
|
|
#include "config.h"
|
|
|
|
|
#include "system.h"
|
|
|
|
|
#include "coretypes.h"
|
|
|
|
|
#include "tree.h"
|
|
|
|
|
#include "tm.h"
|
|
|
|
|
#include "langhooks.h"
|
tree-ssa.h: New.
* tree-ssa.h: New. Move content from tree-flow.h and
tree-flow-inline.h.
* tree-flow.h (_edge_var_map, edge_var_map_vector): Move to tree-ssa.h.
Move prototypes belonging to tree-ssa.c.
* tree-flow-inline.h (redirect_edge_var_map_def,
redirect_edge_var_map_result, redirect_edge_var_map_location): Move to
tree-ssa.h.
* gimple.h: Adjust prototypes.
* tree-ssa.c (useless_type_conversion_p, types_compatible_p): Move to...
* gimple.c (useless_type_conversion_p, types_compatible_p): Here.
* tree.h: Move prototype to tree-ssa.h.
* gengtype.c (open_base_files): Replace tree-flow.h with tree-ssa.h.
* Makefile.in: (TREE_SSA_H, TREE_FLOW_H): Adjust dependencies.
* alias.c, asan.c, builtins.c, calls.c, cfgexpand.c, cfghooks.c,
cfgloop.c, cfgloopmanip.c, cgraph.c, cgraphbuild.c, cgraphclones.c,
cgraphunit.c, dse.c, except.c, expr.c, final.c, fold-const.c,
ggc-page.c, gimple-fold.c, gimple-iterator.c, gimple-low.c,
gimple-pretty-print.c, gimple-ssa-strength-reduction.c,
gimple-streamer-in.c, gimple-streamer-out.c, gimple.c, gimplify.c,
graphite-blocking.c, graphite-clast-to-gimple.c, graphite-dependences.c,
graphite-interchange.c, graphite-optimize-isl.c, graphite-poly.c,
graphite-scop-detection.c, graphite-sese-to-poly.c, graphite.c,
ipa-cp.c, ipa-inline-analysis.c, ipa-inline-transform.c, ipa-inline.c,
ipa-prop.c, ipa-pure-const.c, ipa-reference.c, ipa-split.c, ipa-utils.c,
loop-init.c, lto-cgraph.c, lto-section-in.c, lto-section-out.c,
lto-streamer-in.c, lto-streamer-out.c, lto-streamer.c, omp-low.c,
passes.c, predict.c, print-tree.c, profile.c, sese.c, targhooks.c,
tracer.c, trans-mem.c, tree-call-cdce.c, tree-cfg.c, tree-cfgcleanup.c,
tree-chrec.c, tree-complex.c, tree-data-ref.c, tree-dfa.c, tree-eh.c,
tree-emutls.c, tree-if-conv.c, tree-inline.c, tree-into-ssa.c,
tree-loop-distribution.c, tree-mudflap.c, tree-nested.c, tree-nrv.c,
tree-object-size.c, tree-optimize.c, tree-outof-ssa.c, tree-parloops.c,
tree-phinodes.c, tree-predcom.c, tree-pretty-print.c, tree-profile.c,
tree-scalar-evolution.c, tree-sra.c, tree-ssa*.c, tree-stdarg.c,
tree-streamer-in.c, tree-switch-conversion.c, tree-tailcall.c,
tree-vect-data-refs.c, tree-vect-generic.c, tree-vect-loop-manip.c,
tree-vect-loop.c, tree-vect-patterns.c, tree-vect-slp.c,
tree-vect-stmts.c, tree-vectorizer.c, tree-vrp.c, tsan.c,
value-prof.c, var-tracking.c,
varpool.c, vtable-verify.c: Replace tree-flow.h with tree-ssa.h
From-SVN: r202523
2013-09-12 13:03:18 +00:00
|
|
|
|
#include "tree-ssa.h"
|
2008-07-28 14:33:56 +00:00
|
|
|
|
#include "gimple.h"
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
#include "tree-iterator.h"
|
|
|
|
|
#include "tree-pass.h"
|
|
|
|
|
#include "flags.h"
|
|
|
|
|
#include "ggc.h"
|
2011-10-03 08:13:26 -07:00
|
|
|
|
#include "diagnostic.h"
|
2012-06-29 09:18:15 -07:00
|
|
|
|
#include "target.h"
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
|
gimplify.c: Do not include except.h and optabs.h.
* gimplify.c: Do not include except.h and optabs.h.
(gimplify_body): Do not initialize RTL profiling.
* gimple-low.c: Do not include rtl.h, diagnostic.h, langhooks.h,
langhooks-def.h, timevar.h, except.h, hashtab.h, and expr.h.
* gimple-fold.c: Do not include rtl.h, tm_p.h, ggc.h, basic-block.h,
output.h, expr.h, diagnostic.h, timevar.h, value-prof.h, and
langhooks.h.
* tree-pretty-print.h: Include pretty-print.h.
* gimple-pretty-print.h: Include pretty-print.h.
* tree-pretty-print.c: Do not include diagnostic.h.
* tree-vrp.c: Likewise.
* tree-tailcall.c: Likewise
* tree-scalar-evolution.c: Likewise
* tree-ssa-dse.c: Likewise
* tree-chrec.c: Likewise
* tree-ssa-sccvn.c: Likewise
* tree-ssa-copyrename.c: Likewise
* tree-nomudflap.c: Likewise
* tree-call-cdce.c: Likewise
* tree-stdarg.c: Likewise
* tree-ssa-math-opts.c: Likewise
* tree-nrv.c: Likewise
* tree-ssa-sink.c: Likewise
* tree-browser.c: Likewise
* tree-ssa-loop-ivcanon.c: Likewise
* tree-ssa-loop.c: Likewise
* tree-parloops.c: Likewise
* tree-ssa-address.c: Likewise
* tree-ssa-ifcombine.c: Likewise
* tree-if-conv.c: Likewise
* tree-data-ref.c: Likewise
* tree-affine.c: Likewise
* tree-ssa-phiopt.c: Likewise
* tree-ssa-coalesce.c: Likewise
* tree-ssa-pre.c: Likewise
* tree-ssa-live.c: Likewise
* tree-predcom.c: Likewise
* tree-ssa-forwprop.c: Likewise
* tree-ssa-dce.c: Likewise
* tree-ssa-ter.c: Likewise
* tree-ssa-loop-prefetch.c: Likewise
* tree-optimize.c: Likewise
* tree-ssa-phiprop.c: Likewise
* tree-object-size.c: Likewise
* tree-outof-ssa.c: Likewise
* tree-ssa-structalias.c: Likewise
* tree-switch-conversion.c: Likewise
* tree-ssa-reassoc.c: Likewise
* tree-ssa-operands.c: Likewise
* tree-vectorizer.c: Likewise
* tree-vect-data-refs.c: Likewise
* tree-vect-generic.c: Likewise
* tree-vect-stmts.c: Likewise
* tree-vect-patterns.c: Likewise
* tree-vect-slp.c: Likewise
* tree-vect-loop.c: Likewise
* tree-ssa-loop-ivopts.c: Likewise
* tree-ssa-loop-im.c: Likewise
* tree-ssa-loop-niter.c: Likewise
* tree-ssa-loop-unswitch.c: Likewise
* tree-ssa-loop-manip.c: Likewise
* tree-ssa-loop-ch.c: Likewise
* tree-dump.c: Likewise
* tree-complex.c: Likewise
* tree-into-ssa.c: Do not include diagnostic.h and expr.h.
* tree-ssa-uninit.c: Likewise
* tree-ssa-threadupdate.c: Likewise
* tree-ssa-uncprop.c: Likewise
* tree-ssa-ccp.c: Likewise
* tree-ssa-dom.c: Likewise
* tree-ssa-propagate.c: Likewise
* tree-ssa-alias.c: Likewise
* tree-dfa.c: Likewise
* tree-cfgcleanup.c: Likewise
* tree-sra.c: Likewise
* tree-ssa-copy.c: Likewise
* tree-ssa.c: Likewise
* tree-profile.c: Likewise
* tree-cfg.c: Likewise
* tree-ssa-threadedge.c: Likewise
* tree-vect-loop-manip.c: Likewise
* tree-inline.c: Do not include diagnostic.h and expr.h.
Include rtl.h.
(copy_decl_for_dup_finish): Do not use NULL_RTX.
* tree-loop-linear.c: Do not include diagnostic.h, expr.h,
and optabs.h.
* tree-loop-distribution.c: Likewise.
From-SVN: r160125
2010-06-01 22:00:56 +00:00
|
|
|
|
/* Need to include rtl.h, expr.h, etc. for optabs. */
|
|
|
|
|
#include "expr.h"
|
|
|
|
|
#include "optabs.h"
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
|
2011-09-29 11:29:03 +00:00
|
|
|
|
|
|
|
|
|
static void expand_vector_operations_1 (gimple_stmt_iterator *);
|
|
|
|
|
|
|
|
|
|
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
/* Build a constant of type TYPE, made of VALUE's bits replicated
|
|
|
|
|
every TYPE_SIZE (INNER_TYPE) bits to fit TYPE's precision. */
|
|
|
|
|
static tree
|
|
|
|
|
build_replicated_const (tree type, tree inner_type, HOST_WIDE_INT value)
|
|
|
|
|
{
|
|
|
|
|
int width = tree_low_cst (TYPE_SIZE (inner_type), 1);
|
|
|
|
|
int n = HOST_BITS_PER_WIDE_INT / width;
|
|
|
|
|
unsigned HOST_WIDE_INT low, high, mask;
|
|
|
|
|
tree ret;
|
|
|
|
|
|
|
|
|
|
gcc_assert (n);
|
|
|
|
|
|
|
|
|
|
if (width == HOST_BITS_PER_WIDE_INT)
|
|
|
|
|
low = value;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
mask = ((HOST_WIDE_INT)1 << width) - 1;
|
|
|
|
|
low = (unsigned HOST_WIDE_INT) ~0 / mask * (value & mask);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (TYPE_PRECISION (type) < HOST_BITS_PER_WIDE_INT)
|
|
|
|
|
low &= ((HOST_WIDE_INT)1 << TYPE_PRECISION (type)) - 1, high = 0;
|
|
|
|
|
else if (TYPE_PRECISION (type) == HOST_BITS_PER_WIDE_INT)
|
|
|
|
|
high = 0;
|
2012-06-2 Kenneth Zadeck <zadeck@naturalbridge.com>
* expmed.c (expand_mult, choose_multiplier): Change "2 *
HOST_BITS_PER_WIDE_INT" to "HOST_BITS_PER_DOUBLE_INT".
* expr.c (convert_modes): Likewise.
* explow.c (plus_constant): Likewise.
* fixed-value.c (fixed_saturate1, fixed_saturate2)
(do_fixed_add, do_fixed_multiply, do_fixed_multiply)
(do_fixed_multiply, do_fixed_multiply, do_fixed_divide)
(do_fixed_divide, do_fixed_divide, do_fixed_divide)
(do_fixed_divide, do_fixed_divide, do_fixed_shift, do_fixed_shift)
(do_fixed_shift, fixed_convert, fixed_convert)
(fixed_convert_from_int, fixed_convert_from_int)
(fixed_convert_from_real): Likewise.
* fold-const.c (fold_convert_const_int_from_fixed, sign_bit_p)
(native_interpret_int, fold_binary_loc, fold_ternary_loc): Likewise.
* varasm.c (output_constructor_bitfield): Likewise.
* tree-vrp.c (register_edge_assert_for_2): Likewise.
* double-int.c (rshift_double, lshift_double): Likewise.
* double-int.h (double_int_fits_in_uhwi_p, double_int, double_int): Likewise.
* simplify-rtx.c (mode_signbit_p)
(simplify_const_unary_operation, simplify_binary_operation_1)
(simplify_immed_subreg): Likewise.
* builtins.c (c_readstr, fold_builtin_bitop): Likewise.
* tree-vect-generic.c (build_replicated_const): Likewise.
* dbxout.c (stabstr_O): Likewise.
* emit-rtl.c (immed_double_int_const, immed_double_const)
(gen_lowpart_common, init_emit_once): Likewise.
* tree.c (integer_pow2p, tree_log2, tree_floor_log2)
(widest_int_cst_value, upper_bound_in_type): Likewise.
* stor-layout.c (initialize_sizetypes, fixup_signed_type)
(fixup_unsigned_type): Likewise.
* real.c (real_to_integer2, real_from_integer): Likewise.
* dwarf2out.c (size_of_loc_descr, size_of_die, output_die)
(clz_loc_descriptor, mem_loc_descriptor): Likewise.
From-SVN: r188139
2012-06-02 16:08:39 +00:00
|
|
|
|
else if (TYPE_PRECISION (type) == HOST_BITS_PER_DOUBLE_INT)
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
high = low;
|
|
|
|
|
else
|
|
|
|
|
gcc_unreachable ();
|
|
|
|
|
|
|
|
|
|
ret = build_int_cst_wide (type, low, high);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static GTY(()) tree vector_inner_type;
|
|
|
|
|
static GTY(()) tree vector_last_type;
|
|
|
|
|
static GTY(()) int vector_last_nunits;
|
|
|
|
|
|
|
|
|
|
/* Return a suitable vector types made of SUBPARTS units each of mode
|
|
|
|
|
"word_mode" (the global variable). */
|
|
|
|
|
static tree
|
|
|
|
|
build_word_mode_vector_type (int nunits)
|
|
|
|
|
{
|
|
|
|
|
if (!vector_inner_type)
|
|
|
|
|
vector_inner_type = lang_hooks.types.type_for_mode (word_mode, 1);
|
|
|
|
|
else if (vector_last_nunits == nunits)
|
|
|
|
|
{
|
|
|
|
|
gcc_assert (TREE_CODE (vector_last_type) == VECTOR_TYPE);
|
|
|
|
|
return vector_last_type;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* We build a new type, but we canonicalize it nevertheless,
|
|
|
|
|
because it still saves some memory. */
|
|
|
|
|
vector_last_nunits = nunits;
|
|
|
|
|
vector_last_type = type_hash_canon (nunits,
|
|
|
|
|
build_vector_type (vector_inner_type,
|
|
|
|
|
nunits));
|
|
|
|
|
return vector_last_type;
|
|
|
|
|
}
|
|
|
|
|
|
2008-07-28 14:33:56 +00:00
|
|
|
|
typedef tree (*elem_op_func) (gimple_stmt_iterator *,
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
tree, tree, tree, tree, tree, enum tree_code);
|
|
|
|
|
|
|
|
|
|
static inline tree
|
2008-07-28 14:33:56 +00:00
|
|
|
|
tree_vec_extract (gimple_stmt_iterator *gsi, tree type,
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
tree t, tree bitsize, tree bitpos)
|
|
|
|
|
{
|
|
|
|
|
if (bitpos)
|
2008-07-28 14:33:56 +00:00
|
|
|
|
return gimplify_build3 (gsi, BIT_FIELD_REF, type, t, bitsize, bitpos);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
else
|
2008-07-28 14:33:56 +00:00
|
|
|
|
return gimplify_build1 (gsi, VIEW_CONVERT_EXPR, type, t);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static tree
|
2008-07-28 14:33:56 +00:00
|
|
|
|
do_unop (gimple_stmt_iterator *gsi, tree inner_type, tree a,
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
tree b ATTRIBUTE_UNUSED, tree bitpos, tree bitsize,
|
|
|
|
|
enum tree_code code)
|
|
|
|
|
{
|
2008-07-28 14:33:56 +00:00
|
|
|
|
a = tree_vec_extract (gsi, inner_type, a, bitsize, bitpos);
|
|
|
|
|
return gimplify_build1 (gsi, code, inner_type, a);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static tree
|
2008-07-28 14:33:56 +00:00
|
|
|
|
do_binop (gimple_stmt_iterator *gsi, tree inner_type, tree a, tree b,
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
tree bitpos, tree bitsize, enum tree_code code)
|
|
|
|
|
{
|
2011-10-27 12:10:57 +00:00
|
|
|
|
if (TREE_CODE (TREE_TYPE (a)) == VECTOR_TYPE)
|
|
|
|
|
a = tree_vec_extract (gsi, inner_type, a, bitsize, bitpos);
|
|
|
|
|
if (TREE_CODE (TREE_TYPE (b)) == VECTOR_TYPE)
|
|
|
|
|
b = tree_vec_extract (gsi, inner_type, b, bitsize, bitpos);
|
2008-07-28 14:33:56 +00:00
|
|
|
|
return gimplify_build2 (gsi, code, inner_type, a, b);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
}
|
|
|
|
|
|
2011-09-29 11:29:03 +00:00
|
|
|
|
/* Construct expression (A[BITPOS] code B[BITPOS]) ? -1 : 0
|
|
|
|
|
|
|
|
|
|
INNER_TYPE is the type of A and B elements
|
|
|
|
|
|
|
|
|
|
returned expression is of signed integer type with the
|
|
|
|
|
size equal to the size of INNER_TYPE. */
|
|
|
|
|
static tree
|
|
|
|
|
do_compare (gimple_stmt_iterator *gsi, tree inner_type, tree a, tree b,
|
|
|
|
|
tree bitpos, tree bitsize, enum tree_code code)
|
|
|
|
|
{
|
|
|
|
|
tree comp_type;
|
|
|
|
|
|
|
|
|
|
a = tree_vec_extract (gsi, inner_type, a, bitsize, bitpos);
|
|
|
|
|
b = tree_vec_extract (gsi, inner_type, b, bitsize, bitpos);
|
|
|
|
|
|
|
|
|
|
comp_type = build_nonstandard_integer_type
|
|
|
|
|
(GET_MODE_BITSIZE (TYPE_MODE (inner_type)), 0);
|
|
|
|
|
|
|
|
|
|
return gimplify_build3 (gsi, COND_EXPR, comp_type,
|
|
|
|
|
fold_build2 (code, boolean_type_node, a, b),
|
|
|
|
|
build_int_cst (comp_type, -1),
|
|
|
|
|
build_int_cst (comp_type, 0));
|
|
|
|
|
}
|
|
|
|
|
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
/* Expand vector addition to scalars. This does bit twiddling
|
|
|
|
|
in order to increase parallelism:
|
|
|
|
|
|
|
|
|
|
a + b = (((int) a & 0x7f7f7f7f) + ((int) b & 0x7f7f7f7f)) ^
|
|
|
|
|
(a ^ b) & 0x80808080
|
|
|
|
|
|
|
|
|
|
a - b = (((int) a | 0x80808080) - ((int) b & 0x7f7f7f7f)) ^
|
|
|
|
|
(a ^ ~b) & 0x80808080
|
|
|
|
|
|
|
|
|
|
-b = (0x80808080 - ((int) b & 0x7f7f7f7f)) ^ (~b & 0x80808080)
|
|
|
|
|
|
|
|
|
|
This optimization should be done only if 4 vector items or more
|
|
|
|
|
fit into a word. */
|
|
|
|
|
static tree
|
2008-07-28 14:33:56 +00:00
|
|
|
|
do_plus_minus (gimple_stmt_iterator *gsi, tree word_type, tree a, tree b,
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
tree bitpos ATTRIBUTE_UNUSED, tree bitsize ATTRIBUTE_UNUSED,
|
|
|
|
|
enum tree_code code)
|
|
|
|
|
{
|
|
|
|
|
tree inner_type = TREE_TYPE (TREE_TYPE (a));
|
|
|
|
|
unsigned HOST_WIDE_INT max;
|
|
|
|
|
tree low_bits, high_bits, a_low, b_low, result_low, signs;
|
|
|
|
|
|
|
|
|
|
max = GET_MODE_MASK (TYPE_MODE (inner_type));
|
|
|
|
|
low_bits = build_replicated_const (word_type, inner_type, max >> 1);
|
|
|
|
|
high_bits = build_replicated_const (word_type, inner_type, max & ~(max >> 1));
|
|
|
|
|
|
2008-07-28 14:33:56 +00:00
|
|
|
|
a = tree_vec_extract (gsi, word_type, a, bitsize, bitpos);
|
|
|
|
|
b = tree_vec_extract (gsi, word_type, b, bitsize, bitpos);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
|
2008-07-28 14:33:56 +00:00
|
|
|
|
signs = gimplify_build2 (gsi, BIT_XOR_EXPR, word_type, a, b);
|
|
|
|
|
b_low = gimplify_build2 (gsi, BIT_AND_EXPR, word_type, b, low_bits);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
if (code == PLUS_EXPR)
|
2008-07-28 14:33:56 +00:00
|
|
|
|
a_low = gimplify_build2 (gsi, BIT_AND_EXPR, word_type, a, low_bits);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
else
|
|
|
|
|
{
|
2008-07-28 14:33:56 +00:00
|
|
|
|
a_low = gimplify_build2 (gsi, BIT_IOR_EXPR, word_type, a, high_bits);
|
|
|
|
|
signs = gimplify_build1 (gsi, BIT_NOT_EXPR, word_type, signs);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
}
|
|
|
|
|
|
2008-07-28 14:33:56 +00:00
|
|
|
|
signs = gimplify_build2 (gsi, BIT_AND_EXPR, word_type, signs, high_bits);
|
|
|
|
|
result_low = gimplify_build2 (gsi, code, word_type, a_low, b_low);
|
|
|
|
|
return gimplify_build2 (gsi, BIT_XOR_EXPR, word_type, result_low, signs);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static tree
|
2008-07-28 14:33:56 +00:00
|
|
|
|
do_negate (gimple_stmt_iterator *gsi, tree word_type, tree b,
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
tree unused ATTRIBUTE_UNUSED, tree bitpos ATTRIBUTE_UNUSED,
|
|
|
|
|
tree bitsize ATTRIBUTE_UNUSED,
|
|
|
|
|
enum tree_code code ATTRIBUTE_UNUSED)
|
|
|
|
|
{
|
|
|
|
|
tree inner_type = TREE_TYPE (TREE_TYPE (b));
|
|
|
|
|
HOST_WIDE_INT max;
|
|
|
|
|
tree low_bits, high_bits, b_low, result_low, signs;
|
|
|
|
|
|
|
|
|
|
max = GET_MODE_MASK (TYPE_MODE (inner_type));
|
|
|
|
|
low_bits = build_replicated_const (word_type, inner_type, max >> 1);
|
|
|
|
|
high_bits = build_replicated_const (word_type, inner_type, max & ~(max >> 1));
|
|
|
|
|
|
2008-07-28 14:33:56 +00:00
|
|
|
|
b = tree_vec_extract (gsi, word_type, b, bitsize, bitpos);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
|
2008-07-28 14:33:56 +00:00
|
|
|
|
b_low = gimplify_build2 (gsi, BIT_AND_EXPR, word_type, b, low_bits);
|
|
|
|
|
signs = gimplify_build1 (gsi, BIT_NOT_EXPR, word_type, b);
|
|
|
|
|
signs = gimplify_build2 (gsi, BIT_AND_EXPR, word_type, signs, high_bits);
|
|
|
|
|
result_low = gimplify_build2 (gsi, MINUS_EXPR, word_type, high_bits, b_low);
|
|
|
|
|
return gimplify_build2 (gsi, BIT_XOR_EXPR, word_type, result_low, signs);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Expand a vector operation to scalars, by using many operations
|
|
|
|
|
whose type is the vector type's inner type. */
|
|
|
|
|
static tree
|
2008-07-28 14:33:56 +00:00
|
|
|
|
expand_vector_piecewise (gimple_stmt_iterator *gsi, elem_op_func f,
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
tree type, tree inner_type,
|
|
|
|
|
tree a, tree b, enum tree_code code)
|
|
|
|
|
{
|
This patch rewrites the old VEC macro-based interface into a new one based on the template class 'vec'.
This patch rewrites the old VEC macro-based interface into a new one
based on the template class 'vec'. The user-visible changes are
described in http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec.
I have tested the patch pretty extensively:
- Regular bootstraps on x86_64, ppc, ia64, sparc and hppa.
- Bootstraps with --enable-checking=release
- Bootstraps with --enable-checking=gc,gcac
- Basic builds on all targets (using contrib/config-list.mk).
We no longer access the vectors via VEC_* macros. The pattern is
"VEC_operation (T, A, V, args)" becomes "V.operation (args)".
The only thing I could not do is create proper ctors and dtors for the
vec class. Since these vectors are stored in unions, we
have to keep them as PODs (C++03 does not allow non-PODs in unions).
This means that creation and destruction must be explicit. There is a
new method vec<type, allocation, layout>::create() and another vec<type,
allocation, layout>::destroy() to allocate the internal vector.
For vectors that must be pointers, there is a family of free functions
that implement the operations that need to tolerate NULL vectors.
These functions all start with the prefix 'vec_safe_'. See the wiki
page for details.
The gengtype change removes the special handling for VEC() that used
to exist in gengtype. Additionally, it allows gengtype to recognize
templates of more than one argument and introduces the concept of an
undefined type (useful for template arguments that may or may not be
types).
When a TYPE_UNDEFINED is reached, gengtype will ignore it if it
happens inside a type marked with GTY((user)). Otherwise, it will
emit an error.
Finally, gengtype rejects root types marked GTY((user)) that are not
first class pointers.
2012-11-16 Diego Novillo <dnovillo@google.com>
VEC API overhaul (http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec)
* vec.c (register_overhead): Convert it into
member function of vec_prefix.
(release_overhead): Likewise.
(calculate_allocation): Likewise.
(vec_heap_free): Remove.
(vec_gc_o_reserve_1): Remove.
(vec_heap_o_reserve_1): Remove.
(vec_stack_o_reserve_1): Remove.
(vec_stack_o_reserve_exact): Remove.
(register_stack_vec): New.
(stack_vec_register_index): New.
(unregister_stack_vec): New.
(vec_assert_fail): Remove.
* vec.h: Conditionally include ggc.h. Document conditional
hackery.
Update top-level documentation.
(ALONE_VEC_CHECK_INFO): Remove.
(VEC_CHECK_INFO): Remove.
(ALONE_VEC_CHECK_DECL): Remove.
(VEC_CHECK_DECL): Remove.
(ALONE_VEC_CHECK_PASS): Remove.
(VEC_CHECK_PASS): Remove.
(VEC_ASSERT): Remove.
(vec_prefix): Add friends va_gc, va_gc_atomic, va_heap and
va_stack.
Mark fields alloc_ and num_ as protected.
(struct vec_t): Remove. Remove all function members.
(struct vl_embed): Declare.
(struct vl_ptr): Declare.
(free): Remove.
(reserve_exact): Remove.
(reserve): Remove.
(safe_splice): Remove.
(safe_push): Remove.
(safe_grow): Remove.
(safe_grow_cleared): Remove.
(safe_insert): Remove.
(DEF_VEC_I): Remove.
(DEF_VEC_ALLOC_I): Remove.
(DEF_VEC_P): Remove.
(DEF_VEC_ALLOC_P): Remove.
(DEF_VEC_O): Remove.
(DEF_VEC_ALLOC_O): Remove.
(DEF_VEC_ALLOC_P_STACK): Remove.
(DEF_VEC_ALLOC_O_STACK): Remove.
(DEF_VEC_ALLOC_I_STACK): Remove.
(DEF_VEC_A): Remove.
(DEF_VEC_ALLOC_A): Remove.
(vec_stack_p_reserve_exact_1): Remove.
(vec_stack_o_reserve): Remove.
(vec_stack_o_reserve_exact): Remove.
(VEC_length): Remove.
(VEC_empty): Remove.
(VEC_address): Remove.
(vec_address): Remove.
(VEC_last): Remove.
(VEC_index): Remove.
(VEC_iterate): Remove.
(VEC_embedded_size): Remove.
(VEC_embedded_init): Remove.
(VEC_free): Remove.
(VEC_copy): Remove.
(VEC_space): Remove.
(VEC_reserve): Remove.
(VEC_reserve_exact): Remove.
(VEC_splice): Remove.
(VEC_safe_splice): Remove.
(VEC_quick_push): Remove.
(VEC_safe_push): Remove.
(VEC_pop): Remove.
(VEC_truncate): Remove.
(VEC_safe_grow): Remove.
(VEC_replace): Remove.
(VEC_quick_insert): Remove.
(VEC_safe_insert): Remove.
(VEC_ordered_remove): Remove.
(VEC_unordered_remove): Remove.
(VEC_block_remove): Remove.
(VEC_lower_bound): Remove.
(VEC_alloc): Remove.
(VEC_qsort): Remove.
(va_heap): Declare.
(va_heap::default_layout): New typedef to vl_ptr.
(va_heap::reserve): New.
(va_heap::release): New.
(va_gc): Declare.
(va_gc::default_layout): New typedef to vl_embed.
(va_gc::reserve): New.
(va_gc::release): New.
(va_gc_atomic): Declare. Inherit from va_gc.
(va_stack): Declare.
(va_stack::default_layout): New typedef to vl_ptr.
(va_stack::alloc): New.
(va_stack::reserve): New.
(va_stack::release): New.
(register_stack_vec): Declare.
(stack_vec_register_index): Declare.
(unregister_stack_vec): Declare.
(vec<T, A = va_heap, L = typename A::default_layout>): Declare
empty vec template.
(vec<T, A, vl_embed>): Partial specialization for embedded
layout.
(vec<T, A, vl_embed>::allocated): New.
(vec<T, A, vl_embed>::length): New.
(vec<T, A, vl_embed>::is_empty): New.
(vec<T, A, vl_embed>::address): New.
(vec<T, A, vl_embed>::operator[]): New.
(vec<T, A, vl_embed>::last New.
(vec<T, A, vl_embed>::space): New.
(vec<T, A, vl_embed>::iterate): New.
(vec<T, A, vl_embed>::iterate): New.
(vec<T, A, vl_embed>::copy): New.
(vec<T, A, vl_embed>::splice): New.
(vec<T, A, vl_embed>::quick_push New.
(vec<T, A, vl_embed>::pop New.
(vec<T, A, vl_embed>::truncate): New.
(vec<T, A, vl_embed>::quick_insert): New.
(vec<T, A, vl_embed>::ordered_remove): New.
(vec<T, A, vl_embed>::unordered_remove): New.
(vec<T, A, vl_embed>::block_remove): New.
(vec<T, A, vl_embed>::qsort): New.
(vec<T, A, vl_embed>::lower_bound): New.
(vec<T, A, vl_embed>::embedded_size): New.
(vec<T, A, vl_embed>::embedded_init): New.
(vec<T, A, vl_embed>::quick_grow): New.
(vec<T, A, vl_embed>::quick_grow_cleared): New.
(vec_safe_space): New.
(vec_safe_length): New.
(vec_safe_address): New.
(vec_safe_is_empty): New.
(vec_safe_reserve): New.
(vec_safe_reserve_exact): New.
(vec_alloc): New.
(vec_free): New.
(vec_safe_grow): New.
(vec_safe_grow_cleared): New.
(vec_safe_iterate): New.
(vec_safe_push): New.
(vec_safe_insert): New.
(vec_safe_truncate): New.
(vec_safe_copy): New.
(vec_safe_splice): New.
(vec<T, A, vl_ptr>): New partial specialization for the space
efficient layout.
(vec<T, A, vl_ptr>::exists): New.
(vec<T, A, vl_ptr>::is_empty): New.
(vec<T, A, vl_ptr>::length): New.
(vec<T, A, vl_ptr>::address): New.
(vec<T, A, vl_ptr>::operator[]): New.
(vec<T, A, vl_ptr>::operator!=): New.
(vec<T, A, vl_ptr>::operator==): New.
(vec<T, A, vl_ptr>::last): New.
(vec<T, A, vl_ptr>::space): New.
(vec<T, A, vl_ptr>::iterate): New.
(vec<T, A, vl_ptr>::copy): New.
(vec<T, A, vl_ptr>::reserve): New.
(vec<T, A, vl_ptr>::reserve_exact): New.
(vec<T, A, vl_ptr>::splice): New.
(vec<T, A, vl_ptr>::safe_splice): New.
(vec<T, A, vl_ptr>::quick_push): New.
(vec<T, A, vl_ptr>::safe_push): New.
(vec<T, A, vl_ptr>::pop): New.
(vec<T, A, vl_ptr>::truncate): New.
(vec<T, A, vl_ptr>::safe_grow): New.
(vec<T, A, vl_ptr>::safe_grow_cleared): New.
(vec<T, A, vl_ptr>::quick_grow): New.
(vec<T, A, vl_ptr>::quick_grow_cleared): New.
(vec<T, A, vl_ptr>::quick_insert): New.
(vec<T, A, vl_ptr>::safe_insert): New.
(vec<T, A, vl_ptr>::ordered_remove): New.
(vec<T, A, vl_ptr>::unordered_remove): New.
(vec<T, A, vl_ptr>::block_remove): New.
(vec<T, A, vl_ptr>::qsort): New.
(vec<T, A, vl_ptr>::lower_bound): New.
(vec_stack_alloc): Define.
(FOR_EACH_VEC_SAFE_ELT): Define.
* vecir.h: Remove. Update all users.
* vecprim.h: Remove. Update all users.
Move uchar to coretypes.h.
* Makefile.in (VEC_H): Add $(GGC_H).
Remove vecir.h and vecprim.h dependencies everywhere.
2012-11-16 Diego Novillo <dnovillo@google.com>
* gengtype-lex.l (VEC): Remove.
Add characters in the set [\!\>\.-].
* gengtype-parse.c (token_names): Remove "VEC".
(require_template_declaration): Remove handling of VEC_TOKEN.
(type): Likewise.
Call create_user_defined_type when parsing GTY((user)).
* gengtype-state.c (type_lineloc): handle TYPE_UNDEFINED.
(write_state_undefined_type): New.
(write_state_type): Call write_state_undefined_type for
TYPE_UNDEFINED.
(read_state_type): Call read_state_undefined_type for
TYPE_UNDEFINED.
* gengtype.c (dbgprint_count_type_at): Handle TYPE_UNDEFINED.
(create_user_defined_type): Make extern.
(type_for_name): Factor out of resolve_typedef.
(create_undefined_type): New
(resolve_typedef): Call it when we cannot find a previous
typedef and the type is not a template.
(find_structure): Accept TYPE_UNDEFINED.
(set_gc_used_type): Add argument ALLOWED_UNDEFINED_TYPES,
default to false.
Emit an error for TYPE_UNDEFINED unless LEVEL is GC_UNUSED or
ALLOWED_UNDEFINED_TYPES is set.
Set ALLOWED_UNDEFINED_TYPES to true for TYPE_USER_STRUCT.
(filter_type_name): Accept templates with more than one
argument.
(output_mangled_typename): Handle TYPE_UNDEFINED
(walk_type): Likewise.
(write_types_process_field): Likewise.
(write_func_for_structure): If CHAIN_NEXT is set, ORIG_S
should not be a user-defined type.
(write_types_local_user_process_field): Handle TYPE_ARRAY,
TYPE_NONE and TYPE_UNDEFINED.
(write_types_local_process_field): Likewise.
(contains_scalar_p): Return 0 for TYPE_USER_STRUCT.
(write_root): Reject user-defined types that are not pointers.
Handle TYPE_NONE, TYPE_UNDEFINED, TYPE_UNION, TYPE_LANG_STRUCT
and TYPE_PARAM_STRUCT.
(output_typename): Handle TYPE_NONE, TYPE_UNDEFINED, and
TYPE_ARRAY.
(dump_typekind): Handle TYPE_UNDEFINED.
* gengtype.h (enum typekind): Add TYPE_UNDEFINED.
(create_user_defined_type): Declare.
(enum gty_token): Remove VEC_TOKEN.
2012-11-16 Diego Novillo <dnovillo@google.com>
Adjust for new vec API (http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec)
* coretypes.h (uchar): Define.
* alias.c: Use new vec API in vec.h.
* asan.c: Likewise.
* attribs.c: Likewise.
* basic-block.h: Likewise.
* bb-reorder.c: Likewise.
* builtins.c: Likewise.
* calls.c: Likewise.
* cfg.c: Likewise.
* cfganal.c: Likewise.
* cfgcleanup.c: Likewise.
* cfgexpand.c: Likewise.
* cfghooks.c: Likewise.
* cfghooks.h: Likewise.
* cfgloop.c: Likewise.
* cfgloop.h: Likewise.
* cfgloopanal.c: Likewise.
* cfgloopmanip.c: Likewise.
* cfgrtl.c: Likewise.
* cgraph.c: Likewise.
* cgraph.h: Likewise.
* cgraphclones.c: Likewise.
* cgraphunit.c: Likewise.
* combine.c: Likewise.
* compare-elim.c: Likewise.
* coverage.c: Likewise.
* cprop.c: Likewise.
* data-streamer.h: Likewise.
* dbxout.c: Likewise.
* dce.c: Likewise.
* df-core.c: Likewise.
* df-problems.c: Likewise.
* df-scan.c: Likewise.
* dominance.c: Likewise.
* domwalk.c: Likewise.
* domwalk.h: Likewise.
* dse.c: Likewise.
* dwarf2cfi.c: Likewise.
* dwarf2out.c: Likewise.
* dwarf2out.h: Likewise.
* emit-rtl.c: Likewise.
* except.c: Likewise.
* except.h: Likewise.
* expr.c: Likewise.
* expr.h: Likewise.
* final.c: Likewise.
* fold-const.c: Likewise.
* function.c: Likewise.
* function.h: Likewise.
* fwprop.c: Likewise.
* gcc.c: Likewise.
* gcse.c: Likewise.
* genattr.c: Likewise.
* genattrtab.c: Likewise.
* genautomata.c: Likewise.
* genextract.c: Likewise.
* genopinit.c: Likewise
* ggc-common.c: Likewise.
* ggc.h: Likewise.
* gimple-low.c: Likewise.
* gimple-ssa-strength-reduction.c: Likewise.
* gimple-streamer-in.c: Likewise.
* gimple.c: Likewise.
* gimple.h: Likewise.
* gimplify.c: Likewise.
* graph.c: Likewise.
* graphds.c: Likewise.
* graphds.h: Likewise.
* graphite-blocking.c: Likewise.
* graphite-clast-to-gimple.c: Likewise.
* graphite-dependences.c: Likewise.
* graphite-interchange.c: Likewise.
* graphite-optimize-isl.c: Likewise.
* graphite-poly.c: Likewise.
* graphite-poly.h: Likewise.
* graphite-scop-detection.c: Likewise.
* graphite-scop-detection.h: Likewise.
* graphite-sese-to-poly.c: Likewise.
* graphite.c: Likewise.
* godump.c: Likewise.
* haifa-sched.c: Likewise.
* hw-doloop.c: Likewise.
* hw-doloop.h: Likewise.
* ifcvt.c: Likewise.
* insn-addr.h: Likewise.
* ipa-cp.c: Likewise.
* ipa-inline-analysis.c: Likewise.
* ipa-inline-transform.c: Likewise.
* ipa-inline.c: Likewise.
* ipa-inline.h: Likewise.
* ipa-prop.c: Likewise.
* ipa-prop.h: Likewise.
* ipa-pure-const.c: Likewise.
* ipa-ref-inline.h: Likewise.
* ipa-ref.c: Likewise.
* ipa-ref.h: Likewise.
* ipa-reference.c: Likewise.
* ipa-split.c: Likewise.
* ipa-utils.c: Likewise.
* ipa-utils.h: Likewise.
* ipa.c: Likewise.
* ira-build.c: Likewise.
* ira-color.c: Likewise.
* ira-emit.c: Likewise.
* ira-int.h: Likewise.
* ira.c: Likewise.
* loop-invariant.c: Likewise.
* loop-unroll.c: Likewise.
* lower-subreg.c: Likewise.
* lra-lives.c: Likewise.
* lra.c: Likewise.
* lto-cgraph.c: Likewise.
* lto-section-out.c: Likewise.
* lto-streamer-in.c: Likewise.
* lto-streamer-out.c: Likewise.
* lto-streamer.h: Likewise.
* lto-symtab.c: Likewise.
* mcf.c: Likewise.
* modulo-sched.c: Likewise.
* omp-low.c: Likewise.
* opts-common.c: Likewise.
* opts-global.c: Likewise.
* opts.c: Likewise.
* opts.h: Likewise.
* passes.c: Likewise.
* predict.c: Likewise.
* print-tree.c: Likewise.
* profile.c: Likewise.
* profile.h: Likewise.
* read-rtl.c: Likewise.
* ree.c: Likewise.
* reg-stack.c: Likewise.
* regrename.c: Likewise.
* regrename.h: Likewise.
* reload.c: Likewise.
* reload.h: Likewise.
* reload1.c: Likewise.
* rtl.h: Likewise.
* sched-deps.c: Likewise.
* sched-int.h: Likewise.
* sdbout.c: Likewise.
* sel-sched-dump.c: Likewise.
* sel-sched-ir.c: Likewise.
* sel-sched-ir.h: Likewise.
* sel-sched.c: Likewise.
* sese.c: Likewise.
* sese.h: Likewise.
* statistics.h: Likewise.
* stmt.c: Likewise.
* stor-layout.c: Likewise.
* store-motion.c: Likewise.
* tlink.c: Likewise.
* toplev.c: Likewise.
* trans-mem.c: Likewise.
* tree-browser.c: Likewise.
* tree-call-cdce.c: Likewise.
* tree-cfg.c: Likewise.
* tree-cfgcleanup.c: Likewise.
* tree-chrec.c: Likewise.
* tree-chrec.h: Likewise.
* tree-complex.c: Likewise.
* tree-data-ref.c: Likewise.
* tree-data-ref.h: Likewise.
* tree-dfa.c: Likewise.
* tree-diagnostic.c: Likewise.
* tree-dump.c: Likewise.
* tree-eh.c: Likewise.
* tree-emutls.c: Likewise.
* tree-flow.h: Likewise.
* tree-if-conv.c: Likewise.
* tree-inline.c: Likewise.
* tree-inline.h: Likewise.
* tree-into-ssa.c: Likewise.
* tree-iterator.c: Likewise.
* tree-loop-distribution.c: Likewise.
* tree-mudflap.c: Likewise.
* tree-optimize.c: Likewise.
* tree-outof-ssa.c: Likewise.
* tree-parloops.c: Likewise.
* tree-phinodes.c: Likewise.
* tree-predcom.c: Likewise.
* tree-pretty-print.c: Likewise.
* tree-scalar-evolution.c: Likewise.
* tree-sra.c: Likewise.
* tree-ssa-address.c: Likewise.
* tree-ssa-alias.c: Likewise.
* tree-ssa-ccp.c: Likewise.
* tree-ssa-coalesce.c: Likewise.
* tree-ssa-dce.c: Likewise.
* tree-ssa-dom.c: Likewise.
* tree-ssa-forwprop.c: Likewise.
* tree-ssa-live.c: Likewise.
* tree-ssa-live.h: Likewise.
* tree-ssa-loop-im.c: Likewise.
* tree-ssa-loop-ivcanon.c: Likewise.
* tree-ssa-loop-ivopts.c: Likewise.
* tree-ssa-loop-manip.c: Likewise.
* tree-ssa-loop-niter.c: Likewise.
* tree-ssa-loop-prefetch.c: Likewise.
* tree-ssa-math-opts.c: Likewise.
* tree-ssa-operands.c: Likewise.
* tree-ssa-phiopt.c: Likewise.
* tree-ssa-phiprop.c: Likewise.
* tree-ssa-pre.c: Likewise.
* tree-ssa-propagate.c: Likewise.
* tree-ssa-reassoc.c: Likewise.
* tree-ssa-sccvn.c: Likewise.
* tree-ssa-sccvn.h: Likewise.
* tree-ssa-strlen.c: Likewise.
* tree-ssa-structalias.c: Likewise.
* tree-ssa-tail-merge.c: Likewise.
* tree-ssa-threadedge.c: Likewise.
* tree-ssa-threadupdate.c: Likewise.
* tree-ssa-uncprop.c: Likewise.
* tree-ssa-uninit.c: Likewise.
* tree-ssa.c: Likewise.
* tree-ssanames.c: Likewise.
* tree-stdarg.c: Likewise.
* tree-streamer-in.c: Likewise.
* tree-streamer-out.c: Likewise.
* tree-streamer.c: Likewise.
* tree-streamer.h: Likewise.
* tree-switch-conversion.c: Likewise.
* tree-vect-data-refs.c: Likewise.
* tree-vect-generic.c: Likewise.
* tree-vect-loop-manip.c: Likewise.
* tree-vect-loop.c: Likewise.
* tree-vect-patterns.c: Likewise.
* tree-vect-slp.c: Likewise.
* tree-vect-stmts.c: Likewise.
* tree-vectorizer.c: Likewise.
* tree-vectorizer.h: Likewise.
* tree-vrp.c: Likewise.
* tree.c: Likewise.
* tree.h: Likewise.
* value-prof.c: Likewise.
* value-prof.h: Likewise.
* var-tracking.c: Likewise.
* varasm.c: Likewise.
* varpool.c: Likewise.
* vmsdbgout.c: Likewise.
* config/bfin/bfin.c: Likewise.
* config/c6x/c6x.c: Likewise.
* config/darwin.c: Likewise.
* config/i386/i386.c: Likewise.
* config/ia64/ia64.c: Likewise.
* config/mep/mep.c: Likewise.
* config/mips/mips.c: Likewise.
* config/pa/pa.c: Likewise.
* config/rs6000/rs6000-c.c: Likewise.
* config/rs6000/rs6000.c: Likewise.
* config/rx/rx.c: Likewise.
* config/spu/spu-c.c: Likewise.
* config/vms/vms.c: Likewise.
* config/vxworks.c: Likewise.
* config/epiphany/resolve-sw-modes.c: Likewise.
From-SVN: r193595
2012-11-17 21:54:30 -05:00
|
|
|
|
vec<constructor_elt, va_gc> *v;
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
tree part_width = TYPE_SIZE (inner_type);
|
|
|
|
|
tree index = bitsize_int (0);
|
|
|
|
|
int nunits = TYPE_VECTOR_SUBPARTS (type);
|
|
|
|
|
int delta = tree_low_cst (part_width, 1)
|
|
|
|
|
/ tree_low_cst (TYPE_SIZE (TREE_TYPE (type)), 1);
|
|
|
|
|
int i;
|
2011-10-11 16:10:59 +00:00
|
|
|
|
location_t loc = gimple_location (gsi_stmt (*gsi));
|
|
|
|
|
|
|
|
|
|
if (types_compatible_p (gimple_expr_type (gsi_stmt (*gsi)), type))
|
|
|
|
|
warning_at (loc, OPT_Wvector_operation_performance,
|
|
|
|
|
"vector operation will be expanded piecewise");
|
|
|
|
|
else
|
|
|
|
|
warning_at (loc, OPT_Wvector_operation_performance,
|
|
|
|
|
"vector operation will be expanded in parallel");
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
|
This patch rewrites the old VEC macro-based interface into a new one based on the template class 'vec'.
This patch rewrites the old VEC macro-based interface into a new one
based on the template class 'vec'. The user-visible changes are
described in http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec.
I have tested the patch pretty extensively:
- Regular bootstraps on x86_64, ppc, ia64, sparc and hppa.
- Bootstraps with --enable-checking=release
- Bootstraps with --enable-checking=gc,gcac
- Basic builds on all targets (using contrib/config-list.mk).
We no longer access the vectors via VEC_* macros. The pattern is
"VEC_operation (T, A, V, args)" becomes "V.operation (args)".
The only thing I could not do is create proper ctors and dtors for the
vec class. Since these vectors are stored in unions, we
have to keep them as PODs (C++03 does not allow non-PODs in unions).
This means that creation and destruction must be explicit. There is a
new method vec<type, allocation, layout>::create() and another vec<type,
allocation, layout>::destroy() to allocate the internal vector.
For vectors that must be pointers, there is a family of free functions
that implement the operations that need to tolerate NULL vectors.
These functions all start with the prefix 'vec_safe_'. See the wiki
page for details.
The gengtype change removes the special handling for VEC() that used
to exist in gengtype. Additionally, it allows gengtype to recognize
templates of more than one argument and introduces the concept of an
undefined type (useful for template arguments that may or may not be
types).
When a TYPE_UNDEFINED is reached, gengtype will ignore it if it
happens inside a type marked with GTY((user)). Otherwise, it will
emit an error.
Finally, gengtype rejects root types marked GTY((user)) that are not
first class pointers.
2012-11-16 Diego Novillo <dnovillo@google.com>
VEC API overhaul (http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec)
* vec.c (register_overhead): Convert it into
member function of vec_prefix.
(release_overhead): Likewise.
(calculate_allocation): Likewise.
(vec_heap_free): Remove.
(vec_gc_o_reserve_1): Remove.
(vec_heap_o_reserve_1): Remove.
(vec_stack_o_reserve_1): Remove.
(vec_stack_o_reserve_exact): Remove.
(register_stack_vec): New.
(stack_vec_register_index): New.
(unregister_stack_vec): New.
(vec_assert_fail): Remove.
* vec.h: Conditionally include ggc.h. Document conditional
hackery.
Update top-level documentation.
(ALONE_VEC_CHECK_INFO): Remove.
(VEC_CHECK_INFO): Remove.
(ALONE_VEC_CHECK_DECL): Remove.
(VEC_CHECK_DECL): Remove.
(ALONE_VEC_CHECK_PASS): Remove.
(VEC_CHECK_PASS): Remove.
(VEC_ASSERT): Remove.
(vec_prefix): Add friends va_gc, va_gc_atomic, va_heap and
va_stack.
Mark fields alloc_ and num_ as protected.
(struct vec_t): Remove. Remove all function members.
(struct vl_embed): Declare.
(struct vl_ptr): Declare.
(free): Remove.
(reserve_exact): Remove.
(reserve): Remove.
(safe_splice): Remove.
(safe_push): Remove.
(safe_grow): Remove.
(safe_grow_cleared): Remove.
(safe_insert): Remove.
(DEF_VEC_I): Remove.
(DEF_VEC_ALLOC_I): Remove.
(DEF_VEC_P): Remove.
(DEF_VEC_ALLOC_P): Remove.
(DEF_VEC_O): Remove.
(DEF_VEC_ALLOC_O): Remove.
(DEF_VEC_ALLOC_P_STACK): Remove.
(DEF_VEC_ALLOC_O_STACK): Remove.
(DEF_VEC_ALLOC_I_STACK): Remove.
(DEF_VEC_A): Remove.
(DEF_VEC_ALLOC_A): Remove.
(vec_stack_p_reserve_exact_1): Remove.
(vec_stack_o_reserve): Remove.
(vec_stack_o_reserve_exact): Remove.
(VEC_length): Remove.
(VEC_empty): Remove.
(VEC_address): Remove.
(vec_address): Remove.
(VEC_last): Remove.
(VEC_index): Remove.
(VEC_iterate): Remove.
(VEC_embedded_size): Remove.
(VEC_embedded_init): Remove.
(VEC_free): Remove.
(VEC_copy): Remove.
(VEC_space): Remove.
(VEC_reserve): Remove.
(VEC_reserve_exact): Remove.
(VEC_splice): Remove.
(VEC_safe_splice): Remove.
(VEC_quick_push): Remove.
(VEC_safe_push): Remove.
(VEC_pop): Remove.
(VEC_truncate): Remove.
(VEC_safe_grow): Remove.
(VEC_replace): Remove.
(VEC_quick_insert): Remove.
(VEC_safe_insert): Remove.
(VEC_ordered_remove): Remove.
(VEC_unordered_remove): Remove.
(VEC_block_remove): Remove.
(VEC_lower_bound): Remove.
(VEC_alloc): Remove.
(VEC_qsort): Remove.
(va_heap): Declare.
(va_heap::default_layout): New typedef to vl_ptr.
(va_heap::reserve): New.
(va_heap::release): New.
(va_gc): Declare.
(va_gc::default_layout): New typedef to vl_embed.
(va_gc::reserve): New.
(va_gc::release): New.
(va_gc_atomic): Declare. Inherit from va_gc.
(va_stack): Declare.
(va_stack::default_layout): New typedef to vl_ptr.
(va_stack::alloc): New.
(va_stack::reserve): New.
(va_stack::release): New.
(register_stack_vec): Declare.
(stack_vec_register_index): Declare.
(unregister_stack_vec): Declare.
(vec<T, A = va_heap, L = typename A::default_layout>): Declare
empty vec template.
(vec<T, A, vl_embed>): Partial specialization for embedded
layout.
(vec<T, A, vl_embed>::allocated): New.
(vec<T, A, vl_embed>::length): New.
(vec<T, A, vl_embed>::is_empty): New.
(vec<T, A, vl_embed>::address): New.
(vec<T, A, vl_embed>::operator[]): New.
(vec<T, A, vl_embed>::last New.
(vec<T, A, vl_embed>::space): New.
(vec<T, A, vl_embed>::iterate): New.
(vec<T, A, vl_embed>::iterate): New.
(vec<T, A, vl_embed>::copy): New.
(vec<T, A, vl_embed>::splice): New.
(vec<T, A, vl_embed>::quick_push New.
(vec<T, A, vl_embed>::pop New.
(vec<T, A, vl_embed>::truncate): New.
(vec<T, A, vl_embed>::quick_insert): New.
(vec<T, A, vl_embed>::ordered_remove): New.
(vec<T, A, vl_embed>::unordered_remove): New.
(vec<T, A, vl_embed>::block_remove): New.
(vec<T, A, vl_embed>::qsort): New.
(vec<T, A, vl_embed>::lower_bound): New.
(vec<T, A, vl_embed>::embedded_size): New.
(vec<T, A, vl_embed>::embedded_init): New.
(vec<T, A, vl_embed>::quick_grow): New.
(vec<T, A, vl_embed>::quick_grow_cleared): New.
(vec_safe_space): New.
(vec_safe_length): New.
(vec_safe_address): New.
(vec_safe_is_empty): New.
(vec_safe_reserve): New.
(vec_safe_reserve_exact): New.
(vec_alloc): New.
(vec_free): New.
(vec_safe_grow): New.
(vec_safe_grow_cleared): New.
(vec_safe_iterate): New.
(vec_safe_push): New.
(vec_safe_insert): New.
(vec_safe_truncate): New.
(vec_safe_copy): New.
(vec_safe_splice): New.
(vec<T, A, vl_ptr>): New partial specialization for the space
efficient layout.
(vec<T, A, vl_ptr>::exists): New.
(vec<T, A, vl_ptr>::is_empty): New.
(vec<T, A, vl_ptr>::length): New.
(vec<T, A, vl_ptr>::address): New.
(vec<T, A, vl_ptr>::operator[]): New.
(vec<T, A, vl_ptr>::operator!=): New.
(vec<T, A, vl_ptr>::operator==): New.
(vec<T, A, vl_ptr>::last): New.
(vec<T, A, vl_ptr>::space): New.
(vec<T, A, vl_ptr>::iterate): New.
(vec<T, A, vl_ptr>::copy): New.
(vec<T, A, vl_ptr>::reserve): New.
(vec<T, A, vl_ptr>::reserve_exact): New.
(vec<T, A, vl_ptr>::splice): New.
(vec<T, A, vl_ptr>::safe_splice): New.
(vec<T, A, vl_ptr>::quick_push): New.
(vec<T, A, vl_ptr>::safe_push): New.
(vec<T, A, vl_ptr>::pop): New.
(vec<T, A, vl_ptr>::truncate): New.
(vec<T, A, vl_ptr>::safe_grow): New.
(vec<T, A, vl_ptr>::safe_grow_cleared): New.
(vec<T, A, vl_ptr>::quick_grow): New.
(vec<T, A, vl_ptr>::quick_grow_cleared): New.
(vec<T, A, vl_ptr>::quick_insert): New.
(vec<T, A, vl_ptr>::safe_insert): New.
(vec<T, A, vl_ptr>::ordered_remove): New.
(vec<T, A, vl_ptr>::unordered_remove): New.
(vec<T, A, vl_ptr>::block_remove): New.
(vec<T, A, vl_ptr>::qsort): New.
(vec<T, A, vl_ptr>::lower_bound): New.
(vec_stack_alloc): Define.
(FOR_EACH_VEC_SAFE_ELT): Define.
* vecir.h: Remove. Update all users.
* vecprim.h: Remove. Update all users.
Move uchar to coretypes.h.
* Makefile.in (VEC_H): Add $(GGC_H).
Remove vecir.h and vecprim.h dependencies everywhere.
2012-11-16 Diego Novillo <dnovillo@google.com>
* gengtype-lex.l (VEC): Remove.
Add characters in the set [\!\>\.-].
* gengtype-parse.c (token_names): Remove "VEC".
(require_template_declaration): Remove handling of VEC_TOKEN.
(type): Likewise.
Call create_user_defined_type when parsing GTY((user)).
* gengtype-state.c (type_lineloc): handle TYPE_UNDEFINED.
(write_state_undefined_type): New.
(write_state_type): Call write_state_undefined_type for
TYPE_UNDEFINED.
(read_state_type): Call read_state_undefined_type for
TYPE_UNDEFINED.
* gengtype.c (dbgprint_count_type_at): Handle TYPE_UNDEFINED.
(create_user_defined_type): Make extern.
(type_for_name): Factor out of resolve_typedef.
(create_undefined_type): New
(resolve_typedef): Call it when we cannot find a previous
typedef and the type is not a template.
(find_structure): Accept TYPE_UNDEFINED.
(set_gc_used_type): Add argument ALLOWED_UNDEFINED_TYPES,
default to false.
Emit an error for TYPE_UNDEFINED unless LEVEL is GC_UNUSED or
ALLOWED_UNDEFINED_TYPES is set.
Set ALLOWED_UNDEFINED_TYPES to true for TYPE_USER_STRUCT.
(filter_type_name): Accept templates with more than one
argument.
(output_mangled_typename): Handle TYPE_UNDEFINED
(walk_type): Likewise.
(write_types_process_field): Likewise.
(write_func_for_structure): If CHAIN_NEXT is set, ORIG_S
should not be a user-defined type.
(write_types_local_user_process_field): Handle TYPE_ARRAY,
TYPE_NONE and TYPE_UNDEFINED.
(write_types_local_process_field): Likewise.
(contains_scalar_p): Return 0 for TYPE_USER_STRUCT.
(write_root): Reject user-defined types that are not pointers.
Handle TYPE_NONE, TYPE_UNDEFINED, TYPE_UNION, TYPE_LANG_STRUCT
and TYPE_PARAM_STRUCT.
(output_typename): Handle TYPE_NONE, TYPE_UNDEFINED, and
TYPE_ARRAY.
(dump_typekind): Handle TYPE_UNDEFINED.
* gengtype.h (enum typekind): Add TYPE_UNDEFINED.
(create_user_defined_type): Declare.
(enum gty_token): Remove VEC_TOKEN.
2012-11-16 Diego Novillo <dnovillo@google.com>
Adjust for new vec API (http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec)
* coretypes.h (uchar): Define.
* alias.c: Use new vec API in vec.h.
* asan.c: Likewise.
* attribs.c: Likewise.
* basic-block.h: Likewise.
* bb-reorder.c: Likewise.
* builtins.c: Likewise.
* calls.c: Likewise.
* cfg.c: Likewise.
* cfganal.c: Likewise.
* cfgcleanup.c: Likewise.
* cfgexpand.c: Likewise.
* cfghooks.c: Likewise.
* cfghooks.h: Likewise.
* cfgloop.c: Likewise.
* cfgloop.h: Likewise.
* cfgloopanal.c: Likewise.
* cfgloopmanip.c: Likewise.
* cfgrtl.c: Likewise.
* cgraph.c: Likewise.
* cgraph.h: Likewise.
* cgraphclones.c: Likewise.
* cgraphunit.c: Likewise.
* combine.c: Likewise.
* compare-elim.c: Likewise.
* coverage.c: Likewise.
* cprop.c: Likewise.
* data-streamer.h: Likewise.
* dbxout.c: Likewise.
* dce.c: Likewise.
* df-core.c: Likewise.
* df-problems.c: Likewise.
* df-scan.c: Likewise.
* dominance.c: Likewise.
* domwalk.c: Likewise.
* domwalk.h: Likewise.
* dse.c: Likewise.
* dwarf2cfi.c: Likewise.
* dwarf2out.c: Likewise.
* dwarf2out.h: Likewise.
* emit-rtl.c: Likewise.
* except.c: Likewise.
* except.h: Likewise.
* expr.c: Likewise.
* expr.h: Likewise.
* final.c: Likewise.
* fold-const.c: Likewise.
* function.c: Likewise.
* function.h: Likewise.
* fwprop.c: Likewise.
* gcc.c: Likewise.
* gcse.c: Likewise.
* genattr.c: Likewise.
* genattrtab.c: Likewise.
* genautomata.c: Likewise.
* genextract.c: Likewise.
* genopinit.c: Likewise
* ggc-common.c: Likewise.
* ggc.h: Likewise.
* gimple-low.c: Likewise.
* gimple-ssa-strength-reduction.c: Likewise.
* gimple-streamer-in.c: Likewise.
* gimple.c: Likewise.
* gimple.h: Likewise.
* gimplify.c: Likewise.
* graph.c: Likewise.
* graphds.c: Likewise.
* graphds.h: Likewise.
* graphite-blocking.c: Likewise.
* graphite-clast-to-gimple.c: Likewise.
* graphite-dependences.c: Likewise.
* graphite-interchange.c: Likewise.
* graphite-optimize-isl.c: Likewise.
* graphite-poly.c: Likewise.
* graphite-poly.h: Likewise.
* graphite-scop-detection.c: Likewise.
* graphite-scop-detection.h: Likewise.
* graphite-sese-to-poly.c: Likewise.
* graphite.c: Likewise.
* godump.c: Likewise.
* haifa-sched.c: Likewise.
* hw-doloop.c: Likewise.
* hw-doloop.h: Likewise.
* ifcvt.c: Likewise.
* insn-addr.h: Likewise.
* ipa-cp.c: Likewise.
* ipa-inline-analysis.c: Likewise.
* ipa-inline-transform.c: Likewise.
* ipa-inline.c: Likewise.
* ipa-inline.h: Likewise.
* ipa-prop.c: Likewise.
* ipa-prop.h: Likewise.
* ipa-pure-const.c: Likewise.
* ipa-ref-inline.h: Likewise.
* ipa-ref.c: Likewise.
* ipa-ref.h: Likewise.
* ipa-reference.c: Likewise.
* ipa-split.c: Likewise.
* ipa-utils.c: Likewise.
* ipa-utils.h: Likewise.
* ipa.c: Likewise.
* ira-build.c: Likewise.
* ira-color.c: Likewise.
* ira-emit.c: Likewise.
* ira-int.h: Likewise.
* ira.c: Likewise.
* loop-invariant.c: Likewise.
* loop-unroll.c: Likewise.
* lower-subreg.c: Likewise.
* lra-lives.c: Likewise.
* lra.c: Likewise.
* lto-cgraph.c: Likewise.
* lto-section-out.c: Likewise.
* lto-streamer-in.c: Likewise.
* lto-streamer-out.c: Likewise.
* lto-streamer.h: Likewise.
* lto-symtab.c: Likewise.
* mcf.c: Likewise.
* modulo-sched.c: Likewise.
* omp-low.c: Likewise.
* opts-common.c: Likewise.
* opts-global.c: Likewise.
* opts.c: Likewise.
* opts.h: Likewise.
* passes.c: Likewise.
* predict.c: Likewise.
* print-tree.c: Likewise.
* profile.c: Likewise.
* profile.h: Likewise.
* read-rtl.c: Likewise.
* ree.c: Likewise.
* reg-stack.c: Likewise.
* regrename.c: Likewise.
* regrename.h: Likewise.
* reload.c: Likewise.
* reload.h: Likewise.
* reload1.c: Likewise.
* rtl.h: Likewise.
* sched-deps.c: Likewise.
* sched-int.h: Likewise.
* sdbout.c: Likewise.
* sel-sched-dump.c: Likewise.
* sel-sched-ir.c: Likewise.
* sel-sched-ir.h: Likewise.
* sel-sched.c: Likewise.
* sese.c: Likewise.
* sese.h: Likewise.
* statistics.h: Likewise.
* stmt.c: Likewise.
* stor-layout.c: Likewise.
* store-motion.c: Likewise.
* tlink.c: Likewise.
* toplev.c: Likewise.
* trans-mem.c: Likewise.
* tree-browser.c: Likewise.
* tree-call-cdce.c: Likewise.
* tree-cfg.c: Likewise.
* tree-cfgcleanup.c: Likewise.
* tree-chrec.c: Likewise.
* tree-chrec.h: Likewise.
* tree-complex.c: Likewise.
* tree-data-ref.c: Likewise.
* tree-data-ref.h: Likewise.
* tree-dfa.c: Likewise.
* tree-diagnostic.c: Likewise.
* tree-dump.c: Likewise.
* tree-eh.c: Likewise.
* tree-emutls.c: Likewise.
* tree-flow.h: Likewise.
* tree-if-conv.c: Likewise.
* tree-inline.c: Likewise.
* tree-inline.h: Likewise.
* tree-into-ssa.c: Likewise.
* tree-iterator.c: Likewise.
* tree-loop-distribution.c: Likewise.
* tree-mudflap.c: Likewise.
* tree-optimize.c: Likewise.
* tree-outof-ssa.c: Likewise.
* tree-parloops.c: Likewise.
* tree-phinodes.c: Likewise.
* tree-predcom.c: Likewise.
* tree-pretty-print.c: Likewise.
* tree-scalar-evolution.c: Likewise.
* tree-sra.c: Likewise.
* tree-ssa-address.c: Likewise.
* tree-ssa-alias.c: Likewise.
* tree-ssa-ccp.c: Likewise.
* tree-ssa-coalesce.c: Likewise.
* tree-ssa-dce.c: Likewise.
* tree-ssa-dom.c: Likewise.
* tree-ssa-forwprop.c: Likewise.
* tree-ssa-live.c: Likewise.
* tree-ssa-live.h: Likewise.
* tree-ssa-loop-im.c: Likewise.
* tree-ssa-loop-ivcanon.c: Likewise.
* tree-ssa-loop-ivopts.c: Likewise.
* tree-ssa-loop-manip.c: Likewise.
* tree-ssa-loop-niter.c: Likewise.
* tree-ssa-loop-prefetch.c: Likewise.
* tree-ssa-math-opts.c: Likewise.
* tree-ssa-operands.c: Likewise.
* tree-ssa-phiopt.c: Likewise.
* tree-ssa-phiprop.c: Likewise.
* tree-ssa-pre.c: Likewise.
* tree-ssa-propagate.c: Likewise.
* tree-ssa-reassoc.c: Likewise.
* tree-ssa-sccvn.c: Likewise.
* tree-ssa-sccvn.h: Likewise.
* tree-ssa-strlen.c: Likewise.
* tree-ssa-structalias.c: Likewise.
* tree-ssa-tail-merge.c: Likewise.
* tree-ssa-threadedge.c: Likewise.
* tree-ssa-threadupdate.c: Likewise.
* tree-ssa-uncprop.c: Likewise.
* tree-ssa-uninit.c: Likewise.
* tree-ssa.c: Likewise.
* tree-ssanames.c: Likewise.
* tree-stdarg.c: Likewise.
* tree-streamer-in.c: Likewise.
* tree-streamer-out.c: Likewise.
* tree-streamer.c: Likewise.
* tree-streamer.h: Likewise.
* tree-switch-conversion.c: Likewise.
* tree-vect-data-refs.c: Likewise.
* tree-vect-generic.c: Likewise.
* tree-vect-loop-manip.c: Likewise.
* tree-vect-loop.c: Likewise.
* tree-vect-patterns.c: Likewise.
* tree-vect-slp.c: Likewise.
* tree-vect-stmts.c: Likewise.
* tree-vectorizer.c: Likewise.
* tree-vectorizer.h: Likewise.
* tree-vrp.c: Likewise.
* tree.c: Likewise.
* tree.h: Likewise.
* value-prof.c: Likewise.
* value-prof.h: Likewise.
* var-tracking.c: Likewise.
* varasm.c: Likewise.
* varpool.c: Likewise.
* vmsdbgout.c: Likewise.
* config/bfin/bfin.c: Likewise.
* config/c6x/c6x.c: Likewise.
* config/darwin.c: Likewise.
* config/i386/i386.c: Likewise.
* config/ia64/ia64.c: Likewise.
* config/mep/mep.c: Likewise.
* config/mips/mips.c: Likewise.
* config/pa/pa.c: Likewise.
* config/rs6000/rs6000-c.c: Likewise.
* config/rs6000/rs6000.c: Likewise.
* config/rx/rx.c: Likewise.
* config/spu/spu-c.c: Likewise.
* config/vms/vms.c: Likewise.
* config/vxworks.c: Likewise.
* config/epiphany/resolve-sw-modes.c: Likewise.
From-SVN: r193595
2012-11-17 21:54:30 -05:00
|
|
|
|
vec_alloc (v, (nunits + delta - 1) / delta);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
for (i = 0; i < nunits;
|
2011-05-04 09:04:53 +00:00
|
|
|
|
i += delta, index = int_const_binop (PLUS_EXPR, index, part_width))
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
{
|
2008-07-28 14:33:56 +00:00
|
|
|
|
tree result = f (gsi, inner_type, a, b, index, part_width, code);
|
Remove unnecessary VEC function overloads.
Several VEC member functions that accept an element 'T' used to have
two overloads: one taking 'T', the second taking 'T *'.
This used to be needed because of the interface dichotomy between
vectors of objects and vectors of pointers. In the past, vectors of
pointers would use pass-by-value semantics, but vectors of objects
would use pass-by-reference semantics. This is no longer necessary,
but the distinction had remained.
The main side-effect of this change is some code reduction in code
that manipulates vectors of objects. For instance,
- struct iterator_use *iuse;
-
- iuse = VEC_safe_push (iterator_use, heap, iterator_uses, NULL);
- iuse->iterator = iterator;
- iuse->ptr = ptr;
+ struct iterator_use iuse = {iterator, ptr};
+ VEC_safe_push (iterator_use, heap, iterator_uses, iuse);
Compile time performance was not affected.
Tested on x86_64 and ppc64.
Also built all-gcc on all targets using VEC routines: arm, bfin, c6x,
epiphany, ia64, mips, sh, spu, and vms.
2012-09-10 Diego Novillo <dnovillo@google.com>
* vec.h (vec_t::quick_push): Remove overload that accepts 'T *'.
Update all users.
(vec_t::safe_push): Likewise.
(vec_t::quick_insert): Likewise.
(vec_t::lower_bound): Likewise.
(vec_t::safe_insert): Likewise.
(vec_t::replace): Change second argument to 'T &'.
From-SVN: r191165
2012-09-10 20:04:13 -04:00
|
|
|
|
constructor_elt ce = {NULL_TREE, result};
|
This patch rewrites the old VEC macro-based interface into a new one based on the template class 'vec'.
This patch rewrites the old VEC macro-based interface into a new one
based on the template class 'vec'. The user-visible changes are
described in http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec.
I have tested the patch pretty extensively:
- Regular bootstraps on x86_64, ppc, ia64, sparc and hppa.
- Bootstraps with --enable-checking=release
- Bootstraps with --enable-checking=gc,gcac
- Basic builds on all targets (using contrib/config-list.mk).
We no longer access the vectors via VEC_* macros. The pattern is
"VEC_operation (T, A, V, args)" becomes "V.operation (args)".
The only thing I could not do is create proper ctors and dtors for the
vec class. Since these vectors are stored in unions, we
have to keep them as PODs (C++03 does not allow non-PODs in unions).
This means that creation and destruction must be explicit. There is a
new method vec<type, allocation, layout>::create() and another vec<type,
allocation, layout>::destroy() to allocate the internal vector.
For vectors that must be pointers, there is a family of free functions
that implement the operations that need to tolerate NULL vectors.
These functions all start with the prefix 'vec_safe_'. See the wiki
page for details.
The gengtype change removes the special handling for VEC() that used
to exist in gengtype. Additionally, it allows gengtype to recognize
templates of more than one argument and introduces the concept of an
undefined type (useful for template arguments that may or may not be
types).
When a TYPE_UNDEFINED is reached, gengtype will ignore it if it
happens inside a type marked with GTY((user)). Otherwise, it will
emit an error.
Finally, gengtype rejects root types marked GTY((user)) that are not
first class pointers.
2012-11-16 Diego Novillo <dnovillo@google.com>
VEC API overhaul (http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec)
* vec.c (register_overhead): Convert it into
member function of vec_prefix.
(release_overhead): Likewise.
(calculate_allocation): Likewise.
(vec_heap_free): Remove.
(vec_gc_o_reserve_1): Remove.
(vec_heap_o_reserve_1): Remove.
(vec_stack_o_reserve_1): Remove.
(vec_stack_o_reserve_exact): Remove.
(register_stack_vec): New.
(stack_vec_register_index): New.
(unregister_stack_vec): New.
(vec_assert_fail): Remove.
* vec.h: Conditionally include ggc.h. Document conditional
hackery.
Update top-level documentation.
(ALONE_VEC_CHECK_INFO): Remove.
(VEC_CHECK_INFO): Remove.
(ALONE_VEC_CHECK_DECL): Remove.
(VEC_CHECK_DECL): Remove.
(ALONE_VEC_CHECK_PASS): Remove.
(VEC_CHECK_PASS): Remove.
(VEC_ASSERT): Remove.
(vec_prefix): Add friends va_gc, va_gc_atomic, va_heap and
va_stack.
Mark fields alloc_ and num_ as protected.
(struct vec_t): Remove. Remove all function members.
(struct vl_embed): Declare.
(struct vl_ptr): Declare.
(free): Remove.
(reserve_exact): Remove.
(reserve): Remove.
(safe_splice): Remove.
(safe_push): Remove.
(safe_grow): Remove.
(safe_grow_cleared): Remove.
(safe_insert): Remove.
(DEF_VEC_I): Remove.
(DEF_VEC_ALLOC_I): Remove.
(DEF_VEC_P): Remove.
(DEF_VEC_ALLOC_P): Remove.
(DEF_VEC_O): Remove.
(DEF_VEC_ALLOC_O): Remove.
(DEF_VEC_ALLOC_P_STACK): Remove.
(DEF_VEC_ALLOC_O_STACK): Remove.
(DEF_VEC_ALLOC_I_STACK): Remove.
(DEF_VEC_A): Remove.
(DEF_VEC_ALLOC_A): Remove.
(vec_stack_p_reserve_exact_1): Remove.
(vec_stack_o_reserve): Remove.
(vec_stack_o_reserve_exact): Remove.
(VEC_length): Remove.
(VEC_empty): Remove.
(VEC_address): Remove.
(vec_address): Remove.
(VEC_last): Remove.
(VEC_index): Remove.
(VEC_iterate): Remove.
(VEC_embedded_size): Remove.
(VEC_embedded_init): Remove.
(VEC_free): Remove.
(VEC_copy): Remove.
(VEC_space): Remove.
(VEC_reserve): Remove.
(VEC_reserve_exact): Remove.
(VEC_splice): Remove.
(VEC_safe_splice): Remove.
(VEC_quick_push): Remove.
(VEC_safe_push): Remove.
(VEC_pop): Remove.
(VEC_truncate): Remove.
(VEC_safe_grow): Remove.
(VEC_replace): Remove.
(VEC_quick_insert): Remove.
(VEC_safe_insert): Remove.
(VEC_ordered_remove): Remove.
(VEC_unordered_remove): Remove.
(VEC_block_remove): Remove.
(VEC_lower_bound): Remove.
(VEC_alloc): Remove.
(VEC_qsort): Remove.
(va_heap): Declare.
(va_heap::default_layout): New typedef to vl_ptr.
(va_heap::reserve): New.
(va_heap::release): New.
(va_gc): Declare.
(va_gc::default_layout): New typedef to vl_embed.
(va_gc::reserve): New.
(va_gc::release): New.
(va_gc_atomic): Declare. Inherit from va_gc.
(va_stack): Declare.
(va_stack::default_layout): New typedef to vl_ptr.
(va_stack::alloc): New.
(va_stack::reserve): New.
(va_stack::release): New.
(register_stack_vec): Declare.
(stack_vec_register_index): Declare.
(unregister_stack_vec): Declare.
(vec<T, A = va_heap, L = typename A::default_layout>): Declare
empty vec template.
(vec<T, A, vl_embed>): Partial specialization for embedded
layout.
(vec<T, A, vl_embed>::allocated): New.
(vec<T, A, vl_embed>::length): New.
(vec<T, A, vl_embed>::is_empty): New.
(vec<T, A, vl_embed>::address): New.
(vec<T, A, vl_embed>::operator[]): New.
(vec<T, A, vl_embed>::last New.
(vec<T, A, vl_embed>::space): New.
(vec<T, A, vl_embed>::iterate): New.
(vec<T, A, vl_embed>::iterate): New.
(vec<T, A, vl_embed>::copy): New.
(vec<T, A, vl_embed>::splice): New.
(vec<T, A, vl_embed>::quick_push New.
(vec<T, A, vl_embed>::pop New.
(vec<T, A, vl_embed>::truncate): New.
(vec<T, A, vl_embed>::quick_insert): New.
(vec<T, A, vl_embed>::ordered_remove): New.
(vec<T, A, vl_embed>::unordered_remove): New.
(vec<T, A, vl_embed>::block_remove): New.
(vec<T, A, vl_embed>::qsort): New.
(vec<T, A, vl_embed>::lower_bound): New.
(vec<T, A, vl_embed>::embedded_size): New.
(vec<T, A, vl_embed>::embedded_init): New.
(vec<T, A, vl_embed>::quick_grow): New.
(vec<T, A, vl_embed>::quick_grow_cleared): New.
(vec_safe_space): New.
(vec_safe_length): New.
(vec_safe_address): New.
(vec_safe_is_empty): New.
(vec_safe_reserve): New.
(vec_safe_reserve_exact): New.
(vec_alloc): New.
(vec_free): New.
(vec_safe_grow): New.
(vec_safe_grow_cleared): New.
(vec_safe_iterate): New.
(vec_safe_push): New.
(vec_safe_insert): New.
(vec_safe_truncate): New.
(vec_safe_copy): New.
(vec_safe_splice): New.
(vec<T, A, vl_ptr>): New partial specialization for the space
efficient layout.
(vec<T, A, vl_ptr>::exists): New.
(vec<T, A, vl_ptr>::is_empty): New.
(vec<T, A, vl_ptr>::length): New.
(vec<T, A, vl_ptr>::address): New.
(vec<T, A, vl_ptr>::operator[]): New.
(vec<T, A, vl_ptr>::operator!=): New.
(vec<T, A, vl_ptr>::operator==): New.
(vec<T, A, vl_ptr>::last): New.
(vec<T, A, vl_ptr>::space): New.
(vec<T, A, vl_ptr>::iterate): New.
(vec<T, A, vl_ptr>::copy): New.
(vec<T, A, vl_ptr>::reserve): New.
(vec<T, A, vl_ptr>::reserve_exact): New.
(vec<T, A, vl_ptr>::splice): New.
(vec<T, A, vl_ptr>::safe_splice): New.
(vec<T, A, vl_ptr>::quick_push): New.
(vec<T, A, vl_ptr>::safe_push): New.
(vec<T, A, vl_ptr>::pop): New.
(vec<T, A, vl_ptr>::truncate): New.
(vec<T, A, vl_ptr>::safe_grow): New.
(vec<T, A, vl_ptr>::safe_grow_cleared): New.
(vec<T, A, vl_ptr>::quick_grow): New.
(vec<T, A, vl_ptr>::quick_grow_cleared): New.
(vec<T, A, vl_ptr>::quick_insert): New.
(vec<T, A, vl_ptr>::safe_insert): New.
(vec<T, A, vl_ptr>::ordered_remove): New.
(vec<T, A, vl_ptr>::unordered_remove): New.
(vec<T, A, vl_ptr>::block_remove): New.
(vec<T, A, vl_ptr>::qsort): New.
(vec<T, A, vl_ptr>::lower_bound): New.
(vec_stack_alloc): Define.
(FOR_EACH_VEC_SAFE_ELT): Define.
* vecir.h: Remove. Update all users.
* vecprim.h: Remove. Update all users.
Move uchar to coretypes.h.
* Makefile.in (VEC_H): Add $(GGC_H).
Remove vecir.h and vecprim.h dependencies everywhere.
2012-11-16 Diego Novillo <dnovillo@google.com>
* gengtype-lex.l (VEC): Remove.
Add characters in the set [\!\>\.-].
* gengtype-parse.c (token_names): Remove "VEC".
(require_template_declaration): Remove handling of VEC_TOKEN.
(type): Likewise.
Call create_user_defined_type when parsing GTY((user)).
* gengtype-state.c (type_lineloc): handle TYPE_UNDEFINED.
(write_state_undefined_type): New.
(write_state_type): Call write_state_undefined_type for
TYPE_UNDEFINED.
(read_state_type): Call read_state_undefined_type for
TYPE_UNDEFINED.
* gengtype.c (dbgprint_count_type_at): Handle TYPE_UNDEFINED.
(create_user_defined_type): Make extern.
(type_for_name): Factor out of resolve_typedef.
(create_undefined_type): New
(resolve_typedef): Call it when we cannot find a previous
typedef and the type is not a template.
(find_structure): Accept TYPE_UNDEFINED.
(set_gc_used_type): Add argument ALLOWED_UNDEFINED_TYPES,
default to false.
Emit an error for TYPE_UNDEFINED unless LEVEL is GC_UNUSED or
ALLOWED_UNDEFINED_TYPES is set.
Set ALLOWED_UNDEFINED_TYPES to true for TYPE_USER_STRUCT.
(filter_type_name): Accept templates with more than one
argument.
(output_mangled_typename): Handle TYPE_UNDEFINED
(walk_type): Likewise.
(write_types_process_field): Likewise.
(write_func_for_structure): If CHAIN_NEXT is set, ORIG_S
should not be a user-defined type.
(write_types_local_user_process_field): Handle TYPE_ARRAY,
TYPE_NONE and TYPE_UNDEFINED.
(write_types_local_process_field): Likewise.
(contains_scalar_p): Return 0 for TYPE_USER_STRUCT.
(write_root): Reject user-defined types that are not pointers.
Handle TYPE_NONE, TYPE_UNDEFINED, TYPE_UNION, TYPE_LANG_STRUCT
and TYPE_PARAM_STRUCT.
(output_typename): Handle TYPE_NONE, TYPE_UNDEFINED, and
TYPE_ARRAY.
(dump_typekind): Handle TYPE_UNDEFINED.
* gengtype.h (enum typekind): Add TYPE_UNDEFINED.
(create_user_defined_type): Declare.
(enum gty_token): Remove VEC_TOKEN.
2012-11-16 Diego Novillo <dnovillo@google.com>
Adjust for new vec API (http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec)
* coretypes.h (uchar): Define.
* alias.c: Use new vec API in vec.h.
* asan.c: Likewise.
* attribs.c: Likewise.
* basic-block.h: Likewise.
* bb-reorder.c: Likewise.
* builtins.c: Likewise.
* calls.c: Likewise.
* cfg.c: Likewise.
* cfganal.c: Likewise.
* cfgcleanup.c: Likewise.
* cfgexpand.c: Likewise.
* cfghooks.c: Likewise.
* cfghooks.h: Likewise.
* cfgloop.c: Likewise.
* cfgloop.h: Likewise.
* cfgloopanal.c: Likewise.
* cfgloopmanip.c: Likewise.
* cfgrtl.c: Likewise.
* cgraph.c: Likewise.
* cgraph.h: Likewise.
* cgraphclones.c: Likewise.
* cgraphunit.c: Likewise.
* combine.c: Likewise.
* compare-elim.c: Likewise.
* coverage.c: Likewise.
* cprop.c: Likewise.
* data-streamer.h: Likewise.
* dbxout.c: Likewise.
* dce.c: Likewise.
* df-core.c: Likewise.
* df-problems.c: Likewise.
* df-scan.c: Likewise.
* dominance.c: Likewise.
* domwalk.c: Likewise.
* domwalk.h: Likewise.
* dse.c: Likewise.
* dwarf2cfi.c: Likewise.
* dwarf2out.c: Likewise.
* dwarf2out.h: Likewise.
* emit-rtl.c: Likewise.
* except.c: Likewise.
* except.h: Likewise.
* expr.c: Likewise.
* expr.h: Likewise.
* final.c: Likewise.
* fold-const.c: Likewise.
* function.c: Likewise.
* function.h: Likewise.
* fwprop.c: Likewise.
* gcc.c: Likewise.
* gcse.c: Likewise.
* genattr.c: Likewise.
* genattrtab.c: Likewise.
* genautomata.c: Likewise.
* genextract.c: Likewise.
* genopinit.c: Likewise
* ggc-common.c: Likewise.
* ggc.h: Likewise.
* gimple-low.c: Likewise.
* gimple-ssa-strength-reduction.c: Likewise.
* gimple-streamer-in.c: Likewise.
* gimple.c: Likewise.
* gimple.h: Likewise.
* gimplify.c: Likewise.
* graph.c: Likewise.
* graphds.c: Likewise.
* graphds.h: Likewise.
* graphite-blocking.c: Likewise.
* graphite-clast-to-gimple.c: Likewise.
* graphite-dependences.c: Likewise.
* graphite-interchange.c: Likewise.
* graphite-optimize-isl.c: Likewise.
* graphite-poly.c: Likewise.
* graphite-poly.h: Likewise.
* graphite-scop-detection.c: Likewise.
* graphite-scop-detection.h: Likewise.
* graphite-sese-to-poly.c: Likewise.
* graphite.c: Likewise.
* godump.c: Likewise.
* haifa-sched.c: Likewise.
* hw-doloop.c: Likewise.
* hw-doloop.h: Likewise.
* ifcvt.c: Likewise.
* insn-addr.h: Likewise.
* ipa-cp.c: Likewise.
* ipa-inline-analysis.c: Likewise.
* ipa-inline-transform.c: Likewise.
* ipa-inline.c: Likewise.
* ipa-inline.h: Likewise.
* ipa-prop.c: Likewise.
* ipa-prop.h: Likewise.
* ipa-pure-const.c: Likewise.
* ipa-ref-inline.h: Likewise.
* ipa-ref.c: Likewise.
* ipa-ref.h: Likewise.
* ipa-reference.c: Likewise.
* ipa-split.c: Likewise.
* ipa-utils.c: Likewise.
* ipa-utils.h: Likewise.
* ipa.c: Likewise.
* ira-build.c: Likewise.
* ira-color.c: Likewise.
* ira-emit.c: Likewise.
* ira-int.h: Likewise.
* ira.c: Likewise.
* loop-invariant.c: Likewise.
* loop-unroll.c: Likewise.
* lower-subreg.c: Likewise.
* lra-lives.c: Likewise.
* lra.c: Likewise.
* lto-cgraph.c: Likewise.
* lto-section-out.c: Likewise.
* lto-streamer-in.c: Likewise.
* lto-streamer-out.c: Likewise.
* lto-streamer.h: Likewise.
* lto-symtab.c: Likewise.
* mcf.c: Likewise.
* modulo-sched.c: Likewise.
* omp-low.c: Likewise.
* opts-common.c: Likewise.
* opts-global.c: Likewise.
* opts.c: Likewise.
* opts.h: Likewise.
* passes.c: Likewise.
* predict.c: Likewise.
* print-tree.c: Likewise.
* profile.c: Likewise.
* profile.h: Likewise.
* read-rtl.c: Likewise.
* ree.c: Likewise.
* reg-stack.c: Likewise.
* regrename.c: Likewise.
* regrename.h: Likewise.
* reload.c: Likewise.
* reload.h: Likewise.
* reload1.c: Likewise.
* rtl.h: Likewise.
* sched-deps.c: Likewise.
* sched-int.h: Likewise.
* sdbout.c: Likewise.
* sel-sched-dump.c: Likewise.
* sel-sched-ir.c: Likewise.
* sel-sched-ir.h: Likewise.
* sel-sched.c: Likewise.
* sese.c: Likewise.
* sese.h: Likewise.
* statistics.h: Likewise.
* stmt.c: Likewise.
* stor-layout.c: Likewise.
* store-motion.c: Likewise.
* tlink.c: Likewise.
* toplev.c: Likewise.
* trans-mem.c: Likewise.
* tree-browser.c: Likewise.
* tree-call-cdce.c: Likewise.
* tree-cfg.c: Likewise.
* tree-cfgcleanup.c: Likewise.
* tree-chrec.c: Likewise.
* tree-chrec.h: Likewise.
* tree-complex.c: Likewise.
* tree-data-ref.c: Likewise.
* tree-data-ref.h: Likewise.
* tree-dfa.c: Likewise.
* tree-diagnostic.c: Likewise.
* tree-dump.c: Likewise.
* tree-eh.c: Likewise.
* tree-emutls.c: Likewise.
* tree-flow.h: Likewise.
* tree-if-conv.c: Likewise.
* tree-inline.c: Likewise.
* tree-inline.h: Likewise.
* tree-into-ssa.c: Likewise.
* tree-iterator.c: Likewise.
* tree-loop-distribution.c: Likewise.
* tree-mudflap.c: Likewise.
* tree-optimize.c: Likewise.
* tree-outof-ssa.c: Likewise.
* tree-parloops.c: Likewise.
* tree-phinodes.c: Likewise.
* tree-predcom.c: Likewise.
* tree-pretty-print.c: Likewise.
* tree-scalar-evolution.c: Likewise.
* tree-sra.c: Likewise.
* tree-ssa-address.c: Likewise.
* tree-ssa-alias.c: Likewise.
* tree-ssa-ccp.c: Likewise.
* tree-ssa-coalesce.c: Likewise.
* tree-ssa-dce.c: Likewise.
* tree-ssa-dom.c: Likewise.
* tree-ssa-forwprop.c: Likewise.
* tree-ssa-live.c: Likewise.
* tree-ssa-live.h: Likewise.
* tree-ssa-loop-im.c: Likewise.
* tree-ssa-loop-ivcanon.c: Likewise.
* tree-ssa-loop-ivopts.c: Likewise.
* tree-ssa-loop-manip.c: Likewise.
* tree-ssa-loop-niter.c: Likewise.
* tree-ssa-loop-prefetch.c: Likewise.
* tree-ssa-math-opts.c: Likewise.
* tree-ssa-operands.c: Likewise.
* tree-ssa-phiopt.c: Likewise.
* tree-ssa-phiprop.c: Likewise.
* tree-ssa-pre.c: Likewise.
* tree-ssa-propagate.c: Likewise.
* tree-ssa-reassoc.c: Likewise.
* tree-ssa-sccvn.c: Likewise.
* tree-ssa-sccvn.h: Likewise.
* tree-ssa-strlen.c: Likewise.
* tree-ssa-structalias.c: Likewise.
* tree-ssa-tail-merge.c: Likewise.
* tree-ssa-threadedge.c: Likewise.
* tree-ssa-threadupdate.c: Likewise.
* tree-ssa-uncprop.c: Likewise.
* tree-ssa-uninit.c: Likewise.
* tree-ssa.c: Likewise.
* tree-ssanames.c: Likewise.
* tree-stdarg.c: Likewise.
* tree-streamer-in.c: Likewise.
* tree-streamer-out.c: Likewise.
* tree-streamer.c: Likewise.
* tree-streamer.h: Likewise.
* tree-switch-conversion.c: Likewise.
* tree-vect-data-refs.c: Likewise.
* tree-vect-generic.c: Likewise.
* tree-vect-loop-manip.c: Likewise.
* tree-vect-loop.c: Likewise.
* tree-vect-patterns.c: Likewise.
* tree-vect-slp.c: Likewise.
* tree-vect-stmts.c: Likewise.
* tree-vectorizer.c: Likewise.
* tree-vectorizer.h: Likewise.
* tree-vrp.c: Likewise.
* tree.c: Likewise.
* tree.h: Likewise.
* value-prof.c: Likewise.
* value-prof.h: Likewise.
* var-tracking.c: Likewise.
* varasm.c: Likewise.
* varpool.c: Likewise.
* vmsdbgout.c: Likewise.
* config/bfin/bfin.c: Likewise.
* config/c6x/c6x.c: Likewise.
* config/darwin.c: Likewise.
* config/i386/i386.c: Likewise.
* config/ia64/ia64.c: Likewise.
* config/mep/mep.c: Likewise.
* config/mips/mips.c: Likewise.
* config/pa/pa.c: Likewise.
* config/rs6000/rs6000-c.c: Likewise.
* config/rs6000/rs6000.c: Likewise.
* config/rx/rx.c: Likewise.
* config/spu/spu-c.c: Likewise.
* config/vms/vms.c: Likewise.
* config/vxworks.c: Likewise.
* config/epiphany/resolve-sw-modes.c: Likewise.
From-SVN: r193595
2012-11-17 21:54:30 -05:00
|
|
|
|
v->quick_push (ce);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
}
|
|
|
|
|
|
Make CONSTRUCTOR use VEC to store initializers.
* c-common.c (complete_array_type): Update to cope with VEC in
CONSTRUCTOR_ELTS.
* c-pretty-print.c (pp_c_initializer_list): Use pp_c_constructor_elts.
(pp_c_constructor_elts): New function.
* c-pretty-print.h (pp_c_constructor_elts): Declare.
* c-typeck.c (build_function_call, build_c_cast, digest_init,
struct constructor_stack, struct initializer_stack,
constructor_elements, push_init_level, pop_init_level,
add_pending_init, find_init_member, output_init_element): Update to
cope with VEC in CONSTRUCTOR_ELTS.
* coverage.c (build_fn_info_value, build_ctr_info_value,
build_gcov_info): Likewise.
* expr.c (categorize_ctor_elements_1, store_constructor,
expand_expr_real_1): Likewise.
* fold-const.c (fold_ternary): Likewise.
* gimplify.c (gimplify_init_ctor_preeval, zero_sized_field_decl,
gimplify_init_constructor, gimplify_expr): Likewise.
* tree-dump.c (dequeue_and_dump): Likewise.
* tree-inline.c (copy_tree_r): Add code to duplicate a CONSTRUCTOR
node.
* tree-pretty-print.c (dump_generic_node): Update to cope with VEC in
CONSTRUCTOR_ELTS.
* tree-sra.c (generate_element_init_1): Likewise.
* tree-ssa-ccp.c (fold_const_aggregate_ref): Likewise.
* tree-ssa-operands.c (get_expr_operands): Likewise.
* tree-vect-generic.c (expand_vector_piecewise): Likewise.
* tree-vect-transform.c (vect_get_vec_def_for_operand):
(get_initial_def_for_reduction): Likewise.
* tree-vn.c (set_value_handle, get_value_handle): CONSTURCTOR uses
value handle in annotations.
* tree.c (tree_node_kind, tree_code_size, make_node_stat,
tree_node_structure): Add support for constr_kind.
(build_vector_from_ctor, build_constructor_single,
build_constructor_from_list): New functions.
(build_constructor): Update to take a VEC instead of a TREE_LIST.
(simple_cst_equal, iterative_hash_expr, initializer_zerop, walk_tree):
Update to cope with VEC in CONSTRUCTOR_ELTS.
* tree.def (CONSTRUCTOR): Make it a tcc_exceptional node.
* tree.h (FOR_EACH_CONSTRUCTOR_VALUE, FOR_EACH_CONSTRUCTOR_ELT,
CONSTRUCTOR_APPEND_ELT): New macros.
(struct constructor_elt, struct tree_constructor): New data types.
(union tree_node): Add tree_constructor field.
* treestruct.def: Define TS_CONSTRUCTOR.
* varasm.c (const_hash_1, compare_constant, copy_constant,
compute_reloc_for_constant, output_addressed_constants,
initializer_constant_valid_p, output_constant,
array_size_for_constructor, output_constructor): Update to cope with
VEC in CONSTRUCTOR_ELTS.
* vec.h (VEC_empty, VEC_copy): New macros.
ada/
Make CONSTRUCTOR use VEC to store initializers.
* decl.c (gnat_to_gnu_entity): Update to cope with VEC in
CONSTRUCTOR_ELTS.
* trans.c (extract_values): Likewise.
* utils.c (convert, remove_conversions): Likewise.
* utils2.c (contains_save_expr_p, build_binary_op, build_unary_op,
gnat_build_constructor): Likewise.
cp/
Make CONSTRUCTOR use VEC to store initializers.
* call.c (convert_default_arg): Update call to digest_init.
* class.c (dump_class_hierarchy, dump_array): Update to cope with
VEC in CONSTRUCTOR_ELTS.
* cp-tree.h (EMPTY_CONSTRUCTOR_P): Likewise.
(finish_compound_literal, digest_init): Update declaration.
* decl.c (struct reshape_iter): New data type.
(reshape_init_array): Rename to...
(reshape_init_array_1): Update to cope with VEC in CONSTRUCTOR_ELTS.
(reshape_init): Rewrite from scratch. Split parts into...
(reshape_init_array, reshape_init_vector, reshape_init_class,
reshape_init_r): New functions.
(check_initializer): Update call to reshape_init. Remove obsolete
code.
(initialize_artificial_var, cp_complete_array_type): Update to cope
with VEC in CONSTRUCTOR_ELTS.
* decl2.c (grokfield): Update calls to digest_init.
(mark_vtable_entries): Update to cope with VEC in CONSTRUCTOR_ELTS.
* error.c (dump_expr_init_vec): New function.
(dump_expr): Use dump_expr_init_vec.
* init.c (build_zero_init, build_vec_init): Update to cope with VEC
in CONSTRUCTOR_ELTS.
(expand_default_init): Update call to digest_init.
* parser.c (cp_parser_postfix_expression): Use a VEC for the
initializers.
(cp_parser_initializer_list): Build a VEC of initializers.
* pt.c (tsubst_copy, tsubst_copy_and_build): Update to cope with VEC
in CONSTRUCTOR_ELTS.
* rtti.c (tinfo_base_init, generic_initializer, ptr_initializer,
ptm_initializer, class_initializer, get_pseudo_ti_init): Use
build_constructor_from_list instead of build_constructor.
* semantics.c (finish_compound_literal): Update call to digest_init.
* tree.c (stabilize_init): Update to cope with VEC in
CONSTRUCTOR_ELTS.
* typeck.c (build_ptrmemfunc1): Likewise.
* typeck2.c: (cxx_incomplete_type_error, split_nonconstant_init_1):
Likewise.
(store_init_value): Use build_constructor_from_list and update call
to digest_init.
(digest_init): Rewrite.
(process_init_constructor): Rewrite from scratch. Split into...
(process_init_constructor_array, picflag_from_initializer,
process_init_constructor_record, process_init_constructor_union):
New functions.
(PICFLAG_ERRONEOUS, PICFLAG_NOT_ALL_CONSTANT, PICFLAG_NOT_ALL_SIMPLE):
New macros.
(build_functional_cast): Use build_constructor_from_list instead of
build_constructor.
fortran/
Make CONSTRUCTOR use VEC to store initializers.
* trans-array.c (gfc_build_null_descriptor,
gfc_trans_array_constructor_value, gfc_conv_array_initializer):
Update to cope with VEC in CONSTRUCTOR_ELTS.
* trans-common.c (create_common): Likewise.
* trans-expr.c (gfc_conv_structure): Likewise.
* trans-stmt.c (gfc_trans_character_select): Use
build_constructor_from_list instead of build_constructor.
java/
Make CONSTRUCTOR use VEC to store initializers.
* check-init.c (check_init): Update to cope with VEC in
CONSTRUCTOR_ELTS.
* class.c (make_field_value, make_method_value, get_dispatch_table,
make_class_data, emit_symbol_table, emit_catch_table,
emit_assertion_table): Use build_constructor_from_list instead of
build_constructor.
* constants.c (build_constants_constructor): Likewise.
* java-gimplify.c (java_gimplify_new_array_init): Update to cope with
VEC in CONSTRUCTOR_ELTS.
* java-tree.h (START_RECORD_CONSTRUCTOR, PUSH_SUPER_VALUE,
PUSH_FIELD_VALUE, FINISH_RECORD_CONSTRUCTOR): Create a VEC instead
of a TREE_LIST.
* jcf-write.c (generate_bytecode_insns): Update to cope with VEC in
CONSTRUCTOR_ELTS.
* parse.y (build_new_array_init): Use build_constructor_from_list
instead of build_constructor.
(patch_new_array_init): Update to cope with VEC in
CONSTRUCTOR_ELTS.
(array_constructor_check_entry): Likewise.
objc/
Make CONSTRUCTOR use VEC to store initializers.
* objc-act.c (objc_build_constructor): Use build_constructor_from_list
instead of build_constructor.
testsuite/
Make CONSTRUCTOR use VEC to store initializers.
* g++.dg/ext/complit3.C: Check for specific error messages.
* g++.dg/init/brace2.C: Update error message.
* g++.dg/warn/Wbraces2.C: Likewise.
From-SVN: r102182
2005-07-20 03:19:59 +02:00
|
|
|
|
return build_constructor (type, v);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Expand a vector operation to scalars with the freedom to use
|
|
|
|
|
a scalar integer type, or to use a different size for the items
|
|
|
|
|
in the vector type. */
|
|
|
|
|
static tree
|
2008-07-28 14:33:56 +00:00
|
|
|
|
expand_vector_parallel (gimple_stmt_iterator *gsi, elem_op_func f, tree type,
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
tree a, tree b,
|
|
|
|
|
enum tree_code code)
|
|
|
|
|
{
|
|
|
|
|
tree result, compute_type;
|
|
|
|
|
enum machine_mode mode;
|
|
|
|
|
int n_words = tree_low_cst (TYPE_SIZE_UNIT (type), 1) / UNITS_PER_WORD;
|
2011-10-11 16:10:59 +00:00
|
|
|
|
location_t loc = gimple_location (gsi_stmt (*gsi));
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
|
|
|
|
|
/* We have three strategies. If the type is already correct, just do
|
|
|
|
|
the operation an element at a time. Else, if the vector is wider than
|
|
|
|
|
one word, do it a word at a time; finally, if the vector is smaller
|
|
|
|
|
than one word, do it as a scalar. */
|
|
|
|
|
if (TYPE_MODE (TREE_TYPE (type)) == word_mode)
|
2008-07-28 14:33:56 +00:00
|
|
|
|
return expand_vector_piecewise (gsi, f,
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
type, TREE_TYPE (type),
|
|
|
|
|
a, b, code);
|
|
|
|
|
else if (n_words > 1)
|
|
|
|
|
{
|
|
|
|
|
tree word_type = build_word_mode_vector_type (n_words);
|
2008-07-28 14:33:56 +00:00
|
|
|
|
result = expand_vector_piecewise (gsi, f,
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
word_type, TREE_TYPE (word_type),
|
|
|
|
|
a, b, code);
|
2008-07-28 14:33:56 +00:00
|
|
|
|
result = force_gimple_operand_gsi (gsi, result, true, NULL, true,
|
|
|
|
|
GSI_SAME_STMT);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
/* Use a single scalar operation with a mode no wider than word_mode. */
|
|
|
|
|
mode = mode_for_size (tree_low_cst (TYPE_SIZE (type), 1), MODE_INT, 0);
|
|
|
|
|
compute_type = lang_hooks.types.type_for_mode (mode, 1);
|
2008-07-28 14:33:56 +00:00
|
|
|
|
result = f (gsi, compute_type, a, b, NULL_TREE, NULL_TREE, code);
|
2011-10-11 16:10:59 +00:00
|
|
|
|
warning_at (loc, OPT_Wvector_operation_performance,
|
|
|
|
|
"vector operation will be expanded with a "
|
|
|
|
|
"single scalar operation");
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Expand a vector operation to scalars; for integer types we can use
|
|
|
|
|
special bit twiddling tricks to do the sums a word at a time, using
|
|
|
|
|
function F_PARALLEL instead of F. These tricks are done only if
|
|
|
|
|
they can process at least four items, that is, only if the vector
|
|
|
|
|
holds at least four items and if a word can hold four items. */
|
|
|
|
|
static tree
|
2008-07-28 14:33:56 +00:00
|
|
|
|
expand_vector_addition (gimple_stmt_iterator *gsi,
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
elem_op_func f, elem_op_func f_parallel,
|
|
|
|
|
tree type, tree a, tree b, enum tree_code code)
|
|
|
|
|
{
|
|
|
|
|
int parts_per_word = UNITS_PER_WORD
|
|
|
|
|
/ tree_low_cst (TYPE_SIZE_UNIT (TREE_TYPE (type)), 1);
|
|
|
|
|
|
|
|
|
|
if (INTEGRAL_TYPE_P (TREE_TYPE (type))
|
|
|
|
|
&& parts_per_word >= 4
|
|
|
|
|
&& TYPE_VECTOR_SUBPARTS (type) >= 4)
|
2008-07-28 14:33:56 +00:00
|
|
|
|
return expand_vector_parallel (gsi, f_parallel,
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
type, a, b, code);
|
|
|
|
|
else
|
2008-07-28 14:33:56 +00:00
|
|
|
|
return expand_vector_piecewise (gsi, f,
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
type, TREE_TYPE (type),
|
|
|
|
|
a, b, code);
|
|
|
|
|
}
|
|
|
|
|
|
2011-09-29 11:29:03 +00:00
|
|
|
|
/* Try to expand vector comparison expression OP0 CODE OP1 by
|
|
|
|
|
querying optab if the following expression:
|
|
|
|
|
VEC_COND_EXPR< OP0 CODE OP1, {-1,...}, {0,...}>
|
|
|
|
|
can be expanded. */
|
|
|
|
|
static tree
|
|
|
|
|
expand_vector_comparison (gimple_stmt_iterator *gsi, tree type, tree op0,
|
|
|
|
|
tree op1, enum tree_code code)
|
|
|
|
|
{
|
|
|
|
|
tree t;
|
|
|
|
|
if (! expand_vec_cond_expr_p (type, TREE_TYPE (op0)))
|
|
|
|
|
t = expand_vector_piecewise (gsi, do_compare, type,
|
|
|
|
|
TREE_TYPE (TREE_TYPE (op0)), op0, op1, code);
|
|
|
|
|
else
|
|
|
|
|
t = NULL_TREE;
|
|
|
|
|
|
|
|
|
|
return t;
|
|
|
|
|
}
|
|
|
|
|
|
2012-06-28 13:38:01 +02:00
|
|
|
|
/* Helper function of expand_vector_divmod. Gimplify a RSHIFT_EXPR in type
|
|
|
|
|
of OP0 with shift counts in SHIFTCNTS array and return the temporary holding
|
|
|
|
|
the result if successful, otherwise return NULL_TREE. */
|
|
|
|
|
static tree
|
|
|
|
|
add_rshift (gimple_stmt_iterator *gsi, tree type, tree op0, int *shiftcnts)
|
|
|
|
|
{
|
|
|
|
|
optab op;
|
|
|
|
|
unsigned int i, nunits = TYPE_VECTOR_SUBPARTS (type);
|
|
|
|
|
bool scalar_shift = true;
|
|
|
|
|
|
|
|
|
|
for (i = 1; i < nunits; i++)
|
|
|
|
|
{
|
|
|
|
|
if (shiftcnts[i] != shiftcnts[0])
|
|
|
|
|
scalar_shift = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (scalar_shift && shiftcnts[0] == 0)
|
|
|
|
|
return op0;
|
|
|
|
|
|
|
|
|
|
if (scalar_shift)
|
|
|
|
|
{
|
|
|
|
|
op = optab_for_tree_code (RSHIFT_EXPR, type, optab_scalar);
|
2012-07-24 10:28:41 -07:00
|
|
|
|
if (op != unknown_optab
|
2012-06-28 13:38:01 +02:00
|
|
|
|
&& optab_handler (op, TYPE_MODE (type)) != CODE_FOR_nothing)
|
|
|
|
|
return gimplify_build2 (gsi, RSHIFT_EXPR, type, op0,
|
|
|
|
|
build_int_cst (NULL_TREE, shiftcnts[0]));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
op = optab_for_tree_code (RSHIFT_EXPR, type, optab_vector);
|
2012-07-24 10:28:41 -07:00
|
|
|
|
if (op != unknown_optab
|
2012-06-28 13:38:01 +02:00
|
|
|
|
&& optab_handler (op, TYPE_MODE (type)) != CODE_FOR_nothing)
|
|
|
|
|
{
|
|
|
|
|
tree *vec = XALLOCAVEC (tree, nunits);
|
|
|
|
|
for (i = 0; i < nunits; i++)
|
|
|
|
|
vec[i] = build_int_cst (TREE_TYPE (type), shiftcnts[i]);
|
|
|
|
|
return gimplify_build2 (gsi, RSHIFT_EXPR, type, op0,
|
|
|
|
|
build_vector (type, vec));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Try to expand integer vector division by constant using
|
|
|
|
|
widening multiply, shifts and additions. */
|
|
|
|
|
static tree
|
|
|
|
|
expand_vector_divmod (gimple_stmt_iterator *gsi, tree type, tree op0,
|
|
|
|
|
tree op1, enum tree_code code)
|
|
|
|
|
{
|
|
|
|
|
bool use_pow2 = true;
|
|
|
|
|
bool has_vector_shift = true;
|
|
|
|
|
int mode = -1, this_mode;
|
|
|
|
|
int pre_shift = -1, post_shift;
|
|
|
|
|
unsigned int nunits = TYPE_VECTOR_SUBPARTS (type);
|
|
|
|
|
int *shifts = XALLOCAVEC (int, nunits * 4);
|
|
|
|
|
int *pre_shifts = shifts + nunits;
|
|
|
|
|
int *post_shifts = pre_shifts + nunits;
|
|
|
|
|
int *shift_temps = post_shifts + nunits;
|
|
|
|
|
unsigned HOST_WIDE_INT *mulc = XALLOCAVEC (unsigned HOST_WIDE_INT, nunits);
|
|
|
|
|
int prec = TYPE_PRECISION (TREE_TYPE (type));
|
|
|
|
|
int dummy_int;
|
|
|
|
|
unsigned int i, unsignedp = TYPE_UNSIGNED (TREE_TYPE (type));
|
|
|
|
|
unsigned HOST_WIDE_INT mask = GET_MODE_MASK (TYPE_MODE (TREE_TYPE (type)));
|
|
|
|
|
tree *vec;
|
2012-07-10 01:25:20 -07:00
|
|
|
|
tree cur_op, mulcst, tem;
|
|
|
|
|
optab op;
|
2012-06-28 13:38:01 +02:00
|
|
|
|
|
|
|
|
|
if (prec > HOST_BITS_PER_WIDE_INT)
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
|
|
|
|
|
op = optab_for_tree_code (RSHIFT_EXPR, type, optab_vector);
|
2012-07-24 10:28:41 -07:00
|
|
|
|
if (op == unknown_optab
|
2012-06-28 13:38:01 +02:00
|
|
|
|
|| optab_handler (op, TYPE_MODE (type)) == CODE_FOR_nothing)
|
|
|
|
|
has_vector_shift = false;
|
|
|
|
|
|
|
|
|
|
/* Analysis phase. Determine if all op1 elements are either power
|
|
|
|
|
of two and it is possible to expand it using shifts (or for remainder
|
|
|
|
|
using masking). Additionally compute the multiplicative constants
|
|
|
|
|
and pre and post shifts if the division is to be expanded using
|
|
|
|
|
widening or high part multiplication plus shifts. */
|
|
|
|
|
for (i = 0; i < nunits; i++)
|
|
|
|
|
{
|
|
|
|
|
tree cst = VECTOR_CST_ELT (op1, i);
|
|
|
|
|
unsigned HOST_WIDE_INT ml;
|
|
|
|
|
|
|
|
|
|
if (!host_integerp (cst, unsignedp) || integer_zerop (cst))
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
pre_shifts[i] = 0;
|
|
|
|
|
post_shifts[i] = 0;
|
|
|
|
|
mulc[i] = 0;
|
|
|
|
|
if (use_pow2
|
|
|
|
|
&& (!integer_pow2p (cst) || tree_int_cst_sgn (cst) != 1))
|
|
|
|
|
use_pow2 = false;
|
|
|
|
|
if (use_pow2)
|
|
|
|
|
{
|
|
|
|
|
shifts[i] = tree_log2 (cst);
|
|
|
|
|
if (shifts[i] != shifts[0]
|
|
|
|
|
&& code == TRUNC_DIV_EXPR
|
|
|
|
|
&& !has_vector_shift)
|
|
|
|
|
use_pow2 = false;
|
|
|
|
|
}
|
|
|
|
|
if (mode == -2)
|
|
|
|
|
continue;
|
|
|
|
|
if (unsignedp)
|
|
|
|
|
{
|
|
|
|
|
unsigned HOST_WIDE_INT mh;
|
|
|
|
|
unsigned HOST_WIDE_INT d = tree_low_cst (cst, 1) & mask;
|
|
|
|
|
|
|
|
|
|
if (d >= ((unsigned HOST_WIDE_INT) 1 << (prec - 1)))
|
|
|
|
|
/* FIXME: Can transform this into op0 >= op1 ? 1 : 0. */
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
|
|
|
|
|
if (d <= 1)
|
|
|
|
|
{
|
|
|
|
|
mode = -2;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Find a suitable multiplier and right shift count
|
|
|
|
|
instead of multiplying with D. */
|
|
|
|
|
mh = choose_multiplier (d, prec, prec, &ml, &post_shift, &dummy_int);
|
|
|
|
|
|
|
|
|
|
/* If the suggested multiplier is more than SIZE bits, we can
|
|
|
|
|
do better for even divisors, using an initial right shift. */
|
|
|
|
|
if ((mh != 0 && (d & 1) == 0)
|
|
|
|
|
|| (!has_vector_shift && pre_shift != -1))
|
|
|
|
|
{
|
|
|
|
|
if (has_vector_shift)
|
|
|
|
|
pre_shift = floor_log2 (d & -d);
|
|
|
|
|
else if (pre_shift == -1)
|
|
|
|
|
{
|
|
|
|
|
unsigned int j;
|
|
|
|
|
for (j = 0; j < nunits; j++)
|
|
|
|
|
{
|
|
|
|
|
tree cst2 = VECTOR_CST_ELT (op1, j);
|
|
|
|
|
unsigned HOST_WIDE_INT d2;
|
|
|
|
|
int this_pre_shift;
|
|
|
|
|
|
|
|
|
|
if (!host_integerp (cst2, 1))
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
d2 = tree_low_cst (cst2, 1) & mask;
|
|
|
|
|
if (d2 == 0)
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
this_pre_shift = floor_log2 (d2 & -d2);
|
|
|
|
|
if (pre_shift == -1 || this_pre_shift < pre_shift)
|
|
|
|
|
pre_shift = this_pre_shift;
|
|
|
|
|
}
|
|
|
|
|
if (i != 0 && pre_shift != 0)
|
|
|
|
|
{
|
|
|
|
|
/* Restart. */
|
|
|
|
|
i = -1U;
|
|
|
|
|
mode = -1;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (pre_shift != 0)
|
|
|
|
|
{
|
|
|
|
|
if ((d >> pre_shift) <= 1)
|
|
|
|
|
{
|
|
|
|
|
mode = -2;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
mh = choose_multiplier (d >> pre_shift, prec,
|
|
|
|
|
prec - pre_shift,
|
|
|
|
|
&ml, &post_shift, &dummy_int);
|
|
|
|
|
gcc_assert (!mh);
|
|
|
|
|
pre_shifts[i] = pre_shift;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!mh)
|
|
|
|
|
this_mode = 0;
|
|
|
|
|
else
|
|
|
|
|
this_mode = 1;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
HOST_WIDE_INT d = tree_low_cst (cst, 0);
|
|
|
|
|
unsigned HOST_WIDE_INT abs_d;
|
|
|
|
|
|
|
|
|
|
if (d == -1)
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
|
|
|
|
|
/* Since d might be INT_MIN, we have to cast to
|
|
|
|
|
unsigned HOST_WIDE_INT before negating to avoid
|
|
|
|
|
undefined signed overflow. */
|
|
|
|
|
abs_d = (d >= 0
|
|
|
|
|
? (unsigned HOST_WIDE_INT) d
|
|
|
|
|
: - (unsigned HOST_WIDE_INT) d);
|
|
|
|
|
|
|
|
|
|
/* n rem d = n rem -d */
|
|
|
|
|
if (code == TRUNC_MOD_EXPR && d < 0)
|
|
|
|
|
d = abs_d;
|
|
|
|
|
else if (abs_d == (unsigned HOST_WIDE_INT) 1 << (prec - 1))
|
|
|
|
|
{
|
|
|
|
|
/* This case is not handled correctly below. */
|
|
|
|
|
mode = -2;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (abs_d <= 1)
|
|
|
|
|
{
|
|
|
|
|
mode = -2;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
choose_multiplier (abs_d, prec, prec - 1, &ml,
|
|
|
|
|
&post_shift, &dummy_int);
|
|
|
|
|
if (ml >= (unsigned HOST_WIDE_INT) 1 << (prec - 1))
|
|
|
|
|
{
|
|
|
|
|
this_mode = 4 + (d < 0);
|
|
|
|
|
ml |= (~(unsigned HOST_WIDE_INT) 0) << (prec - 1);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
this_mode = 2 + (d < 0);
|
|
|
|
|
}
|
|
|
|
|
mulc[i] = ml;
|
|
|
|
|
post_shifts[i] = post_shift;
|
|
|
|
|
if ((i && !has_vector_shift && post_shifts[0] != post_shift)
|
|
|
|
|
|| post_shift >= prec
|
|
|
|
|
|| pre_shifts[i] >= prec)
|
|
|
|
|
this_mode = -2;
|
|
|
|
|
|
|
|
|
|
if (i == 0)
|
|
|
|
|
mode = this_mode;
|
|
|
|
|
else if (mode != this_mode)
|
|
|
|
|
mode = -2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
vec = XALLOCAVEC (tree, nunits);
|
|
|
|
|
|
|
|
|
|
if (use_pow2)
|
|
|
|
|
{
|
|
|
|
|
tree addend = NULL_TREE;
|
|
|
|
|
if (!unsignedp)
|
|
|
|
|
{
|
|
|
|
|
tree uns_type;
|
|
|
|
|
|
|
|
|
|
/* Both division and remainder sequences need
|
|
|
|
|
op0 < 0 ? mask : 0 computed. It can be either computed as
|
|
|
|
|
(type) (((uns_type) (op0 >> (prec - 1))) >> (prec - shifts[i]))
|
|
|
|
|
if none of the shifts is 0, or as the conditional. */
|
|
|
|
|
for (i = 0; i < nunits; i++)
|
|
|
|
|
if (shifts[i] == 0)
|
|
|
|
|
break;
|
|
|
|
|
uns_type
|
|
|
|
|
= build_vector_type (build_nonstandard_integer_type (prec, 1),
|
|
|
|
|
nunits);
|
|
|
|
|
if (i == nunits && TYPE_MODE (uns_type) == TYPE_MODE (type))
|
|
|
|
|
{
|
|
|
|
|
for (i = 0; i < nunits; i++)
|
|
|
|
|
shift_temps[i] = prec - 1;
|
|
|
|
|
cur_op = add_rshift (gsi, type, op0, shift_temps);
|
|
|
|
|
if (cur_op != NULL_TREE)
|
|
|
|
|
{
|
|
|
|
|
cur_op = gimplify_build1 (gsi, VIEW_CONVERT_EXPR,
|
|
|
|
|
uns_type, cur_op);
|
|
|
|
|
for (i = 0; i < nunits; i++)
|
|
|
|
|
shift_temps[i] = prec - shifts[i];
|
|
|
|
|
cur_op = add_rshift (gsi, uns_type, cur_op, shift_temps);
|
|
|
|
|
if (cur_op != NULL_TREE)
|
|
|
|
|
addend = gimplify_build1 (gsi, VIEW_CONVERT_EXPR,
|
|
|
|
|
type, cur_op);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (addend == NULL_TREE
|
|
|
|
|
&& expand_vec_cond_expr_p (type, type))
|
|
|
|
|
{
|
|
|
|
|
tree zero, cst, cond;
|
|
|
|
|
gimple stmt;
|
|
|
|
|
|
|
|
|
|
zero = build_zero_cst (type);
|
|
|
|
|
cond = build2 (LT_EXPR, type, op0, zero);
|
|
|
|
|
for (i = 0; i < nunits; i++)
|
|
|
|
|
vec[i] = build_int_cst (TREE_TYPE (type),
|
|
|
|
|
((unsigned HOST_WIDE_INT) 1
|
|
|
|
|
<< shifts[i]) - 1);
|
|
|
|
|
cst = build_vector (type, vec);
|
2012-08-10 09:20:29 +00:00
|
|
|
|
addend = make_ssa_name (type, NULL);
|
2012-09-18 09:17:27 +00:00
|
|
|
|
stmt = gimple_build_assign_with_ops (VEC_COND_EXPR, addend,
|
|
|
|
|
cond, cst, zero);
|
2012-06-28 13:38:01 +02:00
|
|
|
|
gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (code == TRUNC_DIV_EXPR)
|
|
|
|
|
{
|
|
|
|
|
if (unsignedp)
|
|
|
|
|
{
|
|
|
|
|
/* q = op0 >> shift; */
|
|
|
|
|
cur_op = add_rshift (gsi, type, op0, shifts);
|
|
|
|
|
if (cur_op != NULL_TREE)
|
|
|
|
|
return cur_op;
|
|
|
|
|
}
|
|
|
|
|
else if (addend != NULL_TREE)
|
|
|
|
|
{
|
|
|
|
|
/* t1 = op0 + addend;
|
|
|
|
|
q = t1 >> shift; */
|
|
|
|
|
op = optab_for_tree_code (PLUS_EXPR, type, optab_default);
|
2012-07-24 10:28:41 -07:00
|
|
|
|
if (op != unknown_optab
|
2012-06-28 13:38:01 +02:00
|
|
|
|
&& optab_handler (op, TYPE_MODE (type)) != CODE_FOR_nothing)
|
|
|
|
|
{
|
|
|
|
|
cur_op = gimplify_build2 (gsi, PLUS_EXPR, type, op0, addend);
|
|
|
|
|
cur_op = add_rshift (gsi, type, cur_op, shifts);
|
|
|
|
|
if (cur_op != NULL_TREE)
|
|
|
|
|
return cur_op;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
tree mask;
|
|
|
|
|
for (i = 0; i < nunits; i++)
|
|
|
|
|
vec[i] = build_int_cst (TREE_TYPE (type),
|
|
|
|
|
((unsigned HOST_WIDE_INT) 1
|
|
|
|
|
<< shifts[i]) - 1);
|
|
|
|
|
mask = build_vector (type, vec);
|
|
|
|
|
op = optab_for_tree_code (BIT_AND_EXPR, type, optab_default);
|
2012-07-24 10:28:41 -07:00
|
|
|
|
if (op != unknown_optab
|
2012-06-28 13:38:01 +02:00
|
|
|
|
&& optab_handler (op, TYPE_MODE (type)) != CODE_FOR_nothing)
|
|
|
|
|
{
|
|
|
|
|
if (unsignedp)
|
|
|
|
|
/* r = op0 & mask; */
|
|
|
|
|
return gimplify_build2 (gsi, BIT_AND_EXPR, type, op0, mask);
|
|
|
|
|
else if (addend != NULL_TREE)
|
|
|
|
|
{
|
|
|
|
|
/* t1 = op0 + addend;
|
|
|
|
|
t2 = t1 & mask;
|
|
|
|
|
r = t2 - addend; */
|
|
|
|
|
op = optab_for_tree_code (PLUS_EXPR, type, optab_default);
|
2012-07-24 10:28:41 -07:00
|
|
|
|
if (op != unknown_optab
|
2012-06-28 13:38:01 +02:00
|
|
|
|
&& optab_handler (op, TYPE_MODE (type))
|
|
|
|
|
!= CODE_FOR_nothing)
|
|
|
|
|
{
|
|
|
|
|
cur_op = gimplify_build2 (gsi, PLUS_EXPR, type, op0,
|
|
|
|
|
addend);
|
|
|
|
|
cur_op = gimplify_build2 (gsi, BIT_AND_EXPR, type,
|
|
|
|
|
cur_op, mask);
|
|
|
|
|
op = optab_for_tree_code (MINUS_EXPR, type,
|
|
|
|
|
optab_default);
|
2012-07-24 10:28:41 -07:00
|
|
|
|
if (op != unknown_optab
|
2012-06-28 13:38:01 +02:00
|
|
|
|
&& optab_handler (op, TYPE_MODE (type))
|
|
|
|
|
!= CODE_FOR_nothing)
|
|
|
|
|
return gimplify_build2 (gsi, MINUS_EXPR, type,
|
|
|
|
|
cur_op, addend);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mode == -2 || BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN)
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
|
2012-07-10 01:25:20 -07:00
|
|
|
|
if (!can_mult_highpart_p (TYPE_MODE (type), TYPE_UNSIGNED (type)))
|
|
|
|
|
return NULL_TREE;
|
2012-06-28 13:38:01 +02:00
|
|
|
|
|
|
|
|
|
cur_op = op0;
|
|
|
|
|
|
|
|
|
|
switch (mode)
|
|
|
|
|
{
|
|
|
|
|
case 0:
|
|
|
|
|
gcc_assert (unsignedp);
|
|
|
|
|
/* t1 = oprnd0 >> pre_shift;
|
2012-06-28 19:52:51 +02:00
|
|
|
|
t2 = t1 h* ml;
|
2012-06-28 13:38:01 +02:00
|
|
|
|
q = t2 >> post_shift; */
|
|
|
|
|
cur_op = add_rshift (gsi, type, cur_op, pre_shifts);
|
|
|
|
|
if (cur_op == NULL_TREE)
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
gcc_assert (unsignedp);
|
|
|
|
|
for (i = 0; i < nunits; i++)
|
|
|
|
|
{
|
|
|
|
|
shift_temps[i] = 1;
|
|
|
|
|
post_shifts[i]--;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
case 3:
|
|
|
|
|
case 4:
|
|
|
|
|
case 5:
|
|
|
|
|
gcc_assert (!unsignedp);
|
|
|
|
|
for (i = 0; i < nunits; i++)
|
|
|
|
|
shift_temps[i] = prec - 1;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < nunits; i++)
|
|
|
|
|
vec[i] = build_int_cst (TREE_TYPE (type), mulc[i]);
|
|
|
|
|
mulcst = build_vector (type, vec);
|
2012-06-29 09:18:15 -07:00
|
|
|
|
|
2012-07-10 01:25:20 -07:00
|
|
|
|
cur_op = gimplify_build2 (gsi, MULT_HIGHPART_EXPR, type, cur_op, mulcst);
|
2012-06-28 13:38:01 +02:00
|
|
|
|
|
|
|
|
|
switch (mode)
|
|
|
|
|
{
|
|
|
|
|
case 0:
|
|
|
|
|
/* t1 = oprnd0 >> pre_shift;
|
2012-06-28 19:52:51 +02:00
|
|
|
|
t2 = t1 h* ml;
|
2012-06-28 13:38:01 +02:00
|
|
|
|
q = t2 >> post_shift; */
|
|
|
|
|
cur_op = add_rshift (gsi, type, cur_op, post_shifts);
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
2012-06-28 19:52:51 +02:00
|
|
|
|
/* t1 = oprnd0 h* ml;
|
2012-06-28 13:38:01 +02:00
|
|
|
|
t2 = oprnd0 - t1;
|
|
|
|
|
t3 = t2 >> 1;
|
|
|
|
|
t4 = t1 + t3;
|
|
|
|
|
q = t4 >> (post_shift - 1); */
|
|
|
|
|
op = optab_for_tree_code (MINUS_EXPR, type, optab_default);
|
2012-07-24 10:28:41 -07:00
|
|
|
|
if (op == unknown_optab
|
2012-06-28 13:38:01 +02:00
|
|
|
|
|| optab_handler (op, TYPE_MODE (type)) == CODE_FOR_nothing)
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
tem = gimplify_build2 (gsi, MINUS_EXPR, type, op0, cur_op);
|
|
|
|
|
tem = add_rshift (gsi, type, tem, shift_temps);
|
|
|
|
|
op = optab_for_tree_code (PLUS_EXPR, type, optab_default);
|
2012-07-24 10:28:41 -07:00
|
|
|
|
if (op == unknown_optab
|
2012-06-28 13:38:01 +02:00
|
|
|
|
|| optab_handler (op, TYPE_MODE (type)) == CODE_FOR_nothing)
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
tem = gimplify_build2 (gsi, PLUS_EXPR, type, cur_op, tem);
|
|
|
|
|
cur_op = add_rshift (gsi, type, tem, post_shifts);
|
|
|
|
|
if (cur_op == NULL_TREE)
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
case 3:
|
|
|
|
|
case 4:
|
|
|
|
|
case 5:
|
2012-06-28 19:52:51 +02:00
|
|
|
|
/* t1 = oprnd0 h* ml;
|
2012-06-28 13:38:01 +02:00
|
|
|
|
t2 = t1; [ iff (mode & 2) != 0 ]
|
|
|
|
|
t2 = t1 + oprnd0; [ iff (mode & 2) == 0 ]
|
|
|
|
|
t3 = t2 >> post_shift;
|
|
|
|
|
t4 = oprnd0 >> (prec - 1);
|
|
|
|
|
q = t3 - t4; [ iff (mode & 1) == 0 ]
|
|
|
|
|
q = t4 - t3; [ iff (mode & 1) != 0 ] */
|
|
|
|
|
if ((mode & 2) == 0)
|
|
|
|
|
{
|
|
|
|
|
op = optab_for_tree_code (PLUS_EXPR, type, optab_default);
|
2012-07-24 10:28:41 -07:00
|
|
|
|
if (op == unknown_optab
|
2012-06-28 13:38:01 +02:00
|
|
|
|
|| optab_handler (op, TYPE_MODE (type)) == CODE_FOR_nothing)
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
cur_op = gimplify_build2 (gsi, PLUS_EXPR, type, cur_op, op0);
|
|
|
|
|
}
|
|
|
|
|
cur_op = add_rshift (gsi, type, cur_op, post_shifts);
|
|
|
|
|
if (cur_op == NULL_TREE)
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
tem = add_rshift (gsi, type, op0, shift_temps);
|
|
|
|
|
if (tem == NULL_TREE)
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
op = optab_for_tree_code (MINUS_EXPR, type, optab_default);
|
2012-07-24 10:28:41 -07:00
|
|
|
|
if (op == unknown_optab
|
2012-06-28 13:38:01 +02:00
|
|
|
|
|| optab_handler (op, TYPE_MODE (type)) == CODE_FOR_nothing)
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
if ((mode & 1) == 0)
|
|
|
|
|
cur_op = gimplify_build2 (gsi, MINUS_EXPR, type, cur_op, tem);
|
|
|
|
|
else
|
|
|
|
|
cur_op = gimplify_build2 (gsi, MINUS_EXPR, type, tem, cur_op);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
gcc_unreachable ();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (code == TRUNC_DIV_EXPR)
|
|
|
|
|
return cur_op;
|
|
|
|
|
|
|
|
|
|
/* We divided. Now finish by:
|
|
|
|
|
t1 = q * oprnd1;
|
|
|
|
|
r = oprnd0 - t1; */
|
|
|
|
|
op = optab_for_tree_code (MULT_EXPR, type, optab_default);
|
2012-07-24 10:28:41 -07:00
|
|
|
|
if (op == unknown_optab
|
2012-06-28 13:38:01 +02:00
|
|
|
|
|| optab_handler (op, TYPE_MODE (type)) == CODE_FOR_nothing)
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
tem = gimplify_build2 (gsi, MULT_EXPR, type, cur_op, op1);
|
|
|
|
|
op = optab_for_tree_code (MINUS_EXPR, type, optab_default);
|
2012-07-24 10:28:41 -07:00
|
|
|
|
if (op == unknown_optab
|
2012-06-28 13:38:01 +02:00
|
|
|
|
|| optab_handler (op, TYPE_MODE (type)) == CODE_FOR_nothing)
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
return gimplify_build2 (gsi, MINUS_EXPR, type, op0, tem);
|
|
|
|
|
}
|
|
|
|
|
|
2012-11-02 00:39:44 +01:00
|
|
|
|
/* Expand a vector condition to scalars, by using many conditions
|
|
|
|
|
on the vector's elements. */
|
|
|
|
|
static void
|
|
|
|
|
expand_vector_condition (gimple_stmt_iterator *gsi)
|
|
|
|
|
{
|
|
|
|
|
gimple stmt = gsi_stmt (*gsi);
|
|
|
|
|
tree type = gimple_expr_type (stmt);
|
|
|
|
|
tree a = gimple_assign_rhs1 (stmt);
|
|
|
|
|
tree a1 = a;
|
|
|
|
|
tree a2;
|
|
|
|
|
bool a_is_comparison = false;
|
|
|
|
|
tree b = gimple_assign_rhs2 (stmt);
|
|
|
|
|
tree c = gimple_assign_rhs3 (stmt);
|
This patch rewrites the old VEC macro-based interface into a new one based on the template class 'vec'.
This patch rewrites the old VEC macro-based interface into a new one
based on the template class 'vec'. The user-visible changes are
described in http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec.
I have tested the patch pretty extensively:
- Regular bootstraps on x86_64, ppc, ia64, sparc and hppa.
- Bootstraps with --enable-checking=release
- Bootstraps with --enable-checking=gc,gcac
- Basic builds on all targets (using contrib/config-list.mk).
We no longer access the vectors via VEC_* macros. The pattern is
"VEC_operation (T, A, V, args)" becomes "V.operation (args)".
The only thing I could not do is create proper ctors and dtors for the
vec class. Since these vectors are stored in unions, we
have to keep them as PODs (C++03 does not allow non-PODs in unions).
This means that creation and destruction must be explicit. There is a
new method vec<type, allocation, layout>::create() and another vec<type,
allocation, layout>::destroy() to allocate the internal vector.
For vectors that must be pointers, there is a family of free functions
that implement the operations that need to tolerate NULL vectors.
These functions all start with the prefix 'vec_safe_'. See the wiki
page for details.
The gengtype change removes the special handling for VEC() that used
to exist in gengtype. Additionally, it allows gengtype to recognize
templates of more than one argument and introduces the concept of an
undefined type (useful for template arguments that may or may not be
types).
When a TYPE_UNDEFINED is reached, gengtype will ignore it if it
happens inside a type marked with GTY((user)). Otherwise, it will
emit an error.
Finally, gengtype rejects root types marked GTY((user)) that are not
first class pointers.
2012-11-16 Diego Novillo <dnovillo@google.com>
VEC API overhaul (http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec)
* vec.c (register_overhead): Convert it into
member function of vec_prefix.
(release_overhead): Likewise.
(calculate_allocation): Likewise.
(vec_heap_free): Remove.
(vec_gc_o_reserve_1): Remove.
(vec_heap_o_reserve_1): Remove.
(vec_stack_o_reserve_1): Remove.
(vec_stack_o_reserve_exact): Remove.
(register_stack_vec): New.
(stack_vec_register_index): New.
(unregister_stack_vec): New.
(vec_assert_fail): Remove.
* vec.h: Conditionally include ggc.h. Document conditional
hackery.
Update top-level documentation.
(ALONE_VEC_CHECK_INFO): Remove.
(VEC_CHECK_INFO): Remove.
(ALONE_VEC_CHECK_DECL): Remove.
(VEC_CHECK_DECL): Remove.
(ALONE_VEC_CHECK_PASS): Remove.
(VEC_CHECK_PASS): Remove.
(VEC_ASSERT): Remove.
(vec_prefix): Add friends va_gc, va_gc_atomic, va_heap and
va_stack.
Mark fields alloc_ and num_ as protected.
(struct vec_t): Remove. Remove all function members.
(struct vl_embed): Declare.
(struct vl_ptr): Declare.
(free): Remove.
(reserve_exact): Remove.
(reserve): Remove.
(safe_splice): Remove.
(safe_push): Remove.
(safe_grow): Remove.
(safe_grow_cleared): Remove.
(safe_insert): Remove.
(DEF_VEC_I): Remove.
(DEF_VEC_ALLOC_I): Remove.
(DEF_VEC_P): Remove.
(DEF_VEC_ALLOC_P): Remove.
(DEF_VEC_O): Remove.
(DEF_VEC_ALLOC_O): Remove.
(DEF_VEC_ALLOC_P_STACK): Remove.
(DEF_VEC_ALLOC_O_STACK): Remove.
(DEF_VEC_ALLOC_I_STACK): Remove.
(DEF_VEC_A): Remove.
(DEF_VEC_ALLOC_A): Remove.
(vec_stack_p_reserve_exact_1): Remove.
(vec_stack_o_reserve): Remove.
(vec_stack_o_reserve_exact): Remove.
(VEC_length): Remove.
(VEC_empty): Remove.
(VEC_address): Remove.
(vec_address): Remove.
(VEC_last): Remove.
(VEC_index): Remove.
(VEC_iterate): Remove.
(VEC_embedded_size): Remove.
(VEC_embedded_init): Remove.
(VEC_free): Remove.
(VEC_copy): Remove.
(VEC_space): Remove.
(VEC_reserve): Remove.
(VEC_reserve_exact): Remove.
(VEC_splice): Remove.
(VEC_safe_splice): Remove.
(VEC_quick_push): Remove.
(VEC_safe_push): Remove.
(VEC_pop): Remove.
(VEC_truncate): Remove.
(VEC_safe_grow): Remove.
(VEC_replace): Remove.
(VEC_quick_insert): Remove.
(VEC_safe_insert): Remove.
(VEC_ordered_remove): Remove.
(VEC_unordered_remove): Remove.
(VEC_block_remove): Remove.
(VEC_lower_bound): Remove.
(VEC_alloc): Remove.
(VEC_qsort): Remove.
(va_heap): Declare.
(va_heap::default_layout): New typedef to vl_ptr.
(va_heap::reserve): New.
(va_heap::release): New.
(va_gc): Declare.
(va_gc::default_layout): New typedef to vl_embed.
(va_gc::reserve): New.
(va_gc::release): New.
(va_gc_atomic): Declare. Inherit from va_gc.
(va_stack): Declare.
(va_stack::default_layout): New typedef to vl_ptr.
(va_stack::alloc): New.
(va_stack::reserve): New.
(va_stack::release): New.
(register_stack_vec): Declare.
(stack_vec_register_index): Declare.
(unregister_stack_vec): Declare.
(vec<T, A = va_heap, L = typename A::default_layout>): Declare
empty vec template.
(vec<T, A, vl_embed>): Partial specialization for embedded
layout.
(vec<T, A, vl_embed>::allocated): New.
(vec<T, A, vl_embed>::length): New.
(vec<T, A, vl_embed>::is_empty): New.
(vec<T, A, vl_embed>::address): New.
(vec<T, A, vl_embed>::operator[]): New.
(vec<T, A, vl_embed>::last New.
(vec<T, A, vl_embed>::space): New.
(vec<T, A, vl_embed>::iterate): New.
(vec<T, A, vl_embed>::iterate): New.
(vec<T, A, vl_embed>::copy): New.
(vec<T, A, vl_embed>::splice): New.
(vec<T, A, vl_embed>::quick_push New.
(vec<T, A, vl_embed>::pop New.
(vec<T, A, vl_embed>::truncate): New.
(vec<T, A, vl_embed>::quick_insert): New.
(vec<T, A, vl_embed>::ordered_remove): New.
(vec<T, A, vl_embed>::unordered_remove): New.
(vec<T, A, vl_embed>::block_remove): New.
(vec<T, A, vl_embed>::qsort): New.
(vec<T, A, vl_embed>::lower_bound): New.
(vec<T, A, vl_embed>::embedded_size): New.
(vec<T, A, vl_embed>::embedded_init): New.
(vec<T, A, vl_embed>::quick_grow): New.
(vec<T, A, vl_embed>::quick_grow_cleared): New.
(vec_safe_space): New.
(vec_safe_length): New.
(vec_safe_address): New.
(vec_safe_is_empty): New.
(vec_safe_reserve): New.
(vec_safe_reserve_exact): New.
(vec_alloc): New.
(vec_free): New.
(vec_safe_grow): New.
(vec_safe_grow_cleared): New.
(vec_safe_iterate): New.
(vec_safe_push): New.
(vec_safe_insert): New.
(vec_safe_truncate): New.
(vec_safe_copy): New.
(vec_safe_splice): New.
(vec<T, A, vl_ptr>): New partial specialization for the space
efficient layout.
(vec<T, A, vl_ptr>::exists): New.
(vec<T, A, vl_ptr>::is_empty): New.
(vec<T, A, vl_ptr>::length): New.
(vec<T, A, vl_ptr>::address): New.
(vec<T, A, vl_ptr>::operator[]): New.
(vec<T, A, vl_ptr>::operator!=): New.
(vec<T, A, vl_ptr>::operator==): New.
(vec<T, A, vl_ptr>::last): New.
(vec<T, A, vl_ptr>::space): New.
(vec<T, A, vl_ptr>::iterate): New.
(vec<T, A, vl_ptr>::copy): New.
(vec<T, A, vl_ptr>::reserve): New.
(vec<T, A, vl_ptr>::reserve_exact): New.
(vec<T, A, vl_ptr>::splice): New.
(vec<T, A, vl_ptr>::safe_splice): New.
(vec<T, A, vl_ptr>::quick_push): New.
(vec<T, A, vl_ptr>::safe_push): New.
(vec<T, A, vl_ptr>::pop): New.
(vec<T, A, vl_ptr>::truncate): New.
(vec<T, A, vl_ptr>::safe_grow): New.
(vec<T, A, vl_ptr>::safe_grow_cleared): New.
(vec<T, A, vl_ptr>::quick_grow): New.
(vec<T, A, vl_ptr>::quick_grow_cleared): New.
(vec<T, A, vl_ptr>::quick_insert): New.
(vec<T, A, vl_ptr>::safe_insert): New.
(vec<T, A, vl_ptr>::ordered_remove): New.
(vec<T, A, vl_ptr>::unordered_remove): New.
(vec<T, A, vl_ptr>::block_remove): New.
(vec<T, A, vl_ptr>::qsort): New.
(vec<T, A, vl_ptr>::lower_bound): New.
(vec_stack_alloc): Define.
(FOR_EACH_VEC_SAFE_ELT): Define.
* vecir.h: Remove. Update all users.
* vecprim.h: Remove. Update all users.
Move uchar to coretypes.h.
* Makefile.in (VEC_H): Add $(GGC_H).
Remove vecir.h and vecprim.h dependencies everywhere.
2012-11-16 Diego Novillo <dnovillo@google.com>
* gengtype-lex.l (VEC): Remove.
Add characters in the set [\!\>\.-].
* gengtype-parse.c (token_names): Remove "VEC".
(require_template_declaration): Remove handling of VEC_TOKEN.
(type): Likewise.
Call create_user_defined_type when parsing GTY((user)).
* gengtype-state.c (type_lineloc): handle TYPE_UNDEFINED.
(write_state_undefined_type): New.
(write_state_type): Call write_state_undefined_type for
TYPE_UNDEFINED.
(read_state_type): Call read_state_undefined_type for
TYPE_UNDEFINED.
* gengtype.c (dbgprint_count_type_at): Handle TYPE_UNDEFINED.
(create_user_defined_type): Make extern.
(type_for_name): Factor out of resolve_typedef.
(create_undefined_type): New
(resolve_typedef): Call it when we cannot find a previous
typedef and the type is not a template.
(find_structure): Accept TYPE_UNDEFINED.
(set_gc_used_type): Add argument ALLOWED_UNDEFINED_TYPES,
default to false.
Emit an error for TYPE_UNDEFINED unless LEVEL is GC_UNUSED or
ALLOWED_UNDEFINED_TYPES is set.
Set ALLOWED_UNDEFINED_TYPES to true for TYPE_USER_STRUCT.
(filter_type_name): Accept templates with more than one
argument.
(output_mangled_typename): Handle TYPE_UNDEFINED
(walk_type): Likewise.
(write_types_process_field): Likewise.
(write_func_for_structure): If CHAIN_NEXT is set, ORIG_S
should not be a user-defined type.
(write_types_local_user_process_field): Handle TYPE_ARRAY,
TYPE_NONE and TYPE_UNDEFINED.
(write_types_local_process_field): Likewise.
(contains_scalar_p): Return 0 for TYPE_USER_STRUCT.
(write_root): Reject user-defined types that are not pointers.
Handle TYPE_NONE, TYPE_UNDEFINED, TYPE_UNION, TYPE_LANG_STRUCT
and TYPE_PARAM_STRUCT.
(output_typename): Handle TYPE_NONE, TYPE_UNDEFINED, and
TYPE_ARRAY.
(dump_typekind): Handle TYPE_UNDEFINED.
* gengtype.h (enum typekind): Add TYPE_UNDEFINED.
(create_user_defined_type): Declare.
(enum gty_token): Remove VEC_TOKEN.
2012-11-16 Diego Novillo <dnovillo@google.com>
Adjust for new vec API (http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec)
* coretypes.h (uchar): Define.
* alias.c: Use new vec API in vec.h.
* asan.c: Likewise.
* attribs.c: Likewise.
* basic-block.h: Likewise.
* bb-reorder.c: Likewise.
* builtins.c: Likewise.
* calls.c: Likewise.
* cfg.c: Likewise.
* cfganal.c: Likewise.
* cfgcleanup.c: Likewise.
* cfgexpand.c: Likewise.
* cfghooks.c: Likewise.
* cfghooks.h: Likewise.
* cfgloop.c: Likewise.
* cfgloop.h: Likewise.
* cfgloopanal.c: Likewise.
* cfgloopmanip.c: Likewise.
* cfgrtl.c: Likewise.
* cgraph.c: Likewise.
* cgraph.h: Likewise.
* cgraphclones.c: Likewise.
* cgraphunit.c: Likewise.
* combine.c: Likewise.
* compare-elim.c: Likewise.
* coverage.c: Likewise.
* cprop.c: Likewise.
* data-streamer.h: Likewise.
* dbxout.c: Likewise.
* dce.c: Likewise.
* df-core.c: Likewise.
* df-problems.c: Likewise.
* df-scan.c: Likewise.
* dominance.c: Likewise.
* domwalk.c: Likewise.
* domwalk.h: Likewise.
* dse.c: Likewise.
* dwarf2cfi.c: Likewise.
* dwarf2out.c: Likewise.
* dwarf2out.h: Likewise.
* emit-rtl.c: Likewise.
* except.c: Likewise.
* except.h: Likewise.
* expr.c: Likewise.
* expr.h: Likewise.
* final.c: Likewise.
* fold-const.c: Likewise.
* function.c: Likewise.
* function.h: Likewise.
* fwprop.c: Likewise.
* gcc.c: Likewise.
* gcse.c: Likewise.
* genattr.c: Likewise.
* genattrtab.c: Likewise.
* genautomata.c: Likewise.
* genextract.c: Likewise.
* genopinit.c: Likewise
* ggc-common.c: Likewise.
* ggc.h: Likewise.
* gimple-low.c: Likewise.
* gimple-ssa-strength-reduction.c: Likewise.
* gimple-streamer-in.c: Likewise.
* gimple.c: Likewise.
* gimple.h: Likewise.
* gimplify.c: Likewise.
* graph.c: Likewise.
* graphds.c: Likewise.
* graphds.h: Likewise.
* graphite-blocking.c: Likewise.
* graphite-clast-to-gimple.c: Likewise.
* graphite-dependences.c: Likewise.
* graphite-interchange.c: Likewise.
* graphite-optimize-isl.c: Likewise.
* graphite-poly.c: Likewise.
* graphite-poly.h: Likewise.
* graphite-scop-detection.c: Likewise.
* graphite-scop-detection.h: Likewise.
* graphite-sese-to-poly.c: Likewise.
* graphite.c: Likewise.
* godump.c: Likewise.
* haifa-sched.c: Likewise.
* hw-doloop.c: Likewise.
* hw-doloop.h: Likewise.
* ifcvt.c: Likewise.
* insn-addr.h: Likewise.
* ipa-cp.c: Likewise.
* ipa-inline-analysis.c: Likewise.
* ipa-inline-transform.c: Likewise.
* ipa-inline.c: Likewise.
* ipa-inline.h: Likewise.
* ipa-prop.c: Likewise.
* ipa-prop.h: Likewise.
* ipa-pure-const.c: Likewise.
* ipa-ref-inline.h: Likewise.
* ipa-ref.c: Likewise.
* ipa-ref.h: Likewise.
* ipa-reference.c: Likewise.
* ipa-split.c: Likewise.
* ipa-utils.c: Likewise.
* ipa-utils.h: Likewise.
* ipa.c: Likewise.
* ira-build.c: Likewise.
* ira-color.c: Likewise.
* ira-emit.c: Likewise.
* ira-int.h: Likewise.
* ira.c: Likewise.
* loop-invariant.c: Likewise.
* loop-unroll.c: Likewise.
* lower-subreg.c: Likewise.
* lra-lives.c: Likewise.
* lra.c: Likewise.
* lto-cgraph.c: Likewise.
* lto-section-out.c: Likewise.
* lto-streamer-in.c: Likewise.
* lto-streamer-out.c: Likewise.
* lto-streamer.h: Likewise.
* lto-symtab.c: Likewise.
* mcf.c: Likewise.
* modulo-sched.c: Likewise.
* omp-low.c: Likewise.
* opts-common.c: Likewise.
* opts-global.c: Likewise.
* opts.c: Likewise.
* opts.h: Likewise.
* passes.c: Likewise.
* predict.c: Likewise.
* print-tree.c: Likewise.
* profile.c: Likewise.
* profile.h: Likewise.
* read-rtl.c: Likewise.
* ree.c: Likewise.
* reg-stack.c: Likewise.
* regrename.c: Likewise.
* regrename.h: Likewise.
* reload.c: Likewise.
* reload.h: Likewise.
* reload1.c: Likewise.
* rtl.h: Likewise.
* sched-deps.c: Likewise.
* sched-int.h: Likewise.
* sdbout.c: Likewise.
* sel-sched-dump.c: Likewise.
* sel-sched-ir.c: Likewise.
* sel-sched-ir.h: Likewise.
* sel-sched.c: Likewise.
* sese.c: Likewise.
* sese.h: Likewise.
* statistics.h: Likewise.
* stmt.c: Likewise.
* stor-layout.c: Likewise.
* store-motion.c: Likewise.
* tlink.c: Likewise.
* toplev.c: Likewise.
* trans-mem.c: Likewise.
* tree-browser.c: Likewise.
* tree-call-cdce.c: Likewise.
* tree-cfg.c: Likewise.
* tree-cfgcleanup.c: Likewise.
* tree-chrec.c: Likewise.
* tree-chrec.h: Likewise.
* tree-complex.c: Likewise.
* tree-data-ref.c: Likewise.
* tree-data-ref.h: Likewise.
* tree-dfa.c: Likewise.
* tree-diagnostic.c: Likewise.
* tree-dump.c: Likewise.
* tree-eh.c: Likewise.
* tree-emutls.c: Likewise.
* tree-flow.h: Likewise.
* tree-if-conv.c: Likewise.
* tree-inline.c: Likewise.
* tree-inline.h: Likewise.
* tree-into-ssa.c: Likewise.
* tree-iterator.c: Likewise.
* tree-loop-distribution.c: Likewise.
* tree-mudflap.c: Likewise.
* tree-optimize.c: Likewise.
* tree-outof-ssa.c: Likewise.
* tree-parloops.c: Likewise.
* tree-phinodes.c: Likewise.
* tree-predcom.c: Likewise.
* tree-pretty-print.c: Likewise.
* tree-scalar-evolution.c: Likewise.
* tree-sra.c: Likewise.
* tree-ssa-address.c: Likewise.
* tree-ssa-alias.c: Likewise.
* tree-ssa-ccp.c: Likewise.
* tree-ssa-coalesce.c: Likewise.
* tree-ssa-dce.c: Likewise.
* tree-ssa-dom.c: Likewise.
* tree-ssa-forwprop.c: Likewise.
* tree-ssa-live.c: Likewise.
* tree-ssa-live.h: Likewise.
* tree-ssa-loop-im.c: Likewise.
* tree-ssa-loop-ivcanon.c: Likewise.
* tree-ssa-loop-ivopts.c: Likewise.
* tree-ssa-loop-manip.c: Likewise.
* tree-ssa-loop-niter.c: Likewise.
* tree-ssa-loop-prefetch.c: Likewise.
* tree-ssa-math-opts.c: Likewise.
* tree-ssa-operands.c: Likewise.
* tree-ssa-phiopt.c: Likewise.
* tree-ssa-phiprop.c: Likewise.
* tree-ssa-pre.c: Likewise.
* tree-ssa-propagate.c: Likewise.
* tree-ssa-reassoc.c: Likewise.
* tree-ssa-sccvn.c: Likewise.
* tree-ssa-sccvn.h: Likewise.
* tree-ssa-strlen.c: Likewise.
* tree-ssa-structalias.c: Likewise.
* tree-ssa-tail-merge.c: Likewise.
* tree-ssa-threadedge.c: Likewise.
* tree-ssa-threadupdate.c: Likewise.
* tree-ssa-uncprop.c: Likewise.
* tree-ssa-uninit.c: Likewise.
* tree-ssa.c: Likewise.
* tree-ssanames.c: Likewise.
* tree-stdarg.c: Likewise.
* tree-streamer-in.c: Likewise.
* tree-streamer-out.c: Likewise.
* tree-streamer.c: Likewise.
* tree-streamer.h: Likewise.
* tree-switch-conversion.c: Likewise.
* tree-vect-data-refs.c: Likewise.
* tree-vect-generic.c: Likewise.
* tree-vect-loop-manip.c: Likewise.
* tree-vect-loop.c: Likewise.
* tree-vect-patterns.c: Likewise.
* tree-vect-slp.c: Likewise.
* tree-vect-stmts.c: Likewise.
* tree-vectorizer.c: Likewise.
* tree-vectorizer.h: Likewise.
* tree-vrp.c: Likewise.
* tree.c: Likewise.
* tree.h: Likewise.
* value-prof.c: Likewise.
* value-prof.h: Likewise.
* var-tracking.c: Likewise.
* varasm.c: Likewise.
* varpool.c: Likewise.
* vmsdbgout.c: Likewise.
* config/bfin/bfin.c: Likewise.
* config/c6x/c6x.c: Likewise.
* config/darwin.c: Likewise.
* config/i386/i386.c: Likewise.
* config/ia64/ia64.c: Likewise.
* config/mep/mep.c: Likewise.
* config/mips/mips.c: Likewise.
* config/pa/pa.c: Likewise.
* config/rs6000/rs6000-c.c: Likewise.
* config/rs6000/rs6000.c: Likewise.
* config/rx/rx.c: Likewise.
* config/spu/spu-c.c: Likewise.
* config/vms/vms.c: Likewise.
* config/vxworks.c: Likewise.
* config/epiphany/resolve-sw-modes.c: Likewise.
From-SVN: r193595
2012-11-17 21:54:30 -05:00
|
|
|
|
vec<constructor_elt, va_gc> *v;
|
2012-11-02 00:39:44 +01:00
|
|
|
|
tree constr;
|
|
|
|
|
tree inner_type = TREE_TYPE (type);
|
|
|
|
|
tree cond_type = TREE_TYPE (TREE_TYPE (a));
|
|
|
|
|
tree comp_inner_type = cond_type;
|
|
|
|
|
tree width = TYPE_SIZE (inner_type);
|
|
|
|
|
tree index = bitsize_int (0);
|
|
|
|
|
int nunits = TYPE_VECTOR_SUBPARTS (type);
|
|
|
|
|
int i;
|
|
|
|
|
location_t loc = gimple_location (gsi_stmt (*gsi));
|
|
|
|
|
|
2012-11-13 08:25:36 +01:00
|
|
|
|
if (!is_gimple_val (a))
|
2012-11-02 00:39:44 +01:00
|
|
|
|
{
|
|
|
|
|
gcc_assert (COMPARISON_CLASS_P (a));
|
|
|
|
|
a_is_comparison = true;
|
|
|
|
|
a1 = TREE_OPERAND (a, 0);
|
|
|
|
|
a2 = TREE_OPERAND (a, 1);
|
|
|
|
|
comp_inner_type = TREE_TYPE (TREE_TYPE (a1));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (expand_vec_cond_expr_p (type, TREE_TYPE (a1)))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
/* TODO: try and find a smaller vector type. */
|
|
|
|
|
|
|
|
|
|
warning_at (loc, OPT_Wvector_operation_performance,
|
|
|
|
|
"vector condition will be expanded piecewise");
|
|
|
|
|
|
This patch rewrites the old VEC macro-based interface into a new one based on the template class 'vec'.
This patch rewrites the old VEC macro-based interface into a new one
based on the template class 'vec'. The user-visible changes are
described in http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec.
I have tested the patch pretty extensively:
- Regular bootstraps on x86_64, ppc, ia64, sparc and hppa.
- Bootstraps with --enable-checking=release
- Bootstraps with --enable-checking=gc,gcac
- Basic builds on all targets (using contrib/config-list.mk).
We no longer access the vectors via VEC_* macros. The pattern is
"VEC_operation (T, A, V, args)" becomes "V.operation (args)".
The only thing I could not do is create proper ctors and dtors for the
vec class. Since these vectors are stored in unions, we
have to keep them as PODs (C++03 does not allow non-PODs in unions).
This means that creation and destruction must be explicit. There is a
new method vec<type, allocation, layout>::create() and another vec<type,
allocation, layout>::destroy() to allocate the internal vector.
For vectors that must be pointers, there is a family of free functions
that implement the operations that need to tolerate NULL vectors.
These functions all start with the prefix 'vec_safe_'. See the wiki
page for details.
The gengtype change removes the special handling for VEC() that used
to exist in gengtype. Additionally, it allows gengtype to recognize
templates of more than one argument and introduces the concept of an
undefined type (useful for template arguments that may or may not be
types).
When a TYPE_UNDEFINED is reached, gengtype will ignore it if it
happens inside a type marked with GTY((user)). Otherwise, it will
emit an error.
Finally, gengtype rejects root types marked GTY((user)) that are not
first class pointers.
2012-11-16 Diego Novillo <dnovillo@google.com>
VEC API overhaul (http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec)
* vec.c (register_overhead): Convert it into
member function of vec_prefix.
(release_overhead): Likewise.
(calculate_allocation): Likewise.
(vec_heap_free): Remove.
(vec_gc_o_reserve_1): Remove.
(vec_heap_o_reserve_1): Remove.
(vec_stack_o_reserve_1): Remove.
(vec_stack_o_reserve_exact): Remove.
(register_stack_vec): New.
(stack_vec_register_index): New.
(unregister_stack_vec): New.
(vec_assert_fail): Remove.
* vec.h: Conditionally include ggc.h. Document conditional
hackery.
Update top-level documentation.
(ALONE_VEC_CHECK_INFO): Remove.
(VEC_CHECK_INFO): Remove.
(ALONE_VEC_CHECK_DECL): Remove.
(VEC_CHECK_DECL): Remove.
(ALONE_VEC_CHECK_PASS): Remove.
(VEC_CHECK_PASS): Remove.
(VEC_ASSERT): Remove.
(vec_prefix): Add friends va_gc, va_gc_atomic, va_heap and
va_stack.
Mark fields alloc_ and num_ as protected.
(struct vec_t): Remove. Remove all function members.
(struct vl_embed): Declare.
(struct vl_ptr): Declare.
(free): Remove.
(reserve_exact): Remove.
(reserve): Remove.
(safe_splice): Remove.
(safe_push): Remove.
(safe_grow): Remove.
(safe_grow_cleared): Remove.
(safe_insert): Remove.
(DEF_VEC_I): Remove.
(DEF_VEC_ALLOC_I): Remove.
(DEF_VEC_P): Remove.
(DEF_VEC_ALLOC_P): Remove.
(DEF_VEC_O): Remove.
(DEF_VEC_ALLOC_O): Remove.
(DEF_VEC_ALLOC_P_STACK): Remove.
(DEF_VEC_ALLOC_O_STACK): Remove.
(DEF_VEC_ALLOC_I_STACK): Remove.
(DEF_VEC_A): Remove.
(DEF_VEC_ALLOC_A): Remove.
(vec_stack_p_reserve_exact_1): Remove.
(vec_stack_o_reserve): Remove.
(vec_stack_o_reserve_exact): Remove.
(VEC_length): Remove.
(VEC_empty): Remove.
(VEC_address): Remove.
(vec_address): Remove.
(VEC_last): Remove.
(VEC_index): Remove.
(VEC_iterate): Remove.
(VEC_embedded_size): Remove.
(VEC_embedded_init): Remove.
(VEC_free): Remove.
(VEC_copy): Remove.
(VEC_space): Remove.
(VEC_reserve): Remove.
(VEC_reserve_exact): Remove.
(VEC_splice): Remove.
(VEC_safe_splice): Remove.
(VEC_quick_push): Remove.
(VEC_safe_push): Remove.
(VEC_pop): Remove.
(VEC_truncate): Remove.
(VEC_safe_grow): Remove.
(VEC_replace): Remove.
(VEC_quick_insert): Remove.
(VEC_safe_insert): Remove.
(VEC_ordered_remove): Remove.
(VEC_unordered_remove): Remove.
(VEC_block_remove): Remove.
(VEC_lower_bound): Remove.
(VEC_alloc): Remove.
(VEC_qsort): Remove.
(va_heap): Declare.
(va_heap::default_layout): New typedef to vl_ptr.
(va_heap::reserve): New.
(va_heap::release): New.
(va_gc): Declare.
(va_gc::default_layout): New typedef to vl_embed.
(va_gc::reserve): New.
(va_gc::release): New.
(va_gc_atomic): Declare. Inherit from va_gc.
(va_stack): Declare.
(va_stack::default_layout): New typedef to vl_ptr.
(va_stack::alloc): New.
(va_stack::reserve): New.
(va_stack::release): New.
(register_stack_vec): Declare.
(stack_vec_register_index): Declare.
(unregister_stack_vec): Declare.
(vec<T, A = va_heap, L = typename A::default_layout>): Declare
empty vec template.
(vec<T, A, vl_embed>): Partial specialization for embedded
layout.
(vec<T, A, vl_embed>::allocated): New.
(vec<T, A, vl_embed>::length): New.
(vec<T, A, vl_embed>::is_empty): New.
(vec<T, A, vl_embed>::address): New.
(vec<T, A, vl_embed>::operator[]): New.
(vec<T, A, vl_embed>::last New.
(vec<T, A, vl_embed>::space): New.
(vec<T, A, vl_embed>::iterate): New.
(vec<T, A, vl_embed>::iterate): New.
(vec<T, A, vl_embed>::copy): New.
(vec<T, A, vl_embed>::splice): New.
(vec<T, A, vl_embed>::quick_push New.
(vec<T, A, vl_embed>::pop New.
(vec<T, A, vl_embed>::truncate): New.
(vec<T, A, vl_embed>::quick_insert): New.
(vec<T, A, vl_embed>::ordered_remove): New.
(vec<T, A, vl_embed>::unordered_remove): New.
(vec<T, A, vl_embed>::block_remove): New.
(vec<T, A, vl_embed>::qsort): New.
(vec<T, A, vl_embed>::lower_bound): New.
(vec<T, A, vl_embed>::embedded_size): New.
(vec<T, A, vl_embed>::embedded_init): New.
(vec<T, A, vl_embed>::quick_grow): New.
(vec<T, A, vl_embed>::quick_grow_cleared): New.
(vec_safe_space): New.
(vec_safe_length): New.
(vec_safe_address): New.
(vec_safe_is_empty): New.
(vec_safe_reserve): New.
(vec_safe_reserve_exact): New.
(vec_alloc): New.
(vec_free): New.
(vec_safe_grow): New.
(vec_safe_grow_cleared): New.
(vec_safe_iterate): New.
(vec_safe_push): New.
(vec_safe_insert): New.
(vec_safe_truncate): New.
(vec_safe_copy): New.
(vec_safe_splice): New.
(vec<T, A, vl_ptr>): New partial specialization for the space
efficient layout.
(vec<T, A, vl_ptr>::exists): New.
(vec<T, A, vl_ptr>::is_empty): New.
(vec<T, A, vl_ptr>::length): New.
(vec<T, A, vl_ptr>::address): New.
(vec<T, A, vl_ptr>::operator[]): New.
(vec<T, A, vl_ptr>::operator!=): New.
(vec<T, A, vl_ptr>::operator==): New.
(vec<T, A, vl_ptr>::last): New.
(vec<T, A, vl_ptr>::space): New.
(vec<T, A, vl_ptr>::iterate): New.
(vec<T, A, vl_ptr>::copy): New.
(vec<T, A, vl_ptr>::reserve): New.
(vec<T, A, vl_ptr>::reserve_exact): New.
(vec<T, A, vl_ptr>::splice): New.
(vec<T, A, vl_ptr>::safe_splice): New.
(vec<T, A, vl_ptr>::quick_push): New.
(vec<T, A, vl_ptr>::safe_push): New.
(vec<T, A, vl_ptr>::pop): New.
(vec<T, A, vl_ptr>::truncate): New.
(vec<T, A, vl_ptr>::safe_grow): New.
(vec<T, A, vl_ptr>::safe_grow_cleared): New.
(vec<T, A, vl_ptr>::quick_grow): New.
(vec<T, A, vl_ptr>::quick_grow_cleared): New.
(vec<T, A, vl_ptr>::quick_insert): New.
(vec<T, A, vl_ptr>::safe_insert): New.
(vec<T, A, vl_ptr>::ordered_remove): New.
(vec<T, A, vl_ptr>::unordered_remove): New.
(vec<T, A, vl_ptr>::block_remove): New.
(vec<T, A, vl_ptr>::qsort): New.
(vec<T, A, vl_ptr>::lower_bound): New.
(vec_stack_alloc): Define.
(FOR_EACH_VEC_SAFE_ELT): Define.
* vecir.h: Remove. Update all users.
* vecprim.h: Remove. Update all users.
Move uchar to coretypes.h.
* Makefile.in (VEC_H): Add $(GGC_H).
Remove vecir.h and vecprim.h dependencies everywhere.
2012-11-16 Diego Novillo <dnovillo@google.com>
* gengtype-lex.l (VEC): Remove.
Add characters in the set [\!\>\.-].
* gengtype-parse.c (token_names): Remove "VEC".
(require_template_declaration): Remove handling of VEC_TOKEN.
(type): Likewise.
Call create_user_defined_type when parsing GTY((user)).
* gengtype-state.c (type_lineloc): handle TYPE_UNDEFINED.
(write_state_undefined_type): New.
(write_state_type): Call write_state_undefined_type for
TYPE_UNDEFINED.
(read_state_type): Call read_state_undefined_type for
TYPE_UNDEFINED.
* gengtype.c (dbgprint_count_type_at): Handle TYPE_UNDEFINED.
(create_user_defined_type): Make extern.
(type_for_name): Factor out of resolve_typedef.
(create_undefined_type): New
(resolve_typedef): Call it when we cannot find a previous
typedef and the type is not a template.
(find_structure): Accept TYPE_UNDEFINED.
(set_gc_used_type): Add argument ALLOWED_UNDEFINED_TYPES,
default to false.
Emit an error for TYPE_UNDEFINED unless LEVEL is GC_UNUSED or
ALLOWED_UNDEFINED_TYPES is set.
Set ALLOWED_UNDEFINED_TYPES to true for TYPE_USER_STRUCT.
(filter_type_name): Accept templates with more than one
argument.
(output_mangled_typename): Handle TYPE_UNDEFINED
(walk_type): Likewise.
(write_types_process_field): Likewise.
(write_func_for_structure): If CHAIN_NEXT is set, ORIG_S
should not be a user-defined type.
(write_types_local_user_process_field): Handle TYPE_ARRAY,
TYPE_NONE and TYPE_UNDEFINED.
(write_types_local_process_field): Likewise.
(contains_scalar_p): Return 0 for TYPE_USER_STRUCT.
(write_root): Reject user-defined types that are not pointers.
Handle TYPE_NONE, TYPE_UNDEFINED, TYPE_UNION, TYPE_LANG_STRUCT
and TYPE_PARAM_STRUCT.
(output_typename): Handle TYPE_NONE, TYPE_UNDEFINED, and
TYPE_ARRAY.
(dump_typekind): Handle TYPE_UNDEFINED.
* gengtype.h (enum typekind): Add TYPE_UNDEFINED.
(create_user_defined_type): Declare.
(enum gty_token): Remove VEC_TOKEN.
2012-11-16 Diego Novillo <dnovillo@google.com>
Adjust for new vec API (http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec)
* coretypes.h (uchar): Define.
* alias.c: Use new vec API in vec.h.
* asan.c: Likewise.
* attribs.c: Likewise.
* basic-block.h: Likewise.
* bb-reorder.c: Likewise.
* builtins.c: Likewise.
* calls.c: Likewise.
* cfg.c: Likewise.
* cfganal.c: Likewise.
* cfgcleanup.c: Likewise.
* cfgexpand.c: Likewise.
* cfghooks.c: Likewise.
* cfghooks.h: Likewise.
* cfgloop.c: Likewise.
* cfgloop.h: Likewise.
* cfgloopanal.c: Likewise.
* cfgloopmanip.c: Likewise.
* cfgrtl.c: Likewise.
* cgraph.c: Likewise.
* cgraph.h: Likewise.
* cgraphclones.c: Likewise.
* cgraphunit.c: Likewise.
* combine.c: Likewise.
* compare-elim.c: Likewise.
* coverage.c: Likewise.
* cprop.c: Likewise.
* data-streamer.h: Likewise.
* dbxout.c: Likewise.
* dce.c: Likewise.
* df-core.c: Likewise.
* df-problems.c: Likewise.
* df-scan.c: Likewise.
* dominance.c: Likewise.
* domwalk.c: Likewise.
* domwalk.h: Likewise.
* dse.c: Likewise.
* dwarf2cfi.c: Likewise.
* dwarf2out.c: Likewise.
* dwarf2out.h: Likewise.
* emit-rtl.c: Likewise.
* except.c: Likewise.
* except.h: Likewise.
* expr.c: Likewise.
* expr.h: Likewise.
* final.c: Likewise.
* fold-const.c: Likewise.
* function.c: Likewise.
* function.h: Likewise.
* fwprop.c: Likewise.
* gcc.c: Likewise.
* gcse.c: Likewise.
* genattr.c: Likewise.
* genattrtab.c: Likewise.
* genautomata.c: Likewise.
* genextract.c: Likewise.
* genopinit.c: Likewise
* ggc-common.c: Likewise.
* ggc.h: Likewise.
* gimple-low.c: Likewise.
* gimple-ssa-strength-reduction.c: Likewise.
* gimple-streamer-in.c: Likewise.
* gimple.c: Likewise.
* gimple.h: Likewise.
* gimplify.c: Likewise.
* graph.c: Likewise.
* graphds.c: Likewise.
* graphds.h: Likewise.
* graphite-blocking.c: Likewise.
* graphite-clast-to-gimple.c: Likewise.
* graphite-dependences.c: Likewise.
* graphite-interchange.c: Likewise.
* graphite-optimize-isl.c: Likewise.
* graphite-poly.c: Likewise.
* graphite-poly.h: Likewise.
* graphite-scop-detection.c: Likewise.
* graphite-scop-detection.h: Likewise.
* graphite-sese-to-poly.c: Likewise.
* graphite.c: Likewise.
* godump.c: Likewise.
* haifa-sched.c: Likewise.
* hw-doloop.c: Likewise.
* hw-doloop.h: Likewise.
* ifcvt.c: Likewise.
* insn-addr.h: Likewise.
* ipa-cp.c: Likewise.
* ipa-inline-analysis.c: Likewise.
* ipa-inline-transform.c: Likewise.
* ipa-inline.c: Likewise.
* ipa-inline.h: Likewise.
* ipa-prop.c: Likewise.
* ipa-prop.h: Likewise.
* ipa-pure-const.c: Likewise.
* ipa-ref-inline.h: Likewise.
* ipa-ref.c: Likewise.
* ipa-ref.h: Likewise.
* ipa-reference.c: Likewise.
* ipa-split.c: Likewise.
* ipa-utils.c: Likewise.
* ipa-utils.h: Likewise.
* ipa.c: Likewise.
* ira-build.c: Likewise.
* ira-color.c: Likewise.
* ira-emit.c: Likewise.
* ira-int.h: Likewise.
* ira.c: Likewise.
* loop-invariant.c: Likewise.
* loop-unroll.c: Likewise.
* lower-subreg.c: Likewise.
* lra-lives.c: Likewise.
* lra.c: Likewise.
* lto-cgraph.c: Likewise.
* lto-section-out.c: Likewise.
* lto-streamer-in.c: Likewise.
* lto-streamer-out.c: Likewise.
* lto-streamer.h: Likewise.
* lto-symtab.c: Likewise.
* mcf.c: Likewise.
* modulo-sched.c: Likewise.
* omp-low.c: Likewise.
* opts-common.c: Likewise.
* opts-global.c: Likewise.
* opts.c: Likewise.
* opts.h: Likewise.
* passes.c: Likewise.
* predict.c: Likewise.
* print-tree.c: Likewise.
* profile.c: Likewise.
* profile.h: Likewise.
* read-rtl.c: Likewise.
* ree.c: Likewise.
* reg-stack.c: Likewise.
* regrename.c: Likewise.
* regrename.h: Likewise.
* reload.c: Likewise.
* reload.h: Likewise.
* reload1.c: Likewise.
* rtl.h: Likewise.
* sched-deps.c: Likewise.
* sched-int.h: Likewise.
* sdbout.c: Likewise.
* sel-sched-dump.c: Likewise.
* sel-sched-ir.c: Likewise.
* sel-sched-ir.h: Likewise.
* sel-sched.c: Likewise.
* sese.c: Likewise.
* sese.h: Likewise.
* statistics.h: Likewise.
* stmt.c: Likewise.
* stor-layout.c: Likewise.
* store-motion.c: Likewise.
* tlink.c: Likewise.
* toplev.c: Likewise.
* trans-mem.c: Likewise.
* tree-browser.c: Likewise.
* tree-call-cdce.c: Likewise.
* tree-cfg.c: Likewise.
* tree-cfgcleanup.c: Likewise.
* tree-chrec.c: Likewise.
* tree-chrec.h: Likewise.
* tree-complex.c: Likewise.
* tree-data-ref.c: Likewise.
* tree-data-ref.h: Likewise.
* tree-dfa.c: Likewise.
* tree-diagnostic.c: Likewise.
* tree-dump.c: Likewise.
* tree-eh.c: Likewise.
* tree-emutls.c: Likewise.
* tree-flow.h: Likewise.
* tree-if-conv.c: Likewise.
* tree-inline.c: Likewise.
* tree-inline.h: Likewise.
* tree-into-ssa.c: Likewise.
* tree-iterator.c: Likewise.
* tree-loop-distribution.c: Likewise.
* tree-mudflap.c: Likewise.
* tree-optimize.c: Likewise.
* tree-outof-ssa.c: Likewise.
* tree-parloops.c: Likewise.
* tree-phinodes.c: Likewise.
* tree-predcom.c: Likewise.
* tree-pretty-print.c: Likewise.
* tree-scalar-evolution.c: Likewise.
* tree-sra.c: Likewise.
* tree-ssa-address.c: Likewise.
* tree-ssa-alias.c: Likewise.
* tree-ssa-ccp.c: Likewise.
* tree-ssa-coalesce.c: Likewise.
* tree-ssa-dce.c: Likewise.
* tree-ssa-dom.c: Likewise.
* tree-ssa-forwprop.c: Likewise.
* tree-ssa-live.c: Likewise.
* tree-ssa-live.h: Likewise.
* tree-ssa-loop-im.c: Likewise.
* tree-ssa-loop-ivcanon.c: Likewise.
* tree-ssa-loop-ivopts.c: Likewise.
* tree-ssa-loop-manip.c: Likewise.
* tree-ssa-loop-niter.c: Likewise.
* tree-ssa-loop-prefetch.c: Likewise.
* tree-ssa-math-opts.c: Likewise.
* tree-ssa-operands.c: Likewise.
* tree-ssa-phiopt.c: Likewise.
* tree-ssa-phiprop.c: Likewise.
* tree-ssa-pre.c: Likewise.
* tree-ssa-propagate.c: Likewise.
* tree-ssa-reassoc.c: Likewise.
* tree-ssa-sccvn.c: Likewise.
* tree-ssa-sccvn.h: Likewise.
* tree-ssa-strlen.c: Likewise.
* tree-ssa-structalias.c: Likewise.
* tree-ssa-tail-merge.c: Likewise.
* tree-ssa-threadedge.c: Likewise.
* tree-ssa-threadupdate.c: Likewise.
* tree-ssa-uncprop.c: Likewise.
* tree-ssa-uninit.c: Likewise.
* tree-ssa.c: Likewise.
* tree-ssanames.c: Likewise.
* tree-stdarg.c: Likewise.
* tree-streamer-in.c: Likewise.
* tree-streamer-out.c: Likewise.
* tree-streamer.c: Likewise.
* tree-streamer.h: Likewise.
* tree-switch-conversion.c: Likewise.
* tree-vect-data-refs.c: Likewise.
* tree-vect-generic.c: Likewise.
* tree-vect-loop-manip.c: Likewise.
* tree-vect-loop.c: Likewise.
* tree-vect-patterns.c: Likewise.
* tree-vect-slp.c: Likewise.
* tree-vect-stmts.c: Likewise.
* tree-vectorizer.c: Likewise.
* tree-vectorizer.h: Likewise.
* tree-vrp.c: Likewise.
* tree.c: Likewise.
* tree.h: Likewise.
* value-prof.c: Likewise.
* value-prof.h: Likewise.
* var-tracking.c: Likewise.
* varasm.c: Likewise.
* varpool.c: Likewise.
* vmsdbgout.c: Likewise.
* config/bfin/bfin.c: Likewise.
* config/c6x/c6x.c: Likewise.
* config/darwin.c: Likewise.
* config/i386/i386.c: Likewise.
* config/ia64/ia64.c: Likewise.
* config/mep/mep.c: Likewise.
* config/mips/mips.c: Likewise.
* config/pa/pa.c: Likewise.
* config/rs6000/rs6000-c.c: Likewise.
* config/rs6000/rs6000.c: Likewise.
* config/rx/rx.c: Likewise.
* config/spu/spu-c.c: Likewise.
* config/vms/vms.c: Likewise.
* config/vxworks.c: Likewise.
* config/epiphany/resolve-sw-modes.c: Likewise.
From-SVN: r193595
2012-11-17 21:54:30 -05:00
|
|
|
|
vec_alloc (v, nunits);
|
2012-11-02 00:39:44 +01:00
|
|
|
|
for (i = 0; i < nunits;
|
|
|
|
|
i++, index = int_const_binop (PLUS_EXPR, index, width))
|
|
|
|
|
{
|
|
|
|
|
tree aa, result;
|
|
|
|
|
tree bb = tree_vec_extract (gsi, inner_type, b, width, index);
|
|
|
|
|
tree cc = tree_vec_extract (gsi, inner_type, c, width, index);
|
|
|
|
|
if (a_is_comparison)
|
|
|
|
|
{
|
|
|
|
|
tree aa1 = tree_vec_extract (gsi, comp_inner_type, a1, width, index);
|
|
|
|
|
tree aa2 = tree_vec_extract (gsi, comp_inner_type, a2, width, index);
|
|
|
|
|
aa = build2 (TREE_CODE (a), cond_type, aa1, aa2);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
aa = tree_vec_extract (gsi, cond_type, a, width, index);
|
|
|
|
|
result = gimplify_build3 (gsi, COND_EXPR, inner_type, aa, bb, cc);
|
|
|
|
|
constructor_elt ce = {NULL_TREE, result};
|
This patch rewrites the old VEC macro-based interface into a new one based on the template class 'vec'.
This patch rewrites the old VEC macro-based interface into a new one
based on the template class 'vec'. The user-visible changes are
described in http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec.
I have tested the patch pretty extensively:
- Regular bootstraps on x86_64, ppc, ia64, sparc and hppa.
- Bootstraps with --enable-checking=release
- Bootstraps with --enable-checking=gc,gcac
- Basic builds on all targets (using contrib/config-list.mk).
We no longer access the vectors via VEC_* macros. The pattern is
"VEC_operation (T, A, V, args)" becomes "V.operation (args)".
The only thing I could not do is create proper ctors and dtors for the
vec class. Since these vectors are stored in unions, we
have to keep them as PODs (C++03 does not allow non-PODs in unions).
This means that creation and destruction must be explicit. There is a
new method vec<type, allocation, layout>::create() and another vec<type,
allocation, layout>::destroy() to allocate the internal vector.
For vectors that must be pointers, there is a family of free functions
that implement the operations that need to tolerate NULL vectors.
These functions all start with the prefix 'vec_safe_'. See the wiki
page for details.
The gengtype change removes the special handling for VEC() that used
to exist in gengtype. Additionally, it allows gengtype to recognize
templates of more than one argument and introduces the concept of an
undefined type (useful for template arguments that may or may not be
types).
When a TYPE_UNDEFINED is reached, gengtype will ignore it if it
happens inside a type marked with GTY((user)). Otherwise, it will
emit an error.
Finally, gengtype rejects root types marked GTY((user)) that are not
first class pointers.
2012-11-16 Diego Novillo <dnovillo@google.com>
VEC API overhaul (http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec)
* vec.c (register_overhead): Convert it into
member function of vec_prefix.
(release_overhead): Likewise.
(calculate_allocation): Likewise.
(vec_heap_free): Remove.
(vec_gc_o_reserve_1): Remove.
(vec_heap_o_reserve_1): Remove.
(vec_stack_o_reserve_1): Remove.
(vec_stack_o_reserve_exact): Remove.
(register_stack_vec): New.
(stack_vec_register_index): New.
(unregister_stack_vec): New.
(vec_assert_fail): Remove.
* vec.h: Conditionally include ggc.h. Document conditional
hackery.
Update top-level documentation.
(ALONE_VEC_CHECK_INFO): Remove.
(VEC_CHECK_INFO): Remove.
(ALONE_VEC_CHECK_DECL): Remove.
(VEC_CHECK_DECL): Remove.
(ALONE_VEC_CHECK_PASS): Remove.
(VEC_CHECK_PASS): Remove.
(VEC_ASSERT): Remove.
(vec_prefix): Add friends va_gc, va_gc_atomic, va_heap and
va_stack.
Mark fields alloc_ and num_ as protected.
(struct vec_t): Remove. Remove all function members.
(struct vl_embed): Declare.
(struct vl_ptr): Declare.
(free): Remove.
(reserve_exact): Remove.
(reserve): Remove.
(safe_splice): Remove.
(safe_push): Remove.
(safe_grow): Remove.
(safe_grow_cleared): Remove.
(safe_insert): Remove.
(DEF_VEC_I): Remove.
(DEF_VEC_ALLOC_I): Remove.
(DEF_VEC_P): Remove.
(DEF_VEC_ALLOC_P): Remove.
(DEF_VEC_O): Remove.
(DEF_VEC_ALLOC_O): Remove.
(DEF_VEC_ALLOC_P_STACK): Remove.
(DEF_VEC_ALLOC_O_STACK): Remove.
(DEF_VEC_ALLOC_I_STACK): Remove.
(DEF_VEC_A): Remove.
(DEF_VEC_ALLOC_A): Remove.
(vec_stack_p_reserve_exact_1): Remove.
(vec_stack_o_reserve): Remove.
(vec_stack_o_reserve_exact): Remove.
(VEC_length): Remove.
(VEC_empty): Remove.
(VEC_address): Remove.
(vec_address): Remove.
(VEC_last): Remove.
(VEC_index): Remove.
(VEC_iterate): Remove.
(VEC_embedded_size): Remove.
(VEC_embedded_init): Remove.
(VEC_free): Remove.
(VEC_copy): Remove.
(VEC_space): Remove.
(VEC_reserve): Remove.
(VEC_reserve_exact): Remove.
(VEC_splice): Remove.
(VEC_safe_splice): Remove.
(VEC_quick_push): Remove.
(VEC_safe_push): Remove.
(VEC_pop): Remove.
(VEC_truncate): Remove.
(VEC_safe_grow): Remove.
(VEC_replace): Remove.
(VEC_quick_insert): Remove.
(VEC_safe_insert): Remove.
(VEC_ordered_remove): Remove.
(VEC_unordered_remove): Remove.
(VEC_block_remove): Remove.
(VEC_lower_bound): Remove.
(VEC_alloc): Remove.
(VEC_qsort): Remove.
(va_heap): Declare.
(va_heap::default_layout): New typedef to vl_ptr.
(va_heap::reserve): New.
(va_heap::release): New.
(va_gc): Declare.
(va_gc::default_layout): New typedef to vl_embed.
(va_gc::reserve): New.
(va_gc::release): New.
(va_gc_atomic): Declare. Inherit from va_gc.
(va_stack): Declare.
(va_stack::default_layout): New typedef to vl_ptr.
(va_stack::alloc): New.
(va_stack::reserve): New.
(va_stack::release): New.
(register_stack_vec): Declare.
(stack_vec_register_index): Declare.
(unregister_stack_vec): Declare.
(vec<T, A = va_heap, L = typename A::default_layout>): Declare
empty vec template.
(vec<T, A, vl_embed>): Partial specialization for embedded
layout.
(vec<T, A, vl_embed>::allocated): New.
(vec<T, A, vl_embed>::length): New.
(vec<T, A, vl_embed>::is_empty): New.
(vec<T, A, vl_embed>::address): New.
(vec<T, A, vl_embed>::operator[]): New.
(vec<T, A, vl_embed>::last New.
(vec<T, A, vl_embed>::space): New.
(vec<T, A, vl_embed>::iterate): New.
(vec<T, A, vl_embed>::iterate): New.
(vec<T, A, vl_embed>::copy): New.
(vec<T, A, vl_embed>::splice): New.
(vec<T, A, vl_embed>::quick_push New.
(vec<T, A, vl_embed>::pop New.
(vec<T, A, vl_embed>::truncate): New.
(vec<T, A, vl_embed>::quick_insert): New.
(vec<T, A, vl_embed>::ordered_remove): New.
(vec<T, A, vl_embed>::unordered_remove): New.
(vec<T, A, vl_embed>::block_remove): New.
(vec<T, A, vl_embed>::qsort): New.
(vec<T, A, vl_embed>::lower_bound): New.
(vec<T, A, vl_embed>::embedded_size): New.
(vec<T, A, vl_embed>::embedded_init): New.
(vec<T, A, vl_embed>::quick_grow): New.
(vec<T, A, vl_embed>::quick_grow_cleared): New.
(vec_safe_space): New.
(vec_safe_length): New.
(vec_safe_address): New.
(vec_safe_is_empty): New.
(vec_safe_reserve): New.
(vec_safe_reserve_exact): New.
(vec_alloc): New.
(vec_free): New.
(vec_safe_grow): New.
(vec_safe_grow_cleared): New.
(vec_safe_iterate): New.
(vec_safe_push): New.
(vec_safe_insert): New.
(vec_safe_truncate): New.
(vec_safe_copy): New.
(vec_safe_splice): New.
(vec<T, A, vl_ptr>): New partial specialization for the space
efficient layout.
(vec<T, A, vl_ptr>::exists): New.
(vec<T, A, vl_ptr>::is_empty): New.
(vec<T, A, vl_ptr>::length): New.
(vec<T, A, vl_ptr>::address): New.
(vec<T, A, vl_ptr>::operator[]): New.
(vec<T, A, vl_ptr>::operator!=): New.
(vec<T, A, vl_ptr>::operator==): New.
(vec<T, A, vl_ptr>::last): New.
(vec<T, A, vl_ptr>::space): New.
(vec<T, A, vl_ptr>::iterate): New.
(vec<T, A, vl_ptr>::copy): New.
(vec<T, A, vl_ptr>::reserve): New.
(vec<T, A, vl_ptr>::reserve_exact): New.
(vec<T, A, vl_ptr>::splice): New.
(vec<T, A, vl_ptr>::safe_splice): New.
(vec<T, A, vl_ptr>::quick_push): New.
(vec<T, A, vl_ptr>::safe_push): New.
(vec<T, A, vl_ptr>::pop): New.
(vec<T, A, vl_ptr>::truncate): New.
(vec<T, A, vl_ptr>::safe_grow): New.
(vec<T, A, vl_ptr>::safe_grow_cleared): New.
(vec<T, A, vl_ptr>::quick_grow): New.
(vec<T, A, vl_ptr>::quick_grow_cleared): New.
(vec<T, A, vl_ptr>::quick_insert): New.
(vec<T, A, vl_ptr>::safe_insert): New.
(vec<T, A, vl_ptr>::ordered_remove): New.
(vec<T, A, vl_ptr>::unordered_remove): New.
(vec<T, A, vl_ptr>::block_remove): New.
(vec<T, A, vl_ptr>::qsort): New.
(vec<T, A, vl_ptr>::lower_bound): New.
(vec_stack_alloc): Define.
(FOR_EACH_VEC_SAFE_ELT): Define.
* vecir.h: Remove. Update all users.
* vecprim.h: Remove. Update all users.
Move uchar to coretypes.h.
* Makefile.in (VEC_H): Add $(GGC_H).
Remove vecir.h and vecprim.h dependencies everywhere.
2012-11-16 Diego Novillo <dnovillo@google.com>
* gengtype-lex.l (VEC): Remove.
Add characters in the set [\!\>\.-].
* gengtype-parse.c (token_names): Remove "VEC".
(require_template_declaration): Remove handling of VEC_TOKEN.
(type): Likewise.
Call create_user_defined_type when parsing GTY((user)).
* gengtype-state.c (type_lineloc): handle TYPE_UNDEFINED.
(write_state_undefined_type): New.
(write_state_type): Call write_state_undefined_type for
TYPE_UNDEFINED.
(read_state_type): Call read_state_undefined_type for
TYPE_UNDEFINED.
* gengtype.c (dbgprint_count_type_at): Handle TYPE_UNDEFINED.
(create_user_defined_type): Make extern.
(type_for_name): Factor out of resolve_typedef.
(create_undefined_type): New
(resolve_typedef): Call it when we cannot find a previous
typedef and the type is not a template.
(find_structure): Accept TYPE_UNDEFINED.
(set_gc_used_type): Add argument ALLOWED_UNDEFINED_TYPES,
default to false.
Emit an error for TYPE_UNDEFINED unless LEVEL is GC_UNUSED or
ALLOWED_UNDEFINED_TYPES is set.
Set ALLOWED_UNDEFINED_TYPES to true for TYPE_USER_STRUCT.
(filter_type_name): Accept templates with more than one
argument.
(output_mangled_typename): Handle TYPE_UNDEFINED
(walk_type): Likewise.
(write_types_process_field): Likewise.
(write_func_for_structure): If CHAIN_NEXT is set, ORIG_S
should not be a user-defined type.
(write_types_local_user_process_field): Handle TYPE_ARRAY,
TYPE_NONE and TYPE_UNDEFINED.
(write_types_local_process_field): Likewise.
(contains_scalar_p): Return 0 for TYPE_USER_STRUCT.
(write_root): Reject user-defined types that are not pointers.
Handle TYPE_NONE, TYPE_UNDEFINED, TYPE_UNION, TYPE_LANG_STRUCT
and TYPE_PARAM_STRUCT.
(output_typename): Handle TYPE_NONE, TYPE_UNDEFINED, and
TYPE_ARRAY.
(dump_typekind): Handle TYPE_UNDEFINED.
* gengtype.h (enum typekind): Add TYPE_UNDEFINED.
(create_user_defined_type): Declare.
(enum gty_token): Remove VEC_TOKEN.
2012-11-16 Diego Novillo <dnovillo@google.com>
Adjust for new vec API (http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec)
* coretypes.h (uchar): Define.
* alias.c: Use new vec API in vec.h.
* asan.c: Likewise.
* attribs.c: Likewise.
* basic-block.h: Likewise.
* bb-reorder.c: Likewise.
* builtins.c: Likewise.
* calls.c: Likewise.
* cfg.c: Likewise.
* cfganal.c: Likewise.
* cfgcleanup.c: Likewise.
* cfgexpand.c: Likewise.
* cfghooks.c: Likewise.
* cfghooks.h: Likewise.
* cfgloop.c: Likewise.
* cfgloop.h: Likewise.
* cfgloopanal.c: Likewise.
* cfgloopmanip.c: Likewise.
* cfgrtl.c: Likewise.
* cgraph.c: Likewise.
* cgraph.h: Likewise.
* cgraphclones.c: Likewise.
* cgraphunit.c: Likewise.
* combine.c: Likewise.
* compare-elim.c: Likewise.
* coverage.c: Likewise.
* cprop.c: Likewise.
* data-streamer.h: Likewise.
* dbxout.c: Likewise.
* dce.c: Likewise.
* df-core.c: Likewise.
* df-problems.c: Likewise.
* df-scan.c: Likewise.
* dominance.c: Likewise.
* domwalk.c: Likewise.
* domwalk.h: Likewise.
* dse.c: Likewise.
* dwarf2cfi.c: Likewise.
* dwarf2out.c: Likewise.
* dwarf2out.h: Likewise.
* emit-rtl.c: Likewise.
* except.c: Likewise.
* except.h: Likewise.
* expr.c: Likewise.
* expr.h: Likewise.
* final.c: Likewise.
* fold-const.c: Likewise.
* function.c: Likewise.
* function.h: Likewise.
* fwprop.c: Likewise.
* gcc.c: Likewise.
* gcse.c: Likewise.
* genattr.c: Likewise.
* genattrtab.c: Likewise.
* genautomata.c: Likewise.
* genextract.c: Likewise.
* genopinit.c: Likewise
* ggc-common.c: Likewise.
* ggc.h: Likewise.
* gimple-low.c: Likewise.
* gimple-ssa-strength-reduction.c: Likewise.
* gimple-streamer-in.c: Likewise.
* gimple.c: Likewise.
* gimple.h: Likewise.
* gimplify.c: Likewise.
* graph.c: Likewise.
* graphds.c: Likewise.
* graphds.h: Likewise.
* graphite-blocking.c: Likewise.
* graphite-clast-to-gimple.c: Likewise.
* graphite-dependences.c: Likewise.
* graphite-interchange.c: Likewise.
* graphite-optimize-isl.c: Likewise.
* graphite-poly.c: Likewise.
* graphite-poly.h: Likewise.
* graphite-scop-detection.c: Likewise.
* graphite-scop-detection.h: Likewise.
* graphite-sese-to-poly.c: Likewise.
* graphite.c: Likewise.
* godump.c: Likewise.
* haifa-sched.c: Likewise.
* hw-doloop.c: Likewise.
* hw-doloop.h: Likewise.
* ifcvt.c: Likewise.
* insn-addr.h: Likewise.
* ipa-cp.c: Likewise.
* ipa-inline-analysis.c: Likewise.
* ipa-inline-transform.c: Likewise.
* ipa-inline.c: Likewise.
* ipa-inline.h: Likewise.
* ipa-prop.c: Likewise.
* ipa-prop.h: Likewise.
* ipa-pure-const.c: Likewise.
* ipa-ref-inline.h: Likewise.
* ipa-ref.c: Likewise.
* ipa-ref.h: Likewise.
* ipa-reference.c: Likewise.
* ipa-split.c: Likewise.
* ipa-utils.c: Likewise.
* ipa-utils.h: Likewise.
* ipa.c: Likewise.
* ira-build.c: Likewise.
* ira-color.c: Likewise.
* ira-emit.c: Likewise.
* ira-int.h: Likewise.
* ira.c: Likewise.
* loop-invariant.c: Likewise.
* loop-unroll.c: Likewise.
* lower-subreg.c: Likewise.
* lra-lives.c: Likewise.
* lra.c: Likewise.
* lto-cgraph.c: Likewise.
* lto-section-out.c: Likewise.
* lto-streamer-in.c: Likewise.
* lto-streamer-out.c: Likewise.
* lto-streamer.h: Likewise.
* lto-symtab.c: Likewise.
* mcf.c: Likewise.
* modulo-sched.c: Likewise.
* omp-low.c: Likewise.
* opts-common.c: Likewise.
* opts-global.c: Likewise.
* opts.c: Likewise.
* opts.h: Likewise.
* passes.c: Likewise.
* predict.c: Likewise.
* print-tree.c: Likewise.
* profile.c: Likewise.
* profile.h: Likewise.
* read-rtl.c: Likewise.
* ree.c: Likewise.
* reg-stack.c: Likewise.
* regrename.c: Likewise.
* regrename.h: Likewise.
* reload.c: Likewise.
* reload.h: Likewise.
* reload1.c: Likewise.
* rtl.h: Likewise.
* sched-deps.c: Likewise.
* sched-int.h: Likewise.
* sdbout.c: Likewise.
* sel-sched-dump.c: Likewise.
* sel-sched-ir.c: Likewise.
* sel-sched-ir.h: Likewise.
* sel-sched.c: Likewise.
* sese.c: Likewise.
* sese.h: Likewise.
* statistics.h: Likewise.
* stmt.c: Likewise.
* stor-layout.c: Likewise.
* store-motion.c: Likewise.
* tlink.c: Likewise.
* toplev.c: Likewise.
* trans-mem.c: Likewise.
* tree-browser.c: Likewise.
* tree-call-cdce.c: Likewise.
* tree-cfg.c: Likewise.
* tree-cfgcleanup.c: Likewise.
* tree-chrec.c: Likewise.
* tree-chrec.h: Likewise.
* tree-complex.c: Likewise.
* tree-data-ref.c: Likewise.
* tree-data-ref.h: Likewise.
* tree-dfa.c: Likewise.
* tree-diagnostic.c: Likewise.
* tree-dump.c: Likewise.
* tree-eh.c: Likewise.
* tree-emutls.c: Likewise.
* tree-flow.h: Likewise.
* tree-if-conv.c: Likewise.
* tree-inline.c: Likewise.
* tree-inline.h: Likewise.
* tree-into-ssa.c: Likewise.
* tree-iterator.c: Likewise.
* tree-loop-distribution.c: Likewise.
* tree-mudflap.c: Likewise.
* tree-optimize.c: Likewise.
* tree-outof-ssa.c: Likewise.
* tree-parloops.c: Likewise.
* tree-phinodes.c: Likewise.
* tree-predcom.c: Likewise.
* tree-pretty-print.c: Likewise.
* tree-scalar-evolution.c: Likewise.
* tree-sra.c: Likewise.
* tree-ssa-address.c: Likewise.
* tree-ssa-alias.c: Likewise.
* tree-ssa-ccp.c: Likewise.
* tree-ssa-coalesce.c: Likewise.
* tree-ssa-dce.c: Likewise.
* tree-ssa-dom.c: Likewise.
* tree-ssa-forwprop.c: Likewise.
* tree-ssa-live.c: Likewise.
* tree-ssa-live.h: Likewise.
* tree-ssa-loop-im.c: Likewise.
* tree-ssa-loop-ivcanon.c: Likewise.
* tree-ssa-loop-ivopts.c: Likewise.
* tree-ssa-loop-manip.c: Likewise.
* tree-ssa-loop-niter.c: Likewise.
* tree-ssa-loop-prefetch.c: Likewise.
* tree-ssa-math-opts.c: Likewise.
* tree-ssa-operands.c: Likewise.
* tree-ssa-phiopt.c: Likewise.
* tree-ssa-phiprop.c: Likewise.
* tree-ssa-pre.c: Likewise.
* tree-ssa-propagate.c: Likewise.
* tree-ssa-reassoc.c: Likewise.
* tree-ssa-sccvn.c: Likewise.
* tree-ssa-sccvn.h: Likewise.
* tree-ssa-strlen.c: Likewise.
* tree-ssa-structalias.c: Likewise.
* tree-ssa-tail-merge.c: Likewise.
* tree-ssa-threadedge.c: Likewise.
* tree-ssa-threadupdate.c: Likewise.
* tree-ssa-uncprop.c: Likewise.
* tree-ssa-uninit.c: Likewise.
* tree-ssa.c: Likewise.
* tree-ssanames.c: Likewise.
* tree-stdarg.c: Likewise.
* tree-streamer-in.c: Likewise.
* tree-streamer-out.c: Likewise.
* tree-streamer.c: Likewise.
* tree-streamer.h: Likewise.
* tree-switch-conversion.c: Likewise.
* tree-vect-data-refs.c: Likewise.
* tree-vect-generic.c: Likewise.
* tree-vect-loop-manip.c: Likewise.
* tree-vect-loop.c: Likewise.
* tree-vect-patterns.c: Likewise.
* tree-vect-slp.c: Likewise.
* tree-vect-stmts.c: Likewise.
* tree-vectorizer.c: Likewise.
* tree-vectorizer.h: Likewise.
* tree-vrp.c: Likewise.
* tree.c: Likewise.
* tree.h: Likewise.
* value-prof.c: Likewise.
* value-prof.h: Likewise.
* var-tracking.c: Likewise.
* varasm.c: Likewise.
* varpool.c: Likewise.
* vmsdbgout.c: Likewise.
* config/bfin/bfin.c: Likewise.
* config/c6x/c6x.c: Likewise.
* config/darwin.c: Likewise.
* config/i386/i386.c: Likewise.
* config/ia64/ia64.c: Likewise.
* config/mep/mep.c: Likewise.
* config/mips/mips.c: Likewise.
* config/pa/pa.c: Likewise.
* config/rs6000/rs6000-c.c: Likewise.
* config/rs6000/rs6000.c: Likewise.
* config/rx/rx.c: Likewise.
* config/spu/spu-c.c: Likewise.
* config/vms/vms.c: Likewise.
* config/vxworks.c: Likewise.
* config/epiphany/resolve-sw-modes.c: Likewise.
From-SVN: r193595
2012-11-17 21:54:30 -05:00
|
|
|
|
v->quick_push (ce);
|
2012-11-02 00:39:44 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
constr = build_constructor (type, v);
|
|
|
|
|
gimple_assign_set_rhs_from_tree (gsi, constr);
|
|
|
|
|
update_stmt (gsi_stmt (*gsi));
|
|
|
|
|
}
|
|
|
|
|
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
static tree
|
2008-07-28 14:33:56 +00:00
|
|
|
|
expand_vector_operation (gimple_stmt_iterator *gsi, tree type, tree compute_type,
|
|
|
|
|
gimple assign, enum tree_code code)
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
{
|
|
|
|
|
enum machine_mode compute_mode = TYPE_MODE (compute_type);
|
|
|
|
|
|
|
|
|
|
/* If the compute mode is not a vector mode (hence we are not decomposing
|
|
|
|
|
a BLKmode vector to smaller, hardware-supported vectors), we may want
|
|
|
|
|
to expand the operations in parallel. */
|
|
|
|
|
if (GET_MODE_CLASS (compute_mode) != MODE_VECTOR_INT
|
tree.def (FIXED_POINT_TYPE): New type.
* tree.def (FIXED_POINT_TYPE): New type.
(FIXED_CST): New constant.
(FIXED_CONVERT_EXPR): New expr.
* doc/c-tree.texi (Types): Document FIXED_POINT_TYPE.
(Expressions): Document FIXED_CST and FIXED_CONVERT_EXPR.
* tree.h (struct tree_base): Add saturating_flag.
Remove one bit of spare for saturating_flag.
(NUMERICAL_TYPE_CHECK): Support FIXED_POINT_TYPE.
(NON_SAT_FIXED_POINT_TYPE_P, SAT_FIXED_POINT_TYPE_P,
FIXED_POINT_TYPE_P): Define.
(TYPE_SATURATING): Define.
(TREE_FIXED_CST_PTR, TREE_FIXED_CST): Define.
(struct tree_fixed_cst): New.
(TYPE_IBIT, TYPE_FBIT): Define.
(tree_node): Add fixed_cst.
(enum tree_index): Add new enumeration values of
TI_SAT_SFRACT_TYPE, TI_SAT_FRACT_TYPE, TI_SAT_LFRACT_TYPE,
TI_SAT_LLFRACT_TYPE, TI_SAT_USFRACT_TYPE, TI_SAT_UFRACT_TYPE,
TI_SAT_ULFRACT_TYPE, TI_SAT_ULLFRACT_TYPE, TI_SFRACT_TYPE,
TI_FRACT_TYPE, TI_LFRACT_TYPE, TI_LLFRACT_TYPE, TI_USFRACT_TYPE,
TI_UFRACT_TYPE, TI_ULFRACT_TYPE, TI_ULLFRACT_TYPE,
TI_SAT_SACCUM_TYPE, TI_SAT_ACCUM_TYPE, TI_SAT_LACCUM_TYPE,
TI_SAT_LLACCUM_TYPE, TI_SAT_USACCUM_TYPE, TI_SAT_UACCUM_TYPE,
TI_SAT_ULACCUM_TYPE, TI_SAT_ULLACCUM_TYPE, TI_SACCUM_TYPE,
TI_ACCUM_TYPE, TI_LACCUM_TYPE, TI_LLACCUM_TYPE, TI_USACCUM_TYPE,
TI_UACCUM_TYPE, TI_ULACCUM_TYPE, TI_ULLACCUM_TYPE,
TI_QQ_TYPE, TI_HQ_TYPE,_TYPE, TI_SQ_TYPE, TI_DQ_TYPE, TI_TQ_TYPE,
TI_UQQ_TYPE, TI_UHQ_TYPE, TI_USQ_TYPE, TI_UDQ_TYPE, TI_UTQ_TYPE,
TI_SAT_QQ_TYPE, TI_SAT_HQ_TYPE, TI_SAT_SQ_TYPE, TI_SAT_DQ_TYPE,
TI_SAT_TQ_TYPE, TI_SAT_UQQ_TYPE, TI_SAT_UHQ_TYPE, TI_SAT_USQ_TYPE,
TI_SAT_UDQ_TYPE, TI_SAT_UTQ_TYPE, TI_HA_TYPE, TI_SA_TYPE, TI_DA_TYPE,
TI_TA_TYPE, TI_UHA_TYPE, TI_USA_TYPE, TI_UDA_TYPE, TI_UTA_TYPE,
TI_SAT_HA_TYPE, TI_SAT_SA_TYPE, TI_SAT_DA_TYPE, TI_SAT_TA_TYPE,
TI_SAT_UHA_TYPE, TI_SAT_USA_TYPE, TI_SAT_UDA_TYPE, TI_SAT_UTA_TYPE.
(sat_short_fract_type_node, sat_fract_type_node,
sat_long_fract_type_node, sat_long_long_fract_type_node,
sat_unsigned_short_fract_type_node, sat_unsigned_fract_type_node,
sat_unsigned_long_fract_type_node,
sat_unsigned_long_long_fract_type_node, short_fract_type_node,
fract_type_node, long_fract_type_node, long_long_fract_type_node,
unsigned_short_fract_type_node, unsigned_fract_type_node,
unsigned_long_fract_type_node, unsigned_long_long_fract_type_node,
sat_short_accum_type_node, sat_accum_type_node,
sat_long_accum_type_node, sat_long_long_accum_type_node,
sat_unsigned_short_accum_type_node, sat_unsigned_accum_type_node,
sat_unsigned_long_accum_type_node,
sat_unsigned_long_long_accum_type_node, short_accum_type_node,
accum_type_node, long_accum_type_node, long_long_accum_type_node,
unsigned_short_accum_type_node, unsigned_accum_type_node,
unsigned_long_accum_type_node, unsigned_long_long_accum_type_node,
qq_type_node, hq_type_node, sq_type_node, dq_type_node, tq_type_node,
uqq_type_node, uhq_type_node, usq_type_node, udq_type_node,
utq_type_node, sat_qq_type_node, sat_hq_type_node, sat_sq_type_node,
sat_dq_type_node, sat_tq_type_node, sat_uqq_type_node,
sat_uhq_type_node, sat_usq_type_node, sat_udq_type_node,
sat_utq_type_node, ha_type_node, sa_type_node, da_type_node,
ta_type_node, uha_type_node, usa_type_node, uda_type_node,
uta_type_node, sat_ha_type_node, sat_sa_type_node, sat_da_type_node,
sat_ta_type_node, sat_uha_type_node, sat_usa_type_node,
sat_uda_type_node, sat_uta_type_node): New macro.
(make_fract_type, make_accum_type): Declare.
(make_signed_fract_type, make_unsigned_fract_type,
make_sat_signed_fract_type, make_sat_unsigned_fract_type,
make_signed_accum_type, make_unsigned_accum_type,
make_sat_signed_accum_type, make_sat_unsigned_accum_type,
make_or_reuse_signed_fract_type, make_or_reuse_unsigned_fract_type,
make_or_reuse_sat_signed_fract_type,
make_or_reuse_sat_unsigned_fract_type, make_or_reuse_signed_accum_type,
make_or_reuse_unsigned_accum_type, make_or_reuse_sat_signed_accum_type,
make_or_reuse_sat_unsigned_accum_type): New macro.
(fixed_zerop): Declare.
* defaults.h (SHORT_FRACT_TYPE_SIZE, FRACT_TYPE_SIZE,
LONG_FRACT_TYPE_SIZE, LONG_LONG_FRACT_TYPE_SIZE,
SHORT_ACCUM_TYPE_SIZE, ACCUM_TYPE_SIZE, LONG_ACCUM_TYPE_SIZE,
LONG_LONG_ACCUM_TYPE_SIZE): Define.
* treestruct.def: Add TS_FIXED_CST.
* Makefile.in (c-pretty-print.o): Add dependence on fixed-value.h.
(tree.o): Likewise.
(tree-dump.o): Likewise.
(print-tree.o): Likewise.
(tree-pretty-print.o): Likewise.
(fold-const.o): Likewise.
* tree-complex.c (some_nonzerop): Handle FIXED_CST.
* tree-gimple.c (is_gimple_formal_tmp_rhs): Handle FIXED_CST.
(is_gimple_min_invariant): Handle FIXED_CST.
* stor-layout.c (int_mode_for_mode): Handle MODE_FRACT, MODE_UFRACT,
MODE_ACCUM, MODE_UACCUM, MODE_VECTOR_FRACT, MODE_VECTOR_UFRACT,
MODE_VECTOR_ACCUM, MODE_VECTOR_UACCUM.
(layout_type): Handle FIXED_POINT_TYPE.
(make_fract_type, make_accum_type): New functions.
* tree-browser.c (browse_tree): Handle FIXED_POINT_TYPE.
* tree-dump.c (fixed-value.h): New include.
(dump_fixed): New function.
(dequeue_and_dump): Handle FIXED_POINT_TYPE and FIXED_CST.
* tree-inline.c (remap_type_1): Handle FIXED_POINT_TYPE.
(estimate_num_insns_1): Handle FIXED_CST and FIXED_CONVERT_EXPR.
* tree-pretty-print.c (fixed-value.h): New include.
(dump_generic_node): Handle FIXED_POINT_TYPE, FIXED_CST, and
FIXED_CONVERT_EXPR.
* tree-scalar-evolution.c (get_scalar_evolution): Handle FIXED_CST.
* tree-ssa-loop-im.c (for_each_index): Handle FIXED_CST.
* tree-ssa-pre.c (poolify_tree): Handle FIXED_CST.
* tree-ssa-reassoc.c (break_up_subtract_bb): We can do reassociation
for non-saturating fixed-point types.
(reassociate_bb): Likewise.
* emit-rtl.c (fixed-value.h): New include.
(fconst0, fconst1): New array.
(init_emit_once): Initialize fconst0 and fconst1 for fixed-point modes.
* tree-vect-generic.c expand_vector_operation): Support
MODE_VECTOR_FRACT, MODE_VECTOR_UFRACT, MODE_VECTOR_ACCUM, and
MODE_VECTOR_UACCUM.
(type_for_widest_vector_mode): Add one parameter for the
saturating flag.
Check scalar FRACT, UFRACT, ACCUM, and UACCUM mode to select their
vector mode.
Pass the satp parameter to type_for_mode for fixed-point types.
(expand_vector_operations_1): Pass the saturating flag to
type_for_widest_vector_mode.
Support MODE_VECTOR_FRACT, MODE_VECTOR_UFRACT, MODE_VECTOR_ACCUM,
and MODE_VECTOR_UACCUM.
* tree-vect-transform.c (vect_is_simple_cond): Support FIXED_CST.
(vectorizable_condition): Likewise.
* tree.c (fixed-value.h): New include.
(tree_code_size): Support FIXED_CST.
(build_fixed): New function.
(build_one_cst): Support FIXED_POINT_TYPE for accum types.
(fixed_zerop): New function.
(tree_node_structure): Support FIXED_CST.
(type_contains_placeholder_1): Support FIXED_POINT_TYPE.
(build_type_attribute_qual_variant): Handle FIXED_POINT_TYPE.
(type_hash_eq): Handle FIXED_POINT_TYPE.
(simple_cst_equal): Support FIXED_CST.
(iterative_hash_expr): Handle FIXED_CST.
(get_unwidened): Make sure type is not FIXED_POINT_TYPE.
(get_narrower): Likewise.
(variably_modified_type_p): Handle FIXED_POINT_TYPE.
(make_or_reuse_fract_type, make_or_reuse_accum_type): New functions.
(build_common_tree_nodes_2): Use MAKE_FIXED_TYPE_NODE_FAMILY and
MAKE_FIXED_MODE_NODE macros to initialize fixed-point type
nodes.
(build_vector_type_for_mode): Handle MODE_VECTOR_FRACT,
MODE_VECTOR_UFRACT, MODE_VECTOR_ACCUM, MODE_VECTOR_UACCUM.
(initializer_zerop): Support FIXED_CST.
(walk_tree): Handle FIXED_CST and FIXED_POINT_TYPE.
* dwarf2out.c (base_type_die): Use DW_ATE_signed_fixed or
DW_ATE_unsigned_fixed to describe FIXED_POINT_TYPE.
(is_base_type): Handle FIXED_POINT_TYPE.
(add_type_attribute): Handle FIXED_POINT_TYPE.
(gen_type_die_with_usage): Handle FIXED_POINT_TYPE.
* print-tree.c (fixed-value.h): New include.
(print_node_brief): Support FIXED_CST.
(print_node): Support FIXED_POINT_TYPE and FIXED_CST.
* c-pretty-print.c (fixed-value.h): New include.
(pp_c_type_specifier): Handle FIXED_POINT_TYPE. Need to pass
TYPE_SATURATING to c_common_type_for_mode for fixed-point modes.
(pp_c_direct_abstract_declarator): Handle FIXED_POINT_TYPE.
Support fixed-point types for inner items in VECTOR_TYPE.
(pp_c_direct_declarator): Likewise.
(pp_c_declarator): Likewise.
(pp_c_fixed_constant): New function.
(pp_c_constant): Handle FIXED_CST.
(pp_c_primary_expression): Likewise.
(pp_c_expression): Likewise.
* fold-const.c (fixed-value.h): New include.
(negate_expr_p): Return true for FIXED_CST.
(fold_negate_expr): Support FIXED_CST.
(split_tree): Support FIXED_CST.
(const_binop): Support FIXED_CST.
(fold_convert_const_int_from_fixed): New function to convert from
fixed to int.
(fold_convert_const_real_from_fixed): New function to convert from
fixed to real.
(fold_convert_const_fixed_from_fixed): New function to convert from
fixed to another fixed.
(fold_convert_const_fixed_from_int): New function to convert from
int to fixed.
(fold_convert_const_fixed_from_real): New function to convert from
real to fixed.
(fold_convert_const): Support conversions from fixed to int, from
fixed to real, from fixed to fixed, from int to fixed, and from real
to fixed.
(fold_convert): Support FIXED_CST and FIXED_POINT_TYPE.
(operand_equal_p): Support FIXED_CST.
(make_range): For fixed-point modes, we need to pass the
saturating flag as the 2nd parameter.
(tree_swap_operands_p): Handle FIXED_CST.
(fold_plusminus_mult_expr): For fract modes, we cannot generate
constant 1.
(fold_unary): Support FIXED_CONVERT_EXPR.
(fold_binary): Handle FIXED_CST.
Make sure the type is not saturating, before associating operations.
Ex: A + B + C, A * B * C, (A1 * C1) +/- (A2 * C2).
(tree_expr_nonnegative_warnv_p): Handle FIXED_CST.
(fold_negate_const): Support FIXED_CST.
(fold_relational_const): Support FIXED_CST.
* gimplify.c (omp_firstprivatize_type_sizes): Handle FIXED_POINT_TYPE.
(gimplify_expr): Handle FIXED_CST.
(gimplify_type_sizes): Handle FIXED_POINT_TYPE.
* ipa-prop.c (ipa_callsite_compute_param): Support FIXED_CST.
* ipa-type-escape.c (type_to_consider): Handle FIXED_POINT_TYPE.
* doc/tm.texi (Type Layout): Document SHORT_FRACT_TYPE_SIZE,
FRACT_TYPE_SIZE, LONG_FRACT_TYPE_SIZE, LONG_LONG_FRACT_TYPE_SIZE,
SHORT_ACCUM_TYPE_SIZE, ACCUM_TYPE_SIZE, LONG_ACCUM_TYPE_SIZE,
LONG_LONG_ACCUM_TYPE_SIZE.
* dbxout.c (dbxout_type): Handle FIXED_POINT_TYPE.
* c-aux-info.c (gen_type): Handle FIXED_POINT_TYPE.
* tree-sra.c (is_sra_scalar_type): Support FIXED_POINT_TYPE.
* expmed.c (extract_bit_field): Support MODE_FRACT, MODE_UFRACT,
MODE_ACCUM, and MODE_UACCUM.
* tree-vectorizer.c (vect_is_simple_reduction): Check for saturating
fixed-point types to disable reduction.
* explow.c (promote_mode): Support FIXED_POINT_TYPE.
From-SVN: r127306
2007-08-08 22:29:12 +00:00
|
|
|
|
&& GET_MODE_CLASS (compute_mode) != MODE_VECTOR_FLOAT
|
|
|
|
|
&& GET_MODE_CLASS (compute_mode) != MODE_VECTOR_FRACT
|
|
|
|
|
&& GET_MODE_CLASS (compute_mode) != MODE_VECTOR_UFRACT
|
|
|
|
|
&& GET_MODE_CLASS (compute_mode) != MODE_VECTOR_ACCUM
|
|
|
|
|
&& GET_MODE_CLASS (compute_mode) != MODE_VECTOR_UACCUM)
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
switch (code)
|
|
|
|
|
{
|
|
|
|
|
case PLUS_EXPR:
|
|
|
|
|
case MINUS_EXPR:
|
2007-01-28 05:15:06 +00:00
|
|
|
|
if (!TYPE_OVERFLOW_TRAPS (type))
|
2011-10-11 16:10:59 +00:00
|
|
|
|
return expand_vector_addition (gsi, do_binop, do_plus_minus, type,
|
|
|
|
|
gimple_assign_rhs1 (assign),
|
2008-07-28 14:33:56 +00:00
|
|
|
|
gimple_assign_rhs2 (assign), code);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case NEGATE_EXPR:
|
2007-01-28 05:15:06 +00:00
|
|
|
|
if (!TYPE_OVERFLOW_TRAPS (type))
|
2008-07-28 14:33:56 +00:00
|
|
|
|
return expand_vector_addition (gsi, do_unop, do_negate, type,
|
|
|
|
|
gimple_assign_rhs1 (assign),
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
NULL_TREE, code);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case BIT_AND_EXPR:
|
|
|
|
|
case BIT_IOR_EXPR:
|
|
|
|
|
case BIT_XOR_EXPR:
|
2008-07-28 14:33:56 +00:00
|
|
|
|
return expand_vector_parallel (gsi, do_binop, type,
|
|
|
|
|
gimple_assign_rhs1 (assign),
|
|
|
|
|
gimple_assign_rhs2 (assign), code);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
|
|
|
|
|
case BIT_NOT_EXPR:
|
2008-07-28 14:33:56 +00:00
|
|
|
|
return expand_vector_parallel (gsi, do_unop, type,
|
|
|
|
|
gimple_assign_rhs1 (assign),
|
2011-09-29 11:29:03 +00:00
|
|
|
|
NULL_TREE, code);
|
|
|
|
|
case EQ_EXPR:
|
|
|
|
|
case NE_EXPR:
|
|
|
|
|
case GT_EXPR:
|
|
|
|
|
case LT_EXPR:
|
|
|
|
|
case GE_EXPR:
|
|
|
|
|
case LE_EXPR:
|
|
|
|
|
case UNEQ_EXPR:
|
|
|
|
|
case UNGT_EXPR:
|
|
|
|
|
case UNLT_EXPR:
|
|
|
|
|
case UNGE_EXPR:
|
|
|
|
|
case UNLE_EXPR:
|
|
|
|
|
case LTGT_EXPR:
|
|
|
|
|
case ORDERED_EXPR:
|
|
|
|
|
case UNORDERED_EXPR:
|
|
|
|
|
{
|
|
|
|
|
tree rhs1 = gimple_assign_rhs1 (assign);
|
|
|
|
|
tree rhs2 = gimple_assign_rhs2 (assign);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
|
2011-09-29 11:29:03 +00:00
|
|
|
|
return expand_vector_comparison (gsi, type, rhs1, rhs2, code);
|
|
|
|
|
}
|
2012-06-28 13:38:01 +02:00
|
|
|
|
|
|
|
|
|
case TRUNC_DIV_EXPR:
|
|
|
|
|
case TRUNC_MOD_EXPR:
|
|
|
|
|
{
|
|
|
|
|
tree rhs1 = gimple_assign_rhs1 (assign);
|
|
|
|
|
tree rhs2 = gimple_assign_rhs2 (assign);
|
|
|
|
|
tree ret;
|
|
|
|
|
|
|
|
|
|
if (!optimize
|
|
|
|
|
|| !VECTOR_INTEGER_TYPE_P (type)
|
|
|
|
|
|| TREE_CODE (rhs2) != VECTOR_CST)
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
ret = expand_vector_divmod (gsi, type, rhs1, rhs2, code);
|
|
|
|
|
if (ret != NULL_TREE)
|
|
|
|
|
return ret;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (TREE_CODE_CLASS (code) == tcc_unary)
|
2008-07-28 14:33:56 +00:00
|
|
|
|
return expand_vector_piecewise (gsi, do_unop, type, compute_type,
|
|
|
|
|
gimple_assign_rhs1 (assign),
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
NULL_TREE, code);
|
|
|
|
|
else
|
2008-07-28 14:33:56 +00:00
|
|
|
|
return expand_vector_piecewise (gsi, do_binop, type, compute_type,
|
|
|
|
|
gimple_assign_rhs1 (assign),
|
|
|
|
|
gimple_assign_rhs2 (assign), code);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
}
|
|
|
|
|
|
2012-03-14 14:55:11 +00:00
|
|
|
|
/* Return a type for the widest vector mode whose components are of type
|
|
|
|
|
TYPE, or NULL_TREE if none is found. */
|
tree.def (FIXED_POINT_TYPE): New type.
* tree.def (FIXED_POINT_TYPE): New type.
(FIXED_CST): New constant.
(FIXED_CONVERT_EXPR): New expr.
* doc/c-tree.texi (Types): Document FIXED_POINT_TYPE.
(Expressions): Document FIXED_CST and FIXED_CONVERT_EXPR.
* tree.h (struct tree_base): Add saturating_flag.
Remove one bit of spare for saturating_flag.
(NUMERICAL_TYPE_CHECK): Support FIXED_POINT_TYPE.
(NON_SAT_FIXED_POINT_TYPE_P, SAT_FIXED_POINT_TYPE_P,
FIXED_POINT_TYPE_P): Define.
(TYPE_SATURATING): Define.
(TREE_FIXED_CST_PTR, TREE_FIXED_CST): Define.
(struct tree_fixed_cst): New.
(TYPE_IBIT, TYPE_FBIT): Define.
(tree_node): Add fixed_cst.
(enum tree_index): Add new enumeration values of
TI_SAT_SFRACT_TYPE, TI_SAT_FRACT_TYPE, TI_SAT_LFRACT_TYPE,
TI_SAT_LLFRACT_TYPE, TI_SAT_USFRACT_TYPE, TI_SAT_UFRACT_TYPE,
TI_SAT_ULFRACT_TYPE, TI_SAT_ULLFRACT_TYPE, TI_SFRACT_TYPE,
TI_FRACT_TYPE, TI_LFRACT_TYPE, TI_LLFRACT_TYPE, TI_USFRACT_TYPE,
TI_UFRACT_TYPE, TI_ULFRACT_TYPE, TI_ULLFRACT_TYPE,
TI_SAT_SACCUM_TYPE, TI_SAT_ACCUM_TYPE, TI_SAT_LACCUM_TYPE,
TI_SAT_LLACCUM_TYPE, TI_SAT_USACCUM_TYPE, TI_SAT_UACCUM_TYPE,
TI_SAT_ULACCUM_TYPE, TI_SAT_ULLACCUM_TYPE, TI_SACCUM_TYPE,
TI_ACCUM_TYPE, TI_LACCUM_TYPE, TI_LLACCUM_TYPE, TI_USACCUM_TYPE,
TI_UACCUM_TYPE, TI_ULACCUM_TYPE, TI_ULLACCUM_TYPE,
TI_QQ_TYPE, TI_HQ_TYPE,_TYPE, TI_SQ_TYPE, TI_DQ_TYPE, TI_TQ_TYPE,
TI_UQQ_TYPE, TI_UHQ_TYPE, TI_USQ_TYPE, TI_UDQ_TYPE, TI_UTQ_TYPE,
TI_SAT_QQ_TYPE, TI_SAT_HQ_TYPE, TI_SAT_SQ_TYPE, TI_SAT_DQ_TYPE,
TI_SAT_TQ_TYPE, TI_SAT_UQQ_TYPE, TI_SAT_UHQ_TYPE, TI_SAT_USQ_TYPE,
TI_SAT_UDQ_TYPE, TI_SAT_UTQ_TYPE, TI_HA_TYPE, TI_SA_TYPE, TI_DA_TYPE,
TI_TA_TYPE, TI_UHA_TYPE, TI_USA_TYPE, TI_UDA_TYPE, TI_UTA_TYPE,
TI_SAT_HA_TYPE, TI_SAT_SA_TYPE, TI_SAT_DA_TYPE, TI_SAT_TA_TYPE,
TI_SAT_UHA_TYPE, TI_SAT_USA_TYPE, TI_SAT_UDA_TYPE, TI_SAT_UTA_TYPE.
(sat_short_fract_type_node, sat_fract_type_node,
sat_long_fract_type_node, sat_long_long_fract_type_node,
sat_unsigned_short_fract_type_node, sat_unsigned_fract_type_node,
sat_unsigned_long_fract_type_node,
sat_unsigned_long_long_fract_type_node, short_fract_type_node,
fract_type_node, long_fract_type_node, long_long_fract_type_node,
unsigned_short_fract_type_node, unsigned_fract_type_node,
unsigned_long_fract_type_node, unsigned_long_long_fract_type_node,
sat_short_accum_type_node, sat_accum_type_node,
sat_long_accum_type_node, sat_long_long_accum_type_node,
sat_unsigned_short_accum_type_node, sat_unsigned_accum_type_node,
sat_unsigned_long_accum_type_node,
sat_unsigned_long_long_accum_type_node, short_accum_type_node,
accum_type_node, long_accum_type_node, long_long_accum_type_node,
unsigned_short_accum_type_node, unsigned_accum_type_node,
unsigned_long_accum_type_node, unsigned_long_long_accum_type_node,
qq_type_node, hq_type_node, sq_type_node, dq_type_node, tq_type_node,
uqq_type_node, uhq_type_node, usq_type_node, udq_type_node,
utq_type_node, sat_qq_type_node, sat_hq_type_node, sat_sq_type_node,
sat_dq_type_node, sat_tq_type_node, sat_uqq_type_node,
sat_uhq_type_node, sat_usq_type_node, sat_udq_type_node,
sat_utq_type_node, ha_type_node, sa_type_node, da_type_node,
ta_type_node, uha_type_node, usa_type_node, uda_type_node,
uta_type_node, sat_ha_type_node, sat_sa_type_node, sat_da_type_node,
sat_ta_type_node, sat_uha_type_node, sat_usa_type_node,
sat_uda_type_node, sat_uta_type_node): New macro.
(make_fract_type, make_accum_type): Declare.
(make_signed_fract_type, make_unsigned_fract_type,
make_sat_signed_fract_type, make_sat_unsigned_fract_type,
make_signed_accum_type, make_unsigned_accum_type,
make_sat_signed_accum_type, make_sat_unsigned_accum_type,
make_or_reuse_signed_fract_type, make_or_reuse_unsigned_fract_type,
make_or_reuse_sat_signed_fract_type,
make_or_reuse_sat_unsigned_fract_type, make_or_reuse_signed_accum_type,
make_or_reuse_unsigned_accum_type, make_or_reuse_sat_signed_accum_type,
make_or_reuse_sat_unsigned_accum_type): New macro.
(fixed_zerop): Declare.
* defaults.h (SHORT_FRACT_TYPE_SIZE, FRACT_TYPE_SIZE,
LONG_FRACT_TYPE_SIZE, LONG_LONG_FRACT_TYPE_SIZE,
SHORT_ACCUM_TYPE_SIZE, ACCUM_TYPE_SIZE, LONG_ACCUM_TYPE_SIZE,
LONG_LONG_ACCUM_TYPE_SIZE): Define.
* treestruct.def: Add TS_FIXED_CST.
* Makefile.in (c-pretty-print.o): Add dependence on fixed-value.h.
(tree.o): Likewise.
(tree-dump.o): Likewise.
(print-tree.o): Likewise.
(tree-pretty-print.o): Likewise.
(fold-const.o): Likewise.
* tree-complex.c (some_nonzerop): Handle FIXED_CST.
* tree-gimple.c (is_gimple_formal_tmp_rhs): Handle FIXED_CST.
(is_gimple_min_invariant): Handle FIXED_CST.
* stor-layout.c (int_mode_for_mode): Handle MODE_FRACT, MODE_UFRACT,
MODE_ACCUM, MODE_UACCUM, MODE_VECTOR_FRACT, MODE_VECTOR_UFRACT,
MODE_VECTOR_ACCUM, MODE_VECTOR_UACCUM.
(layout_type): Handle FIXED_POINT_TYPE.
(make_fract_type, make_accum_type): New functions.
* tree-browser.c (browse_tree): Handle FIXED_POINT_TYPE.
* tree-dump.c (fixed-value.h): New include.
(dump_fixed): New function.
(dequeue_and_dump): Handle FIXED_POINT_TYPE and FIXED_CST.
* tree-inline.c (remap_type_1): Handle FIXED_POINT_TYPE.
(estimate_num_insns_1): Handle FIXED_CST and FIXED_CONVERT_EXPR.
* tree-pretty-print.c (fixed-value.h): New include.
(dump_generic_node): Handle FIXED_POINT_TYPE, FIXED_CST, and
FIXED_CONVERT_EXPR.
* tree-scalar-evolution.c (get_scalar_evolution): Handle FIXED_CST.
* tree-ssa-loop-im.c (for_each_index): Handle FIXED_CST.
* tree-ssa-pre.c (poolify_tree): Handle FIXED_CST.
* tree-ssa-reassoc.c (break_up_subtract_bb): We can do reassociation
for non-saturating fixed-point types.
(reassociate_bb): Likewise.
* emit-rtl.c (fixed-value.h): New include.
(fconst0, fconst1): New array.
(init_emit_once): Initialize fconst0 and fconst1 for fixed-point modes.
* tree-vect-generic.c expand_vector_operation): Support
MODE_VECTOR_FRACT, MODE_VECTOR_UFRACT, MODE_VECTOR_ACCUM, and
MODE_VECTOR_UACCUM.
(type_for_widest_vector_mode): Add one parameter for the
saturating flag.
Check scalar FRACT, UFRACT, ACCUM, and UACCUM mode to select their
vector mode.
Pass the satp parameter to type_for_mode for fixed-point types.
(expand_vector_operations_1): Pass the saturating flag to
type_for_widest_vector_mode.
Support MODE_VECTOR_FRACT, MODE_VECTOR_UFRACT, MODE_VECTOR_ACCUM,
and MODE_VECTOR_UACCUM.
* tree-vect-transform.c (vect_is_simple_cond): Support FIXED_CST.
(vectorizable_condition): Likewise.
* tree.c (fixed-value.h): New include.
(tree_code_size): Support FIXED_CST.
(build_fixed): New function.
(build_one_cst): Support FIXED_POINT_TYPE for accum types.
(fixed_zerop): New function.
(tree_node_structure): Support FIXED_CST.
(type_contains_placeholder_1): Support FIXED_POINT_TYPE.
(build_type_attribute_qual_variant): Handle FIXED_POINT_TYPE.
(type_hash_eq): Handle FIXED_POINT_TYPE.
(simple_cst_equal): Support FIXED_CST.
(iterative_hash_expr): Handle FIXED_CST.
(get_unwidened): Make sure type is not FIXED_POINT_TYPE.
(get_narrower): Likewise.
(variably_modified_type_p): Handle FIXED_POINT_TYPE.
(make_or_reuse_fract_type, make_or_reuse_accum_type): New functions.
(build_common_tree_nodes_2): Use MAKE_FIXED_TYPE_NODE_FAMILY and
MAKE_FIXED_MODE_NODE macros to initialize fixed-point type
nodes.
(build_vector_type_for_mode): Handle MODE_VECTOR_FRACT,
MODE_VECTOR_UFRACT, MODE_VECTOR_ACCUM, MODE_VECTOR_UACCUM.
(initializer_zerop): Support FIXED_CST.
(walk_tree): Handle FIXED_CST and FIXED_POINT_TYPE.
* dwarf2out.c (base_type_die): Use DW_ATE_signed_fixed or
DW_ATE_unsigned_fixed to describe FIXED_POINT_TYPE.
(is_base_type): Handle FIXED_POINT_TYPE.
(add_type_attribute): Handle FIXED_POINT_TYPE.
(gen_type_die_with_usage): Handle FIXED_POINT_TYPE.
* print-tree.c (fixed-value.h): New include.
(print_node_brief): Support FIXED_CST.
(print_node): Support FIXED_POINT_TYPE and FIXED_CST.
* c-pretty-print.c (fixed-value.h): New include.
(pp_c_type_specifier): Handle FIXED_POINT_TYPE. Need to pass
TYPE_SATURATING to c_common_type_for_mode for fixed-point modes.
(pp_c_direct_abstract_declarator): Handle FIXED_POINT_TYPE.
Support fixed-point types for inner items in VECTOR_TYPE.
(pp_c_direct_declarator): Likewise.
(pp_c_declarator): Likewise.
(pp_c_fixed_constant): New function.
(pp_c_constant): Handle FIXED_CST.
(pp_c_primary_expression): Likewise.
(pp_c_expression): Likewise.
* fold-const.c (fixed-value.h): New include.
(negate_expr_p): Return true for FIXED_CST.
(fold_negate_expr): Support FIXED_CST.
(split_tree): Support FIXED_CST.
(const_binop): Support FIXED_CST.
(fold_convert_const_int_from_fixed): New function to convert from
fixed to int.
(fold_convert_const_real_from_fixed): New function to convert from
fixed to real.
(fold_convert_const_fixed_from_fixed): New function to convert from
fixed to another fixed.
(fold_convert_const_fixed_from_int): New function to convert from
int to fixed.
(fold_convert_const_fixed_from_real): New function to convert from
real to fixed.
(fold_convert_const): Support conversions from fixed to int, from
fixed to real, from fixed to fixed, from int to fixed, and from real
to fixed.
(fold_convert): Support FIXED_CST and FIXED_POINT_TYPE.
(operand_equal_p): Support FIXED_CST.
(make_range): For fixed-point modes, we need to pass the
saturating flag as the 2nd parameter.
(tree_swap_operands_p): Handle FIXED_CST.
(fold_plusminus_mult_expr): For fract modes, we cannot generate
constant 1.
(fold_unary): Support FIXED_CONVERT_EXPR.
(fold_binary): Handle FIXED_CST.
Make sure the type is not saturating, before associating operations.
Ex: A + B + C, A * B * C, (A1 * C1) +/- (A2 * C2).
(tree_expr_nonnegative_warnv_p): Handle FIXED_CST.
(fold_negate_const): Support FIXED_CST.
(fold_relational_const): Support FIXED_CST.
* gimplify.c (omp_firstprivatize_type_sizes): Handle FIXED_POINT_TYPE.
(gimplify_expr): Handle FIXED_CST.
(gimplify_type_sizes): Handle FIXED_POINT_TYPE.
* ipa-prop.c (ipa_callsite_compute_param): Support FIXED_CST.
* ipa-type-escape.c (type_to_consider): Handle FIXED_POINT_TYPE.
* doc/tm.texi (Type Layout): Document SHORT_FRACT_TYPE_SIZE,
FRACT_TYPE_SIZE, LONG_FRACT_TYPE_SIZE, LONG_LONG_FRACT_TYPE_SIZE,
SHORT_ACCUM_TYPE_SIZE, ACCUM_TYPE_SIZE, LONG_ACCUM_TYPE_SIZE,
LONG_LONG_ACCUM_TYPE_SIZE.
* dbxout.c (dbxout_type): Handle FIXED_POINT_TYPE.
* c-aux-info.c (gen_type): Handle FIXED_POINT_TYPE.
* tree-sra.c (is_sra_scalar_type): Support FIXED_POINT_TYPE.
* expmed.c (extract_bit_field): Support MODE_FRACT, MODE_UFRACT,
MODE_ACCUM, and MODE_UACCUM.
* tree-vectorizer.c (vect_is_simple_reduction): Check for saturating
fixed-point types to disable reduction.
* explow.c (promote_mode): Support FIXED_POINT_TYPE.
From-SVN: r127306
2007-08-08 22:29:12 +00:00
|
|
|
|
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
static tree
|
2012-03-14 14:55:11 +00:00
|
|
|
|
type_for_widest_vector_mode (tree type, optab op)
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
{
|
2012-03-14 14:55:11 +00:00
|
|
|
|
enum machine_mode inner_mode = TYPE_MODE (type);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
enum machine_mode best_mode = VOIDmode, mode;
|
|
|
|
|
int best_nunits = 0;
|
|
|
|
|
|
2005-11-21 20:53:27 +00:00
|
|
|
|
if (SCALAR_FLOAT_MODE_P (inner_mode))
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
mode = MIN_MODE_VECTOR_FLOAT;
|
tree.def (FIXED_POINT_TYPE): New type.
* tree.def (FIXED_POINT_TYPE): New type.
(FIXED_CST): New constant.
(FIXED_CONVERT_EXPR): New expr.
* doc/c-tree.texi (Types): Document FIXED_POINT_TYPE.
(Expressions): Document FIXED_CST and FIXED_CONVERT_EXPR.
* tree.h (struct tree_base): Add saturating_flag.
Remove one bit of spare for saturating_flag.
(NUMERICAL_TYPE_CHECK): Support FIXED_POINT_TYPE.
(NON_SAT_FIXED_POINT_TYPE_P, SAT_FIXED_POINT_TYPE_P,
FIXED_POINT_TYPE_P): Define.
(TYPE_SATURATING): Define.
(TREE_FIXED_CST_PTR, TREE_FIXED_CST): Define.
(struct tree_fixed_cst): New.
(TYPE_IBIT, TYPE_FBIT): Define.
(tree_node): Add fixed_cst.
(enum tree_index): Add new enumeration values of
TI_SAT_SFRACT_TYPE, TI_SAT_FRACT_TYPE, TI_SAT_LFRACT_TYPE,
TI_SAT_LLFRACT_TYPE, TI_SAT_USFRACT_TYPE, TI_SAT_UFRACT_TYPE,
TI_SAT_ULFRACT_TYPE, TI_SAT_ULLFRACT_TYPE, TI_SFRACT_TYPE,
TI_FRACT_TYPE, TI_LFRACT_TYPE, TI_LLFRACT_TYPE, TI_USFRACT_TYPE,
TI_UFRACT_TYPE, TI_ULFRACT_TYPE, TI_ULLFRACT_TYPE,
TI_SAT_SACCUM_TYPE, TI_SAT_ACCUM_TYPE, TI_SAT_LACCUM_TYPE,
TI_SAT_LLACCUM_TYPE, TI_SAT_USACCUM_TYPE, TI_SAT_UACCUM_TYPE,
TI_SAT_ULACCUM_TYPE, TI_SAT_ULLACCUM_TYPE, TI_SACCUM_TYPE,
TI_ACCUM_TYPE, TI_LACCUM_TYPE, TI_LLACCUM_TYPE, TI_USACCUM_TYPE,
TI_UACCUM_TYPE, TI_ULACCUM_TYPE, TI_ULLACCUM_TYPE,
TI_QQ_TYPE, TI_HQ_TYPE,_TYPE, TI_SQ_TYPE, TI_DQ_TYPE, TI_TQ_TYPE,
TI_UQQ_TYPE, TI_UHQ_TYPE, TI_USQ_TYPE, TI_UDQ_TYPE, TI_UTQ_TYPE,
TI_SAT_QQ_TYPE, TI_SAT_HQ_TYPE, TI_SAT_SQ_TYPE, TI_SAT_DQ_TYPE,
TI_SAT_TQ_TYPE, TI_SAT_UQQ_TYPE, TI_SAT_UHQ_TYPE, TI_SAT_USQ_TYPE,
TI_SAT_UDQ_TYPE, TI_SAT_UTQ_TYPE, TI_HA_TYPE, TI_SA_TYPE, TI_DA_TYPE,
TI_TA_TYPE, TI_UHA_TYPE, TI_USA_TYPE, TI_UDA_TYPE, TI_UTA_TYPE,
TI_SAT_HA_TYPE, TI_SAT_SA_TYPE, TI_SAT_DA_TYPE, TI_SAT_TA_TYPE,
TI_SAT_UHA_TYPE, TI_SAT_USA_TYPE, TI_SAT_UDA_TYPE, TI_SAT_UTA_TYPE.
(sat_short_fract_type_node, sat_fract_type_node,
sat_long_fract_type_node, sat_long_long_fract_type_node,
sat_unsigned_short_fract_type_node, sat_unsigned_fract_type_node,
sat_unsigned_long_fract_type_node,
sat_unsigned_long_long_fract_type_node, short_fract_type_node,
fract_type_node, long_fract_type_node, long_long_fract_type_node,
unsigned_short_fract_type_node, unsigned_fract_type_node,
unsigned_long_fract_type_node, unsigned_long_long_fract_type_node,
sat_short_accum_type_node, sat_accum_type_node,
sat_long_accum_type_node, sat_long_long_accum_type_node,
sat_unsigned_short_accum_type_node, sat_unsigned_accum_type_node,
sat_unsigned_long_accum_type_node,
sat_unsigned_long_long_accum_type_node, short_accum_type_node,
accum_type_node, long_accum_type_node, long_long_accum_type_node,
unsigned_short_accum_type_node, unsigned_accum_type_node,
unsigned_long_accum_type_node, unsigned_long_long_accum_type_node,
qq_type_node, hq_type_node, sq_type_node, dq_type_node, tq_type_node,
uqq_type_node, uhq_type_node, usq_type_node, udq_type_node,
utq_type_node, sat_qq_type_node, sat_hq_type_node, sat_sq_type_node,
sat_dq_type_node, sat_tq_type_node, sat_uqq_type_node,
sat_uhq_type_node, sat_usq_type_node, sat_udq_type_node,
sat_utq_type_node, ha_type_node, sa_type_node, da_type_node,
ta_type_node, uha_type_node, usa_type_node, uda_type_node,
uta_type_node, sat_ha_type_node, sat_sa_type_node, sat_da_type_node,
sat_ta_type_node, sat_uha_type_node, sat_usa_type_node,
sat_uda_type_node, sat_uta_type_node): New macro.
(make_fract_type, make_accum_type): Declare.
(make_signed_fract_type, make_unsigned_fract_type,
make_sat_signed_fract_type, make_sat_unsigned_fract_type,
make_signed_accum_type, make_unsigned_accum_type,
make_sat_signed_accum_type, make_sat_unsigned_accum_type,
make_or_reuse_signed_fract_type, make_or_reuse_unsigned_fract_type,
make_or_reuse_sat_signed_fract_type,
make_or_reuse_sat_unsigned_fract_type, make_or_reuse_signed_accum_type,
make_or_reuse_unsigned_accum_type, make_or_reuse_sat_signed_accum_type,
make_or_reuse_sat_unsigned_accum_type): New macro.
(fixed_zerop): Declare.
* defaults.h (SHORT_FRACT_TYPE_SIZE, FRACT_TYPE_SIZE,
LONG_FRACT_TYPE_SIZE, LONG_LONG_FRACT_TYPE_SIZE,
SHORT_ACCUM_TYPE_SIZE, ACCUM_TYPE_SIZE, LONG_ACCUM_TYPE_SIZE,
LONG_LONG_ACCUM_TYPE_SIZE): Define.
* treestruct.def: Add TS_FIXED_CST.
* Makefile.in (c-pretty-print.o): Add dependence on fixed-value.h.
(tree.o): Likewise.
(tree-dump.o): Likewise.
(print-tree.o): Likewise.
(tree-pretty-print.o): Likewise.
(fold-const.o): Likewise.
* tree-complex.c (some_nonzerop): Handle FIXED_CST.
* tree-gimple.c (is_gimple_formal_tmp_rhs): Handle FIXED_CST.
(is_gimple_min_invariant): Handle FIXED_CST.
* stor-layout.c (int_mode_for_mode): Handle MODE_FRACT, MODE_UFRACT,
MODE_ACCUM, MODE_UACCUM, MODE_VECTOR_FRACT, MODE_VECTOR_UFRACT,
MODE_VECTOR_ACCUM, MODE_VECTOR_UACCUM.
(layout_type): Handle FIXED_POINT_TYPE.
(make_fract_type, make_accum_type): New functions.
* tree-browser.c (browse_tree): Handle FIXED_POINT_TYPE.
* tree-dump.c (fixed-value.h): New include.
(dump_fixed): New function.
(dequeue_and_dump): Handle FIXED_POINT_TYPE and FIXED_CST.
* tree-inline.c (remap_type_1): Handle FIXED_POINT_TYPE.
(estimate_num_insns_1): Handle FIXED_CST and FIXED_CONVERT_EXPR.
* tree-pretty-print.c (fixed-value.h): New include.
(dump_generic_node): Handle FIXED_POINT_TYPE, FIXED_CST, and
FIXED_CONVERT_EXPR.
* tree-scalar-evolution.c (get_scalar_evolution): Handle FIXED_CST.
* tree-ssa-loop-im.c (for_each_index): Handle FIXED_CST.
* tree-ssa-pre.c (poolify_tree): Handle FIXED_CST.
* tree-ssa-reassoc.c (break_up_subtract_bb): We can do reassociation
for non-saturating fixed-point types.
(reassociate_bb): Likewise.
* emit-rtl.c (fixed-value.h): New include.
(fconst0, fconst1): New array.
(init_emit_once): Initialize fconst0 and fconst1 for fixed-point modes.
* tree-vect-generic.c expand_vector_operation): Support
MODE_VECTOR_FRACT, MODE_VECTOR_UFRACT, MODE_VECTOR_ACCUM, and
MODE_VECTOR_UACCUM.
(type_for_widest_vector_mode): Add one parameter for the
saturating flag.
Check scalar FRACT, UFRACT, ACCUM, and UACCUM mode to select their
vector mode.
Pass the satp parameter to type_for_mode for fixed-point types.
(expand_vector_operations_1): Pass the saturating flag to
type_for_widest_vector_mode.
Support MODE_VECTOR_FRACT, MODE_VECTOR_UFRACT, MODE_VECTOR_ACCUM,
and MODE_VECTOR_UACCUM.
* tree-vect-transform.c (vect_is_simple_cond): Support FIXED_CST.
(vectorizable_condition): Likewise.
* tree.c (fixed-value.h): New include.
(tree_code_size): Support FIXED_CST.
(build_fixed): New function.
(build_one_cst): Support FIXED_POINT_TYPE for accum types.
(fixed_zerop): New function.
(tree_node_structure): Support FIXED_CST.
(type_contains_placeholder_1): Support FIXED_POINT_TYPE.
(build_type_attribute_qual_variant): Handle FIXED_POINT_TYPE.
(type_hash_eq): Handle FIXED_POINT_TYPE.
(simple_cst_equal): Support FIXED_CST.
(iterative_hash_expr): Handle FIXED_CST.
(get_unwidened): Make sure type is not FIXED_POINT_TYPE.
(get_narrower): Likewise.
(variably_modified_type_p): Handle FIXED_POINT_TYPE.
(make_or_reuse_fract_type, make_or_reuse_accum_type): New functions.
(build_common_tree_nodes_2): Use MAKE_FIXED_TYPE_NODE_FAMILY and
MAKE_FIXED_MODE_NODE macros to initialize fixed-point type
nodes.
(build_vector_type_for_mode): Handle MODE_VECTOR_FRACT,
MODE_VECTOR_UFRACT, MODE_VECTOR_ACCUM, MODE_VECTOR_UACCUM.
(initializer_zerop): Support FIXED_CST.
(walk_tree): Handle FIXED_CST and FIXED_POINT_TYPE.
* dwarf2out.c (base_type_die): Use DW_ATE_signed_fixed or
DW_ATE_unsigned_fixed to describe FIXED_POINT_TYPE.
(is_base_type): Handle FIXED_POINT_TYPE.
(add_type_attribute): Handle FIXED_POINT_TYPE.
(gen_type_die_with_usage): Handle FIXED_POINT_TYPE.
* print-tree.c (fixed-value.h): New include.
(print_node_brief): Support FIXED_CST.
(print_node): Support FIXED_POINT_TYPE and FIXED_CST.
* c-pretty-print.c (fixed-value.h): New include.
(pp_c_type_specifier): Handle FIXED_POINT_TYPE. Need to pass
TYPE_SATURATING to c_common_type_for_mode for fixed-point modes.
(pp_c_direct_abstract_declarator): Handle FIXED_POINT_TYPE.
Support fixed-point types for inner items in VECTOR_TYPE.
(pp_c_direct_declarator): Likewise.
(pp_c_declarator): Likewise.
(pp_c_fixed_constant): New function.
(pp_c_constant): Handle FIXED_CST.
(pp_c_primary_expression): Likewise.
(pp_c_expression): Likewise.
* fold-const.c (fixed-value.h): New include.
(negate_expr_p): Return true for FIXED_CST.
(fold_negate_expr): Support FIXED_CST.
(split_tree): Support FIXED_CST.
(const_binop): Support FIXED_CST.
(fold_convert_const_int_from_fixed): New function to convert from
fixed to int.
(fold_convert_const_real_from_fixed): New function to convert from
fixed to real.
(fold_convert_const_fixed_from_fixed): New function to convert from
fixed to another fixed.
(fold_convert_const_fixed_from_int): New function to convert from
int to fixed.
(fold_convert_const_fixed_from_real): New function to convert from
real to fixed.
(fold_convert_const): Support conversions from fixed to int, from
fixed to real, from fixed to fixed, from int to fixed, and from real
to fixed.
(fold_convert): Support FIXED_CST and FIXED_POINT_TYPE.
(operand_equal_p): Support FIXED_CST.
(make_range): For fixed-point modes, we need to pass the
saturating flag as the 2nd parameter.
(tree_swap_operands_p): Handle FIXED_CST.
(fold_plusminus_mult_expr): For fract modes, we cannot generate
constant 1.
(fold_unary): Support FIXED_CONVERT_EXPR.
(fold_binary): Handle FIXED_CST.
Make sure the type is not saturating, before associating operations.
Ex: A + B + C, A * B * C, (A1 * C1) +/- (A2 * C2).
(tree_expr_nonnegative_warnv_p): Handle FIXED_CST.
(fold_negate_const): Support FIXED_CST.
(fold_relational_const): Support FIXED_CST.
* gimplify.c (omp_firstprivatize_type_sizes): Handle FIXED_POINT_TYPE.
(gimplify_expr): Handle FIXED_CST.
(gimplify_type_sizes): Handle FIXED_POINT_TYPE.
* ipa-prop.c (ipa_callsite_compute_param): Support FIXED_CST.
* ipa-type-escape.c (type_to_consider): Handle FIXED_POINT_TYPE.
* doc/tm.texi (Type Layout): Document SHORT_FRACT_TYPE_SIZE,
FRACT_TYPE_SIZE, LONG_FRACT_TYPE_SIZE, LONG_LONG_FRACT_TYPE_SIZE,
SHORT_ACCUM_TYPE_SIZE, ACCUM_TYPE_SIZE, LONG_ACCUM_TYPE_SIZE,
LONG_LONG_ACCUM_TYPE_SIZE.
* dbxout.c (dbxout_type): Handle FIXED_POINT_TYPE.
* c-aux-info.c (gen_type): Handle FIXED_POINT_TYPE.
* tree-sra.c (is_sra_scalar_type): Support FIXED_POINT_TYPE.
* expmed.c (extract_bit_field): Support MODE_FRACT, MODE_UFRACT,
MODE_ACCUM, and MODE_UACCUM.
* tree-vectorizer.c (vect_is_simple_reduction): Check for saturating
fixed-point types to disable reduction.
* explow.c (promote_mode): Support FIXED_POINT_TYPE.
From-SVN: r127306
2007-08-08 22:29:12 +00:00
|
|
|
|
else if (SCALAR_FRACT_MODE_P (inner_mode))
|
|
|
|
|
mode = MIN_MODE_VECTOR_FRACT;
|
|
|
|
|
else if (SCALAR_UFRACT_MODE_P (inner_mode))
|
|
|
|
|
mode = MIN_MODE_VECTOR_UFRACT;
|
|
|
|
|
else if (SCALAR_ACCUM_MODE_P (inner_mode))
|
|
|
|
|
mode = MIN_MODE_VECTOR_ACCUM;
|
|
|
|
|
else if (SCALAR_UACCUM_MODE_P (inner_mode))
|
|
|
|
|
mode = MIN_MODE_VECTOR_UACCUM;
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
else
|
|
|
|
|
mode = MIN_MODE_VECTOR_INT;
|
|
|
|
|
|
|
|
|
|
for (; mode != VOIDmode; mode = GET_MODE_WIDER_MODE (mode))
|
|
|
|
|
if (GET_MODE_INNER (mode) == inner_mode
|
|
|
|
|
&& GET_MODE_NUNITS (mode) > best_nunits
|
optabs.h (optab_handler, [...]): Turn into inline functions that return an insn code.
gcc/
* optabs.h (optab_handler, convert_optab_handler): Turn into
inline functions that return an insn code.
(set_optab_handler, set_convert_optab_handler): New functions.
* builtins.c: Replace optab_handler(X)->insn_code with
optab_handler or set_optab_handler thoughout. Likewise
convert_optab_handler(X)->insn_code with convert_optab_handler
and set_convert_optab_handler.
* expmed.c, expr.c, genopinit.c, ifcvt.c, optabs.c, reload.c,
reload1.c, stmt.c, targhooks.c, tree-ssa-loop-prefetch.c,
tree-ssa-math-opts.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, config/m32c/m32c.c, config/rs6000/rs6000.c,
config/spu/spu.c: Likewise.
From-SVN: r161808
2010-07-04 22:13:09 +00:00
|
|
|
|
&& optab_handler (op, mode) != CODE_FOR_nothing)
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
best_mode = mode, best_nunits = GET_MODE_NUNITS (mode);
|
|
|
|
|
|
|
|
|
|
if (best_mode == VOIDmode)
|
|
|
|
|
return NULL_TREE;
|
|
|
|
|
else
|
2012-03-14 14:55:11 +00:00
|
|
|
|
return build_vector_type_for_mode (type, best_mode);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
}
|
|
|
|
|
|
2011-10-03 08:13:26 -07:00
|
|
|
|
|
|
|
|
|
/* Build a reference to the element of the vector VECT. Function
|
|
|
|
|
returns either the element itself, either BIT_FIELD_REF, or an
|
|
|
|
|
ARRAY_REF expression.
|
|
|
|
|
|
2012-05-29 15:14:06 +01:00
|
|
|
|
GSI is required to insert temporary variables while building a
|
2011-10-03 08:13:26 -07:00
|
|
|
|
refernece to the element of the vector VECT.
|
|
|
|
|
|
|
|
|
|
PTMPVEC is a pointer to the temporary variable for caching
|
|
|
|
|
purposes. In case when PTMPVEC is NULL new temporary variable
|
|
|
|
|
will be created. */
|
|
|
|
|
static tree
|
|
|
|
|
vector_element (gimple_stmt_iterator *gsi, tree vect, tree idx, tree *ptmpvec)
|
|
|
|
|
{
|
2011-10-05 10:40:49 -07:00
|
|
|
|
tree vect_type, vect_elt_type;
|
2011-10-03 08:13:26 -07:00
|
|
|
|
gimple asgn;
|
|
|
|
|
tree tmpvec;
|
|
|
|
|
tree arraytype;
|
|
|
|
|
bool need_asgn = true;
|
2011-10-05 10:40:49 -07:00
|
|
|
|
unsigned int elements;
|
2011-10-03 08:13:26 -07:00
|
|
|
|
|
2011-10-05 10:40:49 -07:00
|
|
|
|
vect_type = TREE_TYPE (vect);
|
|
|
|
|
vect_elt_type = TREE_TYPE (vect_type);
|
|
|
|
|
elements = TYPE_VECTOR_SUBPARTS (vect_type);
|
2011-10-03 08:13:26 -07:00
|
|
|
|
|
|
|
|
|
if (TREE_CODE (idx) == INTEGER_CST)
|
|
|
|
|
{
|
|
|
|
|
unsigned HOST_WIDE_INT index;
|
|
|
|
|
|
2011-10-05 10:40:49 -07:00
|
|
|
|
/* Given that we're about to compute a binary modulus,
|
|
|
|
|
we don't care about the high bits of the value. */
|
|
|
|
|
index = TREE_INT_CST_LOW (idx);
|
|
|
|
|
if (!host_integerp (idx, 1) || index >= elements)
|
|
|
|
|
{
|
|
|
|
|
index &= elements - 1;
|
|
|
|
|
idx = build_int_cst (TREE_TYPE (idx), index);
|
|
|
|
|
}
|
2011-10-03 08:13:26 -07:00
|
|
|
|
|
2011-10-06 14:28:47 +00:00
|
|
|
|
/* When lowering a vector statement sequence do some easy
|
|
|
|
|
simplification by looking through intermediate vector results. */
|
|
|
|
|
if (TREE_CODE (vect) == SSA_NAME)
|
|
|
|
|
{
|
|
|
|
|
gimple def_stmt = SSA_NAME_DEF_STMT (vect);
|
|
|
|
|
if (is_gimple_assign (def_stmt)
|
|
|
|
|
&& (gimple_assign_rhs_code (def_stmt) == VECTOR_CST
|
|
|
|
|
|| gimple_assign_rhs_code (def_stmt) == CONSTRUCTOR))
|
|
|
|
|
vect = gimple_assign_rhs1 (def_stmt);
|
|
|
|
|
}
|
|
|
|
|
|
2011-10-03 08:13:26 -07:00
|
|
|
|
if (TREE_CODE (vect) == VECTOR_CST)
|
tree.h (TREE_VECTOR_CST_ELTS): Remove.
2012-03-16 Richard Guenther <rguenther@suse.de>
* tree.h (TREE_VECTOR_CST_ELTS): Remove.
(VECTOR_CST_NELTS, VECTOR_CST_ELTS, VECTOR_CST_ELT): New defines.
(struct tree_vector): Remove elements member, add variable size
elts array member.
(build_vector_stat): Declare.
(build_vector): Define in terms of build_vector_stat.
* tree.c (build_vector): Rename to ...
(build_vector_stat): ... this. Take array of trees as parameter.
(build_vector_from_ctor): Adjust.
(integer_zerop, integer_onep, integer_all_onesp, iterative_hash_expr,
initializer_zerop): Adjust.
* cfgexpand.c (expand_debug_expr): Likewise.
* expr.c (categorize_ctor_elements_1, expand_expr_real_1,
const_vector_from_tree): Likewise.
* fold-const.c (const_binop, operand_equal_p, native_encode_vector,
native_interpret_vector, fold_unary_loc, vec_cst_ctor_to_array,
fold_vec_perm, fold_binary_loc, fold_ternary_loc): Likewise.
* tree-streamer-in.c (streamer_alloc_tree): Handle TS_VECTOR.
(lto_input_ts_vector_tree_pointers): Adjust.
* tree-streamer-out.c (streamer_write_tree_header): Handle TS_VECTOR.
(write_ts_vector_tree_pointers): Adjust.
* varasm.c (const_hash_1, compare_constant, copy_constant,
output_constant): Adjust.
* gimple-fold.c (gimple_fold_stmt_to_constant_1): Adjust.
* print-tree.c (print_node): Adjust.
* tree-pretty-print.c (dump_generic_node): Adjust.
* tree-vect-generic.c (uniform_vector_p, vector_element,
lower_vec_perm): Adjust.
* tree-vect-loop.c (get_initial_def_for_reduction): Adjust.
* tree-vect-slp.c (vect_get_constant_vectors,
vect_transform_slp_perm_load): Adjust.
* tree-vect-stmts.c (vect_gen_perm_mask): Adjust.
* expmed.c (make_tree): Adjust.
* config/i386/i386.c (ix86_expand_builtin): Adjust.
* config/sparc/sparc.c (sparc_handle_vis_mul8x16): Adjust interface
and implementation.
(sparc_fold_builtin): Adjust.
c-family/
* c-pretty-print.c (pp_c_initializer_list): Adjust.
From-SVN: r185458
2012-03-16 09:47:09 +00:00
|
|
|
|
return VECTOR_CST_ELT (vect, index);
|
2012-09-28 14:18:57 +02:00
|
|
|
|
else if (TREE_CODE (vect) == CONSTRUCTOR
|
|
|
|
|
&& (CONSTRUCTOR_NELTS (vect) == 0
|
|
|
|
|
|| TREE_CODE (TREE_TYPE (CONSTRUCTOR_ELT (vect, 0)->value))
|
|
|
|
|
!= VECTOR_TYPE))
|
2011-10-03 08:13:26 -07:00
|
|
|
|
{
|
2012-09-28 14:18:57 +02:00
|
|
|
|
if (index < CONSTRUCTOR_NELTS (vect))
|
|
|
|
|
return CONSTRUCTOR_ELT (vect, index)->value;
|
2011-10-05 10:40:49 -07:00
|
|
|
|
return build_zero_cst (vect_elt_type);
|
2011-10-03 08:13:26 -07:00
|
|
|
|
}
|
2011-10-05 10:40:49 -07:00
|
|
|
|
else
|
2011-10-03 08:13:26 -07:00
|
|
|
|
{
|
2011-10-05 10:40:49 -07:00
|
|
|
|
tree size = TYPE_SIZE (vect_elt_type);
|
2012-03-28 16:40:57 +02:00
|
|
|
|
tree pos = fold_build2 (MULT_EXPR, bitsizetype, bitsize_int (index),
|
|
|
|
|
size);
|
|
|
|
|
return fold_build3 (BIT_FIELD_REF, vect_elt_type, vect, size, pos);
|
2011-10-03 08:13:26 -07:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!ptmpvec)
|
2011-10-05 10:40:49 -07:00
|
|
|
|
tmpvec = create_tmp_var (vect_type, "vectmp");
|
2011-10-03 08:13:26 -07:00
|
|
|
|
else if (!*ptmpvec)
|
2011-10-05 10:40:49 -07:00
|
|
|
|
tmpvec = *ptmpvec = create_tmp_var (vect_type, "vectmp");
|
2011-10-03 08:13:26 -07:00
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
tmpvec = *ptmpvec;
|
|
|
|
|
need_asgn = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (need_asgn)
|
|
|
|
|
{
|
|
|
|
|
TREE_ADDRESSABLE (tmpvec) = 1;
|
|
|
|
|
asgn = gimple_build_assign (tmpvec, vect);
|
|
|
|
|
gsi_insert_before (gsi, asgn, GSI_SAME_STMT);
|
|
|
|
|
}
|
|
|
|
|
|
2011-10-05 10:40:49 -07:00
|
|
|
|
arraytype = build_array_type_nelts (vect_elt_type, elements);
|
|
|
|
|
return build4 (ARRAY_REF, vect_elt_type,
|
2011-10-03 08:13:26 -07:00
|
|
|
|
build1 (VIEW_CONVERT_EXPR, arraytype, tmpvec),
|
|
|
|
|
idx, NULL_TREE, NULL_TREE);
|
|
|
|
|
}
|
|
|
|
|
|
Rename vshuffle/vec_shuffle to vec_perm.
* doc/extend.texi (__builtin_shuffle): Improve the description to
include the modulus of the selector. Mention OpenCL.
* doc/md.texi (vec_perm, vec_perm_const): Document named patterns.
* tree.def (VEC_PERM_EXPR): Rename from VEC_SHUFFLE_EXPR.
* genopinit.c (optabs): Rename vshuffle to vec_perm.
* c-typeck.c (c_build_vec_perm_expr): Rename from
c_build_vec_shuffle_expr. Update for name changes.
* optabs.c (expand_vec_perm_expr_p): Rename from
expand_vec_shuffle_expr_p.
(expand_vec_perm_expr): Rename from expand_vec_shuffle_expr.
* optabs.h (OTI_vec_perm): Rename from DOI_vshuffle.
(vec_perm_optab): Rename from vshuffle_optab.
* expr.c, gimple-pretty-print.c, gimple.c, gimplify.c,
c-tree.h, c-parser.c, tree-cfg.c, tree-inline.c, tree-pretty-print.c,
tree-ssa-operands.c, tree-vect-generic.c: Update for name changes.
* config/i386/i386.c (ix86_expand_vec_perm): Rename from
ix86_expand_vshuffle.
* config/i386/i386-protos.h: Update.
* config/i386/sse.md (VEC_PERM_AVX2): Rename from VSHUFFLE_AVX2.
(vec_perm<VEC_PERM_AVX2>): Rename from vshuffle<VSHUFFLE_AVX2>.
From-SVN: r179701
2011-10-07 15:41:48 -07:00
|
|
|
|
/* Check if VEC_PERM_EXPR within the given setting is supported
|
2011-10-05 10:40:49 -07:00
|
|
|
|
by hardware, or lower it piecewise.
|
2011-10-03 08:13:26 -07:00
|
|
|
|
|
Rename vshuffle/vec_shuffle to vec_perm.
* doc/extend.texi (__builtin_shuffle): Improve the description to
include the modulus of the selector. Mention OpenCL.
* doc/md.texi (vec_perm, vec_perm_const): Document named patterns.
* tree.def (VEC_PERM_EXPR): Rename from VEC_SHUFFLE_EXPR.
* genopinit.c (optabs): Rename vshuffle to vec_perm.
* c-typeck.c (c_build_vec_perm_expr): Rename from
c_build_vec_shuffle_expr. Update for name changes.
* optabs.c (expand_vec_perm_expr_p): Rename from
expand_vec_shuffle_expr_p.
(expand_vec_perm_expr): Rename from expand_vec_shuffle_expr.
* optabs.h (OTI_vec_perm): Rename from DOI_vshuffle.
(vec_perm_optab): Rename from vshuffle_optab.
* expr.c, gimple-pretty-print.c, gimple.c, gimplify.c,
c-tree.h, c-parser.c, tree-cfg.c, tree-inline.c, tree-pretty-print.c,
tree-ssa-operands.c, tree-vect-generic.c: Update for name changes.
* config/i386/i386.c (ix86_expand_vec_perm): Rename from
ix86_expand_vshuffle.
* config/i386/i386-protos.h: Update.
* config/i386/sse.md (VEC_PERM_AVX2): Rename from VSHUFFLE_AVX2.
(vec_perm<VEC_PERM_AVX2>): Rename from vshuffle<VSHUFFLE_AVX2>.
From-SVN: r179701
2011-10-07 15:41:48 -07:00
|
|
|
|
When VEC_PERM_EXPR has the same first and second operands:
|
|
|
|
|
VEC_PERM_EXPR <v0, v0, mask> the lowered version would be
|
2011-10-03 08:13:26 -07:00
|
|
|
|
{v0[mask[0]], v0[mask[1]], ...}
|
|
|
|
|
MASK and V0 must have the same number of elements.
|
|
|
|
|
|
Rename vshuffle/vec_shuffle to vec_perm.
* doc/extend.texi (__builtin_shuffle): Improve the description to
include the modulus of the selector. Mention OpenCL.
* doc/md.texi (vec_perm, vec_perm_const): Document named patterns.
* tree.def (VEC_PERM_EXPR): Rename from VEC_SHUFFLE_EXPR.
* genopinit.c (optabs): Rename vshuffle to vec_perm.
* c-typeck.c (c_build_vec_perm_expr): Rename from
c_build_vec_shuffle_expr. Update for name changes.
* optabs.c (expand_vec_perm_expr_p): Rename from
expand_vec_shuffle_expr_p.
(expand_vec_perm_expr): Rename from expand_vec_shuffle_expr.
* optabs.h (OTI_vec_perm): Rename from DOI_vshuffle.
(vec_perm_optab): Rename from vshuffle_optab.
* expr.c, gimple-pretty-print.c, gimple.c, gimplify.c,
c-tree.h, c-parser.c, tree-cfg.c, tree-inline.c, tree-pretty-print.c,
tree-ssa-operands.c, tree-vect-generic.c: Update for name changes.
* config/i386/i386.c (ix86_expand_vec_perm): Rename from
ix86_expand_vshuffle.
* config/i386/i386-protos.h: Update.
* config/i386/sse.md (VEC_PERM_AVX2): Rename from VSHUFFLE_AVX2.
(vec_perm<VEC_PERM_AVX2>): Rename from vshuffle<VSHUFFLE_AVX2>.
From-SVN: r179701
2011-10-07 15:41:48 -07:00
|
|
|
|
Otherwise VEC_PERM_EXPR <v0, v1, mask> is lowered to
|
2011-10-03 08:13:26 -07:00
|
|
|
|
{mask[0] < len(v0) ? v0[mask[0]] : v1[mask[0]], ...}
|
|
|
|
|
V0 and V1 must have the same type. MASK, V0, V1 must have the
|
|
|
|
|
same number of arguments. */
|
|
|
|
|
|
2011-10-05 10:40:49 -07:00
|
|
|
|
static void
|
Rename vshuffle/vec_shuffle to vec_perm.
* doc/extend.texi (__builtin_shuffle): Improve the description to
include the modulus of the selector. Mention OpenCL.
* doc/md.texi (vec_perm, vec_perm_const): Document named patterns.
* tree.def (VEC_PERM_EXPR): Rename from VEC_SHUFFLE_EXPR.
* genopinit.c (optabs): Rename vshuffle to vec_perm.
* c-typeck.c (c_build_vec_perm_expr): Rename from
c_build_vec_shuffle_expr. Update for name changes.
* optabs.c (expand_vec_perm_expr_p): Rename from
expand_vec_shuffle_expr_p.
(expand_vec_perm_expr): Rename from expand_vec_shuffle_expr.
* optabs.h (OTI_vec_perm): Rename from DOI_vshuffle.
(vec_perm_optab): Rename from vshuffle_optab.
* expr.c, gimple-pretty-print.c, gimple.c, gimplify.c,
c-tree.h, c-parser.c, tree-cfg.c, tree-inline.c, tree-pretty-print.c,
tree-ssa-operands.c, tree-vect-generic.c: Update for name changes.
* config/i386/i386.c (ix86_expand_vec_perm): Rename from
ix86_expand_vshuffle.
* config/i386/i386-protos.h: Update.
* config/i386/sse.md (VEC_PERM_AVX2): Rename from VSHUFFLE_AVX2.
(vec_perm<VEC_PERM_AVX2>): Rename from vshuffle<VSHUFFLE_AVX2>.
From-SVN: r179701
2011-10-07 15:41:48 -07:00
|
|
|
|
lower_vec_perm (gimple_stmt_iterator *gsi)
|
2011-10-05 10:40:49 -07:00
|
|
|
|
{
|
2011-10-03 08:13:26 -07:00
|
|
|
|
gimple stmt = gsi_stmt (*gsi);
|
|
|
|
|
tree mask = gimple_assign_rhs3 (stmt);
|
|
|
|
|
tree vec0 = gimple_assign_rhs1 (stmt);
|
|
|
|
|
tree vec1 = gimple_assign_rhs2 (stmt);
|
2011-10-05 10:40:49 -07:00
|
|
|
|
tree vect_type = TREE_TYPE (vec0);
|
|
|
|
|
tree mask_type = TREE_TYPE (mask);
|
|
|
|
|
tree vect_elt_type = TREE_TYPE (vect_type);
|
|
|
|
|
tree mask_elt_type = TREE_TYPE (mask_type);
|
|
|
|
|
unsigned int elements = TYPE_VECTOR_SUBPARTS (vect_type);
|
This patch rewrites the old VEC macro-based interface into a new one based on the template class 'vec'.
This patch rewrites the old VEC macro-based interface into a new one
based on the template class 'vec'. The user-visible changes are
described in http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec.
I have tested the patch pretty extensively:
- Regular bootstraps on x86_64, ppc, ia64, sparc and hppa.
- Bootstraps with --enable-checking=release
- Bootstraps with --enable-checking=gc,gcac
- Basic builds on all targets (using contrib/config-list.mk).
We no longer access the vectors via VEC_* macros. The pattern is
"VEC_operation (T, A, V, args)" becomes "V.operation (args)".
The only thing I could not do is create proper ctors and dtors for the
vec class. Since these vectors are stored in unions, we
have to keep them as PODs (C++03 does not allow non-PODs in unions).
This means that creation and destruction must be explicit. There is a
new method vec<type, allocation, layout>::create() and another vec<type,
allocation, layout>::destroy() to allocate the internal vector.
For vectors that must be pointers, there is a family of free functions
that implement the operations that need to tolerate NULL vectors.
These functions all start with the prefix 'vec_safe_'. See the wiki
page for details.
The gengtype change removes the special handling for VEC() that used
to exist in gengtype. Additionally, it allows gengtype to recognize
templates of more than one argument and introduces the concept of an
undefined type (useful for template arguments that may or may not be
types).
When a TYPE_UNDEFINED is reached, gengtype will ignore it if it
happens inside a type marked with GTY((user)). Otherwise, it will
emit an error.
Finally, gengtype rejects root types marked GTY((user)) that are not
first class pointers.
2012-11-16 Diego Novillo <dnovillo@google.com>
VEC API overhaul (http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec)
* vec.c (register_overhead): Convert it into
member function of vec_prefix.
(release_overhead): Likewise.
(calculate_allocation): Likewise.
(vec_heap_free): Remove.
(vec_gc_o_reserve_1): Remove.
(vec_heap_o_reserve_1): Remove.
(vec_stack_o_reserve_1): Remove.
(vec_stack_o_reserve_exact): Remove.
(register_stack_vec): New.
(stack_vec_register_index): New.
(unregister_stack_vec): New.
(vec_assert_fail): Remove.
* vec.h: Conditionally include ggc.h. Document conditional
hackery.
Update top-level documentation.
(ALONE_VEC_CHECK_INFO): Remove.
(VEC_CHECK_INFO): Remove.
(ALONE_VEC_CHECK_DECL): Remove.
(VEC_CHECK_DECL): Remove.
(ALONE_VEC_CHECK_PASS): Remove.
(VEC_CHECK_PASS): Remove.
(VEC_ASSERT): Remove.
(vec_prefix): Add friends va_gc, va_gc_atomic, va_heap and
va_stack.
Mark fields alloc_ and num_ as protected.
(struct vec_t): Remove. Remove all function members.
(struct vl_embed): Declare.
(struct vl_ptr): Declare.
(free): Remove.
(reserve_exact): Remove.
(reserve): Remove.
(safe_splice): Remove.
(safe_push): Remove.
(safe_grow): Remove.
(safe_grow_cleared): Remove.
(safe_insert): Remove.
(DEF_VEC_I): Remove.
(DEF_VEC_ALLOC_I): Remove.
(DEF_VEC_P): Remove.
(DEF_VEC_ALLOC_P): Remove.
(DEF_VEC_O): Remove.
(DEF_VEC_ALLOC_O): Remove.
(DEF_VEC_ALLOC_P_STACK): Remove.
(DEF_VEC_ALLOC_O_STACK): Remove.
(DEF_VEC_ALLOC_I_STACK): Remove.
(DEF_VEC_A): Remove.
(DEF_VEC_ALLOC_A): Remove.
(vec_stack_p_reserve_exact_1): Remove.
(vec_stack_o_reserve): Remove.
(vec_stack_o_reserve_exact): Remove.
(VEC_length): Remove.
(VEC_empty): Remove.
(VEC_address): Remove.
(vec_address): Remove.
(VEC_last): Remove.
(VEC_index): Remove.
(VEC_iterate): Remove.
(VEC_embedded_size): Remove.
(VEC_embedded_init): Remove.
(VEC_free): Remove.
(VEC_copy): Remove.
(VEC_space): Remove.
(VEC_reserve): Remove.
(VEC_reserve_exact): Remove.
(VEC_splice): Remove.
(VEC_safe_splice): Remove.
(VEC_quick_push): Remove.
(VEC_safe_push): Remove.
(VEC_pop): Remove.
(VEC_truncate): Remove.
(VEC_safe_grow): Remove.
(VEC_replace): Remove.
(VEC_quick_insert): Remove.
(VEC_safe_insert): Remove.
(VEC_ordered_remove): Remove.
(VEC_unordered_remove): Remove.
(VEC_block_remove): Remove.
(VEC_lower_bound): Remove.
(VEC_alloc): Remove.
(VEC_qsort): Remove.
(va_heap): Declare.
(va_heap::default_layout): New typedef to vl_ptr.
(va_heap::reserve): New.
(va_heap::release): New.
(va_gc): Declare.
(va_gc::default_layout): New typedef to vl_embed.
(va_gc::reserve): New.
(va_gc::release): New.
(va_gc_atomic): Declare. Inherit from va_gc.
(va_stack): Declare.
(va_stack::default_layout): New typedef to vl_ptr.
(va_stack::alloc): New.
(va_stack::reserve): New.
(va_stack::release): New.
(register_stack_vec): Declare.
(stack_vec_register_index): Declare.
(unregister_stack_vec): Declare.
(vec<T, A = va_heap, L = typename A::default_layout>): Declare
empty vec template.
(vec<T, A, vl_embed>): Partial specialization for embedded
layout.
(vec<T, A, vl_embed>::allocated): New.
(vec<T, A, vl_embed>::length): New.
(vec<T, A, vl_embed>::is_empty): New.
(vec<T, A, vl_embed>::address): New.
(vec<T, A, vl_embed>::operator[]): New.
(vec<T, A, vl_embed>::last New.
(vec<T, A, vl_embed>::space): New.
(vec<T, A, vl_embed>::iterate): New.
(vec<T, A, vl_embed>::iterate): New.
(vec<T, A, vl_embed>::copy): New.
(vec<T, A, vl_embed>::splice): New.
(vec<T, A, vl_embed>::quick_push New.
(vec<T, A, vl_embed>::pop New.
(vec<T, A, vl_embed>::truncate): New.
(vec<T, A, vl_embed>::quick_insert): New.
(vec<T, A, vl_embed>::ordered_remove): New.
(vec<T, A, vl_embed>::unordered_remove): New.
(vec<T, A, vl_embed>::block_remove): New.
(vec<T, A, vl_embed>::qsort): New.
(vec<T, A, vl_embed>::lower_bound): New.
(vec<T, A, vl_embed>::embedded_size): New.
(vec<T, A, vl_embed>::embedded_init): New.
(vec<T, A, vl_embed>::quick_grow): New.
(vec<T, A, vl_embed>::quick_grow_cleared): New.
(vec_safe_space): New.
(vec_safe_length): New.
(vec_safe_address): New.
(vec_safe_is_empty): New.
(vec_safe_reserve): New.
(vec_safe_reserve_exact): New.
(vec_alloc): New.
(vec_free): New.
(vec_safe_grow): New.
(vec_safe_grow_cleared): New.
(vec_safe_iterate): New.
(vec_safe_push): New.
(vec_safe_insert): New.
(vec_safe_truncate): New.
(vec_safe_copy): New.
(vec_safe_splice): New.
(vec<T, A, vl_ptr>): New partial specialization for the space
efficient layout.
(vec<T, A, vl_ptr>::exists): New.
(vec<T, A, vl_ptr>::is_empty): New.
(vec<T, A, vl_ptr>::length): New.
(vec<T, A, vl_ptr>::address): New.
(vec<T, A, vl_ptr>::operator[]): New.
(vec<T, A, vl_ptr>::operator!=): New.
(vec<T, A, vl_ptr>::operator==): New.
(vec<T, A, vl_ptr>::last): New.
(vec<T, A, vl_ptr>::space): New.
(vec<T, A, vl_ptr>::iterate): New.
(vec<T, A, vl_ptr>::copy): New.
(vec<T, A, vl_ptr>::reserve): New.
(vec<T, A, vl_ptr>::reserve_exact): New.
(vec<T, A, vl_ptr>::splice): New.
(vec<T, A, vl_ptr>::safe_splice): New.
(vec<T, A, vl_ptr>::quick_push): New.
(vec<T, A, vl_ptr>::safe_push): New.
(vec<T, A, vl_ptr>::pop): New.
(vec<T, A, vl_ptr>::truncate): New.
(vec<T, A, vl_ptr>::safe_grow): New.
(vec<T, A, vl_ptr>::safe_grow_cleared): New.
(vec<T, A, vl_ptr>::quick_grow): New.
(vec<T, A, vl_ptr>::quick_grow_cleared): New.
(vec<T, A, vl_ptr>::quick_insert): New.
(vec<T, A, vl_ptr>::safe_insert): New.
(vec<T, A, vl_ptr>::ordered_remove): New.
(vec<T, A, vl_ptr>::unordered_remove): New.
(vec<T, A, vl_ptr>::block_remove): New.
(vec<T, A, vl_ptr>::qsort): New.
(vec<T, A, vl_ptr>::lower_bound): New.
(vec_stack_alloc): Define.
(FOR_EACH_VEC_SAFE_ELT): Define.
* vecir.h: Remove. Update all users.
* vecprim.h: Remove. Update all users.
Move uchar to coretypes.h.
* Makefile.in (VEC_H): Add $(GGC_H).
Remove vecir.h and vecprim.h dependencies everywhere.
2012-11-16 Diego Novillo <dnovillo@google.com>
* gengtype-lex.l (VEC): Remove.
Add characters in the set [\!\>\.-].
* gengtype-parse.c (token_names): Remove "VEC".
(require_template_declaration): Remove handling of VEC_TOKEN.
(type): Likewise.
Call create_user_defined_type when parsing GTY((user)).
* gengtype-state.c (type_lineloc): handle TYPE_UNDEFINED.
(write_state_undefined_type): New.
(write_state_type): Call write_state_undefined_type for
TYPE_UNDEFINED.
(read_state_type): Call read_state_undefined_type for
TYPE_UNDEFINED.
* gengtype.c (dbgprint_count_type_at): Handle TYPE_UNDEFINED.
(create_user_defined_type): Make extern.
(type_for_name): Factor out of resolve_typedef.
(create_undefined_type): New
(resolve_typedef): Call it when we cannot find a previous
typedef and the type is not a template.
(find_structure): Accept TYPE_UNDEFINED.
(set_gc_used_type): Add argument ALLOWED_UNDEFINED_TYPES,
default to false.
Emit an error for TYPE_UNDEFINED unless LEVEL is GC_UNUSED or
ALLOWED_UNDEFINED_TYPES is set.
Set ALLOWED_UNDEFINED_TYPES to true for TYPE_USER_STRUCT.
(filter_type_name): Accept templates with more than one
argument.
(output_mangled_typename): Handle TYPE_UNDEFINED
(walk_type): Likewise.
(write_types_process_field): Likewise.
(write_func_for_structure): If CHAIN_NEXT is set, ORIG_S
should not be a user-defined type.
(write_types_local_user_process_field): Handle TYPE_ARRAY,
TYPE_NONE and TYPE_UNDEFINED.
(write_types_local_process_field): Likewise.
(contains_scalar_p): Return 0 for TYPE_USER_STRUCT.
(write_root): Reject user-defined types that are not pointers.
Handle TYPE_NONE, TYPE_UNDEFINED, TYPE_UNION, TYPE_LANG_STRUCT
and TYPE_PARAM_STRUCT.
(output_typename): Handle TYPE_NONE, TYPE_UNDEFINED, and
TYPE_ARRAY.
(dump_typekind): Handle TYPE_UNDEFINED.
* gengtype.h (enum typekind): Add TYPE_UNDEFINED.
(create_user_defined_type): Declare.
(enum gty_token): Remove VEC_TOKEN.
2012-11-16 Diego Novillo <dnovillo@google.com>
Adjust for new vec API (http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec)
* coretypes.h (uchar): Define.
* alias.c: Use new vec API in vec.h.
* asan.c: Likewise.
* attribs.c: Likewise.
* basic-block.h: Likewise.
* bb-reorder.c: Likewise.
* builtins.c: Likewise.
* calls.c: Likewise.
* cfg.c: Likewise.
* cfganal.c: Likewise.
* cfgcleanup.c: Likewise.
* cfgexpand.c: Likewise.
* cfghooks.c: Likewise.
* cfghooks.h: Likewise.
* cfgloop.c: Likewise.
* cfgloop.h: Likewise.
* cfgloopanal.c: Likewise.
* cfgloopmanip.c: Likewise.
* cfgrtl.c: Likewise.
* cgraph.c: Likewise.
* cgraph.h: Likewise.
* cgraphclones.c: Likewise.
* cgraphunit.c: Likewise.
* combine.c: Likewise.
* compare-elim.c: Likewise.
* coverage.c: Likewise.
* cprop.c: Likewise.
* data-streamer.h: Likewise.
* dbxout.c: Likewise.
* dce.c: Likewise.
* df-core.c: Likewise.
* df-problems.c: Likewise.
* df-scan.c: Likewise.
* dominance.c: Likewise.
* domwalk.c: Likewise.
* domwalk.h: Likewise.
* dse.c: Likewise.
* dwarf2cfi.c: Likewise.
* dwarf2out.c: Likewise.
* dwarf2out.h: Likewise.
* emit-rtl.c: Likewise.
* except.c: Likewise.
* except.h: Likewise.
* expr.c: Likewise.
* expr.h: Likewise.
* final.c: Likewise.
* fold-const.c: Likewise.
* function.c: Likewise.
* function.h: Likewise.
* fwprop.c: Likewise.
* gcc.c: Likewise.
* gcse.c: Likewise.
* genattr.c: Likewise.
* genattrtab.c: Likewise.
* genautomata.c: Likewise.
* genextract.c: Likewise.
* genopinit.c: Likewise
* ggc-common.c: Likewise.
* ggc.h: Likewise.
* gimple-low.c: Likewise.
* gimple-ssa-strength-reduction.c: Likewise.
* gimple-streamer-in.c: Likewise.
* gimple.c: Likewise.
* gimple.h: Likewise.
* gimplify.c: Likewise.
* graph.c: Likewise.
* graphds.c: Likewise.
* graphds.h: Likewise.
* graphite-blocking.c: Likewise.
* graphite-clast-to-gimple.c: Likewise.
* graphite-dependences.c: Likewise.
* graphite-interchange.c: Likewise.
* graphite-optimize-isl.c: Likewise.
* graphite-poly.c: Likewise.
* graphite-poly.h: Likewise.
* graphite-scop-detection.c: Likewise.
* graphite-scop-detection.h: Likewise.
* graphite-sese-to-poly.c: Likewise.
* graphite.c: Likewise.
* godump.c: Likewise.
* haifa-sched.c: Likewise.
* hw-doloop.c: Likewise.
* hw-doloop.h: Likewise.
* ifcvt.c: Likewise.
* insn-addr.h: Likewise.
* ipa-cp.c: Likewise.
* ipa-inline-analysis.c: Likewise.
* ipa-inline-transform.c: Likewise.
* ipa-inline.c: Likewise.
* ipa-inline.h: Likewise.
* ipa-prop.c: Likewise.
* ipa-prop.h: Likewise.
* ipa-pure-const.c: Likewise.
* ipa-ref-inline.h: Likewise.
* ipa-ref.c: Likewise.
* ipa-ref.h: Likewise.
* ipa-reference.c: Likewise.
* ipa-split.c: Likewise.
* ipa-utils.c: Likewise.
* ipa-utils.h: Likewise.
* ipa.c: Likewise.
* ira-build.c: Likewise.
* ira-color.c: Likewise.
* ira-emit.c: Likewise.
* ira-int.h: Likewise.
* ira.c: Likewise.
* loop-invariant.c: Likewise.
* loop-unroll.c: Likewise.
* lower-subreg.c: Likewise.
* lra-lives.c: Likewise.
* lra.c: Likewise.
* lto-cgraph.c: Likewise.
* lto-section-out.c: Likewise.
* lto-streamer-in.c: Likewise.
* lto-streamer-out.c: Likewise.
* lto-streamer.h: Likewise.
* lto-symtab.c: Likewise.
* mcf.c: Likewise.
* modulo-sched.c: Likewise.
* omp-low.c: Likewise.
* opts-common.c: Likewise.
* opts-global.c: Likewise.
* opts.c: Likewise.
* opts.h: Likewise.
* passes.c: Likewise.
* predict.c: Likewise.
* print-tree.c: Likewise.
* profile.c: Likewise.
* profile.h: Likewise.
* read-rtl.c: Likewise.
* ree.c: Likewise.
* reg-stack.c: Likewise.
* regrename.c: Likewise.
* regrename.h: Likewise.
* reload.c: Likewise.
* reload.h: Likewise.
* reload1.c: Likewise.
* rtl.h: Likewise.
* sched-deps.c: Likewise.
* sched-int.h: Likewise.
* sdbout.c: Likewise.
* sel-sched-dump.c: Likewise.
* sel-sched-ir.c: Likewise.
* sel-sched-ir.h: Likewise.
* sel-sched.c: Likewise.
* sese.c: Likewise.
* sese.h: Likewise.
* statistics.h: Likewise.
* stmt.c: Likewise.
* stor-layout.c: Likewise.
* store-motion.c: Likewise.
* tlink.c: Likewise.
* toplev.c: Likewise.
* trans-mem.c: Likewise.
* tree-browser.c: Likewise.
* tree-call-cdce.c: Likewise.
* tree-cfg.c: Likewise.
* tree-cfgcleanup.c: Likewise.
* tree-chrec.c: Likewise.
* tree-chrec.h: Likewise.
* tree-complex.c: Likewise.
* tree-data-ref.c: Likewise.
* tree-data-ref.h: Likewise.
* tree-dfa.c: Likewise.
* tree-diagnostic.c: Likewise.
* tree-dump.c: Likewise.
* tree-eh.c: Likewise.
* tree-emutls.c: Likewise.
* tree-flow.h: Likewise.
* tree-if-conv.c: Likewise.
* tree-inline.c: Likewise.
* tree-inline.h: Likewise.
* tree-into-ssa.c: Likewise.
* tree-iterator.c: Likewise.
* tree-loop-distribution.c: Likewise.
* tree-mudflap.c: Likewise.
* tree-optimize.c: Likewise.
* tree-outof-ssa.c: Likewise.
* tree-parloops.c: Likewise.
* tree-phinodes.c: Likewise.
* tree-predcom.c: Likewise.
* tree-pretty-print.c: Likewise.
* tree-scalar-evolution.c: Likewise.
* tree-sra.c: Likewise.
* tree-ssa-address.c: Likewise.
* tree-ssa-alias.c: Likewise.
* tree-ssa-ccp.c: Likewise.
* tree-ssa-coalesce.c: Likewise.
* tree-ssa-dce.c: Likewise.
* tree-ssa-dom.c: Likewise.
* tree-ssa-forwprop.c: Likewise.
* tree-ssa-live.c: Likewise.
* tree-ssa-live.h: Likewise.
* tree-ssa-loop-im.c: Likewise.
* tree-ssa-loop-ivcanon.c: Likewise.
* tree-ssa-loop-ivopts.c: Likewise.
* tree-ssa-loop-manip.c: Likewise.
* tree-ssa-loop-niter.c: Likewise.
* tree-ssa-loop-prefetch.c: Likewise.
* tree-ssa-math-opts.c: Likewise.
* tree-ssa-operands.c: Likewise.
* tree-ssa-phiopt.c: Likewise.
* tree-ssa-phiprop.c: Likewise.
* tree-ssa-pre.c: Likewise.
* tree-ssa-propagate.c: Likewise.
* tree-ssa-reassoc.c: Likewise.
* tree-ssa-sccvn.c: Likewise.
* tree-ssa-sccvn.h: Likewise.
* tree-ssa-strlen.c: Likewise.
* tree-ssa-structalias.c: Likewise.
* tree-ssa-tail-merge.c: Likewise.
* tree-ssa-threadedge.c: Likewise.
* tree-ssa-threadupdate.c: Likewise.
* tree-ssa-uncprop.c: Likewise.
* tree-ssa-uninit.c: Likewise.
* tree-ssa.c: Likewise.
* tree-ssanames.c: Likewise.
* tree-stdarg.c: Likewise.
* tree-streamer-in.c: Likewise.
* tree-streamer-out.c: Likewise.
* tree-streamer.c: Likewise.
* tree-streamer.h: Likewise.
* tree-switch-conversion.c: Likewise.
* tree-vect-data-refs.c: Likewise.
* tree-vect-generic.c: Likewise.
* tree-vect-loop-manip.c: Likewise.
* tree-vect-loop.c: Likewise.
* tree-vect-patterns.c: Likewise.
* tree-vect-slp.c: Likewise.
* tree-vect-stmts.c: Likewise.
* tree-vectorizer.c: Likewise.
* tree-vectorizer.h: Likewise.
* tree-vrp.c: Likewise.
* tree.c: Likewise.
* tree.h: Likewise.
* value-prof.c: Likewise.
* value-prof.h: Likewise.
* var-tracking.c: Likewise.
* varasm.c: Likewise.
* varpool.c: Likewise.
* vmsdbgout.c: Likewise.
* config/bfin/bfin.c: Likewise.
* config/c6x/c6x.c: Likewise.
* config/darwin.c: Likewise.
* config/i386/i386.c: Likewise.
* config/ia64/ia64.c: Likewise.
* config/mep/mep.c: Likewise.
* config/mips/mips.c: Likewise.
* config/pa/pa.c: Likewise.
* config/rs6000/rs6000-c.c: Likewise.
* config/rs6000/rs6000.c: Likewise.
* config/rx/rx.c: Likewise.
* config/spu/spu-c.c: Likewise.
* config/vms/vms.c: Likewise.
* config/vxworks.c: Likewise.
* config/epiphany/resolve-sw-modes.c: Likewise.
From-SVN: r193595
2012-11-17 21:54:30 -05:00
|
|
|
|
vec<constructor_elt, va_gc> *v;
|
2011-10-05 10:40:49 -07:00
|
|
|
|
tree constr, t, si, i_val;
|
|
|
|
|
tree vec0tmp = NULL_TREE, vec1tmp = NULL_TREE, masktmp = NULL_TREE;
|
|
|
|
|
bool two_operand_p = !operand_equal_p (vec0, vec1, 0);
|
2011-10-11 16:10:59 +00:00
|
|
|
|
location_t loc = gimple_location (gsi_stmt (*gsi));
|
2011-10-05 10:40:49 -07:00
|
|
|
|
unsigned i;
|
2011-10-03 08:13:26 -07:00
|
|
|
|
|
2012-06-15 13:06:51 +00:00
|
|
|
|
if (TREE_CODE (mask) == SSA_NAME)
|
|
|
|
|
{
|
|
|
|
|
gimple def_stmt = SSA_NAME_DEF_STMT (mask);
|
|
|
|
|
if (is_gimple_assign (def_stmt)
|
|
|
|
|
&& gimple_assign_rhs_code (def_stmt) == VECTOR_CST)
|
|
|
|
|
mask = gimple_assign_rhs1 (def_stmt);
|
|
|
|
|
}
|
|
|
|
|
|
2011-10-25 14:29:48 -07:00
|
|
|
|
if (TREE_CODE (mask) == VECTOR_CST)
|
|
|
|
|
{
|
|
|
|
|
unsigned char *sel_int = XALLOCAVEC (unsigned char, elements);
|
|
|
|
|
|
tree.h (TREE_VECTOR_CST_ELTS): Remove.
2012-03-16 Richard Guenther <rguenther@suse.de>
* tree.h (TREE_VECTOR_CST_ELTS): Remove.
(VECTOR_CST_NELTS, VECTOR_CST_ELTS, VECTOR_CST_ELT): New defines.
(struct tree_vector): Remove elements member, add variable size
elts array member.
(build_vector_stat): Declare.
(build_vector): Define in terms of build_vector_stat.
* tree.c (build_vector): Rename to ...
(build_vector_stat): ... this. Take array of trees as parameter.
(build_vector_from_ctor): Adjust.
(integer_zerop, integer_onep, integer_all_onesp, iterative_hash_expr,
initializer_zerop): Adjust.
* cfgexpand.c (expand_debug_expr): Likewise.
* expr.c (categorize_ctor_elements_1, expand_expr_real_1,
const_vector_from_tree): Likewise.
* fold-const.c (const_binop, operand_equal_p, native_encode_vector,
native_interpret_vector, fold_unary_loc, vec_cst_ctor_to_array,
fold_vec_perm, fold_binary_loc, fold_ternary_loc): Likewise.
* tree-streamer-in.c (streamer_alloc_tree): Handle TS_VECTOR.
(lto_input_ts_vector_tree_pointers): Adjust.
* tree-streamer-out.c (streamer_write_tree_header): Handle TS_VECTOR.
(write_ts_vector_tree_pointers): Adjust.
* varasm.c (const_hash_1, compare_constant, copy_constant,
output_constant): Adjust.
* gimple-fold.c (gimple_fold_stmt_to_constant_1): Adjust.
* print-tree.c (print_node): Adjust.
* tree-pretty-print.c (dump_generic_node): Adjust.
* tree-vect-generic.c (uniform_vector_p, vector_element,
lower_vec_perm): Adjust.
* tree-vect-loop.c (get_initial_def_for_reduction): Adjust.
* tree-vect-slp.c (vect_get_constant_vectors,
vect_transform_slp_perm_load): Adjust.
* tree-vect-stmts.c (vect_gen_perm_mask): Adjust.
* expmed.c (make_tree): Adjust.
* config/i386/i386.c (ix86_expand_builtin): Adjust.
* config/sparc/sparc.c (sparc_handle_vis_mul8x16): Adjust interface
and implementation.
(sparc_fold_builtin): Adjust.
c-family/
* c-pretty-print.c (pp_c_initializer_list): Adjust.
From-SVN: r185458
2012-03-16 09:47:09 +00:00
|
|
|
|
for (i = 0; i < elements; ++i)
|
|
|
|
|
sel_int[i] = (TREE_INT_CST_LOW (VECTOR_CST_ELT (mask, i))
|
|
|
|
|
& (2 * elements - 1));
|
2011-10-25 14:29:48 -07:00
|
|
|
|
|
|
|
|
|
if (can_vec_perm_p (TYPE_MODE (vect_type), false, sel_int))
|
2012-06-15 13:06:51 +00:00
|
|
|
|
{
|
|
|
|
|
gimple_assign_set_rhs3 (stmt, mask);
|
|
|
|
|
update_stmt (stmt);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2011-10-25 14:29:48 -07:00
|
|
|
|
}
|
|
|
|
|
else if (can_vec_perm_p (TYPE_MODE (vect_type), true, NULL))
|
2011-10-05 10:40:49 -07:00
|
|
|
|
return;
|
2011-10-11 16:10:59 +00:00
|
|
|
|
|
|
|
|
|
warning_at (loc, OPT_Wvector_operation_performance,
|
|
|
|
|
"vector shuffling operation will be expanded piecewise");
|
|
|
|
|
|
This patch rewrites the old VEC macro-based interface into a new one based on the template class 'vec'.
This patch rewrites the old VEC macro-based interface into a new one
based on the template class 'vec'. The user-visible changes are
described in http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec.
I have tested the patch pretty extensively:
- Regular bootstraps on x86_64, ppc, ia64, sparc and hppa.
- Bootstraps with --enable-checking=release
- Bootstraps with --enable-checking=gc,gcac
- Basic builds on all targets (using contrib/config-list.mk).
We no longer access the vectors via VEC_* macros. The pattern is
"VEC_operation (T, A, V, args)" becomes "V.operation (args)".
The only thing I could not do is create proper ctors and dtors for the
vec class. Since these vectors are stored in unions, we
have to keep them as PODs (C++03 does not allow non-PODs in unions).
This means that creation and destruction must be explicit. There is a
new method vec<type, allocation, layout>::create() and another vec<type,
allocation, layout>::destroy() to allocate the internal vector.
For vectors that must be pointers, there is a family of free functions
that implement the operations that need to tolerate NULL vectors.
These functions all start with the prefix 'vec_safe_'. See the wiki
page for details.
The gengtype change removes the special handling for VEC() that used
to exist in gengtype. Additionally, it allows gengtype to recognize
templates of more than one argument and introduces the concept of an
undefined type (useful for template arguments that may or may not be
types).
When a TYPE_UNDEFINED is reached, gengtype will ignore it if it
happens inside a type marked with GTY((user)). Otherwise, it will
emit an error.
Finally, gengtype rejects root types marked GTY((user)) that are not
first class pointers.
2012-11-16 Diego Novillo <dnovillo@google.com>
VEC API overhaul (http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec)
* vec.c (register_overhead): Convert it into
member function of vec_prefix.
(release_overhead): Likewise.
(calculate_allocation): Likewise.
(vec_heap_free): Remove.
(vec_gc_o_reserve_1): Remove.
(vec_heap_o_reserve_1): Remove.
(vec_stack_o_reserve_1): Remove.
(vec_stack_o_reserve_exact): Remove.
(register_stack_vec): New.
(stack_vec_register_index): New.
(unregister_stack_vec): New.
(vec_assert_fail): Remove.
* vec.h: Conditionally include ggc.h. Document conditional
hackery.
Update top-level documentation.
(ALONE_VEC_CHECK_INFO): Remove.
(VEC_CHECK_INFO): Remove.
(ALONE_VEC_CHECK_DECL): Remove.
(VEC_CHECK_DECL): Remove.
(ALONE_VEC_CHECK_PASS): Remove.
(VEC_CHECK_PASS): Remove.
(VEC_ASSERT): Remove.
(vec_prefix): Add friends va_gc, va_gc_atomic, va_heap and
va_stack.
Mark fields alloc_ and num_ as protected.
(struct vec_t): Remove. Remove all function members.
(struct vl_embed): Declare.
(struct vl_ptr): Declare.
(free): Remove.
(reserve_exact): Remove.
(reserve): Remove.
(safe_splice): Remove.
(safe_push): Remove.
(safe_grow): Remove.
(safe_grow_cleared): Remove.
(safe_insert): Remove.
(DEF_VEC_I): Remove.
(DEF_VEC_ALLOC_I): Remove.
(DEF_VEC_P): Remove.
(DEF_VEC_ALLOC_P): Remove.
(DEF_VEC_O): Remove.
(DEF_VEC_ALLOC_O): Remove.
(DEF_VEC_ALLOC_P_STACK): Remove.
(DEF_VEC_ALLOC_O_STACK): Remove.
(DEF_VEC_ALLOC_I_STACK): Remove.
(DEF_VEC_A): Remove.
(DEF_VEC_ALLOC_A): Remove.
(vec_stack_p_reserve_exact_1): Remove.
(vec_stack_o_reserve): Remove.
(vec_stack_o_reserve_exact): Remove.
(VEC_length): Remove.
(VEC_empty): Remove.
(VEC_address): Remove.
(vec_address): Remove.
(VEC_last): Remove.
(VEC_index): Remove.
(VEC_iterate): Remove.
(VEC_embedded_size): Remove.
(VEC_embedded_init): Remove.
(VEC_free): Remove.
(VEC_copy): Remove.
(VEC_space): Remove.
(VEC_reserve): Remove.
(VEC_reserve_exact): Remove.
(VEC_splice): Remove.
(VEC_safe_splice): Remove.
(VEC_quick_push): Remove.
(VEC_safe_push): Remove.
(VEC_pop): Remove.
(VEC_truncate): Remove.
(VEC_safe_grow): Remove.
(VEC_replace): Remove.
(VEC_quick_insert): Remove.
(VEC_safe_insert): Remove.
(VEC_ordered_remove): Remove.
(VEC_unordered_remove): Remove.
(VEC_block_remove): Remove.
(VEC_lower_bound): Remove.
(VEC_alloc): Remove.
(VEC_qsort): Remove.
(va_heap): Declare.
(va_heap::default_layout): New typedef to vl_ptr.
(va_heap::reserve): New.
(va_heap::release): New.
(va_gc): Declare.
(va_gc::default_layout): New typedef to vl_embed.
(va_gc::reserve): New.
(va_gc::release): New.
(va_gc_atomic): Declare. Inherit from va_gc.
(va_stack): Declare.
(va_stack::default_layout): New typedef to vl_ptr.
(va_stack::alloc): New.
(va_stack::reserve): New.
(va_stack::release): New.
(register_stack_vec): Declare.
(stack_vec_register_index): Declare.
(unregister_stack_vec): Declare.
(vec<T, A = va_heap, L = typename A::default_layout>): Declare
empty vec template.
(vec<T, A, vl_embed>): Partial specialization for embedded
layout.
(vec<T, A, vl_embed>::allocated): New.
(vec<T, A, vl_embed>::length): New.
(vec<T, A, vl_embed>::is_empty): New.
(vec<T, A, vl_embed>::address): New.
(vec<T, A, vl_embed>::operator[]): New.
(vec<T, A, vl_embed>::last New.
(vec<T, A, vl_embed>::space): New.
(vec<T, A, vl_embed>::iterate): New.
(vec<T, A, vl_embed>::iterate): New.
(vec<T, A, vl_embed>::copy): New.
(vec<T, A, vl_embed>::splice): New.
(vec<T, A, vl_embed>::quick_push New.
(vec<T, A, vl_embed>::pop New.
(vec<T, A, vl_embed>::truncate): New.
(vec<T, A, vl_embed>::quick_insert): New.
(vec<T, A, vl_embed>::ordered_remove): New.
(vec<T, A, vl_embed>::unordered_remove): New.
(vec<T, A, vl_embed>::block_remove): New.
(vec<T, A, vl_embed>::qsort): New.
(vec<T, A, vl_embed>::lower_bound): New.
(vec<T, A, vl_embed>::embedded_size): New.
(vec<T, A, vl_embed>::embedded_init): New.
(vec<T, A, vl_embed>::quick_grow): New.
(vec<T, A, vl_embed>::quick_grow_cleared): New.
(vec_safe_space): New.
(vec_safe_length): New.
(vec_safe_address): New.
(vec_safe_is_empty): New.
(vec_safe_reserve): New.
(vec_safe_reserve_exact): New.
(vec_alloc): New.
(vec_free): New.
(vec_safe_grow): New.
(vec_safe_grow_cleared): New.
(vec_safe_iterate): New.
(vec_safe_push): New.
(vec_safe_insert): New.
(vec_safe_truncate): New.
(vec_safe_copy): New.
(vec_safe_splice): New.
(vec<T, A, vl_ptr>): New partial specialization for the space
efficient layout.
(vec<T, A, vl_ptr>::exists): New.
(vec<T, A, vl_ptr>::is_empty): New.
(vec<T, A, vl_ptr>::length): New.
(vec<T, A, vl_ptr>::address): New.
(vec<T, A, vl_ptr>::operator[]): New.
(vec<T, A, vl_ptr>::operator!=): New.
(vec<T, A, vl_ptr>::operator==): New.
(vec<T, A, vl_ptr>::last): New.
(vec<T, A, vl_ptr>::space): New.
(vec<T, A, vl_ptr>::iterate): New.
(vec<T, A, vl_ptr>::copy): New.
(vec<T, A, vl_ptr>::reserve): New.
(vec<T, A, vl_ptr>::reserve_exact): New.
(vec<T, A, vl_ptr>::splice): New.
(vec<T, A, vl_ptr>::safe_splice): New.
(vec<T, A, vl_ptr>::quick_push): New.
(vec<T, A, vl_ptr>::safe_push): New.
(vec<T, A, vl_ptr>::pop): New.
(vec<T, A, vl_ptr>::truncate): New.
(vec<T, A, vl_ptr>::safe_grow): New.
(vec<T, A, vl_ptr>::safe_grow_cleared): New.
(vec<T, A, vl_ptr>::quick_grow): New.
(vec<T, A, vl_ptr>::quick_grow_cleared): New.
(vec<T, A, vl_ptr>::quick_insert): New.
(vec<T, A, vl_ptr>::safe_insert): New.
(vec<T, A, vl_ptr>::ordered_remove): New.
(vec<T, A, vl_ptr>::unordered_remove): New.
(vec<T, A, vl_ptr>::block_remove): New.
(vec<T, A, vl_ptr>::qsort): New.
(vec<T, A, vl_ptr>::lower_bound): New.
(vec_stack_alloc): Define.
(FOR_EACH_VEC_SAFE_ELT): Define.
* vecir.h: Remove. Update all users.
* vecprim.h: Remove. Update all users.
Move uchar to coretypes.h.
* Makefile.in (VEC_H): Add $(GGC_H).
Remove vecir.h and vecprim.h dependencies everywhere.
2012-11-16 Diego Novillo <dnovillo@google.com>
* gengtype-lex.l (VEC): Remove.
Add characters in the set [\!\>\.-].
* gengtype-parse.c (token_names): Remove "VEC".
(require_template_declaration): Remove handling of VEC_TOKEN.
(type): Likewise.
Call create_user_defined_type when parsing GTY((user)).
* gengtype-state.c (type_lineloc): handle TYPE_UNDEFINED.
(write_state_undefined_type): New.
(write_state_type): Call write_state_undefined_type for
TYPE_UNDEFINED.
(read_state_type): Call read_state_undefined_type for
TYPE_UNDEFINED.
* gengtype.c (dbgprint_count_type_at): Handle TYPE_UNDEFINED.
(create_user_defined_type): Make extern.
(type_for_name): Factor out of resolve_typedef.
(create_undefined_type): New
(resolve_typedef): Call it when we cannot find a previous
typedef and the type is not a template.
(find_structure): Accept TYPE_UNDEFINED.
(set_gc_used_type): Add argument ALLOWED_UNDEFINED_TYPES,
default to false.
Emit an error for TYPE_UNDEFINED unless LEVEL is GC_UNUSED or
ALLOWED_UNDEFINED_TYPES is set.
Set ALLOWED_UNDEFINED_TYPES to true for TYPE_USER_STRUCT.
(filter_type_name): Accept templates with more than one
argument.
(output_mangled_typename): Handle TYPE_UNDEFINED
(walk_type): Likewise.
(write_types_process_field): Likewise.
(write_func_for_structure): If CHAIN_NEXT is set, ORIG_S
should not be a user-defined type.
(write_types_local_user_process_field): Handle TYPE_ARRAY,
TYPE_NONE and TYPE_UNDEFINED.
(write_types_local_process_field): Likewise.
(contains_scalar_p): Return 0 for TYPE_USER_STRUCT.
(write_root): Reject user-defined types that are not pointers.
Handle TYPE_NONE, TYPE_UNDEFINED, TYPE_UNION, TYPE_LANG_STRUCT
and TYPE_PARAM_STRUCT.
(output_typename): Handle TYPE_NONE, TYPE_UNDEFINED, and
TYPE_ARRAY.
(dump_typekind): Handle TYPE_UNDEFINED.
* gengtype.h (enum typekind): Add TYPE_UNDEFINED.
(create_user_defined_type): Declare.
(enum gty_token): Remove VEC_TOKEN.
2012-11-16 Diego Novillo <dnovillo@google.com>
Adjust for new vec API (http://gcc.gnu.org/wiki/cxx-conversion/cxx-vec)
* coretypes.h (uchar): Define.
* alias.c: Use new vec API in vec.h.
* asan.c: Likewise.
* attribs.c: Likewise.
* basic-block.h: Likewise.
* bb-reorder.c: Likewise.
* builtins.c: Likewise.
* calls.c: Likewise.
* cfg.c: Likewise.
* cfganal.c: Likewise.
* cfgcleanup.c: Likewise.
* cfgexpand.c: Likewise.
* cfghooks.c: Likewise.
* cfghooks.h: Likewise.
* cfgloop.c: Likewise.
* cfgloop.h: Likewise.
* cfgloopanal.c: Likewise.
* cfgloopmanip.c: Likewise.
* cfgrtl.c: Likewise.
* cgraph.c: Likewise.
* cgraph.h: Likewise.
* cgraphclones.c: Likewise.
* cgraphunit.c: Likewise.
* combine.c: Likewise.
* compare-elim.c: Likewise.
* coverage.c: Likewise.
* cprop.c: Likewise.
* data-streamer.h: Likewise.
* dbxout.c: Likewise.
* dce.c: Likewise.
* df-core.c: Likewise.
* df-problems.c: Likewise.
* df-scan.c: Likewise.
* dominance.c: Likewise.
* domwalk.c: Likewise.
* domwalk.h: Likewise.
* dse.c: Likewise.
* dwarf2cfi.c: Likewise.
* dwarf2out.c: Likewise.
* dwarf2out.h: Likewise.
* emit-rtl.c: Likewise.
* except.c: Likewise.
* except.h: Likewise.
* expr.c: Likewise.
* expr.h: Likewise.
* final.c: Likewise.
* fold-const.c: Likewise.
* function.c: Likewise.
* function.h: Likewise.
* fwprop.c: Likewise.
* gcc.c: Likewise.
* gcse.c: Likewise.
* genattr.c: Likewise.
* genattrtab.c: Likewise.
* genautomata.c: Likewise.
* genextract.c: Likewise.
* genopinit.c: Likewise
* ggc-common.c: Likewise.
* ggc.h: Likewise.
* gimple-low.c: Likewise.
* gimple-ssa-strength-reduction.c: Likewise.
* gimple-streamer-in.c: Likewise.
* gimple.c: Likewise.
* gimple.h: Likewise.
* gimplify.c: Likewise.
* graph.c: Likewise.
* graphds.c: Likewise.
* graphds.h: Likewise.
* graphite-blocking.c: Likewise.
* graphite-clast-to-gimple.c: Likewise.
* graphite-dependences.c: Likewise.
* graphite-interchange.c: Likewise.
* graphite-optimize-isl.c: Likewise.
* graphite-poly.c: Likewise.
* graphite-poly.h: Likewise.
* graphite-scop-detection.c: Likewise.
* graphite-scop-detection.h: Likewise.
* graphite-sese-to-poly.c: Likewise.
* graphite.c: Likewise.
* godump.c: Likewise.
* haifa-sched.c: Likewise.
* hw-doloop.c: Likewise.
* hw-doloop.h: Likewise.
* ifcvt.c: Likewise.
* insn-addr.h: Likewise.
* ipa-cp.c: Likewise.
* ipa-inline-analysis.c: Likewise.
* ipa-inline-transform.c: Likewise.
* ipa-inline.c: Likewise.
* ipa-inline.h: Likewise.
* ipa-prop.c: Likewise.
* ipa-prop.h: Likewise.
* ipa-pure-const.c: Likewise.
* ipa-ref-inline.h: Likewise.
* ipa-ref.c: Likewise.
* ipa-ref.h: Likewise.
* ipa-reference.c: Likewise.
* ipa-split.c: Likewise.
* ipa-utils.c: Likewise.
* ipa-utils.h: Likewise.
* ipa.c: Likewise.
* ira-build.c: Likewise.
* ira-color.c: Likewise.
* ira-emit.c: Likewise.
* ira-int.h: Likewise.
* ira.c: Likewise.
* loop-invariant.c: Likewise.
* loop-unroll.c: Likewise.
* lower-subreg.c: Likewise.
* lra-lives.c: Likewise.
* lra.c: Likewise.
* lto-cgraph.c: Likewise.
* lto-section-out.c: Likewise.
* lto-streamer-in.c: Likewise.
* lto-streamer-out.c: Likewise.
* lto-streamer.h: Likewise.
* lto-symtab.c: Likewise.
* mcf.c: Likewise.
* modulo-sched.c: Likewise.
* omp-low.c: Likewise.
* opts-common.c: Likewise.
* opts-global.c: Likewise.
* opts.c: Likewise.
* opts.h: Likewise.
* passes.c: Likewise.
* predict.c: Likewise.
* print-tree.c: Likewise.
* profile.c: Likewise.
* profile.h: Likewise.
* read-rtl.c: Likewise.
* ree.c: Likewise.
* reg-stack.c: Likewise.
* regrename.c: Likewise.
* regrename.h: Likewise.
* reload.c: Likewise.
* reload.h: Likewise.
* reload1.c: Likewise.
* rtl.h: Likewise.
* sched-deps.c: Likewise.
* sched-int.h: Likewise.
* sdbout.c: Likewise.
* sel-sched-dump.c: Likewise.
* sel-sched-ir.c: Likewise.
* sel-sched-ir.h: Likewise.
* sel-sched.c: Likewise.
* sese.c: Likewise.
* sese.h: Likewise.
* statistics.h: Likewise.
* stmt.c: Likewise.
* stor-layout.c: Likewise.
* store-motion.c: Likewise.
* tlink.c: Likewise.
* toplev.c: Likewise.
* trans-mem.c: Likewise.
* tree-browser.c: Likewise.
* tree-call-cdce.c: Likewise.
* tree-cfg.c: Likewise.
* tree-cfgcleanup.c: Likewise.
* tree-chrec.c: Likewise.
* tree-chrec.h: Likewise.
* tree-complex.c: Likewise.
* tree-data-ref.c: Likewise.
* tree-data-ref.h: Likewise.
* tree-dfa.c: Likewise.
* tree-diagnostic.c: Likewise.
* tree-dump.c: Likewise.
* tree-eh.c: Likewise.
* tree-emutls.c: Likewise.
* tree-flow.h: Likewise.
* tree-if-conv.c: Likewise.
* tree-inline.c: Likewise.
* tree-inline.h: Likewise.
* tree-into-ssa.c: Likewise.
* tree-iterator.c: Likewise.
* tree-loop-distribution.c: Likewise.
* tree-mudflap.c: Likewise.
* tree-optimize.c: Likewise.
* tree-outof-ssa.c: Likewise.
* tree-parloops.c: Likewise.
* tree-phinodes.c: Likewise.
* tree-predcom.c: Likewise.
* tree-pretty-print.c: Likewise.
* tree-scalar-evolution.c: Likewise.
* tree-sra.c: Likewise.
* tree-ssa-address.c: Likewise.
* tree-ssa-alias.c: Likewise.
* tree-ssa-ccp.c: Likewise.
* tree-ssa-coalesce.c: Likewise.
* tree-ssa-dce.c: Likewise.
* tree-ssa-dom.c: Likewise.
* tree-ssa-forwprop.c: Likewise.
* tree-ssa-live.c: Likewise.
* tree-ssa-live.h: Likewise.
* tree-ssa-loop-im.c: Likewise.
* tree-ssa-loop-ivcanon.c: Likewise.
* tree-ssa-loop-ivopts.c: Likewise.
* tree-ssa-loop-manip.c: Likewise.
* tree-ssa-loop-niter.c: Likewise.
* tree-ssa-loop-prefetch.c: Likewise.
* tree-ssa-math-opts.c: Likewise.
* tree-ssa-operands.c: Likewise.
* tree-ssa-phiopt.c: Likewise.
* tree-ssa-phiprop.c: Likewise.
* tree-ssa-pre.c: Likewise.
* tree-ssa-propagate.c: Likewise.
* tree-ssa-reassoc.c: Likewise.
* tree-ssa-sccvn.c: Likewise.
* tree-ssa-sccvn.h: Likewise.
* tree-ssa-strlen.c: Likewise.
* tree-ssa-structalias.c: Likewise.
* tree-ssa-tail-merge.c: Likewise.
* tree-ssa-threadedge.c: Likewise.
* tree-ssa-threadupdate.c: Likewise.
* tree-ssa-uncprop.c: Likewise.
* tree-ssa-uninit.c: Likewise.
* tree-ssa.c: Likewise.
* tree-ssanames.c: Likewise.
* tree-stdarg.c: Likewise.
* tree-streamer-in.c: Likewise.
* tree-streamer-out.c: Likewise.
* tree-streamer.c: Likewise.
* tree-streamer.h: Likewise.
* tree-switch-conversion.c: Likewise.
* tree-vect-data-refs.c: Likewise.
* tree-vect-generic.c: Likewise.
* tree-vect-loop-manip.c: Likewise.
* tree-vect-loop.c: Likewise.
* tree-vect-patterns.c: Likewise.
* tree-vect-slp.c: Likewise.
* tree-vect-stmts.c: Likewise.
* tree-vectorizer.c: Likewise.
* tree-vectorizer.h: Likewise.
* tree-vrp.c: Likewise.
* tree.c: Likewise.
* tree.h: Likewise.
* value-prof.c: Likewise.
* value-prof.h: Likewise.
* var-tracking.c: Likewise.
* varasm.c: Likewise.
* varpool.c: Likewise.
* vmsdbgout.c: Likewise.
* config/bfin/bfin.c: Likewise.
* config/c6x/c6x.c: Likewise.
* config/darwin.c: Likewise.
* config/i386/i386.c: Likewise.
* config/ia64/ia64.c: Likewise.
* config/mep/mep.c: Likewise.
* config/mips/mips.c: Likewise.
* config/pa/pa.c: Likewise.
* config/rs6000/rs6000-c.c: Likewise.
* config/rs6000/rs6000.c: Likewise.
* config/rx/rx.c: Likewise.
* config/spu/spu-c.c: Likewise.
* config/vms/vms.c: Likewise.
* config/vxworks.c: Likewise.
* config/epiphany/resolve-sw-modes.c: Likewise.
From-SVN: r193595
2012-11-17 21:54:30 -05:00
|
|
|
|
vec_alloc (v, elements);
|
2011-10-05 10:40:49 -07:00
|
|
|
|
for (i = 0; i < elements; i++)
|
2011-10-03 08:13:26 -07:00
|
|
|
|
{
|
2011-10-05 10:40:49 -07:00
|
|
|
|
si = size_int (i);
|
|
|
|
|
i_val = vector_element (gsi, mask, si, &masktmp);
|
2011-10-03 08:13:26 -07:00
|
|
|
|
|
2011-10-05 10:40:49 -07:00
|
|
|
|
if (TREE_CODE (i_val) == INTEGER_CST)
|
2011-10-03 08:13:26 -07:00
|
|
|
|
{
|
2011-10-05 10:40:49 -07:00
|
|
|
|
unsigned HOST_WIDE_INT index;
|
2011-10-03 08:13:26 -07:00
|
|
|
|
|
2011-10-05 10:40:49 -07:00
|
|
|
|
index = TREE_INT_CST_LOW (i_val);
|
|
|
|
|
if (!host_integerp (i_val, 1) || index >= elements)
|
|
|
|
|
i_val = build_int_cst (mask_elt_type, index & (elements - 1));
|
2011-10-03 08:13:26 -07:00
|
|
|
|
|
2011-10-05 10:40:49 -07:00
|
|
|
|
if (two_operand_p && (index & elements) != 0)
|
|
|
|
|
t = vector_element (gsi, vec1, i_val, &vec1tmp);
|
|
|
|
|
else
|
|
|
|
|
t = vector_element (gsi, vec0, i_val, &vec0tmp);
|
2011-10-03 08:13:26 -07:00
|
|
|
|
|
2011-10-05 10:40:49 -07:00
|
|
|
|
t = force_gimple_operand_gsi (gsi, t, true, NULL_TREE,
|
|
|
|
|
true, GSI_SAME_STMT);
|
2011-10-03 08:13:26 -07:00
|
|
|
|
}
|
2011-10-05 10:40:49 -07:00
|
|
|
|
else
|
2011-10-03 08:13:26 -07:00
|
|
|
|
{
|
2011-10-05 10:40:49 -07:00
|
|
|
|
tree cond = NULL_TREE, v0_val;
|
|
|
|
|
|
|
|
|
|
if (two_operand_p)
|
|
|
|
|
{
|
|
|
|
|
cond = fold_build2 (BIT_AND_EXPR, mask_elt_type, i_val,
|
|
|
|
|
build_int_cst (mask_elt_type, elements));
|
|
|
|
|
cond = force_gimple_operand_gsi (gsi, cond, true, NULL_TREE,
|
|
|
|
|
true, GSI_SAME_STMT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
i_val = fold_build2 (BIT_AND_EXPR, mask_elt_type, i_val,
|
|
|
|
|
build_int_cst (mask_elt_type, elements - 1));
|
|
|
|
|
i_val = force_gimple_operand_gsi (gsi, i_val, true, NULL_TREE,
|
|
|
|
|
true, GSI_SAME_STMT);
|
|
|
|
|
|
|
|
|
|
v0_val = vector_element (gsi, vec0, i_val, &vec0tmp);
|
|
|
|
|
v0_val = force_gimple_operand_gsi (gsi, v0_val, true, NULL_TREE,
|
|
|
|
|
true, GSI_SAME_STMT);
|
|
|
|
|
|
|
|
|
|
if (two_operand_p)
|
|
|
|
|
{
|
|
|
|
|
tree v1_val;
|
|
|
|
|
|
|
|
|
|
v1_val = vector_element (gsi, vec1, i_val, &vec1tmp);
|
|
|
|
|
v1_val = force_gimple_operand_gsi (gsi, v1_val, true, NULL_TREE,
|
|
|
|
|
true, GSI_SAME_STMT);
|
|
|
|
|
|
|
|
|
|
cond = fold_build2 (EQ_EXPR, boolean_type_node,
|
|
|
|
|
cond, build_zero_cst (mask_elt_type));
|
|
|
|
|
cond = fold_build3 (COND_EXPR, vect_elt_type,
|
|
|
|
|
cond, v0_val, v1_val);
|
|
|
|
|
t = force_gimple_operand_gsi (gsi, cond, true, NULL_TREE,
|
|
|
|
|
true, GSI_SAME_STMT);
|
2011-10-03 08:13:26 -07:00
|
|
|
|
}
|
2011-10-05 10:40:49 -07:00
|
|
|
|
else
|
|
|
|
|
t = v0_val;
|
2011-10-03 08:13:26 -07:00
|
|
|
|
}
|
2011-10-05 10:40:49 -07:00
|
|
|
|
|
2012-09-28 14:18:57 +02:00
|
|
|
|
CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, t);
|
2011-10-03 08:13:26 -07:00
|
|
|
|
}
|
|
|
|
|
|
2011-10-05 10:40:49 -07:00
|
|
|
|
constr = build_constructor (vect_type, v);
|
2011-10-03 08:13:26 -07:00
|
|
|
|
gimple_assign_set_rhs_from_tree (gsi, constr);
|
2011-10-05 10:40:49 -07:00
|
|
|
|
update_stmt (gsi_stmt (*gsi));
|
2011-10-03 08:13:26 -07:00
|
|
|
|
}
|
|
|
|
|
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
/* Process one statement. If we identify a vector operation, expand it. */
|
|
|
|
|
|
|
|
|
|
static void
|
2008-07-28 14:33:56 +00:00
|
|
|
|
expand_vector_operations_1 (gimple_stmt_iterator *gsi)
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
{
|
2008-07-28 14:33:56 +00:00
|
|
|
|
gimple stmt = gsi_stmt (*gsi);
|
|
|
|
|
tree lhs, rhs1, rhs2 = NULL, type, compute_type;
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
enum tree_code code;
|
|
|
|
|
enum machine_mode compute_mode;
|
2012-07-24 10:28:41 -07:00
|
|
|
|
optab op = unknown_optab;
|
2008-07-28 14:33:56 +00:00
|
|
|
|
enum gimple_rhs_class rhs_class;
|
|
|
|
|
tree new_rhs;
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
|
2008-07-28 14:33:56 +00:00
|
|
|
|
if (gimple_code (stmt) != GIMPLE_ASSIGN)
|
|
|
|
|
return;
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
|
2008-07-28 14:33:56 +00:00
|
|
|
|
code = gimple_assign_rhs_code (stmt);
|
|
|
|
|
rhs_class = get_gimple_rhs_class (code);
|
2011-09-29 11:29:03 +00:00
|
|
|
|
lhs = gimple_assign_lhs (stmt);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
|
Rename vshuffle/vec_shuffle to vec_perm.
* doc/extend.texi (__builtin_shuffle): Improve the description to
include the modulus of the selector. Mention OpenCL.
* doc/md.texi (vec_perm, vec_perm_const): Document named patterns.
* tree.def (VEC_PERM_EXPR): Rename from VEC_SHUFFLE_EXPR.
* genopinit.c (optabs): Rename vshuffle to vec_perm.
* c-typeck.c (c_build_vec_perm_expr): Rename from
c_build_vec_shuffle_expr. Update for name changes.
* optabs.c (expand_vec_perm_expr_p): Rename from
expand_vec_shuffle_expr_p.
(expand_vec_perm_expr): Rename from expand_vec_shuffle_expr.
* optabs.h (OTI_vec_perm): Rename from DOI_vshuffle.
(vec_perm_optab): Rename from vshuffle_optab.
* expr.c, gimple-pretty-print.c, gimple.c, gimplify.c,
c-tree.h, c-parser.c, tree-cfg.c, tree-inline.c, tree-pretty-print.c,
tree-ssa-operands.c, tree-vect-generic.c: Update for name changes.
* config/i386/i386.c (ix86_expand_vec_perm): Rename from
ix86_expand_vshuffle.
* config/i386/i386-protos.h: Update.
* config/i386/sse.md (VEC_PERM_AVX2): Rename from VSHUFFLE_AVX2.
(vec_perm<VEC_PERM_AVX2>): Rename from vshuffle<VSHUFFLE_AVX2>.
From-SVN: r179701
2011-10-07 15:41:48 -07:00
|
|
|
|
if (code == VEC_PERM_EXPR)
|
2011-10-03 08:13:26 -07:00
|
|
|
|
{
|
Rename vshuffle/vec_shuffle to vec_perm.
* doc/extend.texi (__builtin_shuffle): Improve the description to
include the modulus of the selector. Mention OpenCL.
* doc/md.texi (vec_perm, vec_perm_const): Document named patterns.
* tree.def (VEC_PERM_EXPR): Rename from VEC_SHUFFLE_EXPR.
* genopinit.c (optabs): Rename vshuffle to vec_perm.
* c-typeck.c (c_build_vec_perm_expr): Rename from
c_build_vec_shuffle_expr. Update for name changes.
* optabs.c (expand_vec_perm_expr_p): Rename from
expand_vec_shuffle_expr_p.
(expand_vec_perm_expr): Rename from expand_vec_shuffle_expr.
* optabs.h (OTI_vec_perm): Rename from DOI_vshuffle.
(vec_perm_optab): Rename from vshuffle_optab.
* expr.c, gimple-pretty-print.c, gimple.c, gimplify.c,
c-tree.h, c-parser.c, tree-cfg.c, tree-inline.c, tree-pretty-print.c,
tree-ssa-operands.c, tree-vect-generic.c: Update for name changes.
* config/i386/i386.c (ix86_expand_vec_perm): Rename from
ix86_expand_vshuffle.
* config/i386/i386-protos.h: Update.
* config/i386/sse.md (VEC_PERM_AVX2): Rename from VSHUFFLE_AVX2.
(vec_perm<VEC_PERM_AVX2>): Rename from vshuffle<VSHUFFLE_AVX2>.
From-SVN: r179701
2011-10-07 15:41:48 -07:00
|
|
|
|
lower_vec_perm (gsi);
|
2011-10-05 10:40:49 -07:00
|
|
|
|
return;
|
2011-10-03 08:13:26 -07:00
|
|
|
|
}
|
|
|
|
|
|
2012-11-02 00:39:44 +01:00
|
|
|
|
if (code == VEC_COND_EXPR)
|
|
|
|
|
{
|
|
|
|
|
expand_vector_condition (gsi);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2008-07-28 14:33:56 +00:00
|
|
|
|
if (rhs_class != GIMPLE_UNARY_RHS && rhs_class != GIMPLE_BINARY_RHS)
|
|
|
|
|
return;
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
|
2008-07-28 14:33:56 +00:00
|
|
|
|
rhs1 = gimple_assign_rhs1 (stmt);
|
|
|
|
|
type = gimple_expr_type (stmt);
|
|
|
|
|
if (rhs_class == GIMPLE_BINARY_RHS)
|
|
|
|
|
rhs2 = gimple_assign_rhs2 (stmt);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
|
|
|
|
|
if (TREE_CODE (type) != VECTOR_TYPE)
|
|
|
|
|
return;
|
|
|
|
|
|
2009-11-25 10:55:54 +00:00
|
|
|
|
if (code == NOP_EXPR
|
2007-02-11 11:46:07 +00:00
|
|
|
|
|| code == FLOAT_EXPR
|
|
|
|
|
|| code == FIX_TRUNC_EXPR
|
|
|
|
|
|| code == VIEW_CONVERT_EXPR)
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
return;
|
2009-11-25 10:55:54 +00:00
|
|
|
|
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
gcc_assert (code != CONVERT_EXPR);
|
2007-06-06 14:12:32 +02:00
|
|
|
|
|
|
|
|
|
/* The signedness is determined from input argument. */
|
|
|
|
|
if (code == VEC_UNPACK_FLOAT_HI_EXPR
|
|
|
|
|
|| code == VEC_UNPACK_FLOAT_LO_EXPR)
|
2008-07-28 14:33:56 +00:00
|
|
|
|
type = TREE_TYPE (rhs1);
|
2007-06-06 14:12:32 +02:00
|
|
|
|
|
2012-07-10 01:23:39 -07:00
|
|
|
|
/* For widening/narrowing vector operations, the relevant type is of the
|
|
|
|
|
arguments, not the widened result. VEC_UNPACK_FLOAT_*_EXPR is
|
|
|
|
|
calculated in the same way above. */
|
|
|
|
|
if (code == WIDEN_SUM_EXPR
|
|
|
|
|
|| code == VEC_WIDEN_MULT_HI_EXPR
|
|
|
|
|
|| code == VEC_WIDEN_MULT_LO_EXPR
|
|
|
|
|
|| code == VEC_WIDEN_MULT_EVEN_EXPR
|
|
|
|
|
|| code == VEC_WIDEN_MULT_ODD_EXPR
|
|
|
|
|
|| code == VEC_UNPACK_HI_EXPR
|
|
|
|
|
|| code == VEC_UNPACK_LO_EXPR
|
|
|
|
|
|| code == VEC_PACK_TRUNC_EXPR
|
|
|
|
|
|| code == VEC_PACK_SAT_EXPR
|
|
|
|
|
|| code == VEC_PACK_FIX_TRUNC_EXPR
|
|
|
|
|
|| code == VEC_WIDEN_LSHIFT_HI_EXPR
|
|
|
|
|
|| code == VEC_WIDEN_LSHIFT_LO_EXPR)
|
|
|
|
|
type = TREE_TYPE (rhs1);
|
|
|
|
|
|
2008-05-14 20:07:53 +00:00
|
|
|
|
/* Choose between vector shift/rotate by vector and vector shift/rotate by
|
|
|
|
|
scalar */
|
2009-11-25 10:55:54 +00:00
|
|
|
|
if (code == LSHIFT_EXPR
|
|
|
|
|
|| code == RSHIFT_EXPR
|
2008-07-28 14:33:56 +00:00
|
|
|
|
|| code == LROTATE_EXPR
|
2008-05-14 20:07:53 +00:00
|
|
|
|
|| code == RROTATE_EXPR)
|
|
|
|
|
{
|
2011-12-20 16:41:24 -08:00
|
|
|
|
optab opv;
|
|
|
|
|
|
2011-10-13 20:25:58 -07:00
|
|
|
|
/* Check whether we have vector <op> {x,x,x,x} where x
|
|
|
|
|
could be a scalar variable or a constant. Transform
|
|
|
|
|
vector <op> {x,x,x,x} ==> vector <op> scalar. */
|
2011-12-20 16:41:24 -08:00
|
|
|
|
if (VECTOR_INTEGER_TYPE_P (TREE_TYPE (rhs2)))
|
2010-11-04 10:54:33 +00:00
|
|
|
|
{
|
|
|
|
|
tree first;
|
|
|
|
|
gimple def_stmt;
|
|
|
|
|
|
2011-10-13 20:25:58 -07:00
|
|
|
|
if ((TREE_CODE (rhs2) == VECTOR_CST
|
|
|
|
|
&& (first = uniform_vector_p (rhs2)) != NULL_TREE)
|
|
|
|
|
|| (TREE_CODE (rhs2) == SSA_NAME
|
|
|
|
|
&& (def_stmt = SSA_NAME_DEF_STMT (rhs2))
|
|
|
|
|
&& gimple_assign_single_p (def_stmt)
|
|
|
|
|
&& (first = uniform_vector_p
|
|
|
|
|
(gimple_assign_rhs1 (def_stmt))) != NULL_TREE))
|
2010-11-04 10:54:33 +00:00
|
|
|
|
{
|
|
|
|
|
gimple_assign_set_rhs2 (stmt, first);
|
|
|
|
|
update_stmt (stmt);
|
|
|
|
|
rhs2 = first;
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-10-03 08:13:26 -07:00
|
|
|
|
|
2011-12-20 16:41:24 -08:00
|
|
|
|
opv = optab_for_tree_code (code, type, optab_vector);
|
|
|
|
|
if (VECTOR_INTEGER_TYPE_P (TREE_TYPE (rhs2)))
|
|
|
|
|
op = opv;
|
2011-10-13 20:25:58 -07:00
|
|
|
|
else
|
2011-01-03 13:25:25 +00:00
|
|
|
|
{
|
2011-10-13 20:25:58 -07:00
|
|
|
|
op = optab_for_tree_code (code, type, optab_scalar);
|
2011-01-03 13:25:25 +00:00
|
|
|
|
|
2011-10-13 20:25:58 -07:00
|
|
|
|
/* The rtl expander will expand vector/scalar as vector/vector
|
|
|
|
|
if necessary. Don't bother converting the stmt here. */
|
2011-12-20 16:41:24 -08:00
|
|
|
|
if (optab_handler (op, TYPE_MODE (type)) == CODE_FOR_nothing
|
|
|
|
|
&& optab_handler (opv, TYPE_MODE (type)) != CODE_FOR_nothing)
|
|
|
|
|
return;
|
2011-01-03 13:25:25 +00:00
|
|
|
|
}
|
2008-05-14 20:07:53 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
op = optab_for_tree_code (code, type, optab_default);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
|
|
|
|
|
/* Optabs will try converting a negation into a subtraction, so
|
|
|
|
|
look for it as well. TODO: negation of floating-point vectors
|
|
|
|
|
might be turned into an exclusive OR toggling the sign bit. */
|
2012-07-24 10:28:41 -07:00
|
|
|
|
if (op == unknown_optab
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
&& code == NEGATE_EXPR
|
|
|
|
|
&& INTEGRAL_TYPE_P (TREE_TYPE (type)))
|
2008-05-14 20:07:53 +00:00
|
|
|
|
op = optab_for_tree_code (MINUS_EXPR, type, optab_default);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
|
|
|
|
|
/* For very wide vectors, try using a smaller vector mode. */
|
|
|
|
|
compute_type = type;
|
2011-12-20 16:41:24 -08:00
|
|
|
|
if (!VECTOR_MODE_P (TYPE_MODE (type)) && op)
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
{
|
|
|
|
|
tree vector_compute_type
|
2012-03-14 14:55:11 +00:00
|
|
|
|
= type_for_widest_vector_mode (TREE_TYPE (type), op);
|
2009-06-28 20:33:54 +02:00
|
|
|
|
if (vector_compute_type != NULL_TREE
|
|
|
|
|
&& (TYPE_VECTOR_SUBPARTS (vector_compute_type)
|
2011-12-20 16:41:24 -08:00
|
|
|
|
< TYPE_VECTOR_SUBPARTS (compute_type))
|
|
|
|
|
&& (optab_handler (op, TYPE_MODE (vector_compute_type))
|
|
|
|
|
!= CODE_FOR_nothing))
|
2009-06-28 20:33:54 +02:00
|
|
|
|
compute_type = vector_compute_type;
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* If we are breaking a BLKmode vector into smaller pieces,
|
|
|
|
|
type_for_widest_vector_mode has already looked into the optab,
|
|
|
|
|
so skip these checks. */
|
|
|
|
|
if (compute_type == type)
|
|
|
|
|
{
|
|
|
|
|
compute_mode = TYPE_MODE (compute_type);
|
2012-07-10 01:25:20 -07:00
|
|
|
|
if (VECTOR_MODE_P (compute_mode))
|
|
|
|
|
{
|
|
|
|
|
if (op && optab_handler (op, compute_mode) != CODE_FOR_nothing)
|
|
|
|
|
return;
|
|
|
|
|
if (code == MULT_HIGHPART_EXPR
|
|
|
|
|
&& can_mult_highpart_p (compute_mode,
|
|
|
|
|
TYPE_UNSIGNED (compute_type)))
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
/* There is no operation in hardware, so fall back to scalars. */
|
|
|
|
|
compute_type = TREE_TYPE (type);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
}
|
|
|
|
|
|
genopinit.c (vec_shl_optab, [...]): Initialize new optabs.
* genopinit.c (vec_shl_optab, vec_shr_optab): Initialize new optabs.
(reduc_plus_optab): Removed. Replcaed with...
(reduc_splus_optab, reduc_uplus_optab): Initialize new optabs.
* optabs.c (optab_for_tree_code): Return reduc_splus_optab or
reduc_uplus_optab instead of reduc_plus_optab.
(expand_vec_shift_expr): New function.
(init_optabs): Initialize new optabs. Remove initialization of
reduc_plus_optab.
(optab_for_tree_code): Return vec_shl_optab/vec_shr_optab
for VEC_LSHIFT_EXPR/VEC_RSHIFT_EXPR.
* optabs.h (OTI_reduc_plus): Removed. Replaced with...
(OTI_reduc_splus, OTI_reduc_uplus): New.
(reduc_plus_optab): Removed. Replcaed with...
(reduc_splus_optab, reduc_uplus_optab): New optabs.
(vec_shl_optab, vec_shr_optab): New optabs.
(expand_vec_shift_expr): New function declaration.
* tree.def (VEC_LSHIFT_EXPR, VEC_RSHIFT_EXPR): New tree-codes.
* tree-inline.c (estimate_num_insns_1): Handle new tree-codes.
* expr.c (expand_expr_real_1): Handle new tree-codes.
* tree-pretty-print.c (dump_generic_node, op_symbol, op_prio): Likewise.
* tree-vect-generic.c (expand_vector_operations_1): Add assert.
* tree-vect-transform.c (vect_create_epilog_for_reduction): Add two
alternatives for generating reduction epilog code.
(vectorizable_reduction): Don't fail of direct reduction support is
not available.
(vectorizable_target_reduction_pattern): Likewise.
* config/rs6000/altivec.md (reduc_smax_v4si, reduc_smax_v4sf,
reduc_umax_v4si, reduc_smin_v4si, reduc_smin_v4sf, reduc_umin_v4si,
reduc_plus_v4si, reduc_plus_v4sf): Removed.
(vec_shl_<mode>, vec_shr_<mode>, altivec_vsumsws_nomode,
reduc_splus_<mode>, reduc_uplus_v16qi): New.
From-SVN: r101231
2005-06-21 09:02:00 +00:00
|
|
|
|
gcc_assert (code != VEC_LSHIFT_EXPR && code != VEC_RSHIFT_EXPR);
|
2008-07-28 14:33:56 +00:00
|
|
|
|
new_rhs = expand_vector_operation (gsi, type, compute_type, stmt, code);
|
2011-09-29 11:29:03 +00:00
|
|
|
|
|
|
|
|
|
/* Leave expression untouched for later expansion. */
|
|
|
|
|
if (new_rhs == NULL_TREE)
|
|
|
|
|
return;
|
|
|
|
|
|
2008-07-28 14:33:56 +00:00
|
|
|
|
if (!useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (new_rhs)))
|
|
|
|
|
new_rhs = gimplify_build1 (gsi, VIEW_CONVERT_EXPR, TREE_TYPE (lhs),
|
|
|
|
|
new_rhs);
|
|
|
|
|
|
|
|
|
|
/* NOTE: We should avoid using gimple_assign_set_rhs_from_tree. One
|
|
|
|
|
way to do it is change expand_vector_operation and its callees to
|
|
|
|
|
return a tree_code, RHS1 and RHS2 instead of a tree. */
|
|
|
|
|
gimple_assign_set_rhs_from_tree (gsi, new_rhs);
|
2011-02-08 14:16:50 +00:00
|
|
|
|
update_stmt (gsi_stmt (*gsi));
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Use this to lower vector operations introduced by the vectorizer,
|
|
|
|
|
if it may need the bit-twiddling tricks implemented in this file. */
|
|
|
|
|
|
|
|
|
|
static bool
|
2011-10-03 08:13:26 -07:00
|
|
|
|
gate_expand_vector_operations_ssa (void)
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
{
|
2013-03-21 22:11:56 +01:00
|
|
|
|
return !(cfun->curr_properties & PROP_gimple_lvec);
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
}
|
|
|
|
|
|
2006-03-02 19:00:11 +00:00
|
|
|
|
static unsigned int
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
expand_vector_operations (void)
|
|
|
|
|
{
|
2008-07-28 14:33:56 +00:00
|
|
|
|
gimple_stmt_iterator gsi;
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
basic_block bb;
|
2011-02-08 14:16:50 +00:00
|
|
|
|
bool cfg_changed = false;
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
|
|
|
|
|
FOR_EACH_BB (bb)
|
|
|
|
|
{
|
2008-07-28 14:33:56 +00:00
|
|
|
|
for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
{
|
2008-07-28 14:33:56 +00:00
|
|
|
|
expand_vector_operations_1 (&gsi);
|
2011-02-08 14:16:50 +00:00
|
|
|
|
/* ??? If we do not cleanup EH then we will ICE in
|
|
|
|
|
verification. But in reality we have created wrong-code
|
|
|
|
|
as we did not properly transition EH info and edges to
|
|
|
|
|
the piecewise computations. */
|
|
|
|
|
if (maybe_clean_eh_stmt (gsi_stmt (gsi))
|
|
|
|
|
&& gimple_purge_dead_eh_edges (bb))
|
|
|
|
|
cfg_changed = true;
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
}
|
|
|
|
|
}
|
2011-02-08 14:16:50 +00:00
|
|
|
|
|
|
|
|
|
return cfg_changed ? TODO_cleanup_cfg : 0;
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
}
|
|
|
|
|
|
2013-08-05 20:16:05 +00:00
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
|
|
const pass_data pass_data_lower_vector =
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
{
|
2013-08-05 20:16:05 +00:00
|
|
|
|
GIMPLE_PASS, /* type */
|
|
|
|
|
"veclower", /* name */
|
|
|
|
|
OPTGROUP_VEC, /* optinfo_flags */
|
|
|
|
|
true, /* has_gate */
|
|
|
|
|
true, /* has_execute */
|
|
|
|
|
TV_NONE, /* tv_id */
|
|
|
|
|
PROP_cfg, /* properties_required */
|
|
|
|
|
PROP_gimple_lvec, /* properties_provided */
|
|
|
|
|
0, /* properties_destroyed */
|
|
|
|
|
0, /* todo_flags_start */
|
|
|
|
|
( TODO_update_ssa | TODO_verify_ssa
|
|
|
|
|
| TODO_verify_stmts
|
|
|
|
|
| TODO_verify_flow
|
|
|
|
|
| TODO_cleanup_cfg ), /* todo_flags_finish */
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
};
|
|
|
|
|
|
2013-08-05 20:16:05 +00:00
|
|
|
|
class pass_lower_vector : public gimple_opt_pass
|
|
|
|
|
{
|
|
|
|
|
public:
|
alloc-pool.c, [...]: Add missing whitespace before "(".
gcc/
* alloc-pool.c, asan.c, auto-inc-dec.c, basic-block.h, bb-reorder.c,
bitmap.c, bitmap.h, bt-load.c, builtins.c, calls.c, cfgcleanup.c,
cfgexpand.c, cfghooks.c, cfgloop.c, cfgloopmanip.c, cfgrtl.c, cgraph.c,
cgraph.h, cgraphbuild.c, cgraphclones.c, cgraphunit.c, collect2.c,
combine-stack-adj.c, combine.c, compare-elim.c, context.c, context.h,
cprop.c, cse.c, cselib.c, dbxout.c, dce.c, defaults.h, df-core.c,
df-problems.c, df-scan.c, df.h, diagnostic.c, double-int.c, dse.c,
dumpfile.c, dwarf2asm.c, dwarf2cfi.c, dwarf2out.c, emit-rtl.c,
errors.c, except.c, expmed.c, expr.c, file-find.c, final.c,
fixed-value.c, fold-const.c, function.c, fwprop.c, gcc-ar.c, gcc.c,
gcov-io.c, gcov-io.h, gcov.c, gcse.c, genattr-common.c, genattr.c,
genattrtab.c, genautomata.c, genconfig.c, genemit.c, genextract.c,
genflags.c, gengenrtl.c, gengtype-state.c, gengtype.c, genmodes.c,
genopinit.c, genoutput.c, genpeep.c, genpreds.c, genrecog.c,
gensupport.c, ggc-common.c, ggc-page.c, gimple-fold.c, gimple-low.c,
gimple-pretty-print.c, gimple-ssa-strength-reduction.c, gimple.c,
gimple.h, godump.c, graphite-clast-to-gimple.c,
graphite-optimize-isl.c, graphite-poly.h, graphite-sese-to-poly.c,
graphite.c, haifa-sched.c, hash-table.c, hash-table.h, hwint.c,
hwint.h, ifcvt.c, incpath.c, init-regs.c, input.h, intl.c, intl.h,
ipa-cp.c, ipa-devirt.c, ipa-inline-analysis.c, ipa-inline.c,
ipa-profile.c, ipa-pure-const.c, ipa-reference.c, ipa-split.c,
ipa-utils.c, ipa.c, ira-build.c, ira.c, jump.c, loop-doloop.c,
loop-init.c, loop-invariant.c, loop-iv.c, lower-subreg.c, lto-cgraph.c,
lto-streamer-in.c, lto-streamer-out.c, lto-wrapper.c, mcf.c,
mode-switching.c, modulo-sched.c, omp-low.c, optabs.c, opts.c,
pass_manager.h, passes.c, plugin.c, postreload-gcse.c, postreload.c,
predict.c, prefix.c, pretty-print.c, print-rtl.c, print-tree.c,
profile.c, read-md.c, real.c, real.h, recog.c, ree.c, reg-stack.c,
regcprop.c, reginfo.c, regmove.c, regrename.c, regs.h, regstat.c,
reload1.c, reorg.c, rtl.c, rtl.h, rtlanal.c, sbitmap.c, sched-rgn.c,
sdbout.c, sel-sched-ir.c, sel-sched.c, sparseset.c, stack-ptr-mod.c,
statistics.c, stmt.c, stor-layout.c, store-motion.c, streamer-hooks.h,
system.h, target-hooks-macros.h, targhooks.c, targhooks.h, toplev.c,
tracer.c, trans-mem.c, tree-browser.c, tree-call-cdce.c, tree-cfg.c,
tree-cfgcleanup.c, tree-complex.c, tree-data-ref.c, tree-data-ref.h,
tree-eh.c, tree-emutls.c, tree-flow.h, tree-if-conv.c, tree-into-ssa.c,
tree-iterator.c, tree-loop-distribution.c, tree-mudflap.c,
tree-nested.c, tree-nomudflap.c, tree-nrv.c, tree-object-size.c,
tree-optimize.c, tree-pass.h, tree-pretty-print.c, tree-profile.c,
tree-scalar-evolution.c, tree-sra.c, tree-ssa-ccp.c,
tree-ssa-coalesce.c, tree-ssa-copy.c, tree-ssa-copyrename.c,
tree-ssa-dce.c, tree-ssa-dom.c, tree-ssa-dse.c, tree-ssa-forwprop.c,
tree-ssa-ifcombine.c, tree-ssa-live.c, tree-ssa-loop-ch.c,
tree-ssa-loop-im.c, tree-ssa-loop-ivopts.c, tree-ssa-loop-prefetch.c,
tree-ssa-loop.c, tree-ssa-math-opts.c, tree-ssa-operands.c,
tree-ssa-phiopt.c, tree-ssa-phiprop.c, tree-ssa-pre.c,
tree-ssa-reassoc.c, tree-ssa-sink.c, tree-ssa-strlen.c,
tree-ssa-structalias.c, tree-ssa-threadedge.c, tree-ssa-threadupdate.c,
tree-ssa-uncprop.c, tree-ssa-uninit.c, tree-ssa.c, tree-ssanames.c,
tree-stdarg.c, tree-switch-conversion.c, tree-tailcall.c,
tree-vect-data-refs.c, tree-vect-generic.c, tree-vect-loop-manip.c,
tree-vect-stmts.c, tree-vectorizer.c, tree-vectorizer.h, tree-vrp.c,
tree.c, tree.h, tsan.c, tsystem.h, value-prof.c, var-tracking.c,
varasm.c, vec.h, vmsdbgout.c, vtable-verify.c, web.c: Add missing
whitespace before "(".
From-SVN: r203004
2013-09-28 08:42:34 +00:00
|
|
|
|
pass_lower_vector (gcc::context *ctxt)
|
|
|
|
|
: gimple_opt_pass (pass_data_lower_vector, ctxt)
|
2013-08-05 20:16:05 +00:00
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
/* opt_pass methods: */
|
|
|
|
|
bool gate () { return gate_expand_vector_operations_ssa (); }
|
|
|
|
|
unsigned int execute () { return expand_vector_operations (); }
|
|
|
|
|
|
|
|
|
|
}; // class pass_lower_vector
|
|
|
|
|
|
|
|
|
|
} // anon namespace
|
|
|
|
|
|
|
|
|
|
gimple_opt_pass *
|
|
|
|
|
make_pass_lower_vector (gcc::context *ctxt)
|
|
|
|
|
{
|
|
|
|
|
return new pass_lower_vector (ctxt);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
|
|
const pass_data pass_data_lower_vector_ssa =
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
{
|
2013-08-05 20:16:05 +00:00
|
|
|
|
GIMPLE_PASS, /* type */
|
|
|
|
|
"veclower2", /* name */
|
|
|
|
|
OPTGROUP_VEC, /* optinfo_flags */
|
|
|
|
|
false, /* has_gate */
|
|
|
|
|
true, /* has_execute */
|
|
|
|
|
TV_NONE, /* tv_id */
|
|
|
|
|
PROP_cfg, /* properties_required */
|
|
|
|
|
PROP_gimple_lvec, /* properties_provided */
|
|
|
|
|
0, /* properties_destroyed */
|
|
|
|
|
0, /* todo_flags_start */
|
|
|
|
|
( TODO_update_ssa | TODO_verify_ssa
|
|
|
|
|
| TODO_verify_stmts
|
|
|
|
|
| TODO_verify_flow
|
|
|
|
|
| TODO_cleanup_cfg ), /* todo_flags_finish */
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
};
|
|
|
|
|
|
2013-08-05 20:16:05 +00:00
|
|
|
|
class pass_lower_vector_ssa : public gimple_opt_pass
|
|
|
|
|
{
|
|
|
|
|
public:
|
alloc-pool.c, [...]: Add missing whitespace before "(".
gcc/
* alloc-pool.c, asan.c, auto-inc-dec.c, basic-block.h, bb-reorder.c,
bitmap.c, bitmap.h, bt-load.c, builtins.c, calls.c, cfgcleanup.c,
cfgexpand.c, cfghooks.c, cfgloop.c, cfgloopmanip.c, cfgrtl.c, cgraph.c,
cgraph.h, cgraphbuild.c, cgraphclones.c, cgraphunit.c, collect2.c,
combine-stack-adj.c, combine.c, compare-elim.c, context.c, context.h,
cprop.c, cse.c, cselib.c, dbxout.c, dce.c, defaults.h, df-core.c,
df-problems.c, df-scan.c, df.h, diagnostic.c, double-int.c, dse.c,
dumpfile.c, dwarf2asm.c, dwarf2cfi.c, dwarf2out.c, emit-rtl.c,
errors.c, except.c, expmed.c, expr.c, file-find.c, final.c,
fixed-value.c, fold-const.c, function.c, fwprop.c, gcc-ar.c, gcc.c,
gcov-io.c, gcov-io.h, gcov.c, gcse.c, genattr-common.c, genattr.c,
genattrtab.c, genautomata.c, genconfig.c, genemit.c, genextract.c,
genflags.c, gengenrtl.c, gengtype-state.c, gengtype.c, genmodes.c,
genopinit.c, genoutput.c, genpeep.c, genpreds.c, genrecog.c,
gensupport.c, ggc-common.c, ggc-page.c, gimple-fold.c, gimple-low.c,
gimple-pretty-print.c, gimple-ssa-strength-reduction.c, gimple.c,
gimple.h, godump.c, graphite-clast-to-gimple.c,
graphite-optimize-isl.c, graphite-poly.h, graphite-sese-to-poly.c,
graphite.c, haifa-sched.c, hash-table.c, hash-table.h, hwint.c,
hwint.h, ifcvt.c, incpath.c, init-regs.c, input.h, intl.c, intl.h,
ipa-cp.c, ipa-devirt.c, ipa-inline-analysis.c, ipa-inline.c,
ipa-profile.c, ipa-pure-const.c, ipa-reference.c, ipa-split.c,
ipa-utils.c, ipa.c, ira-build.c, ira.c, jump.c, loop-doloop.c,
loop-init.c, loop-invariant.c, loop-iv.c, lower-subreg.c, lto-cgraph.c,
lto-streamer-in.c, lto-streamer-out.c, lto-wrapper.c, mcf.c,
mode-switching.c, modulo-sched.c, omp-low.c, optabs.c, opts.c,
pass_manager.h, passes.c, plugin.c, postreload-gcse.c, postreload.c,
predict.c, prefix.c, pretty-print.c, print-rtl.c, print-tree.c,
profile.c, read-md.c, real.c, real.h, recog.c, ree.c, reg-stack.c,
regcprop.c, reginfo.c, regmove.c, regrename.c, regs.h, regstat.c,
reload1.c, reorg.c, rtl.c, rtl.h, rtlanal.c, sbitmap.c, sched-rgn.c,
sdbout.c, sel-sched-ir.c, sel-sched.c, sparseset.c, stack-ptr-mod.c,
statistics.c, stmt.c, stor-layout.c, store-motion.c, streamer-hooks.h,
system.h, target-hooks-macros.h, targhooks.c, targhooks.h, toplev.c,
tracer.c, trans-mem.c, tree-browser.c, tree-call-cdce.c, tree-cfg.c,
tree-cfgcleanup.c, tree-complex.c, tree-data-ref.c, tree-data-ref.h,
tree-eh.c, tree-emutls.c, tree-flow.h, tree-if-conv.c, tree-into-ssa.c,
tree-iterator.c, tree-loop-distribution.c, tree-mudflap.c,
tree-nested.c, tree-nomudflap.c, tree-nrv.c, tree-object-size.c,
tree-optimize.c, tree-pass.h, tree-pretty-print.c, tree-profile.c,
tree-scalar-evolution.c, tree-sra.c, tree-ssa-ccp.c,
tree-ssa-coalesce.c, tree-ssa-copy.c, tree-ssa-copyrename.c,
tree-ssa-dce.c, tree-ssa-dom.c, tree-ssa-dse.c, tree-ssa-forwprop.c,
tree-ssa-ifcombine.c, tree-ssa-live.c, tree-ssa-loop-ch.c,
tree-ssa-loop-im.c, tree-ssa-loop-ivopts.c, tree-ssa-loop-prefetch.c,
tree-ssa-loop.c, tree-ssa-math-opts.c, tree-ssa-operands.c,
tree-ssa-phiopt.c, tree-ssa-phiprop.c, tree-ssa-pre.c,
tree-ssa-reassoc.c, tree-ssa-sink.c, tree-ssa-strlen.c,
tree-ssa-structalias.c, tree-ssa-threadedge.c, tree-ssa-threadupdate.c,
tree-ssa-uncprop.c, tree-ssa-uninit.c, tree-ssa.c, tree-ssanames.c,
tree-stdarg.c, tree-switch-conversion.c, tree-tailcall.c,
tree-vect-data-refs.c, tree-vect-generic.c, tree-vect-loop-manip.c,
tree-vect-stmts.c, tree-vectorizer.c, tree-vectorizer.h, tree-vrp.c,
tree.c, tree.h, tsan.c, tsystem.h, value-prof.c, var-tracking.c,
varasm.c, vec.h, vmsdbgout.c, vtable-verify.c, web.c: Add missing
whitespace before "(".
From-SVN: r203004
2013-09-28 08:42:34 +00:00
|
|
|
|
pass_lower_vector_ssa (gcc::context *ctxt)
|
|
|
|
|
: gimple_opt_pass (pass_data_lower_vector_ssa, ctxt)
|
2013-08-05 20:16:05 +00:00
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
/* opt_pass methods: */
|
|
|
|
|
opt_pass * clone () { return new pass_lower_vector_ssa (ctxt_); }
|
|
|
|
|
unsigned int execute () { return expand_vector_operations (); }
|
|
|
|
|
|
|
|
|
|
}; // class pass_lower_vector_ssa
|
|
|
|
|
|
|
|
|
|
} // anon namespace
|
|
|
|
|
|
|
|
|
|
gimple_opt_pass *
|
|
|
|
|
make_pass_lower_vector_ssa (gcc::context *ctxt)
|
|
|
|
|
{
|
|
|
|
|
return new pass_lower_vector_ssa (ctxt);
|
|
|
|
|
}
|
|
|
|
|
|
Makefile.in (tree-vect-generic.o): New.
* Makefile.in (tree-vect-generic.o): New.
(OBJS-common, GTFILES, s-gtype): Add it.
* tree-complex.c (build_replicated_const, vector_inner_type,
vector_last_type, vector_last_nunits, build_word_mode_vector_type,
elem_op_func, tree_vec_extract, do_unop, do_binop, do_plus_minus,
do_negate, expand_vector_piecewise, expand_vector_parallel,
expand_vector_addition, expand_vector_operation,
type_for_widest_vector_mode, expand_vector_operations_1,
gate_expand_vector_operations, expand_vector_operations,
pass_lower_vector_ssa): Move to tree-vect-generic.c.
(tree_lower_complex): Rename from tree_lower_operations.
(pass_lower_complex): Rename from pass_pre_expand.
* tree-vect-generic.c: New file.
* tree-pass.h (pass_lower_complex): Rename from pass_pre_expand.
(pass_lower_vector): New.
* tree-optimize.c (init_tree_optimization_passes): Update to match.
From-SVN: r100529
2005-06-02 19:11:05 -07:00
|
|
|
|
#include "gt-tree-vect-generic.h"
|