1 // RUN: %clang_cc1 -ffp-exception-behavior=ignore -fexperimental-strict-floating-point -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=FCMP 2 // RUN: %clang_cc1 -ffp-exception-behavior=strict -fexperimental-strict-floating-point -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=EXCEPT 3 // RUN: %clang_cc1 -ffp-exception-behavior=maytrap -fexperimental-strict-floating-point -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=MAYTRAP 4 // RUN: %clang_cc1 -frounding-math -ffp-exception-behavior=ignore -fexperimental-strict-floating-point -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=IGNORE 5 // RUN: %clang_cc1 -frounding-math -ffp-exception-behavior=strict -fexperimental-strict-floating-point -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=EXCEPT 6 // RUN: %clang_cc1 -frounding-math -ffp-exception-behavior=maytrap -fexperimental-strict-floating-point -emit-llvm -o - %s | FileCheck %s -check-prefix=CHECK -check-prefix=MAYTRAP 7 8 _Bool QuietEqual(float f1, float f2) { 9 // CHECK-LABEL: define {{.*}}i1 @QuietEqual(float %f1, float %f2) 10 11 // FCMP: fcmp oeq float %{{.*}}, %{{.*}} 12 // IGNORE: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"oeq", metadata !"fpexcept.ignore") 13 // EXCEPT: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"oeq", metadata !"fpexcept.strict") 14 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"oeq", metadata !"fpexcept.maytrap") 15 return f1 == f2; 16 17 // CHECK: ret 18 } 19 20 _Bool QuietNotEqual(float f1, float f2) { 21 // CHECK-LABEL: define {{.*}}i1 @QuietNotEqual(float %f1, float %f2) 22 23 // FCMP: fcmp une float %{{.*}}, %{{.*}} 24 // IGNORE: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"une", metadata !"fpexcept.ignore") 25 // EXCEPT: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"une", metadata !"fpexcept.strict") 26 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"une", metadata !"fpexcept.maytrap") 27 return f1 != f2; 28 29 // CHECK: ret 30 } 31 32 _Bool SignalingLess(float f1, float f2) { 33 // CHECK-LABEL: define {{.*}}i1 @SignalingLess(float %f1, float %f2) 34 35 // FCMP: fcmp olt float %{{.*}}, %{{.*}} 36 // IGNORE: call i1 @llvm.experimental.constrained.fcmps.f32(float %{{.*}}, float %{{.*}}, metadata !"olt", metadata !"fpexcept.ignore") 37 // EXCEPT: call i1 @llvm.experimental.constrained.fcmps.f32(float %{{.*}}, float %{{.*}}, metadata !"olt", metadata !"fpexcept.strict") 38 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmps.f32(float %{{.*}}, float %{{.*}}, metadata !"olt", metadata !"fpexcept.maytrap") 39 return f1 < f2; 40 41 // CHECK: ret 42 } 43 44 _Bool SignalingLessEqual(float f1, float f2) { 45 // CHECK-LABEL: define {{.*}}i1 @SignalingLessEqual(float %f1, float %f2) 46 47 // FCMP: fcmp ole float %{{.*}}, %{{.*}} 48 // IGNORE: call i1 @llvm.experimental.constrained.fcmps.f32(float %{{.*}}, float %{{.*}}, metadata !"ole", metadata !"fpexcept.ignore") 49 // EXCEPT: call i1 @llvm.experimental.constrained.fcmps.f32(float %{{.*}}, float %{{.*}}, metadata !"ole", metadata !"fpexcept.strict") 50 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmps.f32(float %{{.*}}, float %{{.*}}, metadata !"ole", metadata !"fpexcept.maytrap") 51 return f1 <= f2; 52 53 // CHECK: ret 54 } 55 56 _Bool SignalingGreater(float f1, float f2) { 57 // CHECK-LABEL: define {{.*}}i1 @SignalingGreater(float %f1, float %f2) 58 59 // FCMP: fcmp ogt float %{{.*}}, %{{.*}} 60 // IGNORE: call i1 @llvm.experimental.constrained.fcmps.f32(float %{{.*}}, float %{{.*}}, metadata !"ogt", metadata !"fpexcept.ignore") 61 // EXCEPT: call i1 @llvm.experimental.constrained.fcmps.f32(float %{{.*}}, float %{{.*}}, metadata !"ogt", metadata !"fpexcept.strict") 62 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmps.f32(float %{{.*}}, float %{{.*}}, metadata !"ogt", metadata !"fpexcept.maytrap") 63 return f1 > f2; 64 65 // CHECK: ret 66 } 67 68 _Bool SignalingGreaterEqual(float f1, float f2) { 69 // CHECK-LABEL: define {{.*}}i1 @SignalingGreaterEqual(float %f1, float %f2) 70 71 // FCMP: fcmp oge float %{{.*}}, %{{.*}} 72 // IGNORE: call i1 @llvm.experimental.constrained.fcmps.f32(float %{{.*}}, float %{{.*}}, metadata !"oge", metadata !"fpexcept.ignore") 73 // EXCEPT: call i1 @llvm.experimental.constrained.fcmps.f32(float %{{.*}}, float %{{.*}}, metadata !"oge", metadata !"fpexcept.strict") 74 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmps.f32(float %{{.*}}, float %{{.*}}, metadata !"oge", metadata !"fpexcept.maytrap") 75 return f1 >= f2; 76 77 // CHECK: ret 78 } 79 80 _Bool QuietLess(float f1, float f2) { 81 // CHECK-LABEL: define {{.*}}i1 @QuietLess(float %f1, float %f2) 82 83 // FCMP: fcmp olt float %{{.*}}, %{{.*}} 84 // IGNORE: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"olt", metadata !"fpexcept.ignore") 85 // EXCEPT: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"olt", metadata !"fpexcept.strict") 86 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"olt", metadata !"fpexcept.maytrap") 87 return __builtin_isless(f1, f2); 88 89 // CHECK: ret 90 } 91 92 _Bool QuietLessEqual(float f1, float f2) { 93 // CHECK-LABEL: define {{.*}}i1 @QuietLessEqual(float %f1, float %f2) 94 95 // FCMP: fcmp ole float %{{.*}}, %{{.*}} 96 // IGNORE: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"ole", metadata !"fpexcept.ignore") 97 // EXCEPT: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"ole", metadata !"fpexcept.strict") 98 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"ole", metadata !"fpexcept.maytrap") 99 return __builtin_islessequal(f1, f2); 100 101 // CHECK: ret 102 } 103 104 _Bool QuietGreater(float f1, float f2) { 105 // CHECK-LABEL: define {{.*}}i1 @QuietGreater(float %f1, float %f2) 106 107 // FCMP: fcmp ogt float %{{.*}}, %{{.*}} 108 // IGNORE: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"ogt", metadata !"fpexcept.ignore") 109 // EXCEPT: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"ogt", metadata !"fpexcept.strict") 110 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"ogt", metadata !"fpexcept.maytrap") 111 return __builtin_isgreater(f1, f2); 112 113 // CHECK: ret 114 } 115 116 _Bool QuietGreaterEqual(float f1, float f2) { 117 // CHECK-LABEL: define {{.*}}i1 @QuietGreaterEqual(float %f1, float %f2) 118 119 // FCMP: fcmp oge float %{{.*}}, %{{.*}} 120 // IGNORE: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"oge", metadata !"fpexcept.ignore") 121 // EXCEPT: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"oge", metadata !"fpexcept.strict") 122 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"oge", metadata !"fpexcept.maytrap") 123 return __builtin_isgreaterequal(f1, f2); 124 125 // CHECK: ret 126 } 127 128 _Bool QuietLessGreater(float f1, float f2) { 129 // CHECK-LABEL: define {{.*}}i1 @QuietLessGreater(float %f1, float %f2) 130 131 // FCMP: fcmp one float %{{.*}}, %{{.*}} 132 // IGNORE: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"one", metadata !"fpexcept.ignore") 133 // EXCEPT: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"one", metadata !"fpexcept.strict") 134 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"one", metadata !"fpexcept.maytrap") 135 return __builtin_islessgreater(f1, f2); 136 137 // CHECK: ret 138 } 139 140 _Bool QuietUnordered(float f1, float f2) { 141 // CHECK-LABEL: define {{.*}}i1 @QuietUnordered(float %f1, float %f2) 142 143 // FCMP: fcmp uno float %{{.*}}, %{{.*}} 144 // IGNORE: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"uno", metadata !"fpexcept.ignore") 145 // EXCEPT: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"uno", metadata !"fpexcept.strict") 146 // MAYTRAP: call i1 @llvm.experimental.constrained.fcmp.f32(float %{{.*}}, float %{{.*}}, metadata !"uno", metadata !"fpexcept.maytrap") 147 return __builtin_isunordered(f1, f2); 148 149 // CHECK: ret 150 } 151 152