| C Test for bug in reg-stack handling conditional moves. |
| C Reported by Tim Prince <tprince@computer.org> |
| C |
| C { dg-do run { target "i[6789]86-*-*" } } |
| C { dg-options "-ffast-math -march=pentiumpro" } |
| |
| double precision function foo(x, y) |
| implicit none |
| double precision x, y |
| double precision a, b, c, d |
| if (x /= y) then |
| if (x * y >= 0) then |
| a = abs(x) |
| b = abs(y) |
| c = max(a, b) |
| d = min(a, b) |
| foo = 1 - d/c |
| else |
| foo = 1 |
| end if |
| else |
| foo = 0 |
| end if |
| end |
| |
| program test |
| implicit none |
| |
| integer ntests |
| parameter (ntests=7) |
| double precision tolerance |
| parameter (tolerance=1.0D-6) |
| |
| C Each column is a pair of values to feed to foo, |
| C and its expected return value. |
| double precision a(ntests) /1, -23, -1, 1, 9, 10, -9/ |
| double precision b(ntests) /1, -23, 12, -12, 10, 9, -10/ |
| double precision x(ntests) /0, 0, 1, 1, 0.1, 0.1, 0.1/ |
| |
| double precision foo |
| double precision result |
| integer i |
| |
| do i = 1, ntests |
| result = foo(a(i), b(i)) |
| if (abs(result - x(i)) > tolerance) then |
| print *, i, a(i), b(i), x(i), result |
| call abort |
| end if |
| end do |
| end |