Commit af06585a by Joseph Myers Committed by Joseph Myers

arm.c (arm_init_neon_builtins): Move initialization with function calls after declarations.

	* config/arm/arm.c (arm_init_neon_builtins): Move initialization
	with function calls after declarations.  Lay out
	neon_float_type_node before further use.

From-SVN: r136660
parent 10fbe77a
2008-06-11 Joseph Myers <joseph@codesourcery.com>
* config/arm/arm.c (arm_init_neon_builtins): Move initialization
with function calls after declarations. Lay out
neon_float_type_node before further use.
2008-06-11 Richard Guenther <rguenther@suse.de> 2008-06-11 Richard Guenther <rguenther@suse.de>
* tree-flow.h (may_point_to_global_var): Declare. * tree-flow.h (may_point_to_global_var): Declare.
......
...@@ -15007,124 +15007,190 @@ arm_init_neon_builtins (void) ...@@ -15007,124 +15007,190 @@ arm_init_neon_builtins (void)
{ {
unsigned int i, fcode = ARM_BUILTIN_NEON_BASE; unsigned int i, fcode = ARM_BUILTIN_NEON_BASE;
tree neon_intQI_type_node;
tree neon_intHI_type_node;
tree neon_polyQI_type_node;
tree neon_polyHI_type_node;
tree neon_intSI_type_node;
tree neon_intDI_type_node;
tree neon_float_type_node;
tree intQI_pointer_node;
tree intHI_pointer_node;
tree intSI_pointer_node;
tree intDI_pointer_node;
tree float_pointer_node;
tree const_intQI_node;
tree const_intHI_node;
tree const_intSI_node;
tree const_intDI_node;
tree const_float_node;
tree const_intQI_pointer_node;
tree const_intHI_pointer_node;
tree const_intSI_pointer_node;
tree const_intDI_pointer_node;
tree const_float_pointer_node;
tree V8QI_type_node;
tree V4HI_type_node;
tree V2SI_type_node;
tree V2SF_type_node;
tree V16QI_type_node;
tree V8HI_type_node;
tree V4SI_type_node;
tree V4SF_type_node;
tree V2DI_type_node;
tree intUQI_type_node;
tree intUHI_type_node;
tree intUSI_type_node;
tree intUDI_type_node;
tree intEI_type_node;
tree intOI_type_node;
tree intCI_type_node;
tree intXI_type_node;
tree V8QI_pointer_node;
tree V4HI_pointer_node;
tree V2SI_pointer_node;
tree V2SF_pointer_node;
tree V16QI_pointer_node;
tree V8HI_pointer_node;
tree V4SI_pointer_node;
tree V4SF_pointer_node;
tree V2DI_pointer_node;
tree void_ftype_pv8qi_v8qi_v8qi;
tree void_ftype_pv4hi_v4hi_v4hi;
tree void_ftype_pv2si_v2si_v2si;
tree void_ftype_pv2sf_v2sf_v2sf;
tree void_ftype_pdi_di_di;
tree void_ftype_pv16qi_v16qi_v16qi;
tree void_ftype_pv8hi_v8hi_v8hi;
tree void_ftype_pv4si_v4si_v4si;
tree void_ftype_pv4sf_v4sf_v4sf;
tree void_ftype_pv2di_v2di_v2di;
tree reinterp_ftype_dreg[5][5];
tree reinterp_ftype_qreg[5][5];
tree dreg_types[5], qreg_types[5];
/* Create distinguished type nodes for NEON vector element types, /* Create distinguished type nodes for NEON vector element types,
and pointers to values of such types, so we can detect them later. */ and pointers to values of such types, so we can detect them later. */
tree neon_intQI_type_node = make_signed_type (GET_MODE_PRECISION (QImode)); neon_intQI_type_node = make_signed_type (GET_MODE_PRECISION (QImode));
tree neon_intHI_type_node = make_signed_type (GET_MODE_PRECISION (HImode)); neon_intHI_type_node = make_signed_type (GET_MODE_PRECISION (HImode));
tree neon_polyQI_type_node = make_signed_type (GET_MODE_PRECISION (QImode)); neon_polyQI_type_node = make_signed_type (GET_MODE_PRECISION (QImode));
tree neon_polyHI_type_node = make_signed_type (GET_MODE_PRECISION (HImode)); neon_polyHI_type_node = make_signed_type (GET_MODE_PRECISION (HImode));
tree neon_intSI_type_node = make_signed_type (GET_MODE_PRECISION (SImode)); neon_intSI_type_node = make_signed_type (GET_MODE_PRECISION (SImode));
tree neon_intDI_type_node = make_signed_type (GET_MODE_PRECISION (DImode)); neon_intDI_type_node = make_signed_type (GET_MODE_PRECISION (DImode));
tree neon_float_type_node = make_node (REAL_TYPE); neon_float_type_node = make_node (REAL_TYPE);
TYPE_PRECISION (neon_float_type_node) = FLOAT_TYPE_SIZE;
tree intQI_pointer_node = build_pointer_type (neon_intQI_type_node); layout_type (neon_float_type_node);
tree intHI_pointer_node = build_pointer_type (neon_intHI_type_node);
tree intSI_pointer_node = build_pointer_type (neon_intSI_type_node); intQI_pointer_node = build_pointer_type (neon_intQI_type_node);
tree intDI_pointer_node = build_pointer_type (neon_intDI_type_node); intHI_pointer_node = build_pointer_type (neon_intHI_type_node);
tree float_pointer_node = build_pointer_type (neon_float_type_node); intSI_pointer_node = build_pointer_type (neon_intSI_type_node);
intDI_pointer_node = build_pointer_type (neon_intDI_type_node);
float_pointer_node = build_pointer_type (neon_float_type_node);
/* Next create constant-qualified versions of the above types. */ /* Next create constant-qualified versions of the above types. */
tree const_intQI_node = build_qualified_type (neon_intQI_type_node, const_intQI_node = build_qualified_type (neon_intQI_type_node,
TYPE_QUAL_CONST); TYPE_QUAL_CONST);
tree const_intHI_node = build_qualified_type (neon_intHI_type_node, const_intHI_node = build_qualified_type (neon_intHI_type_node,
TYPE_QUAL_CONST); TYPE_QUAL_CONST);
tree const_intSI_node = build_qualified_type (neon_intSI_type_node, const_intSI_node = build_qualified_type (neon_intSI_type_node,
TYPE_QUAL_CONST); TYPE_QUAL_CONST);
tree const_intDI_node = build_qualified_type (neon_intDI_type_node, const_intDI_node = build_qualified_type (neon_intDI_type_node,
TYPE_QUAL_CONST); TYPE_QUAL_CONST);
tree const_float_node = build_qualified_type (neon_float_type_node, const_float_node = build_qualified_type (neon_float_type_node,
TYPE_QUAL_CONST); TYPE_QUAL_CONST);
tree const_intQI_pointer_node = build_pointer_type (const_intQI_node); const_intQI_pointer_node = build_pointer_type (const_intQI_node);
tree const_intHI_pointer_node = build_pointer_type (const_intHI_node); const_intHI_pointer_node = build_pointer_type (const_intHI_node);
tree const_intSI_pointer_node = build_pointer_type (const_intSI_node); const_intSI_pointer_node = build_pointer_type (const_intSI_node);
tree const_intDI_pointer_node = build_pointer_type (const_intDI_node); const_intDI_pointer_node = build_pointer_type (const_intDI_node);
tree const_float_pointer_node = build_pointer_type (const_float_node); const_float_pointer_node = build_pointer_type (const_float_node);
/* Now create vector types based on our NEON element types. */ /* Now create vector types based on our NEON element types. */
/* 64-bit vectors. */ /* 64-bit vectors. */
tree V8QI_type_node = V8QI_type_node =
build_vector_type_for_mode (neon_intQI_type_node, V8QImode); build_vector_type_for_mode (neon_intQI_type_node, V8QImode);
tree V4HI_type_node = V4HI_type_node =
build_vector_type_for_mode (neon_intHI_type_node, V4HImode); build_vector_type_for_mode (neon_intHI_type_node, V4HImode);
tree V2SI_type_node = V2SI_type_node =
build_vector_type_for_mode (neon_intSI_type_node, V2SImode); build_vector_type_for_mode (neon_intSI_type_node, V2SImode);
tree V2SF_type_node = V2SF_type_node =
build_vector_type_for_mode (neon_float_type_node, V2SFmode); build_vector_type_for_mode (neon_float_type_node, V2SFmode);
/* 128-bit vectors. */ /* 128-bit vectors. */
tree V16QI_type_node = V16QI_type_node =
build_vector_type_for_mode (neon_intQI_type_node, V16QImode); build_vector_type_for_mode (neon_intQI_type_node, V16QImode);
tree V8HI_type_node = V8HI_type_node =
build_vector_type_for_mode (neon_intHI_type_node, V8HImode); build_vector_type_for_mode (neon_intHI_type_node, V8HImode);
tree V4SI_type_node = V4SI_type_node =
build_vector_type_for_mode (neon_intSI_type_node, V4SImode); build_vector_type_for_mode (neon_intSI_type_node, V4SImode);
tree V4SF_type_node = V4SF_type_node =
build_vector_type_for_mode (neon_float_type_node, V4SFmode); build_vector_type_for_mode (neon_float_type_node, V4SFmode);
tree V2DI_type_node = V2DI_type_node =
build_vector_type_for_mode (neon_intDI_type_node, V2DImode); build_vector_type_for_mode (neon_intDI_type_node, V2DImode);
/* Unsigned integer types for various mode sizes. */ /* Unsigned integer types for various mode sizes. */
tree intUQI_type_node = make_unsigned_type (GET_MODE_PRECISION (QImode)); intUQI_type_node = make_unsigned_type (GET_MODE_PRECISION (QImode));
tree intUHI_type_node = make_unsigned_type (GET_MODE_PRECISION (HImode)); intUHI_type_node = make_unsigned_type (GET_MODE_PRECISION (HImode));
tree intUSI_type_node = make_unsigned_type (GET_MODE_PRECISION (SImode)); intUSI_type_node = make_unsigned_type (GET_MODE_PRECISION (SImode));
tree intUDI_type_node = make_unsigned_type (GET_MODE_PRECISION (DImode)); intUDI_type_node = make_unsigned_type (GET_MODE_PRECISION (DImode));
/* Opaque integer types for structures of vectors. */ /* Opaque integer types for structures of vectors. */
tree intEI_type_node = make_signed_type (GET_MODE_PRECISION (EImode)); intEI_type_node = make_signed_type (GET_MODE_PRECISION (EImode));
tree intOI_type_node = make_signed_type (GET_MODE_PRECISION (OImode)); intOI_type_node = make_signed_type (GET_MODE_PRECISION (OImode));
tree intCI_type_node = make_signed_type (GET_MODE_PRECISION (CImode)); intCI_type_node = make_signed_type (GET_MODE_PRECISION (CImode));
tree intXI_type_node = make_signed_type (GET_MODE_PRECISION (XImode)); intXI_type_node = make_signed_type (GET_MODE_PRECISION (XImode));
/* Pointers to vector types. */ /* Pointers to vector types. */
tree V8QI_pointer_node = build_pointer_type (V8QI_type_node); V8QI_pointer_node = build_pointer_type (V8QI_type_node);
tree V4HI_pointer_node = build_pointer_type (V4HI_type_node); V4HI_pointer_node = build_pointer_type (V4HI_type_node);
tree V2SI_pointer_node = build_pointer_type (V2SI_type_node); V2SI_pointer_node = build_pointer_type (V2SI_type_node);
tree V2SF_pointer_node = build_pointer_type (V2SF_type_node); V2SF_pointer_node = build_pointer_type (V2SF_type_node);
tree V16QI_pointer_node = build_pointer_type (V16QI_type_node); V16QI_pointer_node = build_pointer_type (V16QI_type_node);
tree V8HI_pointer_node = build_pointer_type (V8HI_type_node); V8HI_pointer_node = build_pointer_type (V8HI_type_node);
tree V4SI_pointer_node = build_pointer_type (V4SI_type_node); V4SI_pointer_node = build_pointer_type (V4SI_type_node);
tree V4SF_pointer_node = build_pointer_type (V4SF_type_node); V4SF_pointer_node = build_pointer_type (V4SF_type_node);
tree V2DI_pointer_node = build_pointer_type (V2DI_type_node); V2DI_pointer_node = build_pointer_type (V2DI_type_node);
/* Operations which return results as pairs. */ /* Operations which return results as pairs. */
tree void_ftype_pv8qi_v8qi_v8qi = void_ftype_pv8qi_v8qi_v8qi =
build_function_type_list (void_type_node, V8QI_pointer_node, V8QI_type_node, build_function_type_list (void_type_node, V8QI_pointer_node, V8QI_type_node,
V8QI_type_node, NULL); V8QI_type_node, NULL);
tree void_ftype_pv4hi_v4hi_v4hi = void_ftype_pv4hi_v4hi_v4hi =
build_function_type_list (void_type_node, V4HI_pointer_node, V4HI_type_node, build_function_type_list (void_type_node, V4HI_pointer_node, V4HI_type_node,
V4HI_type_node, NULL); V4HI_type_node, NULL);
tree void_ftype_pv2si_v2si_v2si = void_ftype_pv2si_v2si_v2si =
build_function_type_list (void_type_node, V2SI_pointer_node, V2SI_type_node, build_function_type_list (void_type_node, V2SI_pointer_node, V2SI_type_node,
V2SI_type_node, NULL); V2SI_type_node, NULL);
tree void_ftype_pv2sf_v2sf_v2sf = void_ftype_pv2sf_v2sf_v2sf =
build_function_type_list (void_type_node, V2SF_pointer_node, V2SF_type_node, build_function_type_list (void_type_node, V2SF_pointer_node, V2SF_type_node,
V2SF_type_node, NULL); V2SF_type_node, NULL);
tree void_ftype_pdi_di_di = void_ftype_pdi_di_di =
build_function_type_list (void_type_node, intDI_pointer_node, build_function_type_list (void_type_node, intDI_pointer_node,
neon_intDI_type_node, neon_intDI_type_node, NULL); neon_intDI_type_node, neon_intDI_type_node, NULL);
tree void_ftype_pv16qi_v16qi_v16qi = void_ftype_pv16qi_v16qi_v16qi =
build_function_type_list (void_type_node, V16QI_pointer_node, build_function_type_list (void_type_node, V16QI_pointer_node,
V16QI_type_node, V16QI_type_node, NULL); V16QI_type_node, V16QI_type_node, NULL);
tree void_ftype_pv8hi_v8hi_v8hi = void_ftype_pv8hi_v8hi_v8hi =
build_function_type_list (void_type_node, V8HI_pointer_node, V8HI_type_node, build_function_type_list (void_type_node, V8HI_pointer_node, V8HI_type_node,
V8HI_type_node, NULL); V8HI_type_node, NULL);
tree void_ftype_pv4si_v4si_v4si = void_ftype_pv4si_v4si_v4si =
build_function_type_list (void_type_node, V4SI_pointer_node, V4SI_type_node, build_function_type_list (void_type_node, V4SI_pointer_node, V4SI_type_node,
V4SI_type_node, NULL); V4SI_type_node, NULL);
tree void_ftype_pv4sf_v4sf_v4sf = void_ftype_pv4sf_v4sf_v4sf =
build_function_type_list (void_type_node, V4SF_pointer_node, V4SF_type_node, build_function_type_list (void_type_node, V4SF_pointer_node, V4SF_type_node,
V4SF_type_node, NULL); V4SF_type_node, NULL);
tree void_ftype_pv2di_v2di_v2di = void_ftype_pv2di_v2di_v2di =
build_function_type_list (void_type_node, V2DI_pointer_node, V2DI_type_node, build_function_type_list (void_type_node, V2DI_pointer_node, V2DI_type_node,
V2DI_type_node, NULL); V2DI_type_node, NULL);
tree reinterp_ftype_dreg[5][5];
tree reinterp_ftype_qreg[5][5];
tree dreg_types[5], qreg_types[5];
TYPE_PRECISION (neon_float_type_node) = FLOAT_TYPE_SIZE;
layout_type (neon_float_type_node);
/* Define typedefs which exactly correspond to the modes we are basing vector /* Define typedefs which exactly correspond to the modes we are basing vector
types on. If you change these names you'll need to change types on. If you change these names you'll need to change
the table used by arm_mangle_type too. */ the table used by arm_mangle_type too. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment