118 lines · plain
1! RUN: bbc -emit-fir -o - %s | FileCheck %s2 3! CHECK-LABEL: c.func @_QPout4subroutine out(x)5 use ieee_arithmetic6 integer, parameter :: k = 87 8 ! CHECK: %[[V_60:[0-9]+]] = fir.alloca !fir.logical<4> {bindc_name = "l", uniq_name = "_QFoutEl"}9 ! CHECK: %[[V_61:[0-9]+]] = fir.declare %[[V_60]] {uniq_name = "_QFoutEl"} : (!fir.ref<!fir.logical<4>>) -> !fir.ref<!fir.logical<4>>10 ! CHECK: %[[V_62:[0-9]+]] = fir.alloca f64 {bindc_name = "r", uniq_name = "_QFoutEr"}11 ! CHECK: %[[V_63:[0-9]+]] = fir.declare %[[V_62]] {uniq_name = "_QFoutEr"} : (!fir.ref<f64>) -> !fir.ref<f64>12 ! CHECK: %[[V_64:[0-9]+]] = fir.declare %arg0 dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFoutEx"} : (!fir.ref<f64>, !fir.dscope) -> !fir.ref<f64>13 real(k) :: x, r14 logical :: L15 16 ! CHECK: %[[V_65:[0-9]+]] = fir.address_of(@_QQro._QM__fortran_builtinsT__builtin_ieee_flag_type.0) : !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_ieee_flag_type{_QM__fortran_builtinsT__builtin_ieee_flag_type.flag:i8}>>17 ! CHECK: %[[V_66:[0-9]+]] = fir.declare %[[V_65]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQro._QM__fortran_builtinsT__builtin_ieee_flag_type.0"} : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_ieee_flag_type{_QM__fortran_builtinsT__builtin_ieee_flag_type.flag:i8}>>) -> !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_ieee_flag_type{_QM__fortran_builtinsT__builtin_ieee_flag_type.flag:i8}>>18 ! CHECK: %[[V_68:[0-9]+]] = fir.coordinate_of %[[V_66]], _QM__fortran_builtinsT__builtin_ieee_flag_type.flag : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_ieee_flag_type{_QM__fortran_builtinsT__builtin_ieee_flag_type.flag:i8}>>) -> !fir.ref<i8>19 ! CHECK: %[[V_69:[0-9]+]] = fir.load %[[V_68]] : !fir.ref<i8>20 ! CHECK: %[[V_70:[0-9]+]] = fir.convert %[[V_69]] : (i8) -> i3221 ! CHECK: %[[V_71:[0-9]+]] = fir.call @_FortranAMapException(%[[V_70]]) fastmath<contract> : (i32) -> i3222 ! CHECK: fir.if %false{{[_0-9]*}} {23 ! CHECK: fir.call {{.*}}feraiseexcept(%[[V_71]]) fastmath<contract> : (i32)24 ! CHECK: } else {25 ! CHECK: fir.call {{.*}}feclearexcept(%[[V_71]]) fastmath<contract> : (i32)26 ! CHECK: }27 call ieee_set_flag(ieee_divide_by_zero, .false.)28 29 ! CHECK: %[[V_72:[0-9]+]] = fir.load %[[V_64]] : !fir.ref<f64>30 ! CHECK: %[[V_73:[0-9]+]] = arith.bitcast %[[V_72]] : f64 to i6431 ! CHECK: %[[V_74:[0-9]+]] = arith.cmpf oeq, %[[V_72]], %cst{{[_0-9]*}} {{.*}} : f6432 ! CHECK: %[[V_75:[0-9]+]] = fir.if %[[V_74]] -> (f64) {33 ! CHECK: %[[V_101:[0-9]+]] = fir.call @_FortranAMapException(%c4{{.*}}) fastmath<contract> : (i32) -> i3234 ! CHECK: fir.call {{.*}}feraiseexcept(%[[V_101]]) fastmath<contract> : (i32)35 ! CHECK: fir.result %cst{{[_0-9]*}} : f6436 ! CHECK: } else {37 ! CHECK: %[[V_101:[0-9]+]] = arith.shli %[[V_73]], %c1{{.*}} : i6438 ! CHECK: %[[V_102:[0-9]+]] = "llvm.intr.is.fpclass"(%[[V_72]]) <{bit = 504 : i32}> : (f64) -> i139 ! CHECK: %[[V_103:[0-9]+]] = fir.if %[[V_102]] -> (f64) {40 ! CHECK: %[[V_104:[0-9]+]] = arith.shrui %[[V_101]], %c53{{.*}} : i6441 ! CHECK: %[[V_105:[0-9]+]] = arith.subi %[[V_104]], %c1023{{.*}} : i6442 ! CHECK: %[[V_106:[0-9]+]] = fir.convert %[[V_105]] : (i64) -> f6443 ! CHECK: fir.result %[[V_106]] : f6444 ! CHECK: } else {45 ! CHECK: %[[V_104:[0-9]+]] = arith.shrui %[[V_101]], %c1{{.*}} : i6446 ! CHECK: %[[V_105:[0-9]+]] = arith.bitcast %[[V_104]] : i64 to f6447 ! CHECK: fir.result %[[V_105]] : f6448 ! CHECK: }49 ! CHECK: fir.result %[[V_103]] : f6450 ! CHECK: }51 ! CHECK: fir.store %[[V_75]] to %[[V_63]] : !fir.ref<f64>52 r = ieee_logb(x)53 54 ! CHECK: %[[V_76:[0-9]+]] = fir.declare %[[V_65]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQro._QM__fortran_builtinsT__builtin_ieee_flag_type.0"} : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_ieee_flag_type{_QM__fortran_builtinsT__builtin_ieee_flag_type.flag:i8}>>) -> !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_ieee_flag_type{_QM__fortran_builtinsT__builtin_ieee_flag_type.flag:i8}>>55 ! CHECK: %[[V_77:[0-9]+]] = fir.coordinate_of %[[V_76]], _QM__fortran_builtinsT__builtin_ieee_flag_type.flag : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_ieee_flag_type{_QM__fortran_builtinsT__builtin_ieee_flag_type.flag:i8}>>) -> !fir.ref<i8>56 ! CHECK: %[[V_78:[0-9]+]] = fir.load %[[V_77]] : !fir.ref<i8>57 ! CHECK: %[[V_79:[0-9]+]] = fir.convert %[[V_78]] : (i8) -> i3258 ! CHECK: %[[V_80:[0-9]+]] = fir.call @_FortranAMapException(%[[V_79]]) fastmath<contract> : (i32) -> i3259 ! CHECK: %[[V_81:[0-9]+]] = fir.call {{.*}}fetestexcept(%[[V_80]]) fastmath<contract> : (i32) -> i3260 ! CHECK: %[[V_82:[0-9]+]] = arith.cmpi ne, %[[V_81]], %c0{{.*}} : i3261 ! CHECK: %[[V_83:[0-9]+]] = fir.convert %[[V_82]] : (i1) -> !fir.logical<4>62 ! CHECK: fir.store %[[V_83]] to %[[V_61]] : !fir.ref<!fir.logical<4>>63 call ieee_get_flag(ieee_divide_by_zero, L)64 65 8 format (' kind=8 ', f12.2, z18.16, f9.1, l3, ' ')66 write(*, 8) x, x, r, L67end68 69 use ieee_arithmetic70 integer, parameter :: k = 871 real(k) :: x, r72 73 call out(ieee_value(x, ieee_signaling_nan))74 call out(ieee_value(x, ieee_quiet_nan))75 call out(ieee_value(x, ieee_negative_inf))76 call out( -huge(x))77 call out( -huge(x)/2)78 call out(-sqrt(huge(x)))79 call out(-2000.0_k)80 call out( -9.9_k)81 call out( -9.0_k)82 call out( -8.0_k)83 call out( -7.0_k)84 call out( -6.0_k)85 call out( -5.0_k)86 call out( -4.0_k)87 call out( -3.9_k)88 call out( -3.0_k)89 call out( -2.0_k)90 call out( -1.1_k)91 call out(ieee_value(x, ieee_negative_normal))92 call out( -.0001_k)93 call out( -tiny(x))94 call out(ieee_value(x, ieee_negative_subnormal))95 call out(ieee_value(x, ieee_negative_zero))96 call out(ieee_value(x, ieee_positive_zero))97 call out(ieee_value(x, ieee_positive_subnormal))98 call out(tiny(x))99 call out(.0001_k)100 call out(ieee_value(x, ieee_positive_normal))101 call out( 1.1_k)102 call out( 2.0_k)103 call out( 3.0_k)104 call out( 3.9_k)105 call out( 4.0_k)106 call out( 5.0_k)107 call out( 6.0_k)108 call out( 7.0_k)109 call out( 8.0_k)110 call out( 9.0_k)111 call out( 9.9_k)112 call out(2000.0_k)113 call out( sqrt(huge(x)))114 call out( huge(x)/2)115 call out( huge(x))116 call out(ieee_value(x, ieee_positive_inf))117end118