1 ; RUN: llc < %s -march=mips -mcpu=mips32 | \ 2 ; RUN: FileCheck %s -check-prefixes=ALL,32-C 3 ; RUN: llc < %s -march=mips -mcpu=mips32r2 | \ 4 ; RUN: FileCheck %s -check-prefixes=ALL,32-C 5 ; RUN: llc < %s -march=mips -mcpu=mips32r6 | \ 6 ; RUN: FileCheck %s -check-prefixes=ALL,32-CMP 7 ; RUN: llc < %s -march=mips64 -mcpu=mips4 | \ 8 ; RUN: FileCheck %s -check-prefixes=ALL,64-C 9 ; RUN: llc < %s -march=mips64 -mcpu=mips64 | \ 10 ; RUN: FileCheck %s -check-prefixes=ALL,64-C 11 ; RUN: llc < %s -march=mips64 -mcpu=mips64r2 | \ 12 ; RUN: FileCheck %s -check-prefixes=ALL,64-C 13 ; RUN: llc < %s -march=mips64 -mcpu=mips64r6 | \ 14 ; RUN: FileCheck %s -check-prefixes=ALL,64-CMP 15 ; RUN: llc < %s -march=mips -mcpu=mips32r3 -mattr=+micromips | FileCheck %s \ 16 ; RUN: -check-prefixes=ALL,MM,MM32R3 17 ; RUN: llc < %s -march=mips -mcpu=mips32r6 -mattr=+micromips | FileCheck %s \ 18 ; RUN: -check-prefixes=ALL,MM,MMR6,MM32R6 19 ; RUN: llc < %s -march=mips64 -mcpu=mips64r6 -mattr=+micromips | FileCheck %s \ 20 ; RUN: -check-prefixes=ALL,MM,MMR6,MM64R6 21 22 define i32 @false_f32(float %a, float %b) nounwind { 23 ; ALL-LABEL: false_f32: 24 ; 32-C: addiu $2, $zero, 0 25 26 ; 32-CMP: addiu $2, $zero, 0 27 28 ; 64-C: addiu $2, $zero, 0 29 30 ; 64-CMP: addiu $2, $zero, 0 31 32 ; MM-DAG: lui $2, 0 33 34 %1 = fcmp false float %a, %b 35 %2 = zext i1 %1 to i32 36 ret i32 %2 37 } 38 39 define i32 @oeq_f32(float %a, float %b) nounwind { 40 ; ALL-LABEL: oeq_f32: 41 42 ; 32-C-DAG: addiu $2, $zero, 1 43 ; 32-C-DAG: c.eq.s $f12, $f14 44 ; 32-C: movf $2, $zero, $fcc0 45 46 ; 64-C-DAG: addiu $2, $zero, 1 47 ; 64-C-DAG: c.eq.s $f12, $f13 48 ; 64-C: movf $2, $zero, $fcc0 49 50 ; 32-CMP-DAG: cmp.eq.s $[[T0:f[0-9]+]], $f12, $f14 51 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 52 ; 32-CMP-DAG: andi $2, $[[T1]], 1 53 54 ; 64-CMP-DAG: cmp.eq.s $[[T0:f[0-9]+]], $f12, $f13 55 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 56 ; 64-CMP-DAG: andi $2, $[[T1]], 1 57 58 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 59 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 60 ; MM32R3-DAG: c.eq.s $f12, $f14 61 ; MM32R3-DAG: movf $[[T1]], $[[T0]], $fcc0 62 63 ; MM32R6-DAG: cmp.eq.s $[[T0:f[0-9]+]], $f12, $f14 64 ; MM64R6-DAG: cmp.eq.s $[[T0:f[0-9]+]], $f12, $f13 65 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 66 ; MMR6-DAG: andi16 $2, $[[T1]], 1 67 68 %1 = fcmp oeq float %a, %b 69 %2 = zext i1 %1 to i32 70 ret i32 %2 71 } 72 73 define i32 @ogt_f32(float %a, float %b) nounwind { 74 ; ALL-LABEL: ogt_f32: 75 76 ; 32-C-DAG: addiu $2, $zero, 1 77 ; 32-C-DAG: c.ule.s $f12, $f14 78 ; 32-C: movt $2, $zero, $fcc0 79 80 ; 64-C-DAG: addiu $2, $zero, 1 81 ; 64-C-DAG: c.ule.s $f12, $f13 82 ; 64-C: movt $2, $zero, $fcc0 83 84 ; 32-CMP-DAG: cmp.lt.s $[[T0:f[0-9]+]], $f14, $f12 85 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 86 ; 32-CMP-DAG: andi $2, $[[T1]], 1 87 88 ; 64-CMP-DAG: cmp.lt.s $[[T0:f[0-9]+]], $f13, $f12 89 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 90 ; 64-CMP-DAG: andi $2, $[[T1]], 1 91 92 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 93 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 94 ; MM32R3-DAG: c.ule.s $f12, $f14 95 ; MM32R3-DAG: movt $[[T1]], $[[T0]], $fcc0 96 97 ; MM32R6-DAG: cmp.lt.s $[[T0:f[0-9]+]], $f14, $f12 98 ; MM64R6-DAG: cmp.lt.s $[[T0:f[0-9]+]], $f13, $f12 99 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 100 ; MMR6-DAG: andi16 $2, $[[T1]], 1 101 102 %1 = fcmp ogt float %a, %b 103 %2 = zext i1 %1 to i32 104 ret i32 %2 105 } 106 107 define i32 @oge_f32(float %a, float %b) nounwind { 108 ; ALL-LABEL: oge_f32: 109 110 ; 32-C-DAG: addiu $2, $zero, 1 111 ; 32-C-DAG: c.ult.s $f12, $f14 112 ; 32-C: movt $2, $zero, $fcc0 113 114 ; 64-C-DAG: addiu $2, $zero, 1 115 ; 64-C-DAG: c.ult.s $f12, $f13 116 ; 64-C: movt $2, $zero, $fcc0 117 118 ; 32-CMP-DAG: cmp.le.s $[[T0:f[0-9]+]], $f14, $f12 119 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 120 ; 32-CMP-DAG: andi $2, $[[T1]], 1 121 122 ; 64-CMP-DAG: cmp.le.s $[[T0:f[0-9]+]], $f13, $f12 123 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 124 ; 64-CMP-DAG: andi $2, $[[T1]], 1 125 126 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 127 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 128 ; MM32R3-DAG: c.ult.s $f12, $f14 129 ; MM32R3-DAG: movt $[[T1]], $[[T0]], $fcc0 130 131 ; MM32R6-DAG: cmp.le.s $[[T0:f[0-9]+]], $f14, $f12 132 ; MM64R6-DAG: cmp.le.s $[[T0:f[0-9]+]], $f13, $f12 133 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 134 ; MMR6-DAG: andi16 $2, $[[T1]], 1 135 136 %1 = fcmp oge float %a, %b 137 %2 = zext i1 %1 to i32 138 ret i32 %2 139 } 140 141 define i32 @olt_f32(float %a, float %b) nounwind { 142 ; ALL-LABEL: olt_f32: 143 144 ; 32-C-DAG: addiu $2, $zero, 1 145 ; 32-C-DAG: c.olt.s $f12, $f14 146 ; 32-C: movf $2, $zero, $fcc0 147 148 ; 64-C-DAG: addiu $2, $zero, 1 149 ; 64-C-DAG: c.olt.s $f12, $f13 150 ; 64-C: movf $2, $zero, $fcc0 151 152 ; 32-CMP-DAG: cmp.lt.s $[[T0:f[0-9]+]], $f12, $f14 153 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 154 ; 32-CMP-DAG: andi $2, $[[T1]], 1 155 156 ; 64-CMP-DAG: cmp.lt.s $[[T0:f[0-9]+]], $f12, $f13 157 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 158 ; 64-CMP-DAG: andi $2, $[[T1]], 1 159 160 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 161 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 162 ; MM32R3-DAG: c.olt.s $f12, $f14 163 ; MM32R3-DAG: movf $[[T1]], $[[T0]], $fcc0 164 165 ; MM32R6-DAG: cmp.lt.s $[[T0:f[0-9]+]], $f12, $f14 166 ; MM64R6-DAG: cmp.lt.s $[[T0:f[0-9]+]], $f12, $f13 167 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 168 ; MMR6-DAG: andi16 $2, $[[T1]], 1 169 170 %1 = fcmp olt float %a, %b 171 %2 = zext i1 %1 to i32 172 ret i32 %2 173 } 174 175 define i32 @ole_f32(float %a, float %b) nounwind { 176 ; ALL-LABEL: ole_f32: 177 178 ; 32-C-DAG: addiu $2, $zero, 1 179 ; 32-C-DAG: c.ole.s $f12, $f14 180 ; 32-C: movf $2, $zero, $fcc0 181 182 ; 64-C-DAG: addiu $2, $zero, 1 183 ; 64-C-DAG: c.ole.s $f12, $f13 184 ; 64-C: movf $2, $zero, $fcc0 185 186 ; 32-CMP-DAG: cmp.le.s $[[T0:f[0-9]+]], $f12, $f14 187 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 188 ; 32-CMP-DAG: andi $2, $[[T1]], 1 189 190 ; 64-CMP-DAG: cmp.le.s $[[T0:f[0-9]+]], $f12, $f13 191 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 192 ; 64-CMP-DAG: andi $2, $[[T1]], 1 193 194 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 195 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 196 ; MM32R3-DAG: c.ole.s $f12, $f14 197 ; MM32R3-DAG: movf $[[T1]], $[[T0]], $fcc0 198 199 ; MM32R6-DAG: cmp.le.s $[[T0:f[0-9]+]], $f12, $f14 200 ; MM64R6-DAG: cmp.le.s $[[T0:f[0-9]+]], $f12, $f13 201 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 202 ; MMR6-DAG: andi16 $2, $[[T1]], 1 203 204 %1 = fcmp ole float %a, %b 205 %2 = zext i1 %1 to i32 206 ret i32 %2 207 } 208 209 define i32 @one_f32(float %a, float %b) nounwind { 210 ; ALL-LABEL: one_f32: 211 212 ; 32-C-DAG: addiu $2, $zero, 1 213 ; 32-C-DAG: c.ueq.s $f12, $f14 214 ; 32-C: movt $2, $zero, $fcc0 215 216 ; 64-C-DAG: addiu $2, $zero, 1 217 ; 64-C-DAG: c.ueq.s $f12, $f13 218 ; 64-C: movt $2, $zero, $fcc0 219 220 ; 32-CMP-DAG: cmp.ueq.s $[[T0:f[0-9]+]], $f12, $f14 221 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 222 ; 32-CMP-DAG: not $[[T2:[0-9]+]], $[[T1]] 223 ; 32-CMP-DAG: andi $2, $[[T2]], 1 224 225 ; 64-CMP-DAG: cmp.ueq.s $[[T0:f[0-9]+]], $f12, $f13 226 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 227 ; 64-CMP-DAG: not $[[T2:[0-9]+]], $[[T1]] 228 ; 64-CMP-DAG: andi $2, $[[T2]], 1 229 230 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 231 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 232 ; MM32R3-DAG: c.ueq.s $f12, $f14 233 ; MM32R3-DAG: movt $[[T1]], $[[T0]], $fcc0 234 235 ; MM32R6-DAG: cmp.ueq.s $[[T0:f[0-9]+]], $f12, $f14 236 ; MM64R6-DAG: cmp.ueq.s $[[T0:f[0-9]+]], $f12, $f13 237 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 238 ; MMR6-DAG: not $[[T2:[0-9]+]], $[[T1]] 239 ; MMR6-DAG: andi16 $2, $[[T2]], 1 240 241 %1 = fcmp one float %a, %b 242 %2 = zext i1 %1 to i32 243 ret i32 %2 244 } 245 246 define i32 @ord_f32(float %a, float %b) nounwind { 247 ; ALL-LABEL: ord_f32: 248 249 ; 32-C-DAG: addiu $2, $zero, 1 250 ; 32-C-DAG: c.un.s $f12, $f14 251 ; 32-C: movt $2, $zero, $fcc0 252 253 ; 64-C-DAG: addiu $2, $zero, 1 254 ; 64-C-DAG: c.un.s $f12, $f13 255 ; 64-C: movt $2, $zero, $fcc0 256 257 ; 32-CMP-DAG: cmp.un.s $[[T0:f[0-9]+]], $f12, $f14 258 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 259 ; 32-CMP-DAG: not $[[T2:[0-9]+]], $[[T1]] 260 ; 32-CMP-DAG: andi $2, $[[T2]], 1 261 262 ; 64-CMP-DAG: cmp.un.s $[[T0:f[0-9]+]], $f12, $f13 263 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 264 ; 64-CMP-DAG: not $[[T2:[0-9]+]], $[[T1]] 265 ; 64-CMP-DAG: andi $2, $[[T2]], 1 266 267 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 268 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 269 ; MM32R3-DAG: c.un.s $f12, $f14 270 ; MM32R3-DAG: movt $[[T1]], $[[T0]], $fcc0 271 272 ; MM32R6-DAG: cmp.un.s $[[T0:f[0-9]+]], $f12, $f14 273 ; MM64R6-DAG: cmp.un.s $[[T0:f[0-9]+]], $f12, $f13 274 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 275 ; MMR6-DAG: not $[[T2:[0-9]+]], $[[T1]] 276 ; MMR6-DAG: andi16 $2, $[[T2]], 1 277 278 %1 = fcmp ord float %a, %b 279 %2 = zext i1 %1 to i32 280 ret i32 %2 281 } 282 283 define i32 @ueq_f32(float %a, float %b) nounwind { 284 ; ALL-LABEL: ueq_f32: 285 286 ; 32-C-DAG: addiu $2, $zero, 1 287 ; 32-C-DAG: c.ueq.s $f12, $f14 288 ; 32-C: movf $2, $zero, $fcc0 289 290 ; 64-C-DAG: addiu $2, $zero, 1 291 ; 64-C-DAG: c.ueq.s $f12, $f13 292 ; 64-C: movf $2, $zero, $fcc0 293 294 ; 32-CMP-DAG: cmp.ueq.s $[[T0:f[0-9]+]], $f12, $f14 295 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 296 ; 32-CMP-DAG: andi $2, $[[T1]], 1 297 298 ; 64-CMP-DAG: cmp.ueq.s $[[T0:f[0-9]+]], $f12, $f13 299 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 300 ; 64-CMP-DAG: andi $2, $[[T1]], 1 301 302 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 303 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 304 ; MM32R3-DAG: c.ueq.s $f12, $f14 305 ; MM32R3-DAG: movf $[[T1]], $[[T0]], $fcc0 306 307 ; MM32R6-DAG: cmp.ueq.s $[[T0:f[0-9]+]], $f12, $f14 308 ; MM64R6-DAG: cmp.ueq.s $[[T0:f[0-9]+]], $f12, $f13 309 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 310 ; MMR6-DAG: andi16 $2, $[[T1]], 1 311 312 %1 = fcmp ueq float %a, %b 313 %2 = zext i1 %1 to i32 314 ret i32 %2 315 } 316 317 define i32 @ugt_f32(float %a, float %b) nounwind { 318 ; ALL-LABEL: ugt_f32: 319 320 ; 32-C-DAG: addiu $2, $zero, 1 321 ; 32-C-DAG: c.ole.s $f12, $f14 322 ; 32-C: movt $2, $zero, $fcc0 323 324 ; 64-C-DAG: addiu $2, $zero, 1 325 ; 64-C-DAG: c.ole.s $f12, $f13 326 ; 64-C: movt $2, $zero, $fcc0 327 328 ; 32-CMP-DAG: cmp.ult.s $[[T0:f[0-9]+]], $f14, $f12 329 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 330 ; 32-CMP-DAG: andi $2, $[[T1]], 1 331 332 ; 64-CMP-DAG: cmp.ult.s $[[T0:f[0-9]+]], $f13, $f12 333 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 334 ; 64-CMP-DAG: andi $2, $[[T1]], 1 335 336 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 337 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 338 ; MM32R3-DAG: c.ole.s $f12, $f14 339 ; MM32R3-DAG: movt $[[T1]], $[[T0]], $fcc0 340 341 ; MM32R6-DAG: cmp.ult.s $[[T0:f[0-9]+]], $f14, $f12 342 ; MM64R6-DAG: cmp.ult.s $[[T0:f[0-9]+]], $f13, $f12 343 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 344 ; MMR6-DAG: andi16 $2, $[[T1]], 1 345 346 %1 = fcmp ugt float %a, %b 347 %2 = zext i1 %1 to i32 348 ret i32 %2 349 } 350 351 define i32 @uge_f32(float %a, float %b) nounwind { 352 ; ALL-LABEL: uge_f32: 353 354 ; 32-C-DAG: addiu $2, $zero, 1 355 ; 32-C-DAG: c.olt.s $f12, $f14 356 ; 32-C: movt $2, $zero, $fcc0 357 358 ; 64-C-DAG: addiu $2, $zero, 1 359 ; 64-C-DAG: c.olt.s $f12, $f13 360 ; 64-C: movt $2, $zero, $fcc0 361 362 ; 32-CMP-DAG: cmp.ule.s $[[T0:f[0-9]+]], $f14, $f12 363 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 364 ; 32-CMP-DAG: andi $2, $[[T1]], 1 365 366 ; 64-CMP-DAG: cmp.ule.s $[[T0:f[0-9]+]], $f13, $f12 367 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 368 ; 64-CMP-DAG: andi $2, $[[T1]], 1 369 370 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 371 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 372 ; MM32R3-DAG: c.olt.s $f12, $f14 373 ; MM32R3-DAG: movt $[[T1]], $[[T0]], $fcc0 374 375 ; MM32R6-DAG: cmp.ule.s $[[T0:f[0-9]+]], $f14, $f12 376 ; MM64R6-DAG: cmp.ule.s $[[T0:f[0-9]+]], $f13, $f12 377 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 378 ; MMR6-DAG: andi16 $2, $[[T1]], 1 379 380 %1 = fcmp uge float %a, %b 381 %2 = zext i1 %1 to i32 382 ret i32 %2 383 } 384 385 define i32 @ult_f32(float %a, float %b) nounwind { 386 ; ALL-LABEL: ult_f32: 387 388 ; 32-C-DAG: addiu $2, $zero, 1 389 ; 32-C-DAG: c.ult.s $f12, $f14 390 ; 32-C: movf $2, $zero, $fcc0 391 392 ; 64-C-DAG: addiu $2, $zero, 1 393 ; 64-C-DAG: c.ult.s $f12, $f13 394 ; 64-C: movf $2, $zero, $fcc0 395 396 ; 32-CMP-DAG: cmp.ult.s $[[T0:f[0-9]+]], $f12, $f14 397 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 398 ; 32-CMP-DAG: andi $2, $[[T1]], 1 399 400 ; 64-CMP-DAG: cmp.ult.s $[[T0:f[0-9]+]], $f12, $f13 401 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 402 ; 64-CMP-DAG: andi $2, $[[T1]], 1 403 404 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 405 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 406 ; MM32R3-DAG: c.ult.s $f12, $f14 407 ; MM32R3-DAG: movf $[[T1]], $[[T0]], $fcc0 408 409 ; MM32R6-DAG: cmp.ult.s $[[T0:f[0-9]+]], $f12, $f14 410 ; MM64R6-DAG: cmp.ult.s $[[T0:f[0-9]+]], $f12, $f13 411 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 412 ; MMR6-DAG: andi16 $2, $[[T1]], 1 413 414 %1 = fcmp ult float %a, %b 415 %2 = zext i1 %1 to i32 416 ret i32 %2 417 } 418 419 define i32 @ule_f32(float %a, float %b) nounwind { 420 ; ALL-LABEL: ule_f32: 421 422 ; 32-C-DAG: addiu $2, $zero, 1 423 ; 32-C-DAG: c.ule.s $f12, $f14 424 ; 32-C: movf $2, $zero, $fcc0 425 426 ; 64-C-DAG: addiu $2, $zero, 1 427 ; 64-C-DAG: c.ule.s $f12, $f13 428 ; 64-C: movf $2, $zero, $fcc0 429 430 ; 32-CMP-DAG: cmp.ule.s $[[T0:f[0-9]+]], $f12, $f14 431 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 432 ; 32-CMP-DAG: andi $2, $[[T1]], 1 433 434 ; 64-CMP-DAG: cmp.ule.s $[[T0:f[0-9]+]], $f12, $f13 435 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 436 ; 64-CMP-DAG: andi $2, $[[T1]], 1 437 438 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 439 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 440 ; MM32R3-DAG: c.ule.s $f12, $f14 441 ; MM32R3-DAG: movf $[[T1]], $[[T0]], $fcc0 442 443 ; MM32R6-DAG: cmp.ule.s $[[T0:f[0-9]+]], $f12, $f14 444 ; MM64R6-DAG: cmp.ule.s $[[T0:f[0-9]+]], $f12, $f13 445 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 446 ; MMR6-DAG: andi16 $2, $[[T1]], 1 447 448 %1 = fcmp ule float %a, %b 449 %2 = zext i1 %1 to i32 450 ret i32 %2 451 } 452 453 define i32 @une_f32(float %a, float %b) nounwind { 454 ; ALL-LABEL: une_f32: 455 456 ; 32-C-DAG: addiu $2, $zero, 1 457 ; 32-C-DAG: c.eq.s $f12, $f14 458 ; 32-C: movt $2, $zero, $fcc0 459 460 ; 64-C-DAG: addiu $2, $zero, 1 461 ; 64-C-DAG: c.eq.s $f12, $f13 462 ; 64-C: movt $2, $zero, $fcc0 463 464 ; 32-CMP-DAG: cmp.eq.s $[[T0:f[0-9]+]], $f12, $f14 465 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 466 ; 32-CMP-DAG: not $[[T2:[0-9]+]], $[[T1]] 467 ; 32-CMP-DAG: andi $2, $[[T2]], 1 468 469 ; 64-CMP-DAG: cmp.eq.s $[[T0:f[0-9]+]], $f12, $f13 470 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 471 ; 64-CMP-DAG: not $[[T2:[0-9]+]], $[[T1]] 472 ; 64-CMP-DAG: andi $2, $[[T2]], 1 473 474 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 475 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 476 ; MM32R3-DAG: c.eq.s $f12, $f14 477 ; MM32R3-DAG: movt $[[T1]], $[[T0]], $fcc0 478 479 ; MM32R6-DAG: cmp.eq.s $[[T0:f[0-9]+]], $f12, $f14 480 ; MM64R6-DAG: cmp.eq.s $[[T0:f[0-9]+]], $f12, $f13 481 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 482 ; MMR6-DAG: not $[[T2:[0-9]+]], $[[T1]] 483 ; MMR6-DAG: andi16 $2, $[[T2]], 1 484 485 %1 = fcmp une float %a, %b 486 %2 = zext i1 %1 to i32 487 ret i32 %2 488 } 489 490 define i32 @uno_f32(float %a, float %b) nounwind { 491 ; ALL-LABEL: uno_f32: 492 493 ; 32-C-DAG: addiu $2, $zero, 1 494 ; 32-C-DAG: c.un.s $f12, $f14 495 ; 32-C: movf $2, $zero, $fcc0 496 497 ; 64-C-DAG: addiu $2, $zero, 1 498 ; 64-C-DAG: c.un.s $f12, $f13 499 ; 64-C: movf $2, $zero, $fcc0 500 501 ; 32-CMP-DAG: cmp.un.s $[[T0:f[0-9]+]], $f12, $f14 502 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 503 ; 32-CMP-DAG: andi $2, $[[T1]], 1 504 505 ; 64-CMP-DAG: cmp.un.s $[[T0:f[0-9]+]], $f12, $f13 506 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 507 ; 64-CMP-DAG: andi $2, $[[T1]], 1 508 509 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 510 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 511 ; MM32R3-DAG: c.un.s $f12, $f14 512 ; MM32R3-DAG: movf $[[T1]], $[[T0]], $fcc0 513 514 ; MM32R6-DAG: cmp.un.s $[[T0:f[0-9]+]], $f12, $f14 515 ; MM64R6-DAG: cmp.un.s $[[T0:f[0-9]+]], $f12, $f13 516 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 517 ; MMR6-DAG: andi16 $2, $[[T1]], 1 518 519 %1 = fcmp uno float %a, %b 520 %2 = zext i1 %1 to i32 521 ret i32 %2 522 } 523 524 define i32 @true_f32(float %a, float %b) nounwind { 525 ; ALL-LABEL: true_f32: 526 ; 32-C: addiu $2, $zero, 1 527 528 ; 32-CMP: addiu $2, $zero, 1 529 530 ; 64-C: addiu $2, $zero, 1 531 532 ; 64-CMP: addiu $2, $zero, 1 533 534 ; MM-DAG: li16 $2, 1 535 536 %1 = fcmp true float %a, %b 537 %2 = zext i1 %1 to i32 538 ret i32 %2 539 } 540 541 define i32 @false_f64(double %a, double %b) nounwind { 542 ; ALL-LABEL: false_f64: 543 ; 32-C: addiu $2, $zero, 0 544 545 ; 32-CMP: addiu $2, $zero, 0 546 547 ; 64-C: addiu $2, $zero, 0 548 549 ; 64-CMP: addiu $2, $zero, 0 550 551 ; MM-DAG: lui $2, 0 552 553 %1 = fcmp false double %a, %b 554 %2 = zext i1 %1 to i32 555 ret i32 %2 556 } 557 558 define i32 @oeq_f64(double %a, double %b) nounwind { 559 ; ALL-LABEL: oeq_f64: 560 561 ; 32-C-DAG: addiu $2, $zero, 1 562 ; 32-C-DAG: c.eq.d $f12, $f14 563 ; 32-C: movf $2, $zero, $fcc0 564 565 ; 64-C-DAG: addiu $2, $zero, 1 566 ; 64-C-DAG: c.eq.d $f12, $f13 567 ; 64-C: movf $2, $zero, $fcc0 568 569 ; 32-CMP-DAG: cmp.eq.d $[[T0:f[0-9]+]], $f12, $f14 570 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 571 ; 32-CMP-DAG: andi $2, $[[T1]], 1 572 573 ; 64-CMP-DAG: cmp.eq.d $[[T0:f[0-9]+]], $f12, $f13 574 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 575 ; 64-CMP-DAG: andi $2, $[[T1]], 1 576 577 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 578 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 579 ; MM32R3-DAG: c.eq.d $f12, $f14 580 ; MM32R3-DAG: movf $[[T1]], $[[T0]], $fcc0 581 582 ; MM32R6-DAG: cmp.eq.d $[[T0:f[0-9]+]], $f12, $f14 583 ; MM64R6-DAG: cmp.eq.d $[[T0:f[0-9]+]], $f12, $f13 584 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 585 ; MMR6-DAG: andi16 $2, $[[T1]], 1 586 587 %1 = fcmp oeq double %a, %b 588 %2 = zext i1 %1 to i32 589 ret i32 %2 590 } 591 592 define i32 @ogt_f64(double %a, double %b) nounwind { 593 ; ALL-LABEL: ogt_f64: 594 595 ; 32-C-DAG: addiu $2, $zero, 1 596 ; 32-C-DAG: c.ule.d $f12, $f14 597 ; 32-C: movt $2, $zero, $fcc0 598 599 ; 64-C-DAG: addiu $2, $zero, 1 600 ; 64-C-DAG: c.ule.d $f12, $f13 601 ; 64-C: movt $2, $zero, $fcc0 602 603 ; 32-CMP-DAG: cmp.lt.d $[[T0:f[0-9]+]], $f14, $f12 604 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 605 ; 32-CMP-DAG: andi $2, $[[T1]], 1 606 607 ; 64-CMP-DAG: cmp.lt.d $[[T0:f[0-9]+]], $f13, $f12 608 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 609 ; 64-CMP-DAG: andi $2, $[[T1]], 1 610 611 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 612 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 613 ; MM32R3-DAG: c.ule.d $f12, $f14 614 ; MM32R3-DAG: movt $[[T1]], $[[T0]], $fcc0 615 616 ; MM32R6-DAG: cmp.lt.d $[[T0:f[0-9]+]], $f14, $f12 617 ; MM64R6-DAG: cmp.lt.d $[[T0:f[0-9]+]], $f13, $f12 618 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 619 ; MMR6-DAG: andi16 $2, $[[T1]], 1 620 621 %1 = fcmp ogt double %a, %b 622 %2 = zext i1 %1 to i32 623 ret i32 %2 624 } 625 626 define i32 @oge_f64(double %a, double %b) nounwind { 627 ; ALL-LABEL: oge_f64: 628 629 ; 32-C-DAG: addiu $2, $zero, 1 630 ; 32-C-DAG: c.ult.d $f12, $f14 631 ; 32-C: movt $2, $zero, $fcc0 632 633 ; 64-C-DAG: addiu $2, $zero, 1 634 ; 64-C-DAG: c.ult.d $f12, $f13 635 ; 64-C: movt $2, $zero, $fcc0 636 637 ; 32-CMP-DAG: cmp.le.d $[[T0:f[0-9]+]], $f14, $f12 638 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 639 ; 32-CMP-DAG: andi $2, $[[T1]], 1 640 641 ; 64-CMP-DAG: cmp.le.d $[[T0:f[0-9]+]], $f13, $f12 642 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 643 ; 64-CMP-DAG: andi $2, $[[T1]], 1 644 645 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 646 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 647 ; MM32R3-DAG: c.ult.d $f12, $f14 648 ; MM32R3-DAG: movt $[[T1]], $[[T0]], $fcc0 649 650 ; MM32R6-DAG: cmp.le.d $[[T0:f[0-9]+]], $f14, $f12 651 ; MM64R6-DAG: cmp.le.d $[[T0:f[0-9]+]], $f13, $f12 652 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 653 ; MMR6-DAG: andi16 $2, $[[T1]], 1 654 655 %1 = fcmp oge double %a, %b 656 %2 = zext i1 %1 to i32 657 ret i32 %2 658 } 659 660 define i32 @olt_f64(double %a, double %b) nounwind { 661 ; ALL-LABEL: olt_f64: 662 663 ; 32-C-DAG: addiu $2, $zero, 1 664 ; 32-C-DAG: c.olt.d $f12, $f14 665 ; 32-C: movf $2, $zero, $fcc0 666 667 ; 64-C-DAG: addiu $2, $zero, 1 668 ; 64-C-DAG: c.olt.d $f12, $f13 669 ; 64-C: movf $2, $zero, $fcc0 670 671 ; 32-CMP-DAG: cmp.lt.d $[[T0:f[0-9]+]], $f12, $f14 672 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 673 ; 32-CMP-DAG: andi $2, $[[T1]], 1 674 675 ; 64-CMP-DAG: cmp.lt.d $[[T0:f[0-9]+]], $f12, $f13 676 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 677 ; 64-CMP-DAG: andi $2, $[[T1]], 1 678 679 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 680 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 681 ; MM32R3-DAG: c.olt.d $f12, $f14 682 ; MM32R3-DAG: movf $[[T1]], $[[T0]], $fcc0 683 684 ; MM32R6-DAG: cmp.lt.d $[[T0:f[0-9]+]], $f12, $f14 685 ; MM64R6-DAG: cmp.lt.d $[[T0:f[0-9]+]], $f12, $f13 686 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 687 ; MMR6-DAG: andi16 $2, $[[T1]], 1 688 689 %1 = fcmp olt double %a, %b 690 %2 = zext i1 %1 to i32 691 ret i32 %2 692 } 693 694 define i32 @ole_f64(double %a, double %b) nounwind { 695 ; ALL-LABEL: ole_f64: 696 697 ; 32-C-DAG: addiu $2, $zero, 1 698 ; 32-C-DAG: c.ole.d $f12, $f14 699 ; 32-C: movf $2, $zero, $fcc0 700 701 ; 64-C-DAG: addiu $2, $zero, 1 702 ; 64-C-DAG: c.ole.d $f12, $f13 703 ; 64-C: movf $2, $zero, $fcc0 704 705 ; 32-CMP-DAG: cmp.le.d $[[T0:f[0-9]+]], $f12, $f14 706 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 707 ; 32-CMP-DAG: andi $2, $[[T1]], 1 708 709 ; 64-CMP-DAG: cmp.le.d $[[T0:f[0-9]+]], $f12, $f13 710 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 711 ; 64-CMP-DAG: andi $2, $[[T1]], 1 712 713 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 714 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 715 ; MM32R3-DAG: c.ole.d $f12, $f14 716 ; MM32R3-DAG: movf $[[T1]], $[[T0]], $fcc0 717 718 ; MM32R6-DAG: cmp.le.d $[[T0:f[0-9]+]], $f12, $f14 719 ; MM64R6-DAG: cmp.le.d $[[T0:f[0-9]+]], $f12, $f13 720 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 721 ; MMR6-DAG: andi16 $2, $[[T1]], 1 722 723 %1 = fcmp ole double %a, %b 724 %2 = zext i1 %1 to i32 725 ret i32 %2 726 } 727 728 define i32 @one_f64(double %a, double %b) nounwind { 729 ; ALL-LABEL: one_f64: 730 731 ; 32-C-DAG: addiu $2, $zero, 1 732 ; 32-C-DAG: c.ueq.d $f12, $f14 733 ; 32-C: movt $2, $zero, $fcc0 734 735 ; 64-C-DAG: addiu $2, $zero, 1 736 ; 64-C-DAG: c.ueq.d $f12, $f13 737 ; 64-C: movt $2, $zero, $fcc0 738 739 ; 32-CMP-DAG: cmp.ueq.d $[[T0:f[0-9]+]], $f12, $f14 740 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 741 ; 32-CMP-DAG: not $[[T2:[0-9]+]], $[[T1]] 742 ; 32-CMP-DAG: andi $2, $[[T2]], 1 743 744 ; 64-CMP-DAG: cmp.ueq.d $[[T0:f[0-9]+]], $f12, $f13 745 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 746 ; 64-CMP-DAG: not $[[T2:[0-9]+]], $[[T1]] 747 ; 64-CMP-DAG: andi $2, $[[T2]], 1 748 749 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 750 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 751 ; MM32R3-DAG: c.ueq.d $f12, $f14 752 ; MM32R3-DAG: movt $[[T1]], $[[T0]], $fcc0 753 754 ; MM32R6-DAG: cmp.ueq.d $[[T0:f[0-9]+]], $f12, $f14 755 ; MM64R6-DAG: cmp.ueq.d $[[T0:f[0-9]+]], $f12, $f13 756 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 757 ; MMR6-DAG: not $[[T2:[0-9]+]], $[[T1]] 758 ; MMR6-DAG: andi16 $2, $[[T2]], 1 759 760 %1 = fcmp one double %a, %b 761 %2 = zext i1 %1 to i32 762 ret i32 %2 763 } 764 765 define i32 @ord_f64(double %a, double %b) nounwind { 766 ; ALL-LABEL: ord_f64: 767 768 ; 32-C-DAG: addiu $2, $zero, 1 769 ; 32-C-DAG: c.un.d $f12, $f14 770 ; 32-C: movt $2, $zero, $fcc0 771 772 ; 64-C-DAG: addiu $2, $zero, 1 773 ; 64-C-DAG: c.un.d $f12, $f13 774 ; 64-C: movt $2, $zero, $fcc0 775 776 ; 32-CMP-DAG: cmp.un.d $[[T0:f[0-9]+]], $f12, $f14 777 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 778 ; 32-CMP-DAG: not $[[T2:[0-9]+]], $[[T1]] 779 ; 32-CMP-DAG: andi $2, $[[T2]], 1 780 781 ; 64-CMP-DAG: cmp.un.d $[[T0:f[0-9]+]], $f12, $f13 782 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 783 ; 64-CMP-DAG: not $[[T2:[0-9]+]], $[[T1]] 784 ; 64-CMP-DAG: andi $2, $[[T2]], 1 785 786 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 787 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 788 ; MM32R3-DAG: c.un.d $f12, $f14 789 ; MM32R3-DAG: movt $[[T1]], $[[T0]], $fcc0 790 791 ; MM32R6-DAG: cmp.un.d $[[T0:f[0-9]+]], $f12, $f14 792 ; MM64R6-DAG: cmp.un.d $[[T0:f[0-9]+]], $f12, $f13 793 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 794 ; MMR6-DAG: not $[[T2:[0-9]+]], $[[T1]] 795 ; MMR6-DAG: andi16 $2, $[[T2]], 1 796 797 %1 = fcmp ord double %a, %b 798 %2 = zext i1 %1 to i32 799 ret i32 %2 800 } 801 802 define i32 @ueq_f64(double %a, double %b) nounwind { 803 ; ALL-LABEL: ueq_f64: 804 805 ; 32-C-DAG: addiu $2, $zero, 1 806 ; 32-C-DAG: c.ueq.d $f12, $f14 807 ; 32-C: movf $2, $zero, $fcc0 808 809 ; 64-C-DAG: addiu $2, $zero, 1 810 ; 64-C-DAG: c.ueq.d $f12, $f13 811 ; 64-C: movf $2, $zero, $fcc0 812 813 ; 32-CMP-DAG: cmp.ueq.d $[[T0:f[0-9]+]], $f12, $f14 814 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 815 ; 32-CMP-DAG: andi $2, $[[T1]], 1 816 817 ; 64-CMP-DAG: cmp.ueq.d $[[T0:f[0-9]+]], $f12, $f13 818 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 819 ; 64-CMP-DAG: andi $2, $[[T1]], 1 820 821 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 822 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 823 ; MM32R3-DAG: c.ueq.d $f12, $f14 824 ; MM32R3-DAG: movf $[[T1]], $[[T0]], $fcc0 825 826 ; MM32R6-DAG: cmp.ueq.d $[[T0:f[0-9]+]], $f12, $f14 827 ; MM64R6-DAG: cmp.ueq.d $[[T0:f[0-9]+]], $f12, $f13 828 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 829 ; MMR6-DAG: andi16 $2, $[[T1]], 1 830 831 %1 = fcmp ueq double %a, %b 832 %2 = zext i1 %1 to i32 833 ret i32 %2 834 } 835 836 define i32 @ugt_f64(double %a, double %b) nounwind { 837 ; ALL-LABEL: ugt_f64: 838 839 ; 32-C-DAG: addiu $2, $zero, 1 840 ; 32-C-DAG: c.ole.d $f12, $f14 841 ; 32-C: movt $2, $zero, $fcc0 842 843 ; 64-C-DAG: addiu $2, $zero, 1 844 ; 64-C-DAG: c.ole.d $f12, $f13 845 ; 64-C: movt $2, $zero, $fcc0 846 847 ; 32-CMP-DAG: cmp.ult.d $[[T0:f[0-9]+]], $f14, $f12 848 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 849 ; 32-CMP-DAG: andi $2, $[[T1]], 1 850 851 ; 64-CMP-DAG: cmp.ult.d $[[T0:f[0-9]+]], $f13, $f12 852 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 853 ; 64-CMP-DAG: andi $2, $[[T1]], 1 854 855 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 856 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 857 ; MM32R3-DAG: c.ole.d $f12, $f14 858 ; MM32R3-DAG: movt $[[T1]], $[[T0]], $fcc0 859 860 ; MM32R6-DAG: cmp.ult.d $[[T0:f[0-9]+]], $f14, $f12 861 ; MM64R6-DAG: cmp.ult.d $[[T0:f[0-9]+]], $f13, $f12 862 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 863 ; MMR6-DAG: andi16 $2, $[[T1]], 1 864 865 %1 = fcmp ugt double %a, %b 866 %2 = zext i1 %1 to i32 867 ret i32 %2 868 } 869 870 define i32 @uge_f64(double %a, double %b) nounwind { 871 ; ALL-LABEL: uge_f64: 872 873 ; 32-C-DAG: addiu $2, $zero, 1 874 ; 32-C-DAG: c.olt.d $f12, $f14 875 ; 32-C: movt $2, $zero, $fcc0 876 877 ; 64-C-DAG: addiu $2, $zero, 1 878 ; 64-C-DAG: c.olt.d $f12, $f13 879 ; 64-C: movt $2, $zero, $fcc0 880 881 ; 32-CMP-DAG: cmp.ule.d $[[T0:f[0-9]+]], $f14, $f12 882 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 883 ; 32-CMP-DAG: andi $2, $[[T1]], 1 884 885 ; 64-CMP-DAG: cmp.ule.d $[[T0:f[0-9]+]], $f13, $f12 886 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 887 ; 64-CMP-DAG: andi $2, $[[T1]], 1 888 889 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 890 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 891 ; MM32R3-DAG: c.olt.d $f12, $f14 892 ; MM32R3-DAG: movt $[[T1]], $[[T0]], $fcc0 893 894 ; MM32R6-DAG: cmp.ule.d $[[T0:f[0-9]+]], $f14, $f12 895 ; MM64R6-DAG: cmp.ule.d $[[T0:f[0-9]+]], $f13, $f12 896 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 897 ; MMR6-DAG: andi16 $2, $[[T1]], 1 898 899 %1 = fcmp uge double %a, %b 900 %2 = zext i1 %1 to i32 901 ret i32 %2 902 } 903 904 define i32 @ult_f64(double %a, double %b) nounwind { 905 ; ALL-LABEL: ult_f64: 906 907 ; 32-C-DAG: addiu $2, $zero, 1 908 ; 32-C-DAG: c.ult.d $f12, $f14 909 ; 32-C: movf $2, $zero, $fcc0 910 911 ; 64-C-DAG: addiu $2, $zero, 1 912 ; 64-C-DAG: c.ult.d $f12, $f13 913 ; 64-C: movf $2, $zero, $fcc0 914 915 ; 32-CMP-DAG: cmp.ult.d $[[T0:f[0-9]+]], $f12, $f14 916 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 917 ; 32-CMP-DAG: andi $2, $[[T1]], 1 918 919 ; 64-CMP-DAG: cmp.ult.d $[[T0:f[0-9]+]], $f12, $f13 920 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 921 ; 64-CMP-DAG: andi $2, $[[T1]], 1 922 923 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 924 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 925 ; MM32R3-DAG: c.ult.d $f12, $f14 926 ; MM32R3-DAG: movf $[[T1]], $[[T0]], $fcc0 927 928 ; MM32R6-DAG: cmp.ult.d $[[T0:f[0-9]+]], $f12, $f14 929 ; MM64R6-DAG: cmp.ult.d $[[T0:f[0-9]+]], $f12, $f13 930 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 931 ; MMR6-DAG: andi16 $2, $[[T1]], 1 932 933 %1 = fcmp ult double %a, %b 934 %2 = zext i1 %1 to i32 935 ret i32 %2 936 } 937 938 define i32 @ule_f64(double %a, double %b) nounwind { 939 ; ALL-LABEL: ule_f64: 940 941 ; 32-C-DAG: addiu $2, $zero, 1 942 ; 32-C-DAG: c.ule.d $f12, $f14 943 ; 32-C: movf $2, $zero, $fcc0 944 945 ; 64-C-DAG: addiu $2, $zero, 1 946 ; 64-C-DAG: c.ule.d $f12, $f13 947 ; 64-C: movf $2, $zero, $fcc0 948 949 ; 32-CMP-DAG: cmp.ule.d $[[T0:f[0-9]+]], $f12, $f14 950 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 951 ; 32-CMP-DAG: andi $2, $[[T1]], 1 952 953 ; 64-CMP-DAG: cmp.ule.d $[[T0:f[0-9]+]], $f12, $f13 954 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 955 ; 64-CMP-DAG: andi $2, $[[T1]], 1 956 957 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 958 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 959 ; MM32R3-DAG: c.ule.d $f12, $f14 960 ; MM32R3-DAG: movf $[[T1]], $[[T0]], $fcc0 961 962 ; MM32R6-DAG: cmp.ule.d $[[T0:f[0-9]+]], $f12, $f14 963 ; MM64R6-DAG: cmp.ule.d $[[T0:f[0-9]+]], $f12, $f13 964 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 965 ; MMR6-DAG: andi16 $2, $[[T1]], 1 966 967 %1 = fcmp ule double %a, %b 968 %2 = zext i1 %1 to i32 969 ret i32 %2 970 } 971 972 define i32 @une_f64(double %a, double %b) nounwind { 973 ; ALL-LABEL: une_f64: 974 975 ; 32-C-DAG: addiu $2, $zero, 1 976 ; 32-C-DAG: c.eq.d $f12, $f14 977 ; 32-C: movt $2, $zero, $fcc0 978 979 ; 64-C-DAG: addiu $2, $zero, 1 980 ; 64-C-DAG: c.eq.d $f12, $f13 981 ; 64-C: movt $2, $zero, $fcc0 982 983 ; 32-CMP-DAG: cmp.eq.d $[[T0:f[0-9]+]], $f12, $f14 984 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 985 ; 32-CMP-DAG: not $[[T2:[0-9]+]], $[[T1]] 986 ; 32-CMP-DAG: andi $2, $[[T2]], 1 987 988 ; 64-CMP-DAG: cmp.eq.d $[[T0:f[0-9]+]], $f12, $f13 989 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 990 ; 64-CMP-DAG: not $[[T2:[0-9]+]], $[[T1]] 991 ; 64-CMP-DAG: andi $2, $[[T2]], 1 992 993 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 994 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 995 ; MM32R3-DAG: c.eq.d $f12, $f14 996 ; MM32R3-DAG: movt $[[T1]], $[[T0]], $fcc0 997 998 ; MM32R6-DAG: cmp.eq.d $[[T0:f[0-9]+]], $f12, $f14 999 ; MM64R6-DAG: cmp.eq.d $[[T0:f[0-9]+]], $f12, $f13 1000 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 1001 ; MMR6-DAG: not $[[T2:[0-9]+]], $[[T1]] 1002 ; MMR6-DAG: andi16 $2, $[[T2]], 1 1003 1004 %1 = fcmp une double %a, %b 1005 %2 = zext i1 %1 to i32 1006 ret i32 %2 1007 } 1008 1009 define i32 @uno_f64(double %a, double %b) nounwind { 1010 ; ALL-LABEL: uno_f64: 1011 1012 ; 32-C-DAG: addiu $2, $zero, 1 1013 ; 32-C-DAG: c.un.d $f12, $f14 1014 ; 32-C: movf $2, $zero, $fcc0 1015 1016 ; 64-C-DAG: addiu $2, $zero, 1 1017 ; 64-C-DAG: c.un.d $f12, $f13 1018 ; 64-C: movf $2, $zero, $fcc0 1019 1020 ; 32-CMP-DAG: cmp.un.d $[[T0:f[0-9]+]], $f12, $f14 1021 ; 32-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 1022 ; 32-CMP-DAG: andi $2, $[[T1]], 1 1023 1024 ; 64-CMP-DAG: cmp.un.d $[[T0:f[0-9]+]], $f12, $f13 1025 ; 64-CMP-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 1026 ; 64-CMP-DAG: andi $2, $[[T1]], 1 1027 1028 ; MM32R3-DAG: lui $[[T0:[0-9]+]], 0 1029 ; MM32R3-DAG: li16 $[[T1:[0-9]+]], 1 1030 ; MM32R3-DAG: c.un.d $f12, $f14 1031 ; MM32R3-DAG: movf $[[T1]], $[[T0]], $fcc0 1032 1033 ; MM32R6-DAG: cmp.un.d $[[T0:f[0-9]+]], $f12, $f14 1034 ; MM64R6-DAG: cmp.un.d $[[T0:f[0-9]+]], $f12, $f13 1035 ; MMR6-DAG: mfc1 $[[T1:[0-9]+]], $[[T0]] 1036 ; MMR6-DAG: andi16 $2, $[[T1]], 1 1037 1038 %1 = fcmp uno double %a, %b 1039 %2 = zext i1 %1 to i32 1040 ret i32 %2 1041 } 1042 1043 define i32 @true_f64(double %a, double %b) nounwind { 1044 ; ALL-LABEL: true_f64: 1045 ; 32-C: addiu $2, $zero, 1 1046 1047 ; 32-CMP: addiu $2, $zero, 1 1048 1049 ; 64-C: addiu $2, $zero, 1 1050 1051 ; 64-CMP: addiu $2, $zero, 1 1052 1053 ; MM-DAG: li16 $2, 1 1054 1055 %1 = fcmp true double %a, %b 1056 %2 = zext i1 %1 to i32 1057 ret i32 %2 1058 } 1059 1060 ; The optimizers sometimes produce setlt instead of setolt/setult. 1061 define float @bug1_f32(float %angle, float %at) #0 { 1062 entry: 1063 ; ALL-LABEL: bug1_f32: 1064 1065 ; 32-C-DAG: add.s $[[T0:f[0-9]+]], $f14, $f12 1066 ; 32-C-DAG: lwc1 $[[T1:f[0-9]+]], %lo($CPI32_0)( 1067 ; 32-C-DAG: c.ole.s $[[T0]], $[[T1]] 1068 ; 32-C-DAG: bc1t 1069 1070 ; 32-CMP-DAG: add.s $[[T0:f[0-9]+]], $f14, $f12 1071 ; 32-CMP-DAG: lwc1 $[[T1:f[0-9]+]], %lo($CPI32_0)( 1072 ; 32-CMP-DAG: cmp.le.s $[[T2:f[0-9]+]], $[[T0]], $[[T1]] 1073 ; 32-CMP-DAG: mfc1 $[[T3:[0-9]+]], $[[T2]] 1074 ; FIXME: This instruction is redundant. 1075 ; 32-CMP-DAG: andi $[[T4:[0-9]+]], $[[T3]], 1 1076 ; 32-CMP-DAG: bnezc $[[T4]], 1077 1078 ; 64-C-DAG: add.s $[[T0:f[0-9]+]], $f13, $f12 1079 ; 64-C-DAG: lwc1 $[[T1:f[0-9]+]], %got_ofst($CPI32_0)( 1080 ; 64-C-DAG: c.ole.s $[[T0]], $[[T1]] 1081 ; 64-C-DAG: bc1t 1082 1083 ; 64-CMP-DAG: add.s $[[T0:f[0-9]+]], $f13, $f12 1084 ; 64-CMP-DAG: lwc1 $[[T1:f[0-9]+]], %got_ofst($CPI32_0)( 1085 ; 64-CMP-DAG: cmp.le.s $[[T2:f[0-9]+]], $[[T0]], $[[T1]] 1086 ; 64-CMP-DAG: mfc1 $[[T3:[0-9]+]], $[[T2]] 1087 ; FIXME: This instruction is redundant. 1088 ; 64-CMP-DAG: andi $[[T4:[0-9]+]], $[[T3]], 1 1089 ; 64-CMP-DAG: bnezc $[[T4]], 1090 1091 ; MM32R3-DAG: add.s $[[T0:f[0-9]+]], $f14, $f12 1092 ; MM32R3-DAG: lui $[[T1:[0-9]+]], %hi($CPI32_0) 1093 ; MM32R3-DAG: lwc1 $[[T2:f[0-9]+]], %lo($CPI32_0)($[[T1]]) 1094 ; MM32R3-DAG: c.ole.s $[[T0]], $[[T2]] 1095 ; MM32R3-DAG: bc1t 1096 1097 ; MM32R6-DAG: add.s $[[T0:f[0-9]+]], $f14, $f12 1098 ; MM32R6-DAG: lui $[[T1:[0-9]+]], %hi($CPI32_0) 1099 ; MM32R6-DAG: lwc1 $[[T2:f[0-9]+]], %lo($CPI32_0)($[[T1]]) 1100 ; MM32R6-DAG: cmp.le.s $[[T3:f[0-9]+]], $[[T0]], $[[T2]] 1101 ; MM32R6-DAG: mfc1 $[[T4:[0-9]+]], $[[T3:f[0-9]+]] 1102 ; MM32R6-DAG: andi16 $[[T5:[0-9]+]], $[[T4]], 1 1103 ; MM32R6-DAG: bnez $[[T5]], 1104 1105 ; MM64R6-DAG: lui $[[T0:[0-9]+]], %hi(%neg(%gp_rel(bug1_f32))) 1106 ; MM64R6-DAG: daddu $[[T1:[0-9]+]], $[[T0]], $25 1107 ; MM64R6-DAG: daddiu $[[T2:[0-9]+]], $[[T1]], %lo(%neg(%gp_rel(bug1_f32))) 1108 ; MM64R6-DAG: add.s $[[T3:f[0-9]+]], $f13, $f12 1109 ; MM64R6-DAG: ld $[[T4:[0-9]+]], %got_page($CPI32_0)($[[T2]]) 1110 ; MM64R6-DAG: lwc1 $[[T5:f[0-9]+]], %got_ofst($CPI32_0)($[[T4]]) 1111 ; MM64R6-DAG: cmp.le.s $[[T6:f[0-9]+]], $[[T3]], $[[T5]] 1112 ; MM64R6-DAG: mfc1 $[[T7:[0-9]+]], $[[T6]] 1113 ; MM64R6-DAG: andi16 $[[T8:[0-9]+]], $[[T7]], 1 1114 ; MM64R6-DAG: bnez $[[T8]], 1115 1116 %add = fadd fast float %at, %angle 1117 %cmp = fcmp ogt float %add, 1.000000e+00 1118 br i1 %cmp, label %if.then, label %if.end 1119 1120 if.then: 1121 %sub = fadd fast float %add, -1.000000e+00 1122 br label %if.end 1123 1124 if.end: 1125 %theta.0 = phi float [ %sub, %if.then ], [ %add, %entry ] 1126 ret float %theta.0 1127 } 1128 1129 ; The optimizers sometimes produce setlt instead of setolt/setult. 1130 define double @bug1_f64(double %angle, double %at) #0 { 1131 entry: 1132 ; ALL-LABEL: bug1_f64: 1133 1134 ; 32-C-DAG: add.d $[[T0:f[0-9]+]], $f14, $f12 1135 ; 32-C-DAG: ldc1 $[[T1:f[0-9]+]], %lo($CPI33_0)( 1136 ; 32-C-DAG: c.ole.d $[[T0]], $[[T1]] 1137 ; 32-C-DAG: bc1t 1138 1139 ; 32-CMP-DAG: add.d $[[T0:f[0-9]+]], $f14, $f12 1140 ; 32-CMP-DAG: ldc1 $[[T1:f[0-9]+]], %lo($CPI33_0)( 1141 ; 32-CMP-DAG: cmp.le.d $[[T2:f[0-9]+]], $[[T0]], $[[T1]] 1142 ; 32-CMP-DAG: mfc1 $[[T3:[0-9]+]], $[[T2]] 1143 ; FIXME: This instruction is redundant. 1144 ; 32-CMP-DAG: andi $[[T4:[0-9]+]], $[[T3]], 1 1145 ; 32-CMP-DAG: bnezc $[[T4]], 1146 1147 ; 64-C-DAG: add.d $[[T0:f[0-9]+]], $f13, $f12 1148 ; 64-C-DAG: ldc1 $[[T1:f[0-9]+]], %got_ofst($CPI33_0)( 1149 ; 64-C-DAG: c.ole.d $[[T0]], $[[T1]] 1150 ; 64-C-DAG: bc1t 1151 1152 ; 64-CMP-DAG: add.d $[[T0:f[0-9]+]], $f13, $f12 1153 ; 64-CMP-DAG: ldc1 $[[T1:f[0-9]+]], %got_ofst($CPI33_0)( 1154 ; 64-CMP-DAG: cmp.le.d $[[T2:f[0-9]+]], $[[T0]], $[[T1]] 1155 ; 64-CMP-DAG: mfc1 $[[T3:[0-9]+]], $[[T2]] 1156 ; FIXME: This instruction is redundant. 1157 ; 64-CMP-DAG: andi $[[T4:[0-9]+]], $[[T3]], 1 1158 ; 64-CMP-DAG: bnezc $[[T4]], 1159 1160 ; MM32R3-DAG: add.d $[[T0:f[0-9]+]], $f14, $f12 1161 ; MM32R3-DAG: lui $[[T1:[0-9]+]], %hi($CPI33_0) 1162 ; MM32R3-DAG: ldc1 $[[T2:f[0-9]+]], %lo($CPI33_0)($[[T1]]) 1163 ; MM32R3-DAG: c.ole.d $[[T0]], $[[T2]] 1164 ; MM32R3-DAG: bc1t 1165 1166 ; MM32R6-DAG: add.d $[[T0:f[0-9]+]], $f14, $f12 1167 ; MM32R6-DAG: lui $[[T1:[0-9]+]], %hi($CPI33_0) 1168 ; MM32R6-DAG: ldc1 $[[T2:f[0-9]+]], %lo($CPI33_0)($[[T1]]) 1169 ; MM32R6-DAG: cmp.le.d $[[T3:f[0-9]+]], $[[T0]], $[[T2]] 1170 ; MM32R6-DAG: mfc1 $[[T4:[0-9]+]], $[[T3]] 1171 ; MM32R6-DAG: andi16 $[[T5:[0-9]+]], $[[T4]], 1 1172 ; MM32R6-DAG: bnez $[[T5]], 1173 1174 ; MM64R6-DAG: lui $[[T0:[0-9]+]], %hi(%neg(%gp_rel(bug1_f64))) 1175 ; MM64R6-DAG: daddu $[[T1:[0-9]+]], $[[T0]], $25 1176 ; MM64R6-DAG: daddiu $[[T2:[0-9]+]], $[[T1]], %lo(%neg(%gp_rel(bug1_f64))) 1177 ; MM64R6-DAG: add.d $[[T3:f[0-9]+]], $f13, $f12 1178 ; MM64R6-DAG: ld $[[T4:[0-9]+]], %got_page($CPI33_0)($[[T2]]) 1179 ; MM64R6-DAG: ldc1 $[[T5:f[0-9]+]], %got_ofst($CPI33_0)($[[T4]]) 1180 ; MM64R6-DAG: cmp.le.d $[[T6:f[0-9]+]], $[[T3]], $[[T5]] 1181 ; MM64R6-DAG: mfc1 $[[T7:[0-9]+]], $[[T6]] 1182 ; MM64R6-DAG: andi16 $[[T8:[0-9]+]], $[[T7]], 1 1183 ; MM64R6-DAG: bnez $[[T8]], 1184 1185 %add = fadd fast double %at, %angle 1186 %cmp = fcmp ogt double %add, 1.000000e+00 1187 br i1 %cmp, label %if.then, label %if.end 1188 1189 if.then: 1190 %sub = fadd fast double %add, -1.000000e+00 1191 br label %if.end 1192 1193 if.end: 1194 %theta.0 = phi double [ %sub, %if.then ], [ %add, %entry ] 1195 ret double %theta.0 1196 } 1197 1198 attributes #0 = { nounwind readnone "no-nans-fp-math"="true" } 1199