1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.2 | FileCheck %s 3 4 define double @test1(double %a, double %b, double %eps) { 5 ; CHECK-LABEL: test1: 6 ; CHECK: # %bb.0: 7 ; CHECK-NEXT: cmpltsd %xmm2, %xmm0 8 ; CHECK-NEXT: andpd %xmm1, %xmm0 9 ; CHECK-NEXT: retq 10 %cmp = fcmp olt double %a, %eps 11 %cond = select i1 %cmp, double %b, double 0.000000e+00 12 ret double %cond 13 } 14 15 define double @test2(double %a, double %b, double %eps) { 16 ; CHECK-LABEL: test2: 17 ; CHECK: # %bb.0: 18 ; CHECK-NEXT: cmplesd %xmm2, %xmm0 19 ; CHECK-NEXT: andpd %xmm1, %xmm0 20 ; CHECK-NEXT: retq 21 %cmp = fcmp ole double %a, %eps 22 %cond = select i1 %cmp, double %b, double 0.000000e+00 23 ret double %cond 24 } 25 26 define double @test3(double %a, double %b, double %eps) { 27 ; CHECK-LABEL: test3: 28 ; CHECK: # %bb.0: 29 ; CHECK-NEXT: cmpltsd %xmm0, %xmm2 30 ; CHECK-NEXT: andpd %xmm1, %xmm2 31 ; CHECK-NEXT: movapd %xmm2, %xmm0 32 ; CHECK-NEXT: retq 33 %cmp = fcmp ogt double %a, %eps 34 %cond = select i1 %cmp, double %b, double 0.000000e+00 35 ret double %cond 36 } 37 38 define double @test4(double %a, double %b, double %eps) { 39 ; CHECK-LABEL: test4: 40 ; CHECK: # %bb.0: 41 ; CHECK-NEXT: cmplesd %xmm0, %xmm2 42 ; CHECK-NEXT: andpd %xmm1, %xmm2 43 ; CHECK-NEXT: movapd %xmm2, %xmm0 44 ; CHECK-NEXT: retq 45 %cmp = fcmp oge double %a, %eps 46 %cond = select i1 %cmp, double %b, double 0.000000e+00 47 ret double %cond 48 } 49 50 define double @test5(double %a, double %b, double %eps) { 51 ; CHECK-LABEL: test5: 52 ; CHECK: # %bb.0: 53 ; CHECK-NEXT: cmpltsd %xmm2, %xmm0 54 ; CHECK-NEXT: andnpd %xmm1, %xmm0 55 ; CHECK-NEXT: retq 56 %cmp = fcmp olt double %a, %eps 57 %cond = select i1 %cmp, double 0.000000e+00, double %b 58 ret double %cond 59 } 60 61 define double @test6(double %a, double %b, double %eps) { 62 ; CHECK-LABEL: test6: 63 ; CHECK: # %bb.0: 64 ; CHECK-NEXT: cmplesd %xmm2, %xmm0 65 ; CHECK-NEXT: andnpd %xmm1, %xmm0 66 ; CHECK-NEXT: retq 67 %cmp = fcmp ole double %a, %eps 68 %cond = select i1 %cmp, double 0.000000e+00, double %b 69 ret double %cond 70 } 71 72 define double @test7(double %a, double %b, double %eps) { 73 ; CHECK-LABEL: test7: 74 ; CHECK: # %bb.0: 75 ; CHECK-NEXT: cmpltsd %xmm0, %xmm2 76 ; CHECK-NEXT: andnpd %xmm1, %xmm2 77 ; CHECK-NEXT: movapd %xmm2, %xmm0 78 ; CHECK-NEXT: retq 79 %cmp = fcmp ogt double %a, %eps 80 %cond = select i1 %cmp, double 0.000000e+00, double %b 81 ret double %cond 82 } 83 84 define double @test8(double %a, double %b, double %eps) { 85 ; CHECK-LABEL: test8: 86 ; CHECK: # %bb.0: 87 ; CHECK-NEXT: cmplesd %xmm0, %xmm2 88 ; CHECK-NEXT: andnpd %xmm1, %xmm2 89 ; CHECK-NEXT: movapd %xmm2, %xmm0 90 ; CHECK-NEXT: retq 91 %cmp = fcmp oge double %a, %eps 92 %cond = select i1 %cmp, double 0.000000e+00, double %b 93 ret double %cond 94 } 95 96 define float @test9(float %a, float %b, float %eps) { 97 ; CHECK-LABEL: test9: 98 ; CHECK: # %bb.0: 99 ; CHECK-NEXT: cmpltss %xmm2, %xmm0 100 ; CHECK-NEXT: andps %xmm1, %xmm0 101 ; CHECK-NEXT: retq 102 %cmp = fcmp olt float %a, %eps 103 %cond = select i1 %cmp, float %b, float 0.000000e+00 104 ret float %cond 105 } 106 107 define float @test10(float %a, float %b, float %eps) { 108 ; CHECK-LABEL: test10: 109 ; CHECK: # %bb.0: 110 ; CHECK-NEXT: cmpless %xmm2, %xmm0 111 ; CHECK-NEXT: andps %xmm1, %xmm0 112 ; CHECK-NEXT: retq 113 %cmp = fcmp ole float %a, %eps 114 %cond = select i1 %cmp, float %b, float 0.000000e+00 115 ret float %cond 116 } 117 118 define float @test11(float %a, float %b, float %eps) { 119 ; CHECK-LABEL: test11: 120 ; CHECK: # %bb.0: 121 ; CHECK-NEXT: cmpltss %xmm0, %xmm2 122 ; CHECK-NEXT: andps %xmm1, %xmm2 123 ; CHECK-NEXT: movaps %xmm2, %xmm0 124 ; CHECK-NEXT: retq 125 %cmp = fcmp ogt float %a, %eps 126 %cond = select i1 %cmp, float %b, float 0.000000e+00 127 ret float %cond 128 } 129 130 define float @test12(float %a, float %b, float %eps) { 131 ; CHECK-LABEL: test12: 132 ; CHECK: # %bb.0: 133 ; CHECK-NEXT: cmpless %xmm0, %xmm2 134 ; CHECK-NEXT: andps %xmm1, %xmm2 135 ; CHECK-NEXT: movaps %xmm2, %xmm0 136 ; CHECK-NEXT: retq 137 %cmp = fcmp oge float %a, %eps 138 %cond = select i1 %cmp, float %b, float 0.000000e+00 139 ret float %cond 140 } 141 142 define float @test13(float %a, float %b, float %eps) { 143 ; CHECK-LABEL: test13: 144 ; CHECK: # %bb.0: 145 ; CHECK-NEXT: cmpltss %xmm2, %xmm0 146 ; CHECK-NEXT: andnps %xmm1, %xmm0 147 ; CHECK-NEXT: retq 148 %cmp = fcmp olt float %a, %eps 149 %cond = select i1 %cmp, float 0.000000e+00, float %b 150 ret float %cond 151 } 152 153 define float @test14(float %a, float %b, float %eps) { 154 ; CHECK-LABEL: test14: 155 ; CHECK: # %bb.0: 156 ; CHECK-NEXT: cmpless %xmm2, %xmm0 157 ; CHECK-NEXT: andnps %xmm1, %xmm0 158 ; CHECK-NEXT: retq 159 %cmp = fcmp ole float %a, %eps 160 %cond = select i1 %cmp, float 0.000000e+00, float %b 161 ret float %cond 162 } 163 164 define float @test15(float %a, float %b, float %eps) { 165 ; CHECK-LABEL: test15: 166 ; CHECK: # %bb.0: 167 ; CHECK-NEXT: cmpltss %xmm0, %xmm2 168 ; CHECK-NEXT: andnps %xmm1, %xmm2 169 ; CHECK-NEXT: movaps %xmm2, %xmm0 170 ; CHECK-NEXT: retq 171 %cmp = fcmp ogt float %a, %eps 172 %cond = select i1 %cmp, float 0.000000e+00, float %b 173 ret float %cond 174 } 175 176 define float @test16(float %a, float %b, float %eps) { 177 ; CHECK-LABEL: test16: 178 ; CHECK: # %bb.0: 179 ; CHECK-NEXT: cmpless %xmm0, %xmm2 180 ; CHECK-NEXT: andnps %xmm1, %xmm2 181 ; CHECK-NEXT: movaps %xmm2, %xmm0 182 ; CHECK-NEXT: retq 183 %cmp = fcmp oge float %a, %eps 184 %cond = select i1 %cmp, float 0.000000e+00, float %b 185 ret float %cond 186 } 187 188 define float @test17(float %a, float %b, float %c, float %eps) { 189 ; CHECK-LABEL: test17: 190 ; CHECK: # %bb.0: 191 ; CHECK-NEXT: cmpless %xmm0, %xmm3 192 ; CHECK-NEXT: andps %xmm3, %xmm2 193 ; CHECK-NEXT: andnps %xmm1, %xmm3 194 ; CHECK-NEXT: orps %xmm2, %xmm3 195 ; CHECK-NEXT: movaps %xmm3, %xmm0 196 ; CHECK-NEXT: retq 197 %cmp = fcmp oge float %a, %eps 198 %cond = select i1 %cmp, float %c, float %b 199 ret float %cond 200 } 201 202 define double @test18(double %a, double %b, double %c, double %eps) { 203 ; CHECK-LABEL: test18: 204 ; CHECK: # %bb.0: 205 ; CHECK-NEXT: cmplesd %xmm0, %xmm3 206 ; CHECK-NEXT: andpd %xmm3, %xmm2 207 ; CHECK-NEXT: andnpd %xmm1, %xmm3 208 ; CHECK-NEXT: orpd %xmm2, %xmm3 209 ; CHECK-NEXT: movapd %xmm3, %xmm0 210 ; CHECK-NEXT: retq 211 %cmp = fcmp oge double %a, %eps 212 %cond = select i1 %cmp, double %c, double %b 213 ret double %cond 214 } 215 216