diff options
Diffstat (limited to 'recipes/gcc/gcc-4.4.2/gcc-release-branch/PR-36500-fix-neon.patch')
-rw-r--r-- | recipes/gcc/gcc-4.4.2/gcc-release-branch/PR-36500-fix-neon.patch | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/recipes/gcc/gcc-4.4.2/gcc-release-branch/PR-36500-fix-neon.patch b/recipes/gcc/gcc-4.4.2/gcc-release-branch/PR-36500-fix-neon.patch new file mode 100644 index 0000000000..971dfe7e29 --- /dev/null +++ b/recipes/gcc/gcc-4.4.2/gcc-release-branch/PR-36500-fix-neon.patch @@ -0,0 +1,265 @@ +--- 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. */ |