diff options
Diffstat (limited to 'gcc/tree.c')
-rw-r--r-- | gcc/tree.c | 65 |
1 files changed, 23 insertions, 42 deletions
@@ -5115,40 +5115,6 @@ build_common_tree_nodes_2 (int short_double) va_list_type_node = t; } - - unsigned_V4SI_type_node - = make_vector (V4SImode, unsigned_intSI_type_node, 1); - unsigned_V2HI_type_node - = make_vector (V2HImode, unsigned_intHI_type_node, 1); - unsigned_V2SI_type_node - = make_vector (V2SImode, unsigned_intSI_type_node, 1); - unsigned_V2DI_type_node - = make_vector (V2DImode, unsigned_intDI_type_node, 1); - unsigned_V4HI_type_node - = make_vector (V4HImode, unsigned_intHI_type_node, 1); - unsigned_V8QI_type_node - = make_vector (V8QImode, unsigned_intQI_type_node, 1); - unsigned_V8HI_type_node - = make_vector (V8HImode, unsigned_intHI_type_node, 1); - unsigned_V16QI_type_node - = make_vector (V16QImode, unsigned_intQI_type_node, 1); - unsigned_V1DI_type_node - = make_vector (V1DImode, unsigned_intDI_type_node, 1); - - V16SF_type_node = make_vector (V16SFmode, float_type_node, 0); - V4SF_type_node = make_vector (V4SFmode, float_type_node, 0); - V4SI_type_node = make_vector (V4SImode, intSI_type_node, 0); - V2HI_type_node = make_vector (V2HImode, intHI_type_node, 0); - V2SI_type_node = make_vector (V2SImode, intSI_type_node, 0); - V2DI_type_node = make_vector (V2DImode, intDI_type_node, 0); - V4HI_type_node = make_vector (V4HImode, intHI_type_node, 0); - V8QI_type_node = make_vector (V8QImode, intQI_type_node, 0); - V8HI_type_node = make_vector (V8HImode, intHI_type_node, 0); - V2SF_type_node = make_vector (V2SFmode, float_type_node, 0); - V2DF_type_node = make_vector (V2DFmode, double_type_node, 0); - V16QI_type_node = make_vector (V16QImode, intQI_type_node, 0); - V1DI_type_node = make_vector (V1DImode, intDI_type_node, 0); - V4DF_type_node = make_vector (V4DFmode, double_type_node, 0); } /* HACK. GROSS. This is absolutely disgusting. I wish there was a @@ -5197,26 +5163,41 @@ reconstruct_complex_type (tree type, tree bottom) return outer; } -/* Returns a vector tree node given a vector mode, the inner type, and - the signness. */ - +/* Returns a vector tree node given a vector mode and inner type. */ tree -make_vector (enum machine_mode mode, tree innertype, int unsignedp) +build_vector_type_for_mode (tree innertype, enum machine_mode mode) { tree t; - t = make_node (VECTOR_TYPE); TREE_TYPE (t) = innertype; TYPE_MODE (t) = mode; - TREE_UNSIGNED (TREE_TYPE (t)) = unsignedp; + TREE_UNSIGNED (t) = TREE_UNSIGNED (innertype); finish_vector_type (t); - return t; } +/* Similarly, but takes inner type and units. */ + +tree +build_vector_type (tree innertype, int nunits) +{ + enum machine_mode innermode = TYPE_MODE (innertype); + enum machine_mode mode; + + if (GET_MODE_CLASS (innermode) == MODE_FLOAT) + mode = MIN_MODE_VECTOR_FLOAT; + else + mode = MIN_MODE_VECTOR_INT; + + for (; mode != VOIDmode ; mode = GET_MODE_WIDER_MODE (mode)) + if (GET_MODE_NUNITS (mode) == nunits && GET_MODE_INNER (mode) == innermode) + return build_vector_type_for_mode (innertype, mode); + + return NULL_TREE; +} + /* Given an initializer INIT, return TRUE if INIT is zero or some aggregate of zeros. Otherwise return FALSE. */ - bool initializer_zerop (tree init) { |