1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc --mtriple=loongarch32 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA32 3; RUN: llc --mtriple=loongarch64 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA64 4 5declare i1 @llvm.experimental.constrained.fcmps.f32(float, float, metadata, metadata) 6declare i1 @llvm.experimental.constrained.fcmp.f32(float, float, metadata, metadata) 7 8define i32 @fcmps_oeq(float %a, float %b) nounwind strictfp { 9; LA32-LABEL: fcmps_oeq: 10; LA32: # %bb.0: 11; LA32-NEXT: fcmp.seq.s $fcc0, $fa0, $fa1 12; LA32-NEXT: movcf2gr $a0, $fcc0 13; LA32-NEXT: ret 14; 15; LA64-LABEL: fcmps_oeq: 16; LA64: # %bb.0: 17; LA64-NEXT: fcmp.seq.s $fcc0, $fa0, $fa1 18; LA64-NEXT: movcf2gr $a0, $fcc0 19; LA64-NEXT: ret 20 %1 = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"oeq", metadata !"fpexcept.strict") strictfp 21 %2 = zext i1 %1 to i32 22 ret i32 %2 23} 24 25define i32 @fcmps_ogt(float %a, float %b) nounwind strictfp { 26; LA32-LABEL: fcmps_ogt: 27; LA32: # %bb.0: 28; LA32-NEXT: fcmp.slt.s $fcc0, $fa1, $fa0 29; LA32-NEXT: movcf2gr $a0, $fcc0 30; LA32-NEXT: ret 31; 32; LA64-LABEL: fcmps_ogt: 33; LA64: # %bb.0: 34; LA64-NEXT: fcmp.slt.s $fcc0, $fa1, $fa0 35; LA64-NEXT: movcf2gr $a0, $fcc0 36; LA64-NEXT: ret 37 %1 = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"ogt", metadata !"fpexcept.strict") strictfp 38 %2 = zext i1 %1 to i32 39 ret i32 %2 40} 41 42define i32 @fcmps_oge(float %a, float %b) nounwind strictfp { 43; LA32-LABEL: fcmps_oge: 44; LA32: # %bb.0: 45; LA32-NEXT: fcmp.sle.s $fcc0, $fa1, $fa0 46; LA32-NEXT: movcf2gr $a0, $fcc0 47; LA32-NEXT: ret 48; 49; LA64-LABEL: fcmps_oge: 50; LA64: # %bb.0: 51; LA64-NEXT: fcmp.sle.s $fcc0, $fa1, $fa0 52; LA64-NEXT: movcf2gr $a0, $fcc0 53; LA64-NEXT: ret 54 %1 = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"oge", metadata !"fpexcept.strict") strictfp 55 %2 = zext i1 %1 to i32 56 ret i32 %2 57} 58 59define i32 @fcmps_olt(float %a, float %b) nounwind strictfp { 60; LA32-LABEL: fcmps_olt: 61; LA32: # %bb.0: 62; LA32-NEXT: fcmp.slt.s $fcc0, $fa0, $fa1 63; LA32-NEXT: movcf2gr $a0, $fcc0 64; LA32-NEXT: ret 65; 66; LA64-LABEL: fcmps_olt: 67; LA64: # %bb.0: 68; LA64-NEXT: fcmp.slt.s $fcc0, $fa0, $fa1 69; LA64-NEXT: movcf2gr $a0, $fcc0 70; LA64-NEXT: ret 71 %1 = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"olt", metadata !"fpexcept.strict") strictfp 72 %2 = zext i1 %1 to i32 73 ret i32 %2 74} 75 76define i32 @fcmps_ole(float %a, float %b) nounwind strictfp { 77; LA32-LABEL: fcmps_ole: 78; LA32: # %bb.0: 79; LA32-NEXT: fcmp.sle.s $fcc0, $fa0, $fa1 80; LA32-NEXT: movcf2gr $a0, $fcc0 81; LA32-NEXT: ret 82; 83; LA64-LABEL: fcmps_ole: 84; LA64: # %bb.0: 85; LA64-NEXT: fcmp.sle.s $fcc0, $fa0, $fa1 86; LA64-NEXT: movcf2gr $a0, $fcc0 87; LA64-NEXT: ret 88 %1 = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"ole", metadata !"fpexcept.strict") strictfp 89 %2 = zext i1 %1 to i32 90 ret i32 %2 91} 92 93define i32 @fcmps_one(float %a, float %b) nounwind strictfp { 94; LA32-LABEL: fcmps_one: 95; LA32: # %bb.0: 96; LA32-NEXT: fcmp.sne.s $fcc0, $fa0, $fa1 97; LA32-NEXT: movcf2gr $a0, $fcc0 98; LA32-NEXT: ret 99; 100; LA64-LABEL: fcmps_one: 101; LA64: # %bb.0: 102; LA64-NEXT: fcmp.sne.s $fcc0, $fa0, $fa1 103; LA64-NEXT: movcf2gr $a0, $fcc0 104; LA64-NEXT: ret 105 %1 = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"one", metadata !"fpexcept.strict") strictfp 106 %2 = zext i1 %1 to i32 107 ret i32 %2 108} 109 110define i32 @fcmps_ord(float %a, float %b) nounwind strictfp { 111; LA32-LABEL: fcmps_ord: 112; LA32: # %bb.0: 113; LA32-NEXT: fcmp.sor.s $fcc0, $fa0, $fa1 114; LA32-NEXT: movcf2gr $a0, $fcc0 115; LA32-NEXT: ret 116; 117; LA64-LABEL: fcmps_ord: 118; LA64: # %bb.0: 119; LA64-NEXT: fcmp.sor.s $fcc0, $fa0, $fa1 120; LA64-NEXT: movcf2gr $a0, $fcc0 121; LA64-NEXT: ret 122 %1 = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"ord", metadata !"fpexcept.strict") strictfp 123 %2 = zext i1 %1 to i32 124 ret i32 %2 125} 126 127define i32 @fcmps_ueq(float %a, float %b) nounwind strictfp { 128; LA32-LABEL: fcmps_ueq: 129; LA32: # %bb.0: 130; LA32-NEXT: fcmp.sueq.s $fcc0, $fa0, $fa1 131; LA32-NEXT: movcf2gr $a0, $fcc0 132; LA32-NEXT: ret 133; 134; LA64-LABEL: fcmps_ueq: 135; LA64: # %bb.0: 136; LA64-NEXT: fcmp.sueq.s $fcc0, $fa0, $fa1 137; LA64-NEXT: movcf2gr $a0, $fcc0 138; LA64-NEXT: ret 139 %1 = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"ueq", metadata !"fpexcept.strict") strictfp 140 %2 = zext i1 %1 to i32 141 ret i32 %2 142} 143 144define i32 @fcmps_ugt(float %a, float %b) nounwind strictfp { 145; LA32-LABEL: fcmps_ugt: 146; LA32: # %bb.0: 147; LA32-NEXT: fcmp.sult.s $fcc0, $fa1, $fa0 148; LA32-NEXT: movcf2gr $a0, $fcc0 149; LA32-NEXT: ret 150; 151; LA64-LABEL: fcmps_ugt: 152; LA64: # %bb.0: 153; LA64-NEXT: fcmp.sult.s $fcc0, $fa1, $fa0 154; LA64-NEXT: movcf2gr $a0, $fcc0 155; LA64-NEXT: ret 156 %1 = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"ugt", metadata !"fpexcept.strict") strictfp 157 %2 = zext i1 %1 to i32 158 ret i32 %2 159} 160 161define i32 @fcmps_uge(float %a, float %b) nounwind strictfp { 162; LA32-LABEL: fcmps_uge: 163; LA32: # %bb.0: 164; LA32-NEXT: fcmp.sule.s $fcc0, $fa1, $fa0 165; LA32-NEXT: movcf2gr $a0, $fcc0 166; LA32-NEXT: ret 167; 168; LA64-LABEL: fcmps_uge: 169; LA64: # %bb.0: 170; LA64-NEXT: fcmp.sule.s $fcc0, $fa1, $fa0 171; LA64-NEXT: movcf2gr $a0, $fcc0 172; LA64-NEXT: ret 173 %1 = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"uge", metadata !"fpexcept.strict") strictfp 174 %2 = zext i1 %1 to i32 175 ret i32 %2 176} 177 178define i32 @fcmps_ult(float %a, float %b) nounwind strictfp { 179; LA32-LABEL: fcmps_ult: 180; LA32: # %bb.0: 181; LA32-NEXT: fcmp.sult.s $fcc0, $fa0, $fa1 182; LA32-NEXT: movcf2gr $a0, $fcc0 183; LA32-NEXT: ret 184; 185; LA64-LABEL: fcmps_ult: 186; LA64: # %bb.0: 187; LA64-NEXT: fcmp.sult.s $fcc0, $fa0, $fa1 188; LA64-NEXT: movcf2gr $a0, $fcc0 189; LA64-NEXT: ret 190 %1 = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"ult", metadata !"fpexcept.strict") strictfp 191 %2 = zext i1 %1 to i32 192 ret i32 %2 193} 194 195define i32 @fcmps_ule(float %a, float %b) nounwind strictfp { 196; LA32-LABEL: fcmps_ule: 197; LA32: # %bb.0: 198; LA32-NEXT: fcmp.sule.s $fcc0, $fa0, $fa1 199; LA32-NEXT: movcf2gr $a0, $fcc0 200; LA32-NEXT: ret 201; 202; LA64-LABEL: fcmps_ule: 203; LA64: # %bb.0: 204; LA64-NEXT: fcmp.sule.s $fcc0, $fa0, $fa1 205; LA64-NEXT: movcf2gr $a0, $fcc0 206; LA64-NEXT: ret 207 %1 = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"ule", metadata !"fpexcept.strict") strictfp 208 %2 = zext i1 %1 to i32 209 ret i32 %2 210} 211 212define i32 @fcmps_une(float %a, float %b) nounwind strictfp { 213; LA32-LABEL: fcmps_une: 214; LA32: # %bb.0: 215; LA32-NEXT: fcmp.sune.s $fcc0, $fa0, $fa1 216; LA32-NEXT: movcf2gr $a0, $fcc0 217; LA32-NEXT: ret 218; 219; LA64-LABEL: fcmps_une: 220; LA64: # %bb.0: 221; LA64-NEXT: fcmp.sune.s $fcc0, $fa0, $fa1 222; LA64-NEXT: movcf2gr $a0, $fcc0 223; LA64-NEXT: ret 224 %1 = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"une", metadata !"fpexcept.strict") strictfp 225 %2 = zext i1 %1 to i32 226 ret i32 %2 227} 228 229define i32 @fcmps_uno(float %a, float %b) nounwind strictfp { 230; LA32-LABEL: fcmps_uno: 231; LA32: # %bb.0: 232; LA32-NEXT: fcmp.sun.s $fcc0, $fa0, $fa1 233; LA32-NEXT: movcf2gr $a0, $fcc0 234; LA32-NEXT: ret 235; 236; LA64-LABEL: fcmps_uno: 237; LA64: # %bb.0: 238; LA64-NEXT: fcmp.sun.s $fcc0, $fa0, $fa1 239; LA64-NEXT: movcf2gr $a0, $fcc0 240; LA64-NEXT: ret 241 %1 = call i1 @llvm.experimental.constrained.fcmps.f32(float %a, float %b, metadata !"uno", metadata !"fpexcept.strict") strictfp 242 %2 = zext i1 %1 to i32 243 ret i32 %2 244} 245 246define i32 @fcmp_oeq(float %a, float %b) nounwind strictfp { 247; LA32-LABEL: fcmp_oeq: 248; LA32: # %bb.0: 249; LA32-NEXT: fcmp.ceq.s $fcc0, $fa0, $fa1 250; LA32-NEXT: movcf2gr $a0, $fcc0 251; LA32-NEXT: ret 252; 253; LA64-LABEL: fcmp_oeq: 254; LA64: # %bb.0: 255; LA64-NEXT: fcmp.ceq.s $fcc0, $fa0, $fa1 256; LA64-NEXT: movcf2gr $a0, $fcc0 257; LA64-NEXT: ret 258 %1 = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"oeq", metadata !"fpexcept.strict") strictfp 259 %2 = zext i1 %1 to i32 260 ret i32 %2 261} 262 263define i32 @fcmp_ogt(float %a, float %b) nounwind strictfp { 264; LA32-LABEL: fcmp_ogt: 265; LA32: # %bb.0: 266; LA32-NEXT: fcmp.clt.s $fcc0, $fa1, $fa0 267; LA32-NEXT: movcf2gr $a0, $fcc0 268; LA32-NEXT: ret 269; 270; LA64-LABEL: fcmp_ogt: 271; LA64: # %bb.0: 272; LA64-NEXT: fcmp.clt.s $fcc0, $fa1, $fa0 273; LA64-NEXT: movcf2gr $a0, $fcc0 274; LA64-NEXT: ret 275 %1 = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ogt", metadata !"fpexcept.strict") strictfp 276 %2 = zext i1 %1 to i32 277 ret i32 %2 278} 279 280define i32 @fcmp_oge(float %a, float %b) nounwind strictfp { 281; LA32-LABEL: fcmp_oge: 282; LA32: # %bb.0: 283; LA32-NEXT: fcmp.cle.s $fcc0, $fa1, $fa0 284; LA32-NEXT: movcf2gr $a0, $fcc0 285; LA32-NEXT: ret 286; 287; LA64-LABEL: fcmp_oge: 288; LA64: # %bb.0: 289; LA64-NEXT: fcmp.cle.s $fcc0, $fa1, $fa0 290; LA64-NEXT: movcf2gr $a0, $fcc0 291; LA64-NEXT: ret 292 %1 = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"oge", metadata !"fpexcept.strict") strictfp 293 %2 = zext i1 %1 to i32 294 ret i32 %2 295} 296 297define i32 @fcmp_olt(float %a, float %b) nounwind strictfp { 298; LA32-LABEL: fcmp_olt: 299; LA32: # %bb.0: 300; LA32-NEXT: fcmp.clt.s $fcc0, $fa0, $fa1 301; LA32-NEXT: movcf2gr $a0, $fcc0 302; LA32-NEXT: ret 303; 304; LA64-LABEL: fcmp_olt: 305; LA64: # %bb.0: 306; LA64-NEXT: fcmp.clt.s $fcc0, $fa0, $fa1 307; LA64-NEXT: movcf2gr $a0, $fcc0 308; LA64-NEXT: ret 309 %1 = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"olt", metadata !"fpexcept.strict") strictfp 310 %2 = zext i1 %1 to i32 311 ret i32 %2 312} 313 314define i32 @fcmp_ole(float %a, float %b) nounwind strictfp { 315; LA32-LABEL: fcmp_ole: 316; LA32: # %bb.0: 317; LA32-NEXT: fcmp.cle.s $fcc0, $fa0, $fa1 318; LA32-NEXT: movcf2gr $a0, $fcc0 319; LA32-NEXT: ret 320; 321; LA64-LABEL: fcmp_ole: 322; LA64: # %bb.0: 323; LA64-NEXT: fcmp.cle.s $fcc0, $fa0, $fa1 324; LA64-NEXT: movcf2gr $a0, $fcc0 325; LA64-NEXT: ret 326 %1 = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ole", metadata !"fpexcept.strict") strictfp 327 %2 = zext i1 %1 to i32 328 ret i32 %2 329} 330 331define i32 @fcmp_one(float %a, float %b) nounwind strictfp { 332; LA32-LABEL: fcmp_one: 333; LA32: # %bb.0: 334; LA32-NEXT: fcmp.cne.s $fcc0, $fa0, $fa1 335; LA32-NEXT: movcf2gr $a0, $fcc0 336; LA32-NEXT: ret 337; 338; LA64-LABEL: fcmp_one: 339; LA64: # %bb.0: 340; LA64-NEXT: fcmp.cne.s $fcc0, $fa0, $fa1 341; LA64-NEXT: movcf2gr $a0, $fcc0 342; LA64-NEXT: ret 343 %1 = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"one", metadata !"fpexcept.strict") strictfp 344 %2 = zext i1 %1 to i32 345 ret i32 %2 346} 347 348define i32 @fcmp_ord(float %a, float %b) nounwind strictfp { 349; LA32-LABEL: fcmp_ord: 350; LA32: # %bb.0: 351; LA32-NEXT: fcmp.cor.s $fcc0, $fa0, $fa1 352; LA32-NEXT: movcf2gr $a0, $fcc0 353; LA32-NEXT: ret 354; 355; LA64-LABEL: fcmp_ord: 356; LA64: # %bb.0: 357; LA64-NEXT: fcmp.cor.s $fcc0, $fa0, $fa1 358; LA64-NEXT: movcf2gr $a0, $fcc0 359; LA64-NEXT: ret 360 %1 = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ord", metadata !"fpexcept.strict") strictfp 361 %2 = zext i1 %1 to i32 362 ret i32 %2 363} 364 365define i32 @fcmp_ueq(float %a, float %b) nounwind strictfp { 366; LA32-LABEL: fcmp_ueq: 367; LA32: # %bb.0: 368; LA32-NEXT: fcmp.cueq.s $fcc0, $fa0, $fa1 369; LA32-NEXT: movcf2gr $a0, $fcc0 370; LA32-NEXT: ret 371; 372; LA64-LABEL: fcmp_ueq: 373; LA64: # %bb.0: 374; LA64-NEXT: fcmp.cueq.s $fcc0, $fa0, $fa1 375; LA64-NEXT: movcf2gr $a0, $fcc0 376; LA64-NEXT: ret 377 %1 = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ueq", metadata !"fpexcept.strict") strictfp 378 %2 = zext i1 %1 to i32 379 ret i32 %2 380} 381 382define i32 @fcmp_ugt(float %a, float %b) nounwind strictfp { 383; LA32-LABEL: fcmp_ugt: 384; LA32: # %bb.0: 385; LA32-NEXT: fcmp.cult.s $fcc0, $fa1, $fa0 386; LA32-NEXT: movcf2gr $a0, $fcc0 387; LA32-NEXT: ret 388; 389; LA64-LABEL: fcmp_ugt: 390; LA64: # %bb.0: 391; LA64-NEXT: fcmp.cult.s $fcc0, $fa1, $fa0 392; LA64-NEXT: movcf2gr $a0, $fcc0 393; LA64-NEXT: ret 394 %1 = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ugt", metadata !"fpexcept.strict") strictfp 395 %2 = zext i1 %1 to i32 396 ret i32 %2 397} 398 399define i32 @fcmp_uge(float %a, float %b) nounwind strictfp { 400; LA32-LABEL: fcmp_uge: 401; LA32: # %bb.0: 402; LA32-NEXT: fcmp.cule.s $fcc0, $fa1, $fa0 403; LA32-NEXT: movcf2gr $a0, $fcc0 404; LA32-NEXT: ret 405; 406; LA64-LABEL: fcmp_uge: 407; LA64: # %bb.0: 408; LA64-NEXT: fcmp.cule.s $fcc0, $fa1, $fa0 409; LA64-NEXT: movcf2gr $a0, $fcc0 410; LA64-NEXT: ret 411 %1 = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"uge", metadata !"fpexcept.strict") strictfp 412 %2 = zext i1 %1 to i32 413 ret i32 %2 414} 415 416define i32 @fcmp_ult(float %a, float %b) nounwind strictfp { 417; LA32-LABEL: fcmp_ult: 418; LA32: # %bb.0: 419; LA32-NEXT: fcmp.cult.s $fcc0, $fa0, $fa1 420; LA32-NEXT: movcf2gr $a0, $fcc0 421; LA32-NEXT: ret 422; 423; LA64-LABEL: fcmp_ult: 424; LA64: # %bb.0: 425; LA64-NEXT: fcmp.cult.s $fcc0, $fa0, $fa1 426; LA64-NEXT: movcf2gr $a0, $fcc0 427; LA64-NEXT: ret 428 %1 = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ult", metadata !"fpexcept.strict") strictfp 429 %2 = zext i1 %1 to i32 430 ret i32 %2 431} 432 433define i32 @fcmp_ule(float %a, float %b) nounwind strictfp { 434; LA32-LABEL: fcmp_ule: 435; LA32: # %bb.0: 436; LA32-NEXT: fcmp.cule.s $fcc0, $fa0, $fa1 437; LA32-NEXT: movcf2gr $a0, $fcc0 438; LA32-NEXT: ret 439; 440; LA64-LABEL: fcmp_ule: 441; LA64: # %bb.0: 442; LA64-NEXT: fcmp.cule.s $fcc0, $fa0, $fa1 443; LA64-NEXT: movcf2gr $a0, $fcc0 444; LA64-NEXT: ret 445 %1 = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"ule", metadata !"fpexcept.strict") strictfp 446 %2 = zext i1 %1 to i32 447 ret i32 %2 448} 449 450define i32 @fcmp_une(float %a, float %b) nounwind strictfp { 451; LA32-LABEL: fcmp_une: 452; LA32: # %bb.0: 453; LA32-NEXT: fcmp.cune.s $fcc0, $fa0, $fa1 454; LA32-NEXT: movcf2gr $a0, $fcc0 455; LA32-NEXT: ret 456; 457; LA64-LABEL: fcmp_une: 458; LA64: # %bb.0: 459; LA64-NEXT: fcmp.cune.s $fcc0, $fa0, $fa1 460; LA64-NEXT: movcf2gr $a0, $fcc0 461; LA64-NEXT: ret 462 %1 = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"une", metadata !"fpexcept.strict") strictfp 463 %2 = zext i1 %1 to i32 464 ret i32 %2 465} 466 467define i32 @fcmp_uno(float %a, float %b) nounwind strictfp { 468; LA32-LABEL: fcmp_uno: 469; LA32: # %bb.0: 470; LA32-NEXT: fcmp.cun.s $fcc0, $fa0, $fa1 471; LA32-NEXT: movcf2gr $a0, $fcc0 472; LA32-NEXT: ret 473; 474; LA64-LABEL: fcmp_uno: 475; LA64: # %bb.0: 476; LA64-NEXT: fcmp.cun.s $fcc0, $fa0, $fa1 477; LA64-NEXT: movcf2gr $a0, $fcc0 478; LA64-NEXT: ret 479 %1 = call i1 @llvm.experimental.constrained.fcmp.f32(float %a, float %b, metadata !"uno", metadata !"fpexcept.strict") strictfp 480 %2 = zext i1 %1 to i32 481 ret i32 %2 482} 483