From e112bba2fced713f1fa6c7f41c6925ee4573f215 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Wed, 3 Jan 2018 07:17:00 +0000 Subject: [PATCH] poly_int: brig vector elements This patch adds a brig-specific wrapper around TYPE_VECTOR_SUBPARTS, since presumably it will never need to support variable vector lengths. 2018-01-03 Richard Sandiford Alan Hayward David Sherwood gcc/brig/ * brigfrontend/brig-util.h (gccbrig_type_vector_subparts): New function. * brigfrontend/brig-basic-inst-handler.cc (brig_basic_inst_handler::build_shuffle): Use it instead of TYPE_VECTOR_SUBPARTS. (brig_basic_inst_handler::build_unpack): Likewise. (brig_basic_inst_handler::build_pack): Likewise. (brig_basic_inst_handler::build_unpack_lo_or_hi): Likewise. (brig_basic_inst_handler::operator ()): Likewise. (brig_basic_inst_handler::build_lower_element_broadcast): Likewise. * brigfrontend/brig-code-entry-handler.cc (brig_code_entry_handler::get_tree_cst_for_hsa_operand): Likewise. (brig_code_entry_handler::get_comparison_result_type): Likewise. (brig_code_entry_handler::expand_or_call_builtin): Likewise. Co-Authored-By: Alan Hayward Co-Authored-By: David Sherwood From-SVN: r256144 --- gcc/brig/ChangeLog | 19 ++++++++++++++ gcc/brig/brigfrontend/brig-basic-inst-handler.cc | 32 +++++++++++++----------- gcc/brig/brigfrontend/brig-code-entry-handler.cc | 8 +++--- gcc/brig/brigfrontend/brig-util.h | 8 ++++++ 4 files changed, 49 insertions(+), 18 deletions(-) diff --git a/gcc/brig/ChangeLog b/gcc/brig/ChangeLog index 0bb552e..b4f2ec0 100644 --- a/gcc/brig/ChangeLog +++ b/gcc/brig/ChangeLog @@ -1,3 +1,22 @@ +2018-01-03 Richard Sandiford + Alan Hayward + David Sherwood + + * brigfrontend/brig-util.h (gccbrig_type_vector_subparts): New + function. + * brigfrontend/brig-basic-inst-handler.cc + (brig_basic_inst_handler::build_shuffle): Use it instead of + TYPE_VECTOR_SUBPARTS. + (brig_basic_inst_handler::build_unpack): Likewise. + (brig_basic_inst_handler::build_pack): Likewise. + (brig_basic_inst_handler::build_unpack_lo_or_hi): Likewise. + (brig_basic_inst_handler::operator ()): Likewise. + (brig_basic_inst_handler::build_lower_element_broadcast): Likewise. + * brigfrontend/brig-code-entry-handler.cc + (brig_code_entry_handler::get_tree_cst_for_hsa_operand): Likewise. + (brig_code_entry_handler::get_comparison_result_type): Likewise. + (brig_code_entry_handler::expand_or_call_builtin): Likewise. + 2017-12-15 Jakub Jelinek * brig-lang.c (brig_attribute_table): Swap affects_type_identity diff --git a/gcc/brig/brigfrontend/brig-basic-inst-handler.cc b/gcc/brig/brigfrontend/brig-basic-inst-handler.cc index ad5a410..ad0b24b 100644 --- a/gcc/brig/brigfrontend/brig-basic-inst-handler.cc +++ b/gcc/brig/brigfrontend/brig-basic-inst-handler.cc @@ -97,9 +97,10 @@ brig_basic_inst_handler::build_shuffle (tree arith_type, output elements can originate from any input element. */ vec *mask_offset_vals = NULL; + unsigned int element_count = gccbrig_type_vector_subparts (arith_type); + vec *input_mask_vals = NULL; - size_t input_mask_element_size - = exact_log2 (TYPE_VECTOR_SUBPARTS (arith_type)); + size_t input_mask_element_size = exact_log2 (element_count); /* Unpack the tightly packed mask elements to BIT_FIELD_REFs from which to construct the mask vector as understood by @@ -109,7 +110,7 @@ brig_basic_inst_handler::build_shuffle (tree arith_type, tree mask_element_type = build_nonstandard_integer_type (input_mask_element_size, true); - for (size_t i = 0; i < TYPE_VECTOR_SUBPARTS (arith_type); ++i) + for (size_t i = 0; i < element_count; ++i) { tree mask_element = build3 (BIT_FIELD_REF, mask_element_type, mask_operand, @@ -119,17 +120,15 @@ brig_basic_inst_handler::build_shuffle (tree arith_type, mask_element = convert (element_type, mask_element); tree offset; - if (i < TYPE_VECTOR_SUBPARTS (arith_type) / 2) + if (i < element_count / 2) offset = build_int_cst (element_type, 0); else - offset - = build_int_cst (element_type, TYPE_VECTOR_SUBPARTS (arith_type)); + offset = build_int_cst (element_type, element_count); CONSTRUCTOR_APPEND_ELT (mask_offset_vals, NULL_TREE, offset); CONSTRUCTOR_APPEND_ELT (input_mask_vals, NULL_TREE, mask_element); } - tree mask_vec_type - = build_vector_type (element_type, TYPE_VECTOR_SUBPARTS (arith_type)); + tree mask_vec_type = build_vector_type (element_type, element_count); tree mask_vec = build_constructor (mask_vec_type, input_mask_vals); tree offset_vec = build_constructor (mask_vec_type, mask_offset_vals); @@ -158,7 +157,8 @@ brig_basic_inst_handler::build_unpack (tree_stl_vec &operands) vec *input_mask_vals = NULL; vec *and_mask_vals = NULL; - size_t element_count = TYPE_VECTOR_SUBPARTS (TREE_TYPE (operands[0])); + size_t element_count + = gccbrig_type_vector_subparts (TREE_TYPE (operands[0])); tree vec_type = build_vector_type (element_type, element_count); for (size_t i = 0; i < element_count; ++i) @@ -214,7 +214,7 @@ brig_basic_inst_handler::build_pack (tree_stl_vec &operands) TODO: Reuse this for implementing 'bitinsert' without a builtin call. */ - size_t ecount = TYPE_VECTOR_SUBPARTS (TREE_TYPE (operands[0])); + size_t ecount = gccbrig_type_vector_subparts (TREE_TYPE (operands[0])); size_t vecsize = int_size_in_bytes (TREE_TYPE (operands[0])) * BITS_PER_UNIT; tree wide_type = build_nonstandard_integer_type (vecsize, 1); @@ -276,9 +276,10 @@ brig_basic_inst_handler::build_unpack_lo_or_hi (BrigOpcode16_t brig_opcode, { tree element_type = get_unsigned_int_type (TREE_TYPE (arith_type)); tree mask_vec_type - = build_vector_type (element_type, TYPE_VECTOR_SUBPARTS (arith_type)); + = build_vector_type (element_type, + gccbrig_type_vector_subparts (arith_type)); - size_t element_count = TYPE_VECTOR_SUBPARTS (arith_type); + size_t element_count = gccbrig_type_vector_subparts (arith_type); vec *input_mask_vals = NULL; size_t offset = (brig_opcode == BRIG_OPCODE_UNPACKLO) ? 0 : element_count / 2; @@ -601,8 +602,8 @@ brig_basic_inst_handler::operator () (const BrigBase *base) } size_t promoted_type_size = int_size_in_bytes (promoted_type) * 8; - - for (size_t i = 0; i < TYPE_VECTOR_SUBPARTS (arith_type); ++i) + size_t element_count = gccbrig_type_vector_subparts (arith_type); + for (size_t i = 0; i < element_count; ++i) { tree operand0 = convert (promoted_type, operand0_elements.at (i)); tree operand1 = convert (promoted_type, operand1_elements.at (i)); @@ -709,7 +710,8 @@ brig_basic_inst_handler::build_lower_element_broadcast (tree vec_operand) tree element_type = TREE_TYPE (TREE_TYPE (vec_operand)); size_t esize = 8 * int_size_in_bytes (element_type); - size_t element_count = TYPE_VECTOR_SUBPARTS (TREE_TYPE (vec_operand)); + size_t element_count + = gccbrig_type_vector_subparts (TREE_TYPE (vec_operand)); tree mask_inner_type = build_nonstandard_integer_type (esize, 1); vec *constructor_vals = NULL; diff --git a/gcc/brig/brigfrontend/brig-code-entry-handler.cc b/gcc/brig/brigfrontend/brig-code-entry-handler.cc index 923a454..fa4da9f 100644 --- a/gcc/brig/brigfrontend/brig-code-entry-handler.cc +++ b/gcc/brig/brigfrontend/brig-code-entry-handler.cc @@ -638,7 +638,8 @@ brig_code_entry_handler::get_tree_cst_for_hsa_operand { /* In case of vector type elements (or sole vectors), create a vector ctor. */ - size_t element_count = TYPE_VECTOR_SUBPARTS (tree_element_type); + size_t element_count + = gccbrig_type_vector_subparts (tree_element_type); if (bytes_left < scalar_element_size * element_count) fatal_error (UNKNOWN_LOCATION, "Not enough bytes left for the initializer " @@ -841,7 +842,7 @@ brig_code_entry_handler::get_comparison_result_type (tree source_type) size_t element_size = int_size_in_bytes (TREE_TYPE (source_type)); return build_vector_type (build_nonstandard_boolean_type (element_size * BITS_PER_UNIT), - TYPE_VECTOR_SUBPARTS (source_type)); + gccbrig_type_vector_subparts (source_type)); } else return gccbrig_tree_type_for_hsa_type (BRIG_TYPE_B1); @@ -946,7 +947,8 @@ brig_code_entry_handler::expand_or_call_builtin (BrigOpcode16_t brig_opcode, tree_stl_vec result_elements; - for (size_t i = 0; i < TYPE_VECTOR_SUBPARTS (arith_type); ++i) + size_t element_count = gccbrig_type_vector_subparts (arith_type); + for (size_t i = 0; i < element_count; ++i) { tree_stl_vec call_operands; if (operand0_elements.size () > 0) diff --git a/gcc/brig/brigfrontend/brig-util.h b/gcc/brig/brigfrontend/brig-util.h index d47470f..3dd2c6e 100644 --- a/gcc/brig/brigfrontend/brig-util.h +++ b/gcc/brig/brigfrontend/brig-util.h @@ -107,4 +107,12 @@ std::string gccbrig_hsa_reg_name_from_id (size_t reg_hash); void gccbrig_print_reg_use_info (FILE *dump, const regs_use_index &info); +/* Return the number of elements in a VECTOR_TYPE. BRIG does not support + variable-length vectors. */ +inline unsigned HOST_WIDE_INT +gccbrig_type_vector_subparts (const_tree type) +{ + return TYPE_VECTOR_SUBPARTS (type); +} + #endif -- 2.7.4