! { dg-do run }
! { dg-require-effective-target sse2_runtime { target { i?86-*-* x86_64-*-* } } }
! { dg-additional-options "-msse2 -mfpmath=sse" { target { i?86-*-* x86_64-*-* } } }

program test_underflow_control
  use ieee_arithmetic
  use iso_fortran_env

  logical l
  real, volatile :: x
  double precision, volatile :: y
  integer, parameter :: kx = kind(x), ky = kind(y)

  if (ieee_support_underflow_control(x)) then

    x = tiny(x)
    call ieee_set_underflow_mode(.true.)
    x = x / 2000._kx
    if (x == 0) call abort
    call ieee_get_underflow_mode(l)
    if (.not. l) call abort

    x = tiny(x)
    call ieee_set_underflow_mode(.false.)
    x = x / 2000._kx
    if (x > 0) call abort
    call ieee_get_underflow_mode(l)
    if (l) call abort

  end if

  if (ieee_support_underflow_control(y)) then

    y = tiny(y)
    call ieee_set_underflow_mode(.true.)
    y = y / 2000._ky
    if (y == 0) call abort
    call ieee_get_underflow_mode(l)
    if (.not. l) call abort

    y = tiny(y)
    call ieee_set_underflow_mode(.false.)
    y = y / 2000._ky
    if (y > 0) call abort
    call ieee_get_underflow_mode(l)
    if (l) call abort

  end if

end program
