blob: ea751da72b23364f01bd710b62ebef744d953107 [file] [log] [blame]
/* { dg-do run } */
/* { dg-require-effective-target arm_v8_2a_fp16_scalar_hw } */
/* { dg-add-options arm_v8_2a_fp16_neon } */
/* { dg-skip-if "" { arm*-*-* } } */
#include <arm_neon.h>
#include "arm-neon-ref.h"
#include "compute-ref-data.h"
#define FP16_C(a) ((__fp16) a)
#define A0 FP16_C (123.4)
#define B0 FP16_C (-5.8)
#define C0 FP16_C (-3.8)
#define D0 FP16_C (10)
#define A1 FP16_C (12.4)
#define B1 FP16_C (-5.8)
#define C1 FP16_C (90.8)
#define D1 FP16_C (24)
#define A2 FP16_C (23.4)
#define B2 FP16_C (-5.8)
#define C2 FP16_C (8.9)
#define D2 FP16_C (4)
#define E0 FP16_C (3.4)
#define F0 FP16_C (-55.8)
#define G0 FP16_C (-31.8)
#define H0 FP16_C (2)
#define E1 FP16_C (123.4)
#define F1 FP16_C (-5.8)
#define G1 FP16_C (-3.8)
#define H1 FP16_C (102)
#define E2 FP16_C (4.9)
#define F2 FP16_C (-15.8)
#define G2 FP16_C (39.8)
#define H2 FP16_C (49)
extern void abort ();
float16_t src1[8] = { A0, B0, C0, D0, E0, F0, G0, H0 };
float16_t src2[8] = { A1, B1, C1, D1, E1, F1, G1, H1 };
VECT_VAR_DECL (src3, float, 16, 4) [] = { A2, B2, C2, D2 };
VECT_VAR_DECL (src3, float, 16, 8) [] = { A2, B2, C2, D2, E2, F2, G2, H2 };
/* Expected results for vfmah_lane_f16. */
uint16_t expected[4] = { 0x5E76 /* A0 + A1 * A2. */,
0x4EF6 /* B0 + B1 * B2. */,
0x6249 /* C0 + C1 * C2. */,
0x56A0 /* D0 + D1 * D2. */ };
/* Expected results for vfmah_laneq_f16. */
uint16_t expected_laneq[8] = { 0x5E76 /* A0 + A1 * A2. */,
0x4EF6 /* B0 + B1 * B2. */,
0x6249 /* C0 + C1 * C2. */,
0x56A0 /* D0 + D1 * D2. */,
0x60BF /* E0 + E1 * E2. */,
0x507A /* F0 + F1 * F2. */,
0xD9B9 /* G0 + G1 * G2. */,
0x6CE2 /* H0 + H1 * H2. */ };
/* Expected results for vfmsh_lane_f16. */
uint16_t expected_fms[4] = { 0xD937 /* A0 + -A1 * A2. */,
0xD0EE /* B0 + -B1 * B2. */,
0xE258 /* C0 + -C1 * C2. */,
0xD560 /* D0 + -D1 * D2. */ };
/* Expected results for vfmsh_laneq_f16. */
uint16_t expected_fms_laneq[8] = { 0xD937 /* A0 + -A1 * A2. */,
0xD0EE /* B0 + -B1 * B2. */,
0xE258 /* C0 + -C1 * C2. */,
0xD560 /* D0 + -D1 * D2. */,
0xE0B2 /* E0 + -E1 * E2. */,
0xD89C /* F0 + -F1 * F2. */,
0x5778 /* G0 + -G1 * G2. */,
0xECE1 /* H0 + -H1 * H2. */ };
void exec_vfmash_lane_f16 (void)
{
#define CHECK_LANE(N) \
ret = vfmah_lane_f16 (src1[N], src2[N], VECT_VAR (vsrc3, float, 16, 4), N);\
if (*(uint16_t *) &ret != expected[N])\
abort ();
DECL_VARIABLE(vsrc3, float, 16, 4);
VLOAD (vsrc3, src3, , float, f, 16, 4);
float16_t ret;
CHECK_LANE(0)
CHECK_LANE(1)
CHECK_LANE(2)
CHECK_LANE(3)
#undef CHECK_LANE
#define CHECK_LANE(N) \
ret = vfmah_laneq_f16 (src1[N], src2[N], VECT_VAR (vsrc3, float, 16, 8), N);\
if (*(uint16_t *) &ret != expected_laneq[N]) \
abort ();
DECL_VARIABLE(vsrc3, float, 16, 8);
VLOAD (vsrc3, src3, q, float, f, 16, 8);
CHECK_LANE(0)
CHECK_LANE(1)
CHECK_LANE(2)
CHECK_LANE(3)
CHECK_LANE(4)
CHECK_LANE(5)
CHECK_LANE(6)
CHECK_LANE(7)
#undef CHECK_LANE
#define CHECK_LANE(N) \
ret = vfmsh_lane_f16 (src1[N], src2[N], VECT_VAR (vsrc3, float, 16, 4), N);\
if (*(uint16_t *) &ret != expected_fms[N])\
abort ();
CHECK_LANE(0)
CHECK_LANE(1)
CHECK_LANE(2)
#undef CHECK_LANE
#define CHECK_LANE(N) \
ret = vfmsh_laneq_f16 (src1[N], src2[N], VECT_VAR (vsrc3, float, 16, 8), N);\
if (*(uint16_t *) &ret != expected_fms_laneq[N]) \
abort ();
CHECK_LANE(0)
CHECK_LANE(1)
CHECK_LANE(2)
CHECK_LANE(3)
CHECK_LANE(4)
CHECK_LANE(5)
CHECK_LANE(6)
CHECK_LANE(7)
}
int
main (void)
{
exec_vfmash_lane_f16 ();
return 0;
}