266 lines
11 KiB
Diff
266 lines
11 KiB
Diff
--- foo/gcc/config/arm/arm.c 2008/06/11 10:51:34 136660
|
|
+++ foo/gcc/config/arm/arm.c 2008/06/11 10:52:55 136661
|
|
@@ -14830,124 +14830,190 @@
|
|
{
|
|
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,
|
|
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));
|
|
- tree neon_intHI_type_node = make_signed_type (GET_MODE_PRECISION (HImode));
|
|
- tree neon_polyQI_type_node = make_signed_type (GET_MODE_PRECISION (QImode));
|
|
- tree neon_polyHI_type_node = make_signed_type (GET_MODE_PRECISION (HImode));
|
|
- tree neon_intSI_type_node = make_signed_type (GET_MODE_PRECISION (SImode));
|
|
- tree neon_intDI_type_node = make_signed_type (GET_MODE_PRECISION (DImode));
|
|
- tree neon_float_type_node = make_node (REAL_TYPE);
|
|
-
|
|
- tree intQI_pointer_node = build_pointer_type (neon_intQI_type_node);
|
|
- tree intHI_pointer_node = build_pointer_type (neon_intHI_type_node);
|
|
- tree intSI_pointer_node = build_pointer_type (neon_intSI_type_node);
|
|
- tree intDI_pointer_node = build_pointer_type (neon_intDI_type_node);
|
|
- tree float_pointer_node = build_pointer_type (neon_float_type_node);
|
|
+ neon_intQI_type_node = make_signed_type (GET_MODE_PRECISION (QImode));
|
|
+ neon_intHI_type_node = make_signed_type (GET_MODE_PRECISION (HImode));
|
|
+ neon_polyQI_type_node = make_signed_type (GET_MODE_PRECISION (QImode));
|
|
+ neon_polyHI_type_node = make_signed_type (GET_MODE_PRECISION (HImode));
|
|
+ neon_intSI_type_node = make_signed_type (GET_MODE_PRECISION (SImode));
|
|
+ neon_intDI_type_node = make_signed_type (GET_MODE_PRECISION (DImode));
|
|
+ neon_float_type_node = make_node (REAL_TYPE);
|
|
+ TYPE_PRECISION (neon_float_type_node) = FLOAT_TYPE_SIZE;
|
|
+ layout_type (neon_float_type_node);
|
|
+
|
|
+ intQI_pointer_node = build_pointer_type (neon_intQI_type_node);
|
|
+ intHI_pointer_node = build_pointer_type (neon_intHI_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. */
|
|
- tree const_intQI_node = build_qualified_type (neon_intQI_type_node,
|
|
- TYPE_QUAL_CONST);
|
|
- tree const_intHI_node = build_qualified_type (neon_intHI_type_node,
|
|
- TYPE_QUAL_CONST);
|
|
- tree const_intSI_node = build_qualified_type (neon_intSI_type_node,
|
|
- TYPE_QUAL_CONST);
|
|
- tree const_intDI_node = build_qualified_type (neon_intDI_type_node,
|
|
- TYPE_QUAL_CONST);
|
|
- tree const_float_node = build_qualified_type (neon_float_type_node,
|
|
- TYPE_QUAL_CONST);
|
|
-
|
|
- tree const_intQI_pointer_node = build_pointer_type (const_intQI_node);
|
|
- tree const_intHI_pointer_node = build_pointer_type (const_intHI_node);
|
|
- tree const_intSI_pointer_node = build_pointer_type (const_intSI_node);
|
|
- tree const_intDI_pointer_node = build_pointer_type (const_intDI_node);
|
|
- tree const_float_pointer_node = build_pointer_type (const_float_node);
|
|
+ const_intQI_node = build_qualified_type (neon_intQI_type_node,
|
|
+ TYPE_QUAL_CONST);
|
|
+ const_intHI_node = build_qualified_type (neon_intHI_type_node,
|
|
+ TYPE_QUAL_CONST);
|
|
+ const_intSI_node = build_qualified_type (neon_intSI_type_node,
|
|
+ TYPE_QUAL_CONST);
|
|
+ const_intDI_node = build_qualified_type (neon_intDI_type_node,
|
|
+ TYPE_QUAL_CONST);
|
|
+ const_float_node = build_qualified_type (neon_float_type_node,
|
|
+ TYPE_QUAL_CONST);
|
|
+
|
|
+ const_intQI_pointer_node = build_pointer_type (const_intQI_node);
|
|
+ const_intHI_pointer_node = build_pointer_type (const_intHI_node);
|
|
+ const_intSI_pointer_node = build_pointer_type (const_intSI_node);
|
|
+ const_intDI_pointer_node = build_pointer_type (const_intDI_node);
|
|
+ const_float_pointer_node = build_pointer_type (const_float_node);
|
|
|
|
/* Now create vector types based on our NEON element types. */
|
|
/* 64-bit vectors. */
|
|
- tree V8QI_type_node =
|
|
+ V8QI_type_node =
|
|
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);
|
|
- tree V2SI_type_node =
|
|
+ V2SI_type_node =
|
|
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);
|
|
/* 128-bit vectors. */
|
|
- tree V16QI_type_node =
|
|
+ V16QI_type_node =
|
|
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);
|
|
- tree V4SI_type_node =
|
|
+ V4SI_type_node =
|
|
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);
|
|
- tree V2DI_type_node =
|
|
+ V2DI_type_node =
|
|
build_vector_type_for_mode (neon_intDI_type_node, V2DImode);
|
|
|
|
/* Unsigned integer types for various mode sizes. */
|
|
- tree intUQI_type_node = make_unsigned_type (GET_MODE_PRECISION (QImode));
|
|
- tree intUHI_type_node = make_unsigned_type (GET_MODE_PRECISION (HImode));
|
|
- tree intUSI_type_node = make_unsigned_type (GET_MODE_PRECISION (SImode));
|
|
- tree intUDI_type_node = make_unsigned_type (GET_MODE_PRECISION (DImode));
|
|
+ intUQI_type_node = make_unsigned_type (GET_MODE_PRECISION (QImode));
|
|
+ intUHI_type_node = make_unsigned_type (GET_MODE_PRECISION (HImode));
|
|
+ intUSI_type_node = make_unsigned_type (GET_MODE_PRECISION (SImode));
|
|
+ intUDI_type_node = make_unsigned_type (GET_MODE_PRECISION (DImode));
|
|
|
|
/* Opaque integer types for structures of vectors. */
|
|
- tree intEI_type_node = make_signed_type (GET_MODE_PRECISION (EImode));
|
|
- tree intOI_type_node = make_signed_type (GET_MODE_PRECISION (OImode));
|
|
- tree intCI_type_node = make_signed_type (GET_MODE_PRECISION (CImode));
|
|
- tree intXI_type_node = make_signed_type (GET_MODE_PRECISION (XImode));
|
|
+ intEI_type_node = make_signed_type (GET_MODE_PRECISION (EImode));
|
|
+ intOI_type_node = make_signed_type (GET_MODE_PRECISION (OImode));
|
|
+ intCI_type_node = make_signed_type (GET_MODE_PRECISION (CImode));
|
|
+ intXI_type_node = make_signed_type (GET_MODE_PRECISION (XImode));
|
|
|
|
/* Pointers to vector types. */
|
|
- tree V8QI_pointer_node = build_pointer_type (V8QI_type_node);
|
|
- tree V4HI_pointer_node = build_pointer_type (V4HI_type_node);
|
|
- tree V2SI_pointer_node = build_pointer_type (V2SI_type_node);
|
|
- tree V2SF_pointer_node = build_pointer_type (V2SF_type_node);
|
|
- tree V16QI_pointer_node = build_pointer_type (V16QI_type_node);
|
|
- tree V8HI_pointer_node = build_pointer_type (V8HI_type_node);
|
|
- tree V4SI_pointer_node = build_pointer_type (V4SI_type_node);
|
|
- tree V4SF_pointer_node = build_pointer_type (V4SF_type_node);
|
|
- tree V2DI_pointer_node = build_pointer_type (V2DI_type_node);
|
|
+ V8QI_pointer_node = build_pointer_type (V8QI_type_node);
|
|
+ V4HI_pointer_node = build_pointer_type (V4HI_type_node);
|
|
+ V2SI_pointer_node = build_pointer_type (V2SI_type_node);
|
|
+ V2SF_pointer_node = build_pointer_type (V2SF_type_node);
|
|
+ V16QI_pointer_node = build_pointer_type (V16QI_type_node);
|
|
+ V8HI_pointer_node = build_pointer_type (V8HI_type_node);
|
|
+ V4SI_pointer_node = build_pointer_type (V4SI_type_node);
|
|
+ V4SF_pointer_node = build_pointer_type (V4SF_type_node);
|
|
+ V2DI_pointer_node = build_pointer_type (V2DI_type_node);
|
|
|
|
/* 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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
types on. If you change these names you'll need to change
|
|
the table used by arm_mangle_type too. */
|