[ARM] Add V8HFmode and float16x8_t type
authorAlan Lawrence <alan.lawrence@arm.com>
Tue, 8 Sep 2015 18:30:07 +0000 (18:30 +0000)
committerAlan Lawrence <alalaw01@gcc.gnu.org>
Tue, 8 Sep 2015 18:30:07 +0000 (18:30 +0000)
* config/arm/arm.h (VALID_NEON_QREG_MODE): Add V8HFmode.

* config/arm/arm.c (arm_vector_mode_supported_p): Support V8HFmode.

* config/arm/arm-builtins.c (v8hf_UP): New.
(arm_init_simd_builtin_types): Initialise Float16x8_t.

* config/arm/arm-simd-builtin-types.def (Float16x8_t): New.

* config/arm/arm_neon.h (float16x8_t): New typedef.

From-SVN: r227536

gcc/ChangeLog
gcc/config/arm/arm-builtins.c
gcc/config/arm/arm-simd-builtin-types.def
gcc/config/arm/arm.c
gcc/config/arm/arm.h
gcc/config/arm/arm_neon.h

index 26a277be1966238fcbdf1246815e0cb0289fef23..9416f90ebbf1820a0beb8f85ae7d3711d1a67317 100644 (file)
@@ -1,3 +1,15 @@
+2015-09-07  Alan Lawrence  <alan.lawrence.com>
+       
+       * config/arm/arm.h (VALID_NEON_QREG_MODE): Add V8HFmode.
+       
+       * config/arm/arm.c (arm_vector_mode_supported_p): Support V8HFmode.
+       
+       * config/arm/arm-builtins.c (v8hf_UP): New.
+       (arm_init_simd_builtin_types): Initialise Float16x8_t.
+       
+       * config/arm/arm-simd-builtin-types.def (Float16x8_t): New.
+       
+       * config/arm/arm_neon.h (float16x8_t): New typedef.
 2015-09-07  Alan Lawrence  <alan.lawrence@arm.com>
 
        * config/arm/arm_neon.h (float16_t, vget_lane_f16, vset_lane_f16,
index 4391f17c6556b8bd9e1fced18cc3c605c37a9994..342c138eab76a74c428458410c1401c0d5181fd8 100644 (file)
@@ -190,6 +190,7 @@ arm_storestruct_lane_qualifiers[SIMD_MAX_BUILTIN_ARGS]
 #define di_UP    DImode
 #define v16qi_UP V16QImode
 #define v8hi_UP  V8HImode
+#define v8hf_UP  V8HFmode
 #define v4si_UP  V4SImode
 #define v4sf_UP  V4SFmode
 #define v2di_UP  V2DImode
@@ -819,6 +820,7 @@ arm_init_simd_builtin_types (void)
   /* The __builtin_simd{64,128}_float16 types are kept private unless
      we have a scalar __fp16 type.  */
   arm_simd_types[Float16x4_t].eltype = arm_simd_floatHF_type_node;
+  arm_simd_types[Float16x8_t].eltype = arm_simd_floatHF_type_node;
   arm_simd_types[Float32x2_t].eltype = float_type_node;
   arm_simd_types[Float32x4_t].eltype = float_type_node;
 
index bcbd20be057d8bc6c94ca155eb6051f20e5300b6..b178ae6c05f0c532b105b30f9a2706c9f0aa8afe 100644 (file)
@@ -44,5 +44,7 @@
 
   ENTRY (Float16x4_t, V4HF, none, 64, float16, 18)
   ENTRY (Float32x2_t, V2SF, none, 64, float32, 18)
+
+  ENTRY (Float16x8_t, V8HF, none, 128, float16, 19)
   ENTRY (Float32x4_t, V4SF, none, 128, float32, 19)
 
index fa4e083adfe215b5820237f3cc6b449dbdefc778..f343d533396c60590c8e6e56d1fff725e4287f21 100644 (file)
@@ -26278,7 +26278,8 @@ arm_vector_mode_supported_p (machine_mode mode)
 {
   /* Neon also supports V2SImode, etc. listed in the clause below.  */
   if (TARGET_NEON && (mode == V2SFmode || mode == V4SImode || mode == V8HImode
-      || mode == V4HFmode || mode == V16QImode || mode == V4SFmode || mode == V2DImode))
+      || mode == V4HFmode || mode == V16QImode || mode == V4SFmode
+      || mode == V2DImode || mode == V8HFmode))
     return true;
 
   if ((TARGET_NEON || TARGET_IWMMXT)
index eee9e8b551ffa11f0d7109db815f6687bf3554c2..f7a9d6386739962da0b472db6ddd4c94ec985d45 100644 (file)
@@ -1016,7 +1016,7 @@ extern int arm_arch_crc;
 /* Modes valid for Neon Q registers.  */
 #define VALID_NEON_QREG_MODE(MODE) \
   ((MODE) == V4SImode || (MODE) == V8HImode || (MODE) == V16QImode \
-   || (MODE) == V4SFmode || (MODE) == V2DImode)
+   || (MODE) == V8HFmode || (MODE) == V4SFmode || (MODE) == V2DImode)
 
 /* Structure modes valid for Neon registers.  */
 #define VALID_NEON_STRUCT_MODE(MODE) \
index 3c40f9f94fae30cab5e8833d72d0ac9ff3ac7b0f..10d2de945e16d8056a7f137bc6d892617576ddb8 100644 (file)
@@ -60,6 +60,9 @@ typedef __simd128_int8_t int8x16_t;
 typedef __simd128_int16_t int16x8_t;
 typedef __simd128_int32_t int32x4_t;
 typedef __simd128_int64_t int64x2_t;
+#if defined (__ARM_FP16_FORMAT_IEEE) || defined (__ARM_FP16_FORMAT_ALTERNATIVE)
+typedef __simd128_float16_t float16x8_t;
+#endif
 typedef __simd128_float32_t float32x4_t;
 typedef __simd128_poly8_t poly8x16_t;
 typedef __simd128_poly16_t poly16x8_t;