1; RUN: llc < %s -mtriple=arm64-eabi -mattr=+fullfp16 -enable-no-nans-fp-math | FileCheck %s 2 3declare i1 @llvm.experimental.constrained.fcmp.f32(float, float, metadata, metadata) 4declare i1 @llvm.experimental.constrained.fcmp.f64(double, double, metadata, metadata) 5 6; CHECK-LABEL: @f32_constrained_fcmp_ueq 7; CHECK: fcmp s0, s1 8; CHECK-NEXT: cset w0, eq 9; CHECK-NEXT: ret 10define i1 @f32_constrained_fcmp_ueq(float %a, float %b) nounwind ssp strictfp { 11 %cmp = tail call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ueq", metadata !"fpexcept.strict") 12 ret i1 %cmp 13} 14 15; CHECK-LABEL: @f32_constrained_fcmp_une 16; CHECK: fcmp s0, s1 17; CHECK-NEXT: cset w0, ne 18; CHECK-NEXT: ret 19define i1 @f32_constrained_fcmp_une(float %a, float %b) nounwind ssp strictfp { 20 %cmp = tail call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"une", metadata !"fpexcept.strict") 21 ret i1 %cmp 22} 23 24; CHECK-LABEL: @f32_constrained_fcmp_ugt 25; CHECK: fcmp s0, s1 26; CHECK-NEXT: cset w0, gt 27; CHECK-NEXT: ret 28define i1 @f32_constrained_fcmp_ugt(float %a, float %b) nounwind ssp strictfp { 29 %cmp = tail call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ugt", metadata !"fpexcept.strict") 30 ret i1 %cmp 31} 32 33; CHECK-LABEL: @f32_constrained_fcmp_uge 34; CHECK: fcmp s0, s1 35; CHECK-NEXT: cset w0, ge 36; CHECK-NEXT: ret 37define i1 @f32_constrained_fcmp_uge(float %a, float %b) nounwind ssp strictfp { 38 %cmp = tail call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"uge", metadata !"fpexcept.strict") 39 ret i1 %cmp 40} 41 42; CHECK-LABEL: @f32_constrained_fcmp_ult 43; CHECK: fcmp s0, s1 44; CHECK-NEXT: cset w0, lt 45; CHECK-NEXT: ret 46define i1 @f32_constrained_fcmp_ult(float %a, float %b) nounwind ssp strictfp { 47 %cmp = tail call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ult", metadata !"fpexcept.strict") 48 ret i1 %cmp 49} 50 51; CHECK-LABEL: @f32_constrained_fcmp_ule 52; CHECK: fcmp s0, s1 53; CHECK-NEXT: cset w0, le 54; CHECK-NEXT: ret 55define i1 @f32_constrained_fcmp_ule(float %a, float %b) nounwind ssp strictfp { 56 %cmp = tail call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ule", metadata !"fpexcept.strict") 57 ret i1 %cmp 58} 59 60; CHECK-LABEL: @f64_constrained_fcmp_ueq 61; CHECK: fcmp d0, d1 62; CHECK-NEXT: cset w0, eq 63; CHECK-NEXT: ret 64define i1 @f64_constrained_fcmp_ueq(double %a, double %b) nounwind ssp strictfp { 65 %cmp = tail call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ueq", metadata !"fpexcept.strict") 66 ret i1 %cmp 67} 68 69; CHECK-LABEL: @f64_constrained_fcmp_une 70; CHECK: fcmp d0, d1 71; CHECK-NEXT: cset w0, ne 72; CHECK-NEXT: ret 73define i1 @f64_constrained_fcmp_une(double %a, double %b) nounwind ssp strictfp { 74 %cmp = tail call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"une", metadata !"fpexcept.strict") 75 ret i1 %cmp 76} 77 78; CHECK-LABEL: @f64_constrained_fcmp_ugt 79; CHECK: fcmp d0, d1 80; CHECK-NEXT: cset w0, gt 81; CHECK-NEXT: ret 82define i1 @f64_constrained_fcmp_ugt(double %a, double %b) nounwind ssp strictfp { 83 %cmp = tail call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ugt", metadata !"fpexcept.strict") 84 ret i1 %cmp 85} 86 87; CHECK-LABEL: @f64_constrained_fcmp_uge 88; CHECK: fcmp d0, d1 89; CHECK-NEXT: cset w0, ge 90; CHECK-NEXT: ret 91define i1 @f64_constrained_fcmp_uge(double %a, double %b) nounwind ssp strictfp { 92 %cmp = tail call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"uge", metadata !"fpexcept.strict") 93 ret i1 %cmp 94} 95 96; CHECK-LABEL: @f64_constrained_fcmp_ult 97; CHECK: fcmp d0, d1 98; CHECK-NEXT: cset w0, lt 99; CHECK-NEXT: ret 100define i1 @f64_constrained_fcmp_ult(double %a, double %b) nounwind ssp strictfp { 101 %cmp = tail call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ult", metadata !"fpexcept.strict") 102 ret i1 %cmp 103} 104 105; CHECK-LABEL: @f64_constrained_fcmp_ule 106; CHECK: fcmp d0, d1 107; CHECK-NEXT: cset w0, le 108; CHECK-NEXT: ret 109define i1 @f64_constrained_fcmp_ule(double %a, double %b) nounwind ssp strictfp { 110 %cmp = tail call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ule", metadata !"fpexcept.strict") 111 ret i1 %cmp 112} 113