395 lines · plain
1! RUN: bbc -emit-hlfir %s -o - | FileCheck %s --check-prefixes=CHECK%if target=x86_64{{.*}} %{,CHECK-KIND10%}%if flang-supports-f128-math %{,CHECK-KIND16%}2 3module ieee_next_tests4 use ieee_arithmetic, only: ieee_value, ieee_negative_inf, ieee_positive_inf5 use ieee_arithmetic, only: ieee_next_after, ieee_next_down, ieee_next_up6 implicit none7 integer, parameter :: kind10 = merge(10, 4, selected_real_kind(p=18).eq.10)8 integer, parameter :: kind16 = merge(16, 4, selected_real_kind(p=33).eq.16)9contains10 11subroutine test1(r2, x2, x10)12 real(2) :: r2, x213 real(kind10) :: x1014 r2 = ieee_next_after(x2, x10)15end subroutine16!CHECK-KIND10-LABEL: func.func @_QMieee_next_testsPtest1(17!CHECK-KIND10: %[[VAL_12:.*]]:2 = hlfir.declare {{.*}}r2"18!CHECK-KIND10: %[[VAL_13:.*]]:2 = hlfir.declare {{.*}}x10"19!CHECK-KIND10: %[[VAL_14:.*]]:2 = hlfir.declare {{.*}}x2"20!CHECK-KIND10: %[[VAL_15:.*]] = fir.load %[[VAL_14]]#0 : !fir.ref<f16>21!CHECK-KIND10: %[[VAL_16:.*]] = fir.load %[[VAL_13]]#0 : !fir.ref<f80>22!CHECK-KIND10-DAG: %[[VAL_17:.*]] = "llvm.intr.is.fpclass"(%[[VAL_16]]) <{bit = 3 : i32}> : (f80) -> i123!CHECK-KIND10-DAG: %[[VAL_18:.*]] = arith.constant 2 : i824!CHECK-KIND10-DAG: %[[VAL_19:.*]] = fir.address_of(@_FortranAIeeeValueTable_2) : !fir.ref<!fir.array<12xi16>>25!CHECK-KIND10-DAG: %[[VAL_20:.*]] = fir.coordinate_of %[[VAL_19]], %[[VAL_18]] : (!fir.ref<!fir.array<12xi16>>, i8) -> !fir.ref<i16>26!CHECK-KIND10-DAG: %[[VAL_21:.*]] = fir.load %[[VAL_20]] : !fir.ref<i16>27!CHECK-KIND10-DAG: %[[VAL_22:.*]] = arith.bitcast %[[VAL_21]] : i16 to f1628!CHECK-KIND10: %[[VAL_23:.*]] = arith.select %[[VAL_17]], %[[VAL_22]], %[[VAL_15]] : f1629!CHECK-KIND10: %[[VAL_24:.*]] = "llvm.intr.is.fpclass"(%[[VAL_23]]) <{bit = 3 : i32}> : (f16) -> i130!CHECK-KIND10: %[[VAL_25:.*]] = arith.constant 1 : i1631!CHECK-KIND10: %[[VAL_26:.*]] = fir.convert %[[VAL_23]] : (f16) -> f3232!CHECK-KIND10: %[[VAL_27:.*]] = fir.convert %[[VAL_26]] : (f32) -> f8033!CHECK-KIND10: %[[VAL_28:.*]] = arith.cmpf oeq, %[[VAL_27]], %[[VAL_16]] fastmath<contract> : f8034!CHECK-KIND10: %[[VAL_29:.*]] = arith.ori %[[VAL_24]], %[[VAL_28]] : i135!CHECK-KIND10: %[[VAL_30:.*]] = arith.cmpf olt, %[[VAL_27]], %[[VAL_16]] fastmath<contract> : f8036!CHECK-KIND10: %[[VAL_31:.*]] = arith.bitcast %[[VAL_15]] : f16 to i1637!CHECK-KIND10: %[[VAL_32:.*]] = arith.constant 15 : i1638!CHECK-KIND10: %[[VAL_33:.*]] = arith.shrui %[[VAL_31]], %[[VAL_32]] : i1639!CHECK-KIND10: %[[VAL_34:.*]] = fir.convert %[[VAL_33]] : (i16) -> i140!CHECK-KIND10: %[[VAL_35:.*]] = arith.cmpi ne, %[[VAL_30]], %[[VAL_34]] : i141!CHECK-KIND10: %[[VAL_36:.*]] = "llvm.intr.is.fpclass"(%[[VAL_23]]) <{bit = 516 : i32}> : (f16) -> i142!CHECK-KIND10: %[[VAL_37:.*]] = arith.andi %[[VAL_36]], %[[VAL_35]] : i143!CHECK-KIND10: %[[VAL_38:.*]] = arith.ori %[[VAL_29]], %[[VAL_37]] : i144!CHECK-KIND10: %[[VAL_39:.*]] = fir.if %[[VAL_38]] -> (f16) {45!CHECK-KIND10: fir.result %[[VAL_23]] : f1646!CHECK-KIND10: } else {47!CHECK-KIND10: %[[VAL_40:.*]] = arith.constant 0.000000e+00 : f1648!CHECK-KIND10: %[[VAL_41:.*]] = arith.cmpf oeq, %[[VAL_23]], %[[VAL_40]] fastmath<contract> : f1649!CHECK-KIND10: %[[VAL_42:.*]] = fir.if %[[VAL_41]] -> (f16) {50!CHECK-KIND10: %[[VAL_43:.*]] = arith.bitcast %[[VAL_25]] : i16 to f1651!CHECK-KIND10: %[[VAL_44:.*]] = arith.constant -32767 : i1652!CHECK-KIND10: %[[VAL_45:.*]] = arith.bitcast %[[VAL_44]] : i16 to f1653!CHECK-KIND10: %[[VAL_46:.*]] = arith.select %[[VAL_30]], %[[VAL_43]], %[[VAL_45]] : f1654!CHECK-KIND10: %[[VAL_47:.*]] = arith.constant 48 : i3255!CHECK-KIND10: %[[VAL_48:.*]] = fir.call @_FortranAMapException(%[[VAL_47]]) fastmath<contract> : (i32) -> i3256!CHECK-KIND10: fir.call {{.*}}feraiseexcept(%[[VAL_48]]) fastmath<contract> : (i32)57!CHECK-KIND10: fir.result %[[VAL_46]] : f1658!CHECK-KIND10: } else {59!CHECK-KIND10: %[[VAL_50:.*]] = arith.bitcast %[[VAL_23]] : f16 to i1660!CHECK-KIND10-DAG: %[[VAL_51:.*]] = arith.addi %[[VAL_50]], %[[VAL_25]] : i1661!CHECK-KIND10-DAG: %[[VAL_52:.*]] = arith.subi %[[VAL_50]], %[[VAL_25]] : i1662!CHECK-KIND10: %[[VAL_53:.*]] = arith.select %[[VAL_35]], %[[VAL_51]], %[[VAL_52]] : i1663!CHECK-KIND10: %[[VAL_54:.*]] = arith.bitcast %[[VAL_53]] : i16 to f1664!CHECK-KIND10: %[[VAL_55:.*]] = "llvm.intr.is.fpclass"(%[[VAL_54]]) <{bit = 516 : i32}> : (f16) -> i165!CHECK-KIND10: fir.if %[[VAL_55]] {66!CHECK-KIND10: %[[VAL_56:.*]] = arith.constant 40 : i3267!CHECK-KIND10: %[[VAL_57:.*]] = fir.call @_FortranAMapException(%[[VAL_56]]) fastmath<contract> : (i32) -> i3268!CHECK-KIND10: fir.call {{.*}}feraiseexcept(%[[VAL_57]]) fastmath<contract> : (i32)69!CHECK-KIND10: }70!CHECK-KIND10: %[[VAL_59:.*]] = "llvm.intr.is.fpclass"(%[[VAL_54]]) <{bit = 144 : i32}> : (f16) -> i171!CHECK-KIND10: fir.if %[[VAL_59]] {72!CHECK-KIND10: %[[VAL_60:.*]] = arith.constant 48 : i3273!CHECK-KIND10: %[[VAL_61:.*]] = fir.call @_FortranAMapException(%[[VAL_60]]) fastmath<contract> : (i32) -> i3274!CHECK-KIND10: fir.call {{.*}}feraiseexcept(%[[VAL_61]]) fastmath<contract> : (i32)75!CHECK-KIND10: }76!CHECK-KIND10: fir.result %[[VAL_54]] : f1677!CHECK-KIND10: }78!CHECK-KIND10: fir.result %[[VAL_42]] : f1679!CHECK-KIND10: }80!CHECK-KIND10: hlfir.assign %[[VAL_39]] to %[[VAL_12]]#0 : f16, !fir.ref<f16>81!CHECK-KIND10: return82!CHECK-KIND10: }83 84subroutine test2(r3, x3)85 real(3) :: r3, x386 r3 = ieee_next_up(x3)87end subroutine88!CHECK-LABEL: func.func @_QMieee_next_testsPtest2(89!CHECK: %[[VAL_11:.*]]:2 = hlfir.declare {{.*}}r3"90!CHECK: %[[VAL_12:.*]]:2 = hlfir.declare {{.*}}x3"91!CHECK: %[[VAL_13:.*]] = fir.load %[[VAL_12]]#0 : !fir.ref<bf16>92!CHECK: %[[VAL_14:.*]] = "llvm.intr.is.fpclass"(%[[VAL_13]]) <{bit = 3 : i32}> : (bf16) -> i193!CHECK: %[[VAL_15:.*]] = arith.constant 1 : i1694!CHECK: %[[VAL_16:.*]] = arith.constant true95!CHECK: %[[VAL_17:.*]] = fir.convert %[[VAL_13]] : (bf16) -> f3296!CHECK: %[[VAL_18:.*]] = arith.bitcast %[[VAL_17]] : f32 to i3297!CHECK: %[[VAL_19:.*]] = arith.constant 31 : i3298!CHECK: %[[VAL_20:.*]] = arith.shrui %[[VAL_18]], %[[VAL_19]] : i3299!CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_20]] : (i32) -> i1100!CHECK: %[[VAL_22:.*]] = arith.cmpi ne, %[[VAL_16]], %[[VAL_21]] : i1101!CHECK: %[[VAL_23:.*]] = "llvm.intr.is.fpclass"(%[[VAL_13]]) <{bit = 516 : i32}> : (bf16) -> i1102!CHECK: %[[VAL_24:.*]] = arith.andi %[[VAL_23]], %[[VAL_22]] : i1103!CHECK: %[[VAL_25:.*]] = arith.ori %[[VAL_14]], %[[VAL_24]] : i1104!CHECK: %[[VAL_26:.*]] = fir.if %[[VAL_25]] -> (bf16) {105!CHECK: %[[VAL_27:.*]] = "llvm.intr.is.fpclass"(%[[VAL_13]]) <{bit = 1 : i32}> : (bf16) -> i1106!CHECK: fir.if %[[VAL_27]] {107!CHECK: %[[VAL_28:.*]] = arith.constant 1 : i32108!CHECK: %[[VAL_29:.*]] = fir.call @_FortranAMapException(%[[VAL_28]]) fastmath<contract> : (i32) -> i32109!CHECK: fir.call {{.*}}feraiseexcept(%[[VAL_29]]) fastmath<contract> : (i32)110!CHECK: }111!CHECK: fir.result %[[VAL_13]] : bf16112!CHECK: } else {113!CHECK: %[[VAL_31:.*]] = arith.constant 0.000000e+00 : bf16114!CHECK: %[[VAL_32:.*]] = arith.cmpf oeq, %[[VAL_13]], %[[VAL_31]] fastmath<contract> : bf16115!CHECK: %[[VAL_33:.*]] = fir.if %[[VAL_32]] -> (bf16) {116!CHECK: %[[VAL_34:.*]] = arith.bitcast %[[VAL_15]] : i16 to bf16117!CHECK: %[[VAL_35:.*]] = arith.constant -32767 : i16118!CHECK: %[[VAL_36:.*]] = arith.bitcast %[[VAL_35]] : i16 to bf16119!CHECK: %[[VAL_37:.*]] = arith.select %[[VAL_16]], %[[VAL_34]], %[[VAL_36]] : bf16120!CHECK: fir.result %[[VAL_37]] : bf16121!CHECK: } else {122!CHECK: %[[VAL_38:.*]] = arith.bitcast %[[VAL_13]] : bf16 to i16123!CHECK-DAG: %[[VAL_39:.*]] = arith.addi %[[VAL_38]], %[[VAL_15]] : i16124!CHECK-DAG: %[[VAL_40:.*]] = arith.subi %[[VAL_38]], %[[VAL_15]] : i16125!CHECK: %[[VAL_41:.*]] = arith.select %[[VAL_22]], %[[VAL_39]], %[[VAL_40]] : i16126!CHECK: %[[VAL_42:.*]] = arith.bitcast %[[VAL_41]] : i16 to bf16127!CHECK: fir.result %[[VAL_42]] : bf16128!CHECK: }129!CHECK: fir.result %[[VAL_33]] : bf16130!CHECK: }131!CHECK: hlfir.assign %[[VAL_26]] to %[[VAL_11]]#0 : bf16, !fir.ref<bf16>132!CHECK: return133!CHECK: }134 135subroutine test3(r4, x4)136 real(4) :: r4, x4137 r4 = ieee_next_down(x4)138end subroutine139!CHECK-LABEL: func.func @_QMieee_next_testsPtest3(140!CHECK: %[[VAL_11:.*]]:2 = hlfir.declare {{.*}}r4"141!CHECK: %[[VAL_12:.*]]:2 = hlfir.declare {{.*}}x4"142!CHECK: %[[VAL_13:.*]] = fir.load %[[VAL_12]]#0 : !fir.ref<f32>143!CHECK: %[[VAL_14:.*]] = "llvm.intr.is.fpclass"(%[[VAL_13]]) <{bit = 3 : i32}> : (f32) -> i1144!CHECK: %[[VAL_15:.*]] = arith.constant 1 : i32145!CHECK: %[[VAL_16:.*]] = arith.constant false146!CHECK: %[[VAL_17:.*]] = arith.bitcast %[[VAL_13]] : f32 to i32147!CHECK: %[[VAL_18:.*]] = arith.constant 31 : i32148!CHECK: %[[VAL_19:.*]] = arith.shrui %[[VAL_17]], %[[VAL_18]] : i32149!CHECK: %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (i32) -> i1150!CHECK: %[[VAL_21:.*]] = arith.cmpi ne, %[[VAL_16]], %[[VAL_20]] : i1151!CHECK: %[[VAL_22:.*]] = "llvm.intr.is.fpclass"(%[[VAL_13]]) <{bit = 516 : i32}> : (f32) -> i1152!CHECK: %[[VAL_23:.*]] = arith.andi %[[VAL_22]], %[[VAL_21]] : i1153!CHECK: %[[VAL_24:.*]] = arith.ori %[[VAL_14]], %[[VAL_23]] : i1154!CHECK: %[[VAL_25:.*]] = fir.if %[[VAL_24]] -> (f32) {155!CHECK: %[[VAL_26:.*]] = "llvm.intr.is.fpclass"(%[[VAL_13]]) <{bit = 1 : i32}> : (f32) -> i1156!CHECK: fir.if %[[VAL_26]] {157!CHECK: %[[VAL_27:.*]] = arith.constant 1 : i32158!CHECK: %[[VAL_28:.*]] = fir.call @_FortranAMapException(%[[VAL_27]]) fastmath<contract> : (i32) -> i32159!CHECK: fir.call {{.*}}feraiseexcept(%[[VAL_28]]) fastmath<contract> : (i32)160!CHECK: }161!CHECK: fir.result %[[VAL_13]] : f32162!CHECK: } else {163!CHECK: %[[VAL_30:.*]] = arith.constant 0.000000e+00 : f32164!CHECK: %[[VAL_31:.*]] = arith.cmpf oeq, %[[VAL_13]], %[[VAL_30]] fastmath<contract> : f32165!CHECK: %[[VAL_32:.*]] = fir.if %[[VAL_31]] -> (f32) {166!CHECK: %[[VAL_33:.*]] = arith.bitcast %[[VAL_15]] : i32 to f32167!CHECK: %[[VAL_34:.*]] = arith.constant -2147483647 : i32168!CHECK: %[[VAL_35:.*]] = arith.bitcast %[[VAL_34]] : i32 to f32169!CHECK: %[[VAL_36:.*]] = arith.select %[[VAL_16]], %[[VAL_33]], %[[VAL_35]] : f32170!CHECK: fir.result %[[VAL_36]] : f32171!CHECK: } else {172!CHECK: %[[VAL_37:.*]] = arith.bitcast %[[VAL_13]] : f32 to i32173!CHECK-DAG: %[[VAL_38:.*]] = arith.addi %[[VAL_37]], %[[VAL_15]] : i32174!CHECK-DAG: %[[VAL_39:.*]] = arith.subi %[[VAL_37]], %[[VAL_15]] : i32175!CHECK: %[[VAL_40:.*]] = arith.select %[[VAL_21]], %[[VAL_38]], %[[VAL_39]] : i32176!CHECK: %[[VAL_41:.*]] = arith.bitcast %[[VAL_40]] : i32 to f32177!CHECK: fir.result %[[VAL_41]] : f32178!CHECK: }179!CHECK: fir.result %[[VAL_32]] : f32180!CHECK: }181!CHECK: hlfir.assign %[[VAL_25]] to %[[VAL_11]]#0 : f32, !fir.ref<f32>182!CHECK: return183!CHECK: }184 185subroutine test4(r8, x8, x2)186 real(2) :: x2187 real(8) :: r8, x8188 r8 = ieee_next_after(x8, x2)189end subroutine190!CHECK-LABEL: func.func @_QMieee_next_testsPtest4(191!CHECK: %[[VAL_12:.*]]:2 = hlfir.declare {{.*}}r8"192!CHECK: %[[VAL_13:.*]]:2 = hlfir.declare {{.*}}x2"193!CHECK: %[[VAL_14:.*]]:2 = hlfir.declare {{.*}}x8"194!CHECK: %[[VAL_15:.*]] = fir.load %[[VAL_14]]#0 : !fir.ref<f64>195!CHECK: %[[VAL_16:.*]] = fir.load %[[VAL_13]]#0 : !fir.ref<f16>196!CHECK-DAG: %[[VAL_17:.*]] = "llvm.intr.is.fpclass"(%[[VAL_16]]) <{bit = 3 : i32}> : (f16) -> i1197!CHECK-DAG: %[[VAL_18:.*]] = arith.constant 2 : i8198!CHECK-DAG: %[[VAL_19:.*]] = fir.address_of(@_FortranAIeeeValueTable_8) : !fir.ref<!fir.array<12xi64>>199!CHECK-DAG: %[[VAL_20:.*]] = fir.coordinate_of %[[VAL_19]], %[[VAL_18]] : (!fir.ref<!fir.array<12xi64>>, i8) -> !fir.ref<i64>200!CHECK-DAG: %[[VAL_21:.*]] = fir.load %[[VAL_20]] : !fir.ref<i64>201!CHECK-DAG: %[[VAL_22:.*]] = arith.bitcast %[[VAL_21]] : i64 to f64202!CHECK: %[[VAL_23:.*]] = arith.select %[[VAL_17]], %[[VAL_22]], %[[VAL_15]] : f64203!CHECK: %[[VAL_24:.*]] = "llvm.intr.is.fpclass"(%[[VAL_23]]) <{bit = 3 : i32}> : (f64) -> i1204!CHECK: %[[VAL_25:.*]] = arith.constant 1 : i64205!CHECK: %[[VAL_26:.*]] = fir.convert %[[VAL_16]] : (f16) -> f32206!CHECK: %[[VAL_27:.*]] = fir.convert %[[VAL_26]] : (f32) -> f64207!CHECK: %[[VAL_28:.*]] = arith.cmpf oeq, %[[VAL_23]], %[[VAL_27]] fastmath<contract> : f64208!CHECK: %[[VAL_29:.*]] = arith.ori %[[VAL_24]], %[[VAL_28]] : i1209!CHECK: %[[VAL_30:.*]] = arith.cmpf olt, %[[VAL_23]], %[[VAL_27]] fastmath<contract> : f64210!CHECK: %[[VAL_31:.*]] = arith.bitcast %[[VAL_15]] : f64 to i64211!CHECK: %[[VAL_32:.*]] = arith.constant 63 : i64212!CHECK: %[[VAL_33:.*]] = arith.shrui %[[VAL_31]], %[[VAL_32]] : i64213!CHECK: %[[VAL_34:.*]] = fir.convert %[[VAL_33]] : (i64) -> i1214!CHECK: %[[VAL_35:.*]] = arith.cmpi ne, %[[VAL_30]], %[[VAL_34]] : i1215!CHECK: %[[VAL_36:.*]] = "llvm.intr.is.fpclass"(%[[VAL_23]]) <{bit = 516 : i32}> : (f64) -> i1216!CHECK: %[[VAL_37:.*]] = arith.andi %[[VAL_36]], %[[VAL_35]] : i1217!CHECK: %[[VAL_38:.*]] = arith.ori %[[VAL_29]], %[[VAL_37]] : i1218!CHECK: %[[VAL_39:.*]] = fir.if %[[VAL_38]] -> (f64) {219!CHECK: fir.result %[[VAL_23]] : f64220!CHECK: } else {221!CHECK: %[[VAL_40:.*]] = arith.constant 0.000000e+00 : f64222!CHECK: %[[VAL_41:.*]] = arith.cmpf oeq, %[[VAL_23]], %[[VAL_40]] fastmath<contract> : f64223!CHECK: %[[VAL_42:.*]] = fir.if %[[VAL_41]] -> (f64) {224!CHECK: %[[VAL_43:.*]] = arith.bitcast %[[VAL_25]] : i64 to f64225!CHECK: %[[VAL_44:.*]] = arith.constant -9223372036854775807 : i64226!CHECK: %[[VAL_45:.*]] = arith.bitcast %[[VAL_44]] : i64 to f64227!CHECK: %[[VAL_46:.*]] = arith.select %[[VAL_30]], %[[VAL_43]], %[[VAL_45]] : f64228!CHECK: %[[VAL_47:.*]] = arith.constant 48 : i32229!CHECK: %[[VAL_48:.*]] = fir.call @_FortranAMapException(%[[VAL_47]]) fastmath<contract> : (i32) -> i32230!CHECK: fir.call {{.*}}feraiseexcept(%[[VAL_48]]) fastmath<contract> : (i32)231!CHECK: fir.result %[[VAL_46]] : f64232!CHECK: } else {233!CHECK: %[[VAL_50:.*]] = arith.bitcast %[[VAL_23]] : f64 to i64234!CHECK-DAG: %[[VAL_51:.*]] = arith.addi %[[VAL_50]], %[[VAL_25]] : i64235!CHECK-DAG: %[[VAL_52:.*]] = arith.subi %[[VAL_50]], %[[VAL_25]] : i64236!CHECK: %[[VAL_53:.*]] = arith.select %[[VAL_35]], %[[VAL_51]], %[[VAL_52]] : i64237!CHECK: %[[VAL_54:.*]] = arith.bitcast %[[VAL_53]] : i64 to f64238!CHECK: %[[VAL_55:.*]] = "llvm.intr.is.fpclass"(%[[VAL_54]]) <{bit = 516 : i32}> : (f64) -> i1239!CHECK: fir.if %[[VAL_55]] {240!CHECK: %[[VAL_56:.*]] = arith.constant 40 : i32241!CHECK: %[[VAL_57:.*]] = fir.call @_FortranAMapException(%[[VAL_56]]) fastmath<contract> : (i32) -> i32242!CHECK: fir.call {{.*}}feraiseexcept(%[[VAL_57]]) fastmath<contract> : (i32)243!CHECK: }244!CHECK: %[[VAL_59:.*]] = "llvm.intr.is.fpclass"(%[[VAL_54]]) <{bit = 144 : i32}> : (f64) -> i1245!CHECK: fir.if %[[VAL_59]] {246!CHECK: %[[VAL_60:.*]] = arith.constant 48 : i32247!CHECK: %[[VAL_61:.*]] = fir.call @_FortranAMapException(%[[VAL_60]]) fastmath<contract> : (i32) -> i32248!CHECK: fir.call {{.*}}feraiseexcept(%[[VAL_61]]) fastmath<contract> : (i32)249!CHECK: }250!CHECK: fir.result %[[VAL_54]] : f64251!CHECK: }252!CHECK: fir.result %[[VAL_42]] : f64253!CHECK: }254!CHECK: hlfir.assign %[[VAL_39]] to %[[VAL_12]]#0 : f64, !fir.ref<f64>255!CHECK: return256!CHECK: }257 258subroutine test5(r10, x10)259 real(kind10) :: x10, r10260 r10 = ieee_next_up(x10)261end subroutine262!CHECK-KIND10-LABEL: func.func @_QMieee_next_testsPtest5(263!CHECK-KIND10: %[[VAL_11:.*]]:2 = hlfir.declare {{.*}}r10"264!CHECK-KIND10: %[[VAL_12:.*]]:2 = hlfir.declare {{.*}}x10"265!CHECK-KIND10: %[[VAL_13:.*]] = fir.load %[[VAL_12]]#0 : !fir.ref<f80>266!CHECK-KIND10: %[[VAL_14:.*]] = "llvm.intr.is.fpclass"(%[[VAL_13]]) <{bit = 3 : i32}> : (f80) -> i1267!CHECK-KIND10: %[[VAL_15:.*]] = arith.constant 1 : i80268!CHECK-KIND10: %[[VAL_16:.*]] = arith.constant true269!CHECK-KIND10: %[[VAL_17:.*]] = arith.bitcast %[[VAL_13]] : f80 to i80270!CHECK-KIND10: %[[VAL_18:.*]] = arith.constant 79 : i80271!CHECK-KIND10: %[[VAL_19:.*]] = arith.shrui %[[VAL_17]], %[[VAL_18]] : i80272!CHECK-KIND10: %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (i80) -> i1273!CHECK-KIND10: %[[VAL_21:.*]] = arith.cmpi ne, %[[VAL_16]], %[[VAL_20]] : i1274!CHECK-KIND10: %[[VAL_22:.*]] = "llvm.intr.is.fpclass"(%[[VAL_13]]) <{bit = 516 : i32}> : (f80) -> i1275!CHECK-KIND10: %[[VAL_23:.*]] = arith.andi %[[VAL_22]], %[[VAL_21]] : i1276!CHECK-KIND10: %[[VAL_24:.*]] = arith.ori %[[VAL_14]], %[[VAL_23]] : i1277!CHECK-KIND10: %[[VAL_25:.*]] = fir.if %[[VAL_24]] -> (f80) {278!CHECK-KIND10: %[[VAL_26:.*]] = "llvm.intr.is.fpclass"(%[[VAL_13]]) <{bit = 1 : i32}> : (f80) -> i1279!CHECK-KIND10: fir.if %[[VAL_26]] {280!CHECK-KIND10: %[[VAL_27:.*]] = arith.constant 1 : i32281!CHECK-KIND10: %[[VAL_28:.*]] = fir.call @_FortranAMapException(%[[VAL_27]]) fastmath<contract> : (i32) -> i32282!CHECK-KIND10: fir.call {{.*}}feraiseexcept(%[[VAL_28]]) fastmath<contract> : (i32)283!CHECK-KIND10: }284!CHECK-KIND10: fir.result %[[VAL_13]] : f80285!CHECK-KIND10: } else {286!CHECK-KIND10: %[[VAL_30:.*]] = arith.constant 0.000000e+00 : f80287!CHECK-KIND10: %[[VAL_31:.*]] = arith.cmpf oeq, %[[VAL_13]], %[[VAL_30]] fastmath<contract> : f80288!CHECK-KIND10: %[[VAL_32:.*]] = fir.if %[[VAL_31]] -> (f80) {289!CHECK-KIND10: %[[VAL_33:.*]] = arith.bitcast %[[VAL_15]] : i80 to f80290!CHECK-KIND10: %[[VAL_34:.*]] = arith.constant -604462909807314587353087 : i80291!CHECK-KIND10: %[[VAL_35:.*]] = arith.bitcast %[[VAL_34]] : i80 to f80292!CHECK-KIND10: %[[VAL_36:.*]] = arith.select %[[VAL_16]], %[[VAL_33]], %[[VAL_35]] : f80293!CHECK-KIND10: fir.result %[[VAL_36]] : f80294!CHECK-KIND10: } else {295!CHECK-KIND10: %[[VAL_37:.*]] = arith.constant 63 : i32296!CHECK-KIND10: %[[VAL_38:.*]] = fir.call @_FortranAMapException(%[[VAL_37]]) fastmath<contract> : (i32) -> i32297!CHECK-KIND10: %[[VAL_39:.*]] = fir.call {{.*}}fetestexcept(%[[VAL_38]]) fastmath<contract> : (i32) -> i32298!CHECK-KIND10: %[[VAL_40:.*]] = fir.call {{.*}}fedisableexcept(%[[VAL_38]]) fastmath<contract> : (i32) -> i32299!CHECK-KIND10: %[[VAL_41:.*]] = fir.call @_FortranANearest10(%[[VAL_13]], %[[VAL_16]]) fastmath<contract> : (f80, i1) -> f80300!CHECK-KIND10: %[[VAL_42:.*]] = fir.call {{.*}}feclearexcept(%[[VAL_38]]) fastmath<contract> : (i32) -> i32301!CHECK-KIND10: fir.call {{.*}}feraiseexcept(%[[VAL_39]]) fastmath<contract> : (i32)302!CHECK-KIND10: %[[VAL_44:.*]] = fir.call {{.*}}feenableexcept(%[[VAL_40]]) fastmath<contract> : (i32) -> i32303!CHECK-KIND10: fir.result %[[VAL_41]] : f80304!CHECK-KIND10: }305!CHECK-KIND10: fir.result %[[VAL_32]] : f80306!CHECK-KIND10: }307!CHECK-KIND10: hlfir.assign %[[VAL_25]] to %[[VAL_11]]#0 : f80, !fir.ref<f80>308!CHECK-KIND10: return309!CHECK-KIND10: }310 311subroutine test6(r16, x16)312 real(kind16) :: r16, x16313 r16 = ieee_next_down(x16)314end subroutine315!CHECK-KIND16-LABEL: func.func @_QMieee_next_testsPtest6(316!CHECK-KIND16: %[[VAL_11:.*]]:2 = hlfir.declare {{.*}}r16"317!CHECK-KIND16: %[[VAL_12:.*]]:2 = hlfir.declare {{.*}}x16"318!CHECK-KIND16: %[[VAL_13:.*]] = fir.load %[[VAL_12]]#0 : !fir.ref<f128>319!CHECK-KIND16: %[[VAL_14:.*]] = "llvm.intr.is.fpclass"(%[[VAL_13]]) <{bit = 3 : i32}> : (f128) -> i1320!CHECK-KIND16: %[[VAL_15:.*]] = arith.constant 1 : i128321!CHECK-KIND16: %[[VAL_16:.*]] = arith.constant false322!CHECK-KIND16: %[[VAL_17:.*]] = arith.bitcast %[[VAL_13]] : f128 to i128323!CHECK-KIND16: %[[VAL_18:.*]] = arith.constant 127 : i128324!CHECK-KIND16: %[[VAL_19:.*]] = arith.shrui %[[VAL_17]], %[[VAL_18]] : i128325!CHECK-KIND16: %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (i128) -> i1326!CHECK-KIND16: %[[VAL_21:.*]] = arith.cmpi ne, %[[VAL_16]], %[[VAL_20]] : i1327!CHECK-KIND16: %[[VAL_22:.*]] = "llvm.intr.is.fpclass"(%[[VAL_13]]) <{bit = 516 : i32}> : (f128) -> i1328!CHECK-KIND16: %[[VAL_23:.*]] = arith.andi %[[VAL_22]], %[[VAL_21]] : i1329!CHECK-KIND16: %[[VAL_24:.*]] = arith.ori %[[VAL_14]], %[[VAL_23]] : i1330!CHECK-KIND16: %[[VAL_25:.*]] = fir.if %[[VAL_24]] -> (f128) {331!CHECK-KIND16: %[[VAL_26:.*]] = "llvm.intr.is.fpclass"(%[[VAL_13]]) <{bit = 1 : i32}> : (f128) -> i1332!CHECK-KIND16: fir.if %[[VAL_26]] {333!CHECK-KIND16: %[[VAL_27:.*]] = arith.constant 1 : i32334!CHECK-KIND16: %[[VAL_28:.*]] = fir.call @_FortranAMapException(%[[VAL_27]]) fastmath<contract> : (i32) -> i32335!CHECK-KIND16: fir.call {{.*}}feraiseexcept(%[[VAL_28]]) fastmath<contract> : (i32)336!CHECK-KIND16: }337!CHECK-KIND16: fir.result %[[VAL_13]] : f128338!CHECK-KIND16: } else {339!CHECK-KIND16: %[[VAL_30:.*]] = arith.constant 0.000000e+00 : f128340!CHECK-KIND16: %[[VAL_31:.*]] = arith.cmpf oeq, %[[VAL_13]], %[[VAL_30]] fastmath<contract> : f128341!CHECK-KIND16: %[[VAL_32:.*]] = fir.if %[[VAL_31]] -> (f128) {342!CHECK-KIND16: %[[VAL_33:.*]] = arith.bitcast %[[VAL_15]] : i128 to f128343!CHECK-KIND16: %[[VAL_34:.*]] = arith.constant -170141183460469231731687303715884105727 : i128344!CHECK-KIND16: %[[VAL_35:.*]] = arith.bitcast %[[VAL_34]] : i128 to f128345!CHECK-KIND16: %[[VAL_36:.*]] = arith.select %[[VAL_16]], %[[VAL_33]], %[[VAL_35]] : f128346!CHECK-KIND16: fir.result %[[VAL_36]] : f128347!CHECK-KIND16: } else {348!CHECK-KIND16: %[[VAL_37:.*]] = arith.bitcast %[[VAL_13]] : f128 to i128349!CHECK-KIND16-DAG: %[[VAL_38:.*]] = arith.addi %[[VAL_37]], %[[VAL_15]] : i128350!CHECK-KIND16-DAG: %[[VAL_39:.*]] = arith.subi %[[VAL_37]], %[[VAL_15]] : i128351!CHECK-KIND16: %[[VAL_40:.*]] = arith.select %[[VAL_21]], %[[VAL_38]], %[[VAL_39]] : i128352!CHECK-KIND16: %[[VAL_41:.*]] = arith.bitcast %[[VAL_40]] : i128 to f128353!CHECK-KIND16: fir.result %[[VAL_41]] : f128354!CHECK-KIND16: }355!CHECK-KIND16: fir.result %[[VAL_32]] : f128356!CHECK-KIND16: }357!CHECK-KIND16: hlfir.assign %[[VAL_25]] to %[[VAL_11]]#0 : f128, !fir.ref<f128>358!CHECK-KIND16: return359!CHECK-KIND16: }360end module361 362! Expected end-to-end output when both kind10 and kind16 enabled (not part of lit363! test, only provided for debug help):364!365! after: FC00 -> FBFF = -.655E+5366! up: FF7F -> FF7E = -.337E+39367! down: 80000000 -> 80000001 = -.1E-44368! after: 0000000000000000 -> 8000000000000001 = -.5E-323369! up: 7FFEFFFFFFFFFFFFFFFF -> 7FFF8000000000000000 = Inf370! down: 7FFF0000000000000000000000000000 -> 7FFEFFFFFFFFFFFFFFFFFFFFFFFFFFFF = .1189731495357231765085759326628007E+4933371program p372 use ieee_next_tests373 real(2) :: r2, x2374 real(3) :: r3, x3 = -huge(x3)375 real(4) :: r4, x4 = -0.376 real(8) :: r8, x8 = 0.377 real(kind10) :: r10, x10 = huge(x10)378 real(kind16) :: r16, x16379 380 x2 = ieee_value(x2, ieee_negative_inf)381 x16 = ieee_value(x2, ieee_positive_inf)382 call test1(r2, x2, x10)383 print "('after: ', z4.4, ' -> ', z4.4, ' = ', g0)", x2, r2, r2384 call test2(r3, x3)385 print "('up: ', z4.4, ' -> ', z4.4, ' = ', g0)", x3, r3, r3386 call test3(r4, x4)387 print "('down: ', z8.8, ' -> ', z8.8, ' = ', g0)", x4, r4, r4388 call test4(r8, x8, x2)389 print "('after: ', z16.16, ' -> ', z16.16, ' = ', g0)", x8, r8, r8390 call test5(r10, x10)391 print "('up: ', z20.20, ' -> ', z20.20, ' = ', g0)", x10, r10, r10392 call test6(r16, x16)393 print "('down: ', z32.32, ' -> ', z32.32, ' = ', g0)", x16, r16, r16394end395