blob: 6aa3e59c15e0eb85595871b47e8d8aa937cca47e [file] [log] [blame]
/* { dg-do run } */
/* { dg-options "-O2" } */
/* { dg-additional-options "-mfp16-format=ieee" {target "arm*-*-*"} } */
extern void abort (void);
#define EPSILON 0.0001
int
main (int argc, char **argv)
{
int i1 = 3;
int i2 = 2;
/* This 'assembler' should be portable across ARM and AArch64. */
asm volatile ("" : : : "memory");
__fp16 in1 = i1;
__fp16 in2 = i2;
/* Do the addition on __fp16's (implicitly converts both operands to
float32, adds, converts back to f16, then we convert to int). */
__fp16 res1 = in1 + in2;
asm volatile ("" : : : "memory");
int result1 = res1;
/* Do the addition on int's (we convert both operands directly to int, add,
and we're done). */
int result2 = ((int) in1) + ((int) in2);
if (__builtin_abs (result2 - result1) > EPSILON)
abort ();
return 0;
}