Skip to content

Commit 7513892

Browse files
authored
[flang] Make IEEE_INT and IEEE_REAL into builtin intrinsic functions (llvm#109191)
For proper error detection of bad KIND= arguments, make IEEE_INT and IEEE_REAL actual intrinsic functions. Lowering will have to check for the new __builtin_ names.
1 parent 2e41479 commit 7513892

File tree

4 files changed

+24
-57
lines changed

4 files changed

+24
-57
lines changed

flang/lib/Evaluate/intrinsics.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -935,12 +935,16 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
935935
{"__builtin_compiler_version", {}, DefaultChar},
936936
{"__builtin_fma", {{"f1", SameReal}, {"f2", SameReal}, {"f3", SameReal}},
937937
SameReal},
938+
{"__builtin_ieee_int",
939+
{{"a", AnyFloating}, {"round", IeeeRoundType}, DefaultingKIND},
940+
KINDInt},
938941
{"__builtin_ieee_is_nan", {{"a", AnyFloating}}, DefaultLogical},
939942
{"__builtin_ieee_is_negative", {{"a", AnyFloating}}, DefaultLogical},
940943
{"__builtin_ieee_is_normal", {{"a", AnyFloating}}, DefaultLogical},
941944
{"__builtin_ieee_next_after", {{"x", SameReal}, {"y", AnyReal}}, SameReal},
942945
{"__builtin_ieee_next_down", {{"x", SameReal}}, SameReal},
943946
{"__builtin_ieee_next_up", {{"x", SameReal}}, SameReal},
947+
{"__builtin_ieee_real", {{"a", AnyIntOrReal}, DefaultingKIND}, KINDReal},
944948
{"__builtin_ieee_support_datatype",
945949
{{"x", AnyReal, Rank::elemental, Optionality::optional}},
946950
DefaultLogical},

flang/module/__fortran_builtins.f90

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,13 @@
108108
end type
109109

110110
intrinsic :: __builtin_fma
111+
intrinsic :: __builtin_ieee_int
111112
intrinsic :: __builtin_ieee_is_nan, __builtin_ieee_is_negative, &
112113
__builtin_ieee_is_normal
113114
intrinsic :: __builtin_ieee_next_after, __builtin_ieee_next_down, &
114115
__builtin_ieee_next_up
115116
intrinsic :: scale ! for ieee_scalb
117+
intrinsic :: __builtin_ieee_real
116118
intrinsic :: __builtin_ieee_selected_real_kind
117119
intrinsic :: __builtin_ieee_support_datatype, &
118120
__builtin_ieee_support_denormal, __builtin_ieee_support_divide, &
@@ -123,10 +125,12 @@
123125
__builtin_ieee_support_standard, __builtin_ieee_support_subnormal, &
124126
__builtin_ieee_support_underflow_control
125127
public :: __builtin_fma
128+
public :: __builtin_ieee_int
126129
public :: __builtin_ieee_is_nan, __builtin_ieee_is_negative, &
127130
__builtin_ieee_is_normal
128131
public :: __builtin_ieee_next_after, __builtin_ieee_next_down, &
129132
__builtin_ieee_next_up
133+
public :: __builtin_ieee_real
130134
public :: scale ! for ieee_scalb
131135
public :: __builtin_ieee_selected_real_kind
132136
public :: __builtin_ieee_support_datatype, &

flang/module/ieee_arithmetic.f90

Lines changed: 4 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ module ieee_arithmetic
2121
ieee_away => __builtin_ieee_away, &
2222
ieee_down => __builtin_ieee_down, &
2323
ieee_fma => __builtin_fma, &
24+
ieee_int => __builtin_ieee_int, &
2425
ieee_is_nan => __builtin_ieee_is_nan, &
2526
ieee_is_negative => __builtin_ieee_is_negative, &
2627
ieee_is_normal => __builtin_ieee_is_normal, &
@@ -29,6 +30,7 @@ module ieee_arithmetic
2930
ieee_next_down => __builtin_ieee_next_down, &
3031
ieee_next_up => __builtin_ieee_next_up, &
3132
ieee_other => __builtin_ieee_other, &
33+
ieee_real => __builtin_ieee_real, &
3234
ieee_round_type => __builtin_ieee_round_type, &
3335
ieee_scalb => scale, &
3436
ieee_selected_real_kind => __builtin_ieee_selected_real_kind, &
@@ -57,6 +59,7 @@ module ieee_arithmetic
5759
public :: ieee_away
5860
public :: ieee_down
5961
public :: ieee_fma
62+
public :: ieee_int
6063
public :: ieee_is_nan
6164
public :: ieee_is_negative
6265
public :: ieee_is_normal
@@ -65,6 +68,7 @@ module ieee_arithmetic
6568
public :: ieee_next_after
6669
public :: ieee_next_down
6770
public :: ieee_next_up
71+
public :: ieee_real
6872
public :: ieee_round_type
6973
public :: ieee_scalb
7074
public :: ieee_selected_real_kind
@@ -303,29 +307,6 @@ end subroutine ieee_get_underflow_mode_l##GKIND;
303307
public :: ieee_get_underflow_mode
304308
#undef IEEE_GET_UNDERFLOW_MODE_L
305309

306-
! When kind argument is present, kind(result) is value(kind), not kind(kind).
307-
! That is not known here, so return integer(16).
308-
#define IEEE_INT_R(AKIND) \
309-
elemental integer function ieee_int_a##AKIND(a, round); \
310-
import ieee_round_type; \
311-
real(AKIND), intent(in) :: a; \
312-
type(ieee_round_type), intent(in) :: round; \
313-
end function ieee_int_a##AKIND;
314-
#define IEEE_INT_RI(AKIND, KKIND) \
315-
elemental integer(16) function ieee_int_a##AKIND##_i##KKIND(a, round, kind); \
316-
import ieee_round_type; \
317-
real(AKIND), intent(in) :: a; \
318-
type(ieee_round_type), intent(in) :: round; \
319-
integer(KKIND), intent(in) :: kind; \
320-
end function ieee_int_a##AKIND##_i##KKIND;
321-
interface ieee_int
322-
SPECIFICS_R(IEEE_INT_R)
323-
SPECIFICS_RI(IEEE_INT_RI)
324-
end interface ieee_int
325-
public :: ieee_int
326-
#undef IEEE_INT_R
327-
#undef IEEE_INT_RI
328-
329310
#define IEEE_IS_FINITE_R(XKIND) \
330311
elemental logical function ieee_is_finite_a##XKIND(x); \
331312
real(XKIND), intent(in) :: x; \
@@ -486,40 +467,6 @@ end function ieee_quiet_ne_a##AKIND;
486467
public :: ieee_quiet_ne
487468
#undef IEEE_QUIET_NE_R
488469

489-
! When kind argument is present, kind(result) is value(kind), not kind(kind).
490-
! That is not known here, so return real(16).
491-
#define IEEE_REAL_I(AKIND) \
492-
elemental real function ieee_real_i##AKIND(a); \
493-
integer(AKIND), intent(in) :: a; \
494-
end function ieee_real_i##AKIND;
495-
#define IEEE_REAL_R(AKIND) \
496-
elemental real function ieee_real_a##AKIND(a); \
497-
real(AKIND), intent(in) :: a; \
498-
end function ieee_real_a##AKIND;
499-
#define IEEE_REAL_II(AKIND, KKIND) \
500-
elemental real(16) function ieee_real_i##AKIND##_i##KKIND(a, kind); \
501-
integer(AKIND), intent(in) :: a; \
502-
integer(KKIND), intent(in) :: kind; \
503-
end function ieee_real_i##AKIND##_i##KKIND;
504-
#define IEEE_REAL_RI(AKIND, KKIND) \
505-
elemental real(16) function ieee_real_a##AKIND##_i##KKIND(a, kind); \
506-
real(AKIND), intent(in) :: a; \
507-
integer(KKIND), intent(in) :: kind; \
508-
end function ieee_real_a##AKIND##_i##KKIND;
509-
interface ieee_real
510-
SPECIFICS_I(IEEE_REAL_I)
511-
SPECIFICS_R(IEEE_REAL_R)
512-
#if FLANG_SUPPORT_R16
513-
SPECIFICS_II(IEEE_REAL_II)
514-
SPECIFICS_RI(IEEE_REAL_RI)
515-
#endif
516-
end interface ieee_real
517-
public :: ieee_real
518-
#undef IEEE_REAL_I
519-
#undef IEEE_REAL_R
520-
#undef IEEE_REAL_II
521-
#undef IEEE_REAL_RI
522-
523470
#define IEEE_REM_RR(XKIND, YKIND) \
524471
elemental real(XKIND) function ieee_rem_a##XKIND##_a##YKIND(x, y); \
525472
real(XKIND), intent(in) :: x; \

flang/test/Semantics/ieee_int.f90

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
! RUN: %python %S/test_errors.py %s %flang_fc1
2+
use ieee_arithmetic, only: ieee_int, ieee_real, ieee_up
3+
implicit none
4+
print *, ieee_int(1.5, ieee_up)
5+
print *, ieee_int(1.5, ieee_up, 4)
6+
!ERROR: 'kind=' argument must be a constant scalar integer whose value is a supported kind for the intrinsic result type
7+
print *, ieee_int(1.5, ieee_up, 3)
8+
print *, ieee_real(1)
9+
print *, ieee_real(1, 4)
10+
!ERROR: 'kind=' argument must be a constant scalar integer whose value is a supported kind for the intrinsic result type
11+
print *, ieee_real(1, 7)
12+
end

0 commit comments

Comments
 (0)