1 | *// RUN: %clang_builtins %s %librt -o %t && %run %t* |

2 | |

3 | __#define DOUBLE_PRECISION__ |

4 | __#include <fenv.h>__ |

5 | __#include <math.h>__ |

6 | __#include <stdio.h>__ |

7 | __#include "fp_lib.h"__ |

8 | |

9 | *int* test__compiler_rt_fmax(fp_t x, fp_t y) { |

10 | fp_t crt_value = __compiler_rt_fmax(x, y); |

11 | fp_t libm_value = fmax(x, y); |

12 | *// Consider +0 and -0 equal, and also disregard the sign/payload of two NaNs.* |

13 | **if** (crt_value != libm_value && |

14 | !(crt_isnan(crt_value) && crt_isnan(libm_value))) { |

15 | printf("error: in __compiler_rt_fmax(%a [%llX], %a [%llX]) = %a [%llX] " |

16 | "!= %a [%llX]\n" , |

17 | x, (*unsigned* *long* *long*)toRep(x), |

18 | y, (*unsigned* *long* *long*)toRep(y), |

19 | crt_value, (*unsigned* *long* *long*)toRep(crt_value), |

20 | libm_value, (*unsigned* *long* *long*)toRep(libm_value)); |

21 | **return** `1`; |

22 | } |

23 | **return** `0`; |

24 | } |

25 | |

26 | fp_t cases[] = { |

27 | -NAN, NAN, -INFINITY, INFINITY, -`0.0`, `0.0`, -`1`, `1`, -`2`, `2`, |

28 | -`0x1.0p-1023`, `0x1.0p-1023`, -`0x1.0p-1024`, `0x1.0p-1024`, *// subnormals* |

29 | -`1.001`, `1.001`, -`1.002`, `1.002`, |

30 | }; |

31 | |

32 | *int* main() { |

33 | *const* *unsigned* N = **sizeof**(cases) / **sizeof**(cases[`0`]); |

34 | *unsigned* i, j; |

35 | **for** (i = `0`; i < N; ++i) { |

36 | **for** (j = `0`; j < N; ++j) { |

37 | **if** (test__compiler_rt_fmax(cases[i], cases[j])) **return** `1`; |

38 | } |

39 | } |

40 | **return** `0`; |

41 | } |

42 | |