Commit 7171dc86 by Alan Lawrence Committed by Alan Lawrence

[AArch64] vreinterpret(q?), vget_(low|high), vld1(q?)_dup

gcc/:

	* config/aarch64/arm_neon.h (vreinterpret_p8_f16, vreinterpret_p16_f16,
	vreinterpret_f16_f64, vreinterpret_f16_s8, vreinterpret_f16_s16,
	vreinterpret_f16_s32, vreinterpret_f16_s64, vreinterpret_f16_f32,
	vreinterpret_f16_u8, vreinterpret_f16_u16, vreinterpret_f16_u32,
	vreinterpret_f16_u64, vreinterpret_f16_p8, vreinterpret_f16_p16,
	vreinterpretq_f16_f64, vreinterpretq_f16_s8, vreinterpretq_f16_s16,
	vreinterpretq_f16_s32, vreinterpretq_f16_s64, vreinterpretq_f16_f32,
	vreinterpretq_f16_u8, vreinterpretq_f16_u16, vreinterpretq_f16_u32,
	vreinterpretq_f16_u64, vreinterpretq_f16_p8, vreinterpretq_f16_p16,
	vreinterpret_f32_f16, vreinterpret_f64_f16, vreinterpret_s64_f16,
	vreinterpret_u64_f16, vreinterpretq_u64_f16, vreinterpret_s8_f16,
	vreinterpret_s16_f16, vreinterpret_s32_f16, vreinterpret_u8_f16,
	vreinterpret_u16_f16, vreinterpret_u32_f16, vreinterpretq_p8_f16,
	vreinterpretq_p16_f16, vreinterpretq_f32_f16, vreinterpretq_f64_f16,
	vreinterpretq_s64_f16, vreinterpretq_s8_f16, vreinterpretq_s16_f16,
	vreinterpretq_s32_f16, vreinterpretq_u8_f16, vreinterpretq_u16_f16,
	vreinterpretq_u32_f16, vget_low_f16, vget_high_f16, vld1_dup_f16,
	vld1q_dup_f16): New.

gcc/testsuite/:

	* gcc.target/aarch64/vget_high_1.c: Add float16x8->float16x4 case.
	* gcc.target/aarch64/vget_low_1.c: Likewise.

From-SVN: r227546
parent 922f9c25
2015-09-08 Alan Lawrence <alan.lawrence@arm.com> 2015-09-08 Alan Lawrence <alan.lawrence@arm.com>
* config/aarch64/arm_neon.h (vreinterpret_p8_f16, vreinterpret_p16_f16,
vreinterpret_f16_f64, vreinterpret_f16_s8, vreinterpret_f16_s16,
vreinterpret_f16_s32, vreinterpret_f16_s64, vreinterpret_f16_f32,
vreinterpret_f16_u8, vreinterpret_f16_u16, vreinterpret_f16_u32,
vreinterpret_f16_u64, vreinterpret_f16_p8, vreinterpret_f16_p16,
vreinterpretq_f16_f64, vreinterpretq_f16_s8, vreinterpretq_f16_s16,
vreinterpretq_f16_s32, vreinterpretq_f16_s64, vreinterpretq_f16_f32,
vreinterpretq_f16_u8, vreinterpretq_f16_u16, vreinterpretq_f16_u32,
vreinterpretq_f16_u64, vreinterpretq_f16_p8, vreinterpretq_f16_p16,
vreinterpret_f32_f16, vreinterpret_f64_f16, vreinterpret_s64_f16,
vreinterpret_u64_f16, vreinterpretq_u64_f16, vreinterpret_s8_f16,
vreinterpret_s16_f16, vreinterpret_s32_f16, vreinterpret_u8_f16,
vreinterpret_u16_f16, vreinterpret_u32_f16, vreinterpretq_p8_f16,
vreinterpretq_p16_f16, vreinterpretq_f32_f16, vreinterpretq_f64_f16,
vreinterpretq_s64_f16, vreinterpretq_s8_f16, vreinterpretq_s16_f16,
vreinterpretq_s32_f16, vreinterpretq_u8_f16, vreinterpretq_u16_f16,
vreinterpretq_u32_f16, vget_low_f16, vget_high_f16, vld1_dup_f16,
vld1q_dup_f16): New.
2015-09-08 Alan Lawrence <alan.lawrence@arm.com>
* config/aarch64/aarch64-simd.md (aarch64_float_truncate_lo_v2sf): * config/aarch64/aarch64-simd.md (aarch64_float_truncate_lo_v2sf):
Reparameterize to... Reparameterize to...
(aarch64_float_truncate_lo_<mode>): ...this, for both V2SF and V4HF. (aarch64_float_truncate_lo_<mode>): ...this, for both V2SF and V4HF.
......
...@@ -2890,6 +2890,12 @@ vgetq_lane_u64 (uint64x2_t __a, const int __b) ...@@ -2890,6 +2890,12 @@ vgetq_lane_u64 (uint64x2_t __a, const int __b)
/* vreinterpret */ /* vreinterpret */
__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__)) __extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
vreinterpret_p8_f16 (float16x4_t __a)
{
return (poly8x8_t) __a;
}
__extension__ static __inline poly8x8_t __attribute__ ((__always_inline__))
vreinterpret_p8_f64 (float64x1_t __a) vreinterpret_p8_f64 (float64x1_t __a)
{ {
return (poly8x8_t) __a; return (poly8x8_t) __a;
...@@ -2986,6 +2992,12 @@ vreinterpretq_p8_s64 (int64x2_t __a) ...@@ -2986,6 +2992,12 @@ vreinterpretq_p8_s64 (int64x2_t __a)
} }
__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__)) __extension__ static __inline poly8x16_t __attribute__ ((__always_inline__))
vreinterpretq_p8_f16 (float16x8_t __a)
{
return (poly8x16_t) __a;
}
__extension__ static __inline poly8x16_t __attribute__ ((__always_inline__))
vreinterpretq_p8_f32 (float32x4_t __a) vreinterpretq_p8_f32 (float32x4_t __a)
{ {
return (poly8x16_t) __a; return (poly8x16_t) __a;
...@@ -3022,6 +3034,12 @@ vreinterpretq_p8_p16 (poly16x8_t __a) ...@@ -3022,6 +3034,12 @@ vreinterpretq_p8_p16 (poly16x8_t __a)
} }
__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__)) __extension__ static __inline poly16x4_t __attribute__ ((__always_inline__))
vreinterpret_p16_f16 (float16x4_t __a)
{
return (poly16x4_t) __a;
}
__extension__ static __inline poly16x4_t __attribute__ ((__always_inline__))
vreinterpret_p16_f64 (float64x1_t __a) vreinterpret_p16_f64 (float64x1_t __a)
{ {
return (poly16x4_t) __a; return (poly16x4_t) __a;
...@@ -3118,6 +3136,12 @@ vreinterpretq_p16_s64 (int64x2_t __a) ...@@ -3118,6 +3136,12 @@ vreinterpretq_p16_s64 (int64x2_t __a)
} }
__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__)) __extension__ static __inline poly16x8_t __attribute__ ((__always_inline__))
vreinterpretq_p16_f16 (float16x8_t __a)
{
return (poly16x8_t) __a;
}
__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__))
vreinterpretq_p16_f32 (float32x4_t __a) vreinterpretq_p16_f32 (float32x4_t __a)
{ {
return (poly16x8_t) __a; return (poly16x8_t) __a;
...@@ -3153,6 +3177,156 @@ vreinterpretq_p16_p8 (poly8x16_t __a) ...@@ -3153,6 +3177,156 @@ vreinterpretq_p16_p8 (poly8x16_t __a)
return (poly16x8_t) __a; return (poly16x8_t) __a;
} }
__extension__ static __inline float16x4_t __attribute__ ((__always_inline__))
vreinterpret_f16_f64 (float64x1_t __a)
{
return (float16x4_t) __a;
}
__extension__ static __inline float16x4_t __attribute__ ((__always_inline__))
vreinterpret_f16_s8 (int8x8_t __a)
{
return (float16x4_t) __a;
}
__extension__ static __inline float16x4_t __attribute__ ((__always_inline__))
vreinterpret_f16_s16 (int16x4_t __a)
{
return (float16x4_t) __a;
}
__extension__ static __inline float16x4_t __attribute__ ((__always_inline__))
vreinterpret_f16_s32 (int32x2_t __a)
{
return (float16x4_t) __a;
}
__extension__ static __inline float16x4_t __attribute__ ((__always_inline__))
vreinterpret_f16_s64 (int64x1_t __a)
{
return (float16x4_t) __a;
}
__extension__ static __inline float16x4_t __attribute__ ((__always_inline__))
vreinterpret_f16_f32 (float32x2_t __a)
{
return (float16x4_t) __a;
}
__extension__ static __inline float16x4_t __attribute__ ((__always_inline__))
vreinterpret_f16_u8 (uint8x8_t __a)
{
return (float16x4_t) __a;
}
__extension__ static __inline float16x4_t __attribute__ ((__always_inline__))
vreinterpret_f16_u16 (uint16x4_t __a)
{
return (float16x4_t) __a;
}
__extension__ static __inline float16x4_t __attribute__ ((__always_inline__))
vreinterpret_f16_u32 (uint32x2_t __a)
{
return (float16x4_t) __a;
}
__extension__ static __inline float16x4_t __attribute__ ((__always_inline__))
vreinterpret_f16_u64 (uint64x1_t __a)
{
return (float16x4_t) __a;
}
__extension__ static __inline float16x4_t __attribute__ ((__always_inline__))
vreinterpret_f16_p8 (poly8x8_t __a)
{
return (float16x4_t) __a;
}
__extension__ static __inline float16x4_t __attribute__ ((__always_inline__))
vreinterpret_f16_p16 (poly16x4_t __a)
{
return (float16x4_t) __a;
}
__extension__ static __inline float16x8_t __attribute__ ((__always_inline__))
vreinterpretq_f16_f64 (float64x2_t __a)
{
return (float16x8_t) __a;
}
__extension__ static __inline float16x8_t __attribute__ ((__always_inline__))
vreinterpretq_f16_s8 (int8x16_t __a)
{
return (float16x8_t) __a;
}
__extension__ static __inline float16x8_t __attribute__ ((__always_inline__))
vreinterpretq_f16_s16 (int16x8_t __a)
{
return (float16x8_t) __a;
}
__extension__ static __inline float16x8_t __attribute__ ((__always_inline__))
vreinterpretq_f16_s32 (int32x4_t __a)
{
return (float16x8_t) __a;
}
__extension__ static __inline float16x8_t __attribute__ ((__always_inline__))
vreinterpretq_f16_s64 (int64x2_t __a)
{
return (float16x8_t) __a;
}
__extension__ static __inline float16x8_t __attribute__ ((__always_inline__))
vreinterpretq_f16_f32 (float32x4_t __a)
{
return (float16x8_t) __a;
}
__extension__ static __inline float16x8_t __attribute__ ((__always_inline__))
vreinterpretq_f16_u8 (uint8x16_t __a)
{
return (float16x8_t) __a;
}
__extension__ static __inline float16x8_t __attribute__ ((__always_inline__))
vreinterpretq_f16_u16 (uint16x8_t __a)
{
return (float16x8_t) __a;
}
__extension__ static __inline float16x8_t __attribute__ ((__always_inline__))
vreinterpretq_f16_u32 (uint32x4_t __a)
{
return (float16x8_t) __a;
}
__extension__ static __inline float16x8_t __attribute__ ((__always_inline__))
vreinterpretq_f16_u64 (uint64x2_t __a)
{
return (float16x8_t) __a;
}
__extension__ static __inline float16x8_t __attribute__ ((__always_inline__))
vreinterpretq_f16_p8 (poly8x16_t __a)
{
return (float16x8_t) __a;
}
__extension__ static __inline float16x8_t __attribute__ ((__always_inline__))
vreinterpretq_f16_p16 (poly16x8_t __a)
{
return (float16x8_t) __a;
}
__extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
vreinterpret_f32_f16 (float16x4_t __a)
{
return (float32x2_t) __a;
}
__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
vreinterpret_f32_f64 (float64x1_t __a) vreinterpret_f32_f64 (float64x1_t __a)
{ {
...@@ -3220,6 +3394,12 @@ vreinterpret_f32_p16 (poly16x4_t __a) ...@@ -3220,6 +3394,12 @@ vreinterpret_f32_p16 (poly16x4_t __a)
} }
__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) __extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
vreinterpretq_f32_f16 (float16x8_t __a)
{
return (float32x4_t) __a;
}
__extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
vreinterpretq_f32_f64 (float64x2_t __a) vreinterpretq_f32_f64 (float64x2_t __a)
{ {
return (float32x4_t) __a; return (float32x4_t) __a;
...@@ -3286,6 +3466,12 @@ vreinterpretq_f32_p16 (poly16x8_t __a) ...@@ -3286,6 +3466,12 @@ vreinterpretq_f32_p16 (poly16x8_t __a)
} }
__extension__ static __inline float64x1_t __attribute__((__always_inline__)) __extension__ static __inline float64x1_t __attribute__((__always_inline__))
vreinterpret_f64_f16 (float16x4_t __a)
{
return (float64x1_t) __a;
}
__extension__ static __inline float64x1_t __attribute__((__always_inline__))
vreinterpret_f64_f32 (float32x2_t __a) vreinterpret_f64_f32 (float32x2_t __a)
{ {
return (float64x1_t) __a; return (float64x1_t) __a;
...@@ -3352,6 +3538,12 @@ vreinterpret_f64_u64 (uint64x1_t __a) ...@@ -3352,6 +3538,12 @@ vreinterpret_f64_u64 (uint64x1_t __a)
} }
__extension__ static __inline float64x2_t __attribute__((__always_inline__)) __extension__ static __inline float64x2_t __attribute__((__always_inline__))
vreinterpretq_f64_f16 (float16x8_t __a)
{
return (float64x2_t) __a;
}
__extension__ static __inline float64x2_t __attribute__((__always_inline__))
vreinterpretq_f64_f32 (float32x4_t __a) vreinterpretq_f64_f32 (float32x4_t __a)
{ {
return (float64x2_t) __a; return (float64x2_t) __a;
...@@ -3418,6 +3610,12 @@ vreinterpretq_f64_u64 (uint64x2_t __a) ...@@ -3418,6 +3610,12 @@ vreinterpretq_f64_u64 (uint64x2_t __a)
} }
__extension__ static __inline int64x1_t __attribute__ ((__always_inline__)) __extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
vreinterpret_s64_f16 (float16x4_t __a)
{
return (int64x1_t) __a;
}
__extension__ static __inline int64x1_t __attribute__ ((__always_inline__))
vreinterpret_s64_f64 (float64x1_t __a) vreinterpret_s64_f64 (float64x1_t __a)
{ {
return (int64x1_t) __a; return (int64x1_t) __a;
...@@ -3508,6 +3706,12 @@ vreinterpretq_s64_s32 (int32x4_t __a) ...@@ -3508,6 +3706,12 @@ vreinterpretq_s64_s32 (int32x4_t __a)
} }
__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) __extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
vreinterpretq_s64_f16 (float16x8_t __a)
{
return (int64x2_t) __a;
}
__extension__ static __inline int64x2_t __attribute__ ((__always_inline__))
vreinterpretq_s64_f32 (float32x4_t __a) vreinterpretq_s64_f32 (float32x4_t __a)
{ {
return (int64x2_t) __a; return (int64x2_t) __a;
...@@ -3550,6 +3754,12 @@ vreinterpretq_s64_p16 (poly16x8_t __a) ...@@ -3550,6 +3754,12 @@ vreinterpretq_s64_p16 (poly16x8_t __a)
} }
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__)) __extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
vreinterpret_u64_f16 (float16x4_t __a)
{
return (uint64x1_t) __a;
}
__extension__ static __inline uint64x1_t __attribute__ ((__always_inline__))
vreinterpret_u64_f64 (float64x1_t __a) vreinterpret_u64_f64 (float64x1_t __a)
{ {
return (uint64x1_t) __a; return (uint64x1_t) __a;
...@@ -3646,6 +3856,12 @@ vreinterpretq_u64_s64 (int64x2_t __a) ...@@ -3646,6 +3856,12 @@ vreinterpretq_u64_s64 (int64x2_t __a)
} }
__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__)) __extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
vreinterpretq_u64_f16 (float16x8_t __a)
{
return (uint64x2_t) __a;
}
__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__))
vreinterpretq_u64_f32 (float32x4_t __a) vreinterpretq_u64_f32 (float32x4_t __a)
{ {
return (uint64x2_t) __a; return (uint64x2_t) __a;
...@@ -3682,6 +3898,12 @@ vreinterpretq_u64_p16 (poly16x8_t __a) ...@@ -3682,6 +3898,12 @@ vreinterpretq_u64_p16 (poly16x8_t __a)
} }
__extension__ static __inline int8x8_t __attribute__ ((__always_inline__)) __extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
vreinterpret_s8_f16 (float16x4_t __a)
{
return (int8x8_t) __a;
}
__extension__ static __inline int8x8_t __attribute__ ((__always_inline__))
vreinterpret_s8_f64 (float64x1_t __a) vreinterpret_s8_f64 (float64x1_t __a)
{ {
return (int8x8_t) __a; return (int8x8_t) __a;
...@@ -3772,6 +3994,12 @@ vreinterpretq_s8_s64 (int64x2_t __a) ...@@ -3772,6 +3994,12 @@ vreinterpretq_s8_s64 (int64x2_t __a)
} }
__extension__ static __inline int8x16_t __attribute__ ((__always_inline__)) __extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
vreinterpretq_s8_f16 (float16x8_t __a)
{
return (int8x16_t) __a;
}
__extension__ static __inline int8x16_t __attribute__ ((__always_inline__))
vreinterpretq_s8_f32 (float32x4_t __a) vreinterpretq_s8_f32 (float32x4_t __a)
{ {
return (int8x16_t) __a; return (int8x16_t) __a;
...@@ -3814,6 +4042,12 @@ vreinterpretq_s8_p16 (poly16x8_t __a) ...@@ -3814,6 +4042,12 @@ vreinterpretq_s8_p16 (poly16x8_t __a)
} }
__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) __extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
vreinterpret_s16_f16 (float16x4_t __a)
{
return (int16x4_t) __a;
}
__extension__ static __inline int16x4_t __attribute__ ((__always_inline__))
vreinterpret_s16_f64 (float64x1_t __a) vreinterpret_s16_f64 (float64x1_t __a)
{ {
return (int16x4_t) __a; return (int16x4_t) __a;
...@@ -3904,6 +4138,12 @@ vreinterpretq_s16_s64 (int64x2_t __a) ...@@ -3904,6 +4138,12 @@ vreinterpretq_s16_s64 (int64x2_t __a)
} }
__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) __extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
vreinterpretq_s16_f16 (float16x8_t __a)
{
return (int16x8_t) __a;
}
__extension__ static __inline int16x8_t __attribute__ ((__always_inline__))
vreinterpretq_s16_f32 (float32x4_t __a) vreinterpretq_s16_f32 (float32x4_t __a)
{ {
return (int16x8_t) __a; return (int16x8_t) __a;
...@@ -3946,6 +4186,12 @@ vreinterpretq_s16_p16 (poly16x8_t __a) ...@@ -3946,6 +4186,12 @@ vreinterpretq_s16_p16 (poly16x8_t __a)
} }
__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) __extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
vreinterpret_s32_f16 (float16x4_t __a)
{
return (int32x2_t) __a;
}
__extension__ static __inline int32x2_t __attribute__ ((__always_inline__))
vreinterpret_s32_f64 (float64x1_t __a) vreinterpret_s32_f64 (float64x1_t __a)
{ {
return (int32x2_t) __a; return (int32x2_t) __a;
...@@ -4036,6 +4282,12 @@ vreinterpretq_s32_s64 (int64x2_t __a) ...@@ -4036,6 +4282,12 @@ vreinterpretq_s32_s64 (int64x2_t __a)
} }
__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) __extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
vreinterpretq_s32_f16 (float16x8_t __a)
{
return (int32x4_t) __a;
}
__extension__ static __inline int32x4_t __attribute__ ((__always_inline__))
vreinterpretq_s32_f32 (float32x4_t __a) vreinterpretq_s32_f32 (float32x4_t __a)
{ {
return (int32x4_t) __a; return (int32x4_t) __a;
...@@ -4078,6 +4330,12 @@ vreinterpretq_s32_p16 (poly16x8_t __a) ...@@ -4078,6 +4330,12 @@ vreinterpretq_s32_p16 (poly16x8_t __a)
} }
__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__)) __extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
vreinterpret_u8_f16 (float16x4_t __a)
{
return (uint8x8_t) __a;
}
__extension__ static __inline uint8x8_t __attribute__ ((__always_inline__))
vreinterpret_u8_f64 (float64x1_t __a) vreinterpret_u8_f64 (float64x1_t __a)
{ {
return (uint8x8_t) __a; return (uint8x8_t) __a;
...@@ -4174,6 +4432,12 @@ vreinterpretq_u8_s64 (int64x2_t __a) ...@@ -4174,6 +4432,12 @@ vreinterpretq_u8_s64 (int64x2_t __a)
} }
__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__)) __extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
vreinterpretq_u8_f16 (float16x8_t __a)
{
return (uint8x16_t) __a;
}
__extension__ static __inline uint8x16_t __attribute__ ((__always_inline__))
vreinterpretq_u8_f32 (float32x4_t __a) vreinterpretq_u8_f32 (float32x4_t __a)
{ {
return (uint8x16_t) __a; return (uint8x16_t) __a;
...@@ -4210,6 +4474,12 @@ vreinterpretq_u8_p16 (poly16x8_t __a) ...@@ -4210,6 +4474,12 @@ vreinterpretq_u8_p16 (poly16x8_t __a)
} }
__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__)) __extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
vreinterpret_u16_f16 (float16x4_t __a)
{
return (uint16x4_t) __a;
}
__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__))
vreinterpret_u16_f64 (float64x1_t __a) vreinterpret_u16_f64 (float64x1_t __a)
{ {
return (uint16x4_t) __a; return (uint16x4_t) __a;
...@@ -4306,6 +4576,12 @@ vreinterpretq_u16_s64 (int64x2_t __a) ...@@ -4306,6 +4576,12 @@ vreinterpretq_u16_s64 (int64x2_t __a)
} }
__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__)) __extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
vreinterpretq_u16_f16 (float16x8_t __a)
{
return (uint16x8_t) __a;
}
__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__))
vreinterpretq_u16_f32 (float32x4_t __a) vreinterpretq_u16_f32 (float32x4_t __a)
{ {
return (uint16x8_t) __a; return (uint16x8_t) __a;
...@@ -4342,6 +4618,12 @@ vreinterpretq_u16_p16 (poly16x8_t __a) ...@@ -4342,6 +4618,12 @@ vreinterpretq_u16_p16 (poly16x8_t __a)
} }
__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__)) __extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
vreinterpret_u32_f16 (float16x4_t __a)
{
return (uint32x2_t) __a;
}
__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__))
vreinterpret_u32_f64 (float64x1_t __a) vreinterpret_u32_f64 (float64x1_t __a)
{ {
return (uint32x2_t) __a; return (uint32x2_t) __a;
...@@ -4438,6 +4720,12 @@ vreinterpretq_u32_s64 (int64x2_t __a) ...@@ -4438,6 +4720,12 @@ vreinterpretq_u32_s64 (int64x2_t __a)
} }
__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__)) __extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
vreinterpretq_u32_f16 (float16x8_t __a)
{
return (uint32x4_t) __a;
}
__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__))
vreinterpretq_u32_f32 (float32x4_t __a) vreinterpretq_u32_f32 (float32x4_t __a)
{ {
return (uint32x4_t) __a; return (uint32x4_t) __a;
...@@ -4638,6 +4926,12 @@ vsetq_lane_u64 (uint64_t __elem, uint64x2_t __vec, const int __index) ...@@ -4638,6 +4926,12 @@ vsetq_lane_u64 (uint64_t __elem, uint64x2_t __vec, const int __index)
uint64x1_t lo = vcreate_u64 (vgetq_lane_u64 (tmp, 0)); \ uint64x1_t lo = vcreate_u64 (vgetq_lane_u64 (tmp, 0)); \
return vreinterpret_##__TYPE##_u64 (lo); return vreinterpret_##__TYPE##_u64 (lo);
__extension__ static __inline float16x4_t __attribute__ ((__always_inline__))
vget_low_f16 (float16x8_t __a)
{
__GET_LOW (f16);
}
__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
vget_low_f32 (float32x4_t __a) vget_low_f32 (float32x4_t __a)
{ {
...@@ -4717,6 +5011,12 @@ vget_low_u64 (uint64x2_t __a) ...@@ -4717,6 +5011,12 @@ vget_low_u64 (uint64x2_t __a)
uint64x1_t hi = vcreate_u64 (vgetq_lane_u64 (tmp, 1)); \ uint64x1_t hi = vcreate_u64 (vgetq_lane_u64 (tmp, 1)); \
return vreinterpret_##__TYPE##_u64 (hi); return vreinterpret_##__TYPE##_u64 (hi);
__extension__ static __inline float16x4_t __attribute__ ((__always_inline__))
vget_high_f16 (float16x8_t __a)
{
__GET_HIGH (f16);
}
__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
vget_high_f32 (float32x4_t __a) vget_high_f32 (float32x4_t __a)
{ {
...@@ -14887,6 +15187,13 @@ vld1q_u64 (const uint64_t *a) ...@@ -14887,6 +15187,13 @@ vld1q_u64 (const uint64_t *a)
/* vld1_dup */ /* vld1_dup */
__extension__ static __inline float16x4_t __attribute__ ((__always_inline__))
vld1_dup_f16 (const float16_t* __a)
{
float16_t __f = *__a;
return (float16x4_t) { __f, __f, __f, __f };
}
__extension__ static __inline float32x2_t __attribute__ ((__always_inline__)) __extension__ static __inline float32x2_t __attribute__ ((__always_inline__))
vld1_dup_f32 (const float32_t* __a) vld1_dup_f32 (const float32_t* __a)
{ {
...@@ -14961,6 +15268,13 @@ vld1_dup_u64 (const uint64_t* __a) ...@@ -14961,6 +15268,13 @@ vld1_dup_u64 (const uint64_t* __a)
/* vld1q_dup */ /* vld1q_dup */
__extension__ static __inline float16x8_t __attribute__ ((__always_inline__))
vld1q_dup_f16 (const float16_t* __a)
{
float16_t __f = *__a;
return (float16x8_t) { __f, __f, __f, __f, __f, __f, __f, __f };
}
__extension__ static __inline float32x4_t __attribute__ ((__always_inline__)) __extension__ static __inline float32x4_t __attribute__ ((__always_inline__))
vld1q_dup_f32 (const float32_t* __a) vld1q_dup_f32 (const float32_t* __a)
{ {
......
2015-09-08 Alan Lawrence <alan.lawrence@arm.com> 2015-09-08 Alan Lawrence <alan.lawrence@arm.com>
* gcc.target/aarch64/vget_high_1.c: Add float16x8->float16x4 case.
* gcc.target/aarch64/vget_low_1.c: Likewise.
2015-09-08 Alan Lawrence <alan.lawrence@arm.com>
* gcc.target/aarch64/vldN_1.c: Add float16x4_t and float16x8_t cases. * gcc.target/aarch64/vldN_1.c: Add float16x4_t and float16x8_t cases.
* gcc.target/aarch64/vldN_dup_1.c: Likewise. * gcc.target/aarch64/vldN_dup_1.c: Likewise.
* gcc.target/aarch64/vldN_lane_1.c: Likewise. * gcc.target/aarch64/vldN_lane_1.c: Likewise.
......
...@@ -14,6 +14,7 @@ VARIANT (int8_t, 8, int8x8_t, int8x16_t, s8) \ ...@@ -14,6 +14,7 @@ VARIANT (int8_t, 8, int8x8_t, int8x16_t, s8) \
VARIANT (int16_t, 4, int16x4_t, int16x8_t, s16) \ VARIANT (int16_t, 4, int16x4_t, int16x8_t, s16) \
VARIANT (int32_t, 2, int32x2_t, int32x4_t, s32) \ VARIANT (int32_t, 2, int32x2_t, int32x4_t, s32) \
VARIANT (int64_t, 1, int64x1_t, int64x2_t, s64) \ VARIANT (int64_t, 1, int64x1_t, int64x2_t, s64) \
VARIANT (float16_t, 4, float16x4_t, float16x8_t, f16) \
VARIANT (float32_t, 2, float32x2_t, float32x4_t, f32) \ VARIANT (float32_t, 2, float32x2_t, float32x4_t, f32) \
VARIANT (float64_t, 1, float64x1_t, float64x2_t, f64) VARIANT (float64_t, 1, float64x1_t, float64x2_t, f64)
...@@ -51,6 +52,8 @@ main (int argc, char **argv) ...@@ -51,6 +52,8 @@ main (int argc, char **argv)
int16_t int16_t_data[8] = { -17, 19, 3, -999, 44048, 505, 9999, 1000}; int16_t int16_t_data[8] = { -17, 19, 3, -999, 44048, 505, 9999, 1000};
int32_t int32_t_data[4] = { 123456789, -987654321, -135792468, 975318642 }; int32_t int32_t_data[4] = { 123456789, -987654321, -135792468, 975318642 };
int64_t int64_t_data[2] = {0xfedcba9876543210LL, 0xdeadbabecafebeefLL }; int64_t int64_t_data[2] = {0xfedcba9876543210LL, 0xdeadbabecafebeefLL };
float16_t float16_t_data[8] = { 1.25, 4.5, 7.875, 2.3125, 5.675, 8.875,
3.6875, 6.75};
float32_t float32_t_data[4] = { 3.14159, 2.718, 1.414, 100.0 }; float32_t float32_t_data[4] = { 3.14159, 2.718, 1.414, 100.0 };
float64_t float64_t_data[2] = { 1.01001000100001, 12345.6789 }; float64_t float64_t_data[2] = { 1.01001000100001, 12345.6789 };
......
...@@ -14,6 +14,7 @@ VARIANT (int8_t, 8, int8x8_t, int8x16_t, s8) \ ...@@ -14,6 +14,7 @@ VARIANT (int8_t, 8, int8x8_t, int8x16_t, s8) \
VARIANT (int16_t, 4, int16x4_t, int16x8_t, s16) \ VARIANT (int16_t, 4, int16x4_t, int16x8_t, s16) \
VARIANT (int32_t, 2, int32x2_t, int32x4_t, s32) \ VARIANT (int32_t, 2, int32x2_t, int32x4_t, s32) \
VARIANT (int64_t, 1, int64x1_t, int64x2_t, s64) \ VARIANT (int64_t, 1, int64x1_t, int64x2_t, s64) \
VARIANT (float16_t, 4, float16x4_t, float16x8_t, f16) \
VARIANT (float32_t, 2, float32x2_t, float32x4_t, f32) \ VARIANT (float32_t, 2, float32x2_t, float32x4_t, f32) \
VARIANT (float64_t, 1, float64x1_t, float64x2_t, f64) VARIANT (float64_t, 1, float64x1_t, float64x2_t, f64)
...@@ -51,6 +52,8 @@ main (int argc, char **argv) ...@@ -51,6 +52,8 @@ main (int argc, char **argv)
int16_t int16_t_data[8] = { -17, 19, 3, -999, 44048, 505, 9999, 1000}; int16_t int16_t_data[8] = { -17, 19, 3, -999, 44048, 505, 9999, 1000};
int32_t int32_t_data[4] = { 123456789, -987654321, -135792468, 975318642 }; int32_t int32_t_data[4] = { 123456789, -987654321, -135792468, 975318642 };
int64_t int64_t_data[2] = {0xfedcba9876543210LL, 0xdeadbabecafebeefLL }; int64_t int64_t_data[2] = {0xfedcba9876543210LL, 0xdeadbabecafebeefLL };
float16_t float16_t_data[8] = { 1.25, 4.5, 7.875, 2.3125, 5.675, 8.875,
3.6875, 6.75};
float32_t float32_t_data[4] = { 3.14159, 2.718, 1.414, 100.0 }; float32_t float32_t_data[4] = { 3.14159, 2.718, 1.414, 100.0 };
float64_t float64_t_data[2] = { 1.01001000100001, 12345.6789 }; float64_t float64_t_data[2] = { 1.01001000100001, 12345.6789 };
......
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