1 ; RUN: llc < %s -O0 -fast-isel-abort -verify-machineinstrs -mtriple=arm64-apple-darwin | FileCheck %s 2 3 define zeroext i1 @fcmp_float1(float %a) nounwind ssp { 4 entry: 5 ; CHECK-LABEL: @fcmp_float1 6 ; CHECK: fcmp s0, #0.0 7 ; CHECK: cset w{{[0-9]+}}, ne 8 %cmp = fcmp une float %a, 0.000000e+00 9 ret i1 %cmp 10 } 11 12 define zeroext i1 @fcmp_float2(float %a, float %b) nounwind ssp { 13 entry: 14 ; CHECK-LABEL: @fcmp_float2 15 ; CHECK: fcmp s0, s1 16 ; CHECK: cset w{{[0-9]+}}, ne 17 %cmp = fcmp une float %a, %b 18 ret i1 %cmp 19 } 20 21 define zeroext i1 @fcmp_double1(double %a) nounwind ssp { 22 entry: 23 ; CHECK-LABEL: @fcmp_double1 24 ; CHECK: fcmp d0, #0.0 25 ; CHECK: cset w{{[0-9]+}}, ne 26 %cmp = fcmp une double %a, 0.000000e+00 27 ret i1 %cmp 28 } 29 30 define zeroext i1 @fcmp_double2(double %a, double %b) nounwind ssp { 31 entry: 32 ; CHECK-LABEL: @fcmp_double2 33 ; CHECK: fcmp d0, d1 34 ; CHECK: cset w{{[0-9]+}}, ne 35 %cmp = fcmp une double %a, %b 36 ret i1 %cmp 37 } 38 39 ; Check each fcmp condition 40 define float @fcmp_oeq(float %a, float %b) nounwind ssp { 41 ; CHECK-LABEL: @fcmp_oeq 42 ; CHECK: fcmp s0, s1 43 ; CHECK: cset w{{[0-9]+}}, eq 44 %cmp = fcmp oeq float %a, %b 45 %conv = uitofp i1 %cmp to float 46 ret float %conv 47 } 48 49 define float @fcmp_ogt(float %a, float %b) nounwind ssp { 50 ; CHECK-LABEL: @fcmp_ogt 51 ; CHECK: fcmp s0, s1 52 ; CHECK: cset w{{[0-9]+}}, gt 53 %cmp = fcmp ogt float %a, %b 54 %conv = uitofp i1 %cmp to float 55 ret float %conv 56 } 57 58 define float @fcmp_oge(float %a, float %b) nounwind ssp { 59 ; CHECK-LABEL: @fcmp_oge 60 ; CHECK: fcmp s0, s1 61 ; CHECK: cset w{{[0-9]+}}, ge 62 %cmp = fcmp oge float %a, %b 63 %conv = uitofp i1 %cmp to float 64 ret float %conv 65 } 66 67 define float @fcmp_olt(float %a, float %b) nounwind ssp { 68 ; CHECK-LABEL: @fcmp_olt 69 ; CHECK: fcmp s0, s1 70 ; CHECK: cset w{{[0-9]+}}, mi 71 %cmp = fcmp olt float %a, %b 72 %conv = uitofp i1 %cmp to float 73 ret float %conv 74 } 75 76 define float @fcmp_ole(float %a, float %b) nounwind ssp { 77 ; CHECK-LABEL: @fcmp_ole 78 ; CHECK: fcmp s0, s1 79 ; CHECK: cset w{{[0-9]+}}, ls 80 %cmp = fcmp ole float %a, %b 81 %conv = uitofp i1 %cmp to float 82 ret float %conv 83 } 84 85 define float @fcmp_ord(float %a, float %b) nounwind ssp { 86 ; CHECK-LABEL: @fcmp_ord 87 ; CHECK: fcmp s0, s1 88 ; CHECK: cset {{w[0-9]+}}, vc 89 %cmp = fcmp ord float %a, %b 90 %conv = uitofp i1 %cmp to float 91 ret float %conv 92 } 93 94 define float @fcmp_uno(float %a, float %b) nounwind ssp { 95 ; CHECK-LABEL: @fcmp_uno 96 ; CHECK: fcmp s0, s1 97 ; CHECK: cset {{w[0-9]+}}, vs 98 %cmp = fcmp uno float %a, %b 99 %conv = uitofp i1 %cmp to float 100 ret float %conv 101 } 102 103 define float @fcmp_ugt(float %a, float %b) nounwind ssp { 104 ; CHECK-LABEL: @fcmp_ugt 105 ; CHECK: fcmp s0, s1 106 ; CHECK: cset {{w[0-9]+}}, hi 107 %cmp = fcmp ugt float %a, %b 108 %conv = uitofp i1 %cmp to float 109 ret float %conv 110 } 111 112 define float @fcmp_uge(float %a, float %b) nounwind ssp { 113 ; CHECK-LABEL: @fcmp_uge 114 ; CHECK: fcmp s0, s1 115 ; CHECK: cset {{w[0-9]+}}, pl 116 %cmp = fcmp uge float %a, %b 117 %conv = uitofp i1 %cmp to float 118 ret float %conv 119 } 120 121 define float @fcmp_ult(float %a, float %b) nounwind ssp { 122 ; CHECK-LABEL: @fcmp_ult 123 ; CHECK: fcmp s0, s1 124 ; CHECK: cset {{w[0-9]+}}, lt 125 %cmp = fcmp ult float %a, %b 126 %conv = uitofp i1 %cmp to float 127 ret float %conv 128 } 129 130 define float @fcmp_ule(float %a, float %b) nounwind ssp { 131 ; CHECK-LABEL: @fcmp_ule 132 ; CHECK: fcmp s0, s1 133 ; CHECK: cset {{w[0-9]+}}, le 134 %cmp = fcmp ule float %a, %b 135 %conv = uitofp i1 %cmp to float 136 ret float %conv 137 } 138 139 define float @fcmp_une(float %a, float %b) nounwind ssp { 140 ; CHECK-LABEL: @fcmp_une 141 ; CHECK: fcmp s0, s1 142 ; CHECK: cset {{w[0-9]+}}, ne 143 %cmp = fcmp une float %a, %b 144 %conv = uitofp i1 %cmp to float 145 ret float %conv 146 } 147