diff --git a/Fortran/UnitTests/CMakeLists.txt b/Fortran/UnitTests/CMakeLists.txt index 695ff0f397..00178231e7 100644 --- a/Fortran/UnitTests/CMakeLists.txt +++ b/Fortran/UnitTests/CMakeLists.txt @@ -4,3 +4,4 @@ add_subdirectory(assign-goto) add_subdirectory(execute_command_line) add_subdirectory(fcvs21_f95) # NIST Fortran Compiler Validation Suite add_subdirectory(finalization) +add_subdirectory(fp_conversions) diff --git a/Fortran/UnitTests/fp_conversions/CMakeLists.txt b/Fortran/UnitTests/fp_conversions/CMakeLists.txt new file mode 100644 index 0000000000..597f565626 --- /dev/null +++ b/Fortran/UnitTests/fp_conversions/CMakeLists.txt @@ -0,0 +1,21 @@ +include(CheckFortranSourceCompiles) + +CHECK_FORTRAN_SOURCE_COMPILES(" +real(kind=16)::r +integer(kind=16)::i +end +" FORTRAN_HAS_R16) + +list(APPEND FFLAGS -funsigned) + +if(FORTRAN_HAS_R16) + message(STATUS "Fortran compiler supports real(kind=16)") + set(Source fp_convert_r16.f90) + llvm_singlesource() +else() + message(STATUS "Fortran compiler does not support real(kind=16)") +endif() + +set(Source fp_convert.f90) +llvm_singlesource() +file(COPY lit.local.cfg DESTINATION "${CMAKE_CURRENT_BINARY_DIR}") diff --git a/Fortran/UnitTests/fp_conversions/fp_convert.f90 b/Fortran/UnitTests/fp_conversions/fp_convert.f90 new file mode 100644 index 0000000000..55107b5f43 --- /dev/null +++ b/Fortran/UnitTests/fp_conversions/fp_convert.f90 @@ -0,0 +1,81 @@ +module fp_convert_m + implicit none + type answer + integer(kind=1) :: i8 + integer(kind=2) :: i16 + integer(kind=4) :: i32 + integer(kind=8) :: i64 + unsigned(kind=1) :: u8 + unsigned(kind=2) :: u16 + unsigned(kind=4) :: u32 + unsigned(kind=8) :: u64 + end type answer + +contains + subroutine print_answer(a) + type(answer), intent(in) :: a + print *, a%i8 + print *, a%i16 + print *, a%i32 + print *, a%i64 + print *, a%u8 + print *, a%u16 + print *, a%u32 + print *, a%u64 + end subroutine print_answer + + function do_conversion(value) result(result) + real(kind=8), intent(in) :: value + type(answer) :: result + result%i8 = int(value, kind=1) + result%i16 = int(value, kind=2) + result%i32 = int(value, kind=4) + result%i64 = int(value, kind=8) + + result%u8 = uint(value, kind=1) + result%u16 = uint(value, kind=2) + result%u32 = uint(value, kind=4) + result%u64 = uint(value, kind=8) + end function do_conversion + + subroutine testcase(value) + real(kind=8), intent(in) :: value + type(answer) :: result + result = do_conversion(value) + call print_answer(result) + end subroutine testcase +end module fp_convert_m + +program fp_convert + use ieee_arithmetic, only: ieee_value, ieee_quiet_nan, ieee_positive_inf, ieee_negative_inf + use fp_convert_m + implicit none + + real(kind=8) :: r64, nan, inf, ninf + + nan = ieee_value(nan, ieee_quiet_nan) + inf = ieee_value(inf, ieee_positive_inf) + ninf = ieee_value(ninf, ieee_negative_inf) + + print *, "huge" + call testcase(huge(r64)) + + print *, "-huge" + call testcase(-huge(r64)) + + print *, "tiny" + call testcase(tiny(r64)) + + print *, "-tiny" + call testcase(-tiny(r64)) + + print *, "inf" + call testcase(inf) + + print *, "-inf" + call testcase(ninf) + + print *, "nan" + call testcase(nan) + +end program fp_convert diff --git a/Fortran/UnitTests/fp_conversions/fp_convert.reference_output b/Fortran/UnitTests/fp_conversions/fp_convert.reference_output new file mode 100644 index 0000000000..9ba188b053 --- /dev/null +++ b/Fortran/UnitTests/fp_conversions/fp_convert.reference_output @@ -0,0 +1,64 @@ + huge + 127 + 32767 + 2147483647 + 9223372036854775807 + 255 + 65535 + 4294967295 + 18446744073709551615 + -huge + -128 + -32768 + -2147483648 + -9223372036854775808 + 0 + 0 + 0 + 0 + tiny + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + -tiny + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + inf + 127 + 32767 + 2147483647 + 9223372036854775807 + 255 + 65535 + 4294967295 + 18446744073709551615 + -inf + -128 + -32768 + -2147483648 + -9223372036854775808 + 0 + 0 + 0 + 0 + nan + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 +exit 0 diff --git a/Fortran/UnitTests/fp_conversions/fp_convert_r16.f90 b/Fortran/UnitTests/fp_conversions/fp_convert_r16.f90 new file mode 100644 index 0000000000..ee6ff29fe6 --- /dev/null +++ b/Fortran/UnitTests/fp_conversions/fp_convert_r16.f90 @@ -0,0 +1,86 @@ +module fp_convert_r16_m + implicit none + type answer + integer(kind=1) :: i8 + integer(kind=2) :: i16 + integer(kind=4) :: i32 + integer(kind=8) :: i64 + integer(kind=16) :: i128 + unsigned(kind=1) :: u8 + unsigned(kind=2) :: u16 + unsigned(kind=4) :: u32 + unsigned(kind=8) :: u64 + unsigned(kind=16) :: u128 + end type answer +contains + + subroutine print_answer(a) + type(answer), intent(in) :: a + print *, a%i8 + print *, a%i16 + print *, a%i32 + print *, a%i64 + print *, a%i128 + print *, a%u8 + print *, a%u16 + print *, a%u32 + print *, a%u64 + print *, a%u128 + end subroutine print_answer + + function do_conversion(value) result(result) + real(kind=16), intent(in) :: value + type(answer) :: result + result%i8 = int(value, kind=1) + result%i16 = int(value, kind=2) + result%i32 = int(value, kind=4) + result%i64 = int(value, kind=8) + result%i128 = int(value, kind=16) + result%u8 = uint(value, kind=1) + result%u16 = uint(value, kind=2) + result%u32 = uint(value, kind=4) + result%u64 = uint(value, kind=8) + result%u128 = uint(value, kind=16) + end function do_conversion + + subroutine testcase(value) + real(kind=16), intent(in) :: value + type(answer) :: result + result = do_conversion(value) + call print_answer(result) + end subroutine +end module fp_convert_r16_m + +program fp_convert_r16 + use ieee_arithmetic, only: ieee_value, ieee_quiet_nan, ieee_positive_inf, ieee_negative_inf + use fp_convert_r16_m + implicit none + + real(kind=16) :: r128, nan, inf, ninf + + nan = ieee_value(nan, ieee_quiet_nan) + inf = ieee_value(inf, ieee_positive_inf) + ninf = ieee_value(ninf, ieee_negative_inf) + + print *, "huge" + call testcase(huge(r128)) + + print *, "-huge" + call testcase(-huge(r128)) + + print *, "tiny" + call testcase(tiny(r128)) + + print *, "-tiny" + call testcase(-tiny(r128)) + + print *, "inf" + call testcase(inf) + + print *, "-inf" + call testcase(ninf) + + print *, "nan" + call testcase(nan) + +end program fp_convert_r16 diff --git a/Fortran/UnitTests/fp_conversions/fp_convert_r16.reference_output b/Fortran/UnitTests/fp_conversions/fp_convert_r16.reference_output new file mode 100644 index 0000000000..3ece704ebb --- /dev/null +++ b/Fortran/UnitTests/fp_conversions/fp_convert_r16.reference_output @@ -0,0 +1,78 @@ + huge + 127 + 32767 + 2147483647 + 9223372036854775807 + 170141183460469231731687303715884105727 + 255 + 65535 + 4294967295 + 18446744073709551615 + 340282366920938463463374607431768211455 + -huge + -128 + -32768 + -2147483648 + -9223372036854775808 + -170141183460469231731687303715884105728 + 0 + 0 + 0 + 0 + 0 + tiny + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + -tiny + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + inf + 127 + 32767 + 2147483647 + 9223372036854775807 + 170141183460469231731687303715884105727 + 255 + 65535 + 4294967295 + 18446744073709551615 + 340282366920938463463374607431768211455 + -inf + -128 + -32768 + -2147483648 + -9223372036854775808 + -170141183460469231731687303715884105728 + 0 + 0 + 0 + 0 + 0 + nan + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 +exit 0 diff --git a/Fortran/UnitTests/fp_conversions/lit.local.cfg b/Fortran/UnitTests/fp_conversions/lit.local.cfg new file mode 100644 index 0000000000..1166820260 --- /dev/null +++ b/Fortran/UnitTests/fp_conversions/lit.local.cfg @@ -0,0 +1,2 @@ +config.traditional_output = True +config.single_source = True