| /* Test __bf16 complex arithmetic. */ |
| /* { dg-do run } */ |
| /* { dg-options "" } */ |
| /* { dg-add-options bfloat16 } */ |
| /* { dg-require-effective-target bfloat16_runtime } */ |
| |
| extern void exit (int); |
| extern void abort (void); |
| |
| volatile __bf16 a = 1.0bf16; |
| typedef _Complex float __cbf16 __attribute__((__mode__(__BC__))); |
| volatile __cbf16 b = __builtin_complex (2.0bf16, 3.0bf16); |
| volatile __cbf16 c = __builtin_complex (2.0bf16, 3.0bf16); |
| volatile __cbf16 d = __builtin_complex (2.0bf16, 3.0bf16); |
| |
| __cbf16 |
| fn (__cbf16 arg) |
| { |
| return arg / 4; |
| } |
| |
| int |
| main (void) |
| { |
| volatile __cbf16 r; |
| if (b != c) |
| abort (); |
| if (b != d) |
| abort (); |
| r = a + b; |
| if (__real__ r != 3.0bf16 || __imag__ r != 3.0bf16) |
| abort (); |
| r += d; |
| if (__real__ r != 5.0bf16 || __imag__ r != 6.0bf16) |
| abort (); |
| r -= a; |
| if (__real__ r != 4.0bf16 || __imag__ r != 6.0bf16) |
| abort (); |
| r /= (a + a); |
| if (__real__ r != 2.0bf16 || __imag__ r != 3.0bf16) |
| abort (); |
| r *= (a + a); |
| if (__real__ r != 4.0bf16 || __imag__ r != 6.0bf16) |
| abort (); |
| r -= b; |
| if (__real__ r != 2.0bf16 || __imag__ r != 3.0bf16) |
| abort (); |
| r *= r; |
| if (__real__ r != -5.0bf16 || __imag__ r != 12.0bf16) |
| abort (); |
| /* Division may not be exact, so round result before comparing. */ |
| r /= b; |
| r += __builtin_complex (100.0bf16, 100.0bf16); |
| r -= __builtin_complex (100.0bf16, 100.0bf16); |
| if (r != b) |
| abort (); |
| r = fn (r); |
| if (__real__ r != 0.5bf16 || __imag__ r != 0.75bf16) |
| abort (); |
| exit (0); |
| } |