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 5;; Test the 'fcmp' LLVM IR: https://llvm.org/docs/LangRef.html#fcmp-instruction 6;; over float values. 7 8define i1 @fcmp_false(float %a, float %b) { 9; LA32-LABEL: fcmp_false: 10; LA32: # %bb.0: 11; LA32-NEXT: move $a0, $zero 12; LA32-NEXT: ret 13; 14; LA64-LABEL: fcmp_false: 15; LA64: # %bb.0: 16; LA64-NEXT: move $a0, $zero 17; LA64-NEXT: ret 18 %cmp = fcmp false float %a, %b 19 ret i1 %cmp 20} 21 22define i1 @fcmp_oeq(float %a, float %b) { 23; LA32-LABEL: fcmp_oeq: 24; LA32: # %bb.0: 25; LA32-NEXT: fcmp.ceq.s $fcc0, $fa0, $fa1 26; LA32-NEXT: movcf2gr $a0, $fcc0 27; LA32-NEXT: ret 28; 29; LA64-LABEL: fcmp_oeq: 30; LA64: # %bb.0: 31; LA64-NEXT: fcmp.ceq.s $fcc0, $fa0, $fa1 32; LA64-NEXT: movcf2gr $a0, $fcc0 33; LA64-NEXT: ret 34 %cmp = fcmp oeq float %a, %b 35 ret i1 %cmp 36} 37 38define i1 @fcmp_ogt(float %a, float %b) { 39; LA32-LABEL: fcmp_ogt: 40; LA32: # %bb.0: 41; LA32-NEXT: fcmp.clt.s $fcc0, $fa1, $fa0 42; LA32-NEXT: movcf2gr $a0, $fcc0 43; LA32-NEXT: ret 44; 45; LA64-LABEL: fcmp_ogt: 46; LA64: # %bb.0: 47; LA64-NEXT: fcmp.clt.s $fcc0, $fa1, $fa0 48; LA64-NEXT: movcf2gr $a0, $fcc0 49; LA64-NEXT: ret 50 %cmp = fcmp ogt float %a, %b 51 ret i1 %cmp 52} 53 54define i1 @fcmp_oge(float %a, float %b) { 55; LA32-LABEL: fcmp_oge: 56; LA32: # %bb.0: 57; LA32-NEXT: fcmp.cle.s $fcc0, $fa1, $fa0 58; LA32-NEXT: movcf2gr $a0, $fcc0 59; LA32-NEXT: ret 60; 61; LA64-LABEL: fcmp_oge: 62; LA64: # %bb.0: 63; LA64-NEXT: fcmp.cle.s $fcc0, $fa1, $fa0 64; LA64-NEXT: movcf2gr $a0, $fcc0 65; LA64-NEXT: ret 66 %cmp = fcmp oge float %a, %b 67 ret i1 %cmp 68} 69 70define i1 @fcmp_olt(float %a, float %b) { 71; LA32-LABEL: fcmp_olt: 72; LA32: # %bb.0: 73; LA32-NEXT: fcmp.clt.s $fcc0, $fa0, $fa1 74; LA32-NEXT: movcf2gr $a0, $fcc0 75; LA32-NEXT: ret 76; 77; LA64-LABEL: fcmp_olt: 78; LA64: # %bb.0: 79; LA64-NEXT: fcmp.clt.s $fcc0, $fa0, $fa1 80; LA64-NEXT: movcf2gr $a0, $fcc0 81; LA64-NEXT: ret 82 %cmp = fcmp olt float %a, %b 83 ret i1 %cmp 84} 85 86define i1 @fcmp_ole(float %a, float %b) { 87; LA32-LABEL: fcmp_ole: 88; LA32: # %bb.0: 89; LA32-NEXT: fcmp.cle.s $fcc0, $fa0, $fa1 90; LA32-NEXT: movcf2gr $a0, $fcc0 91; LA32-NEXT: ret 92; 93; LA64-LABEL: fcmp_ole: 94; LA64: # %bb.0: 95; LA64-NEXT: fcmp.cle.s $fcc0, $fa0, $fa1 96; LA64-NEXT: movcf2gr $a0, $fcc0 97; LA64-NEXT: ret 98 %cmp = fcmp ole float %a, %b 99 ret i1 %cmp 100} 101 102define i1 @fcmp_one(float %a, float %b) { 103; LA32-LABEL: fcmp_one: 104; LA32: # %bb.0: 105; LA32-NEXT: fcmp.cne.s $fcc0, $fa0, $fa1 106; LA32-NEXT: movcf2gr $a0, $fcc0 107; LA32-NEXT: ret 108; 109; LA64-LABEL: fcmp_one: 110; LA64: # %bb.0: 111; LA64-NEXT: fcmp.cne.s $fcc0, $fa0, $fa1 112; LA64-NEXT: movcf2gr $a0, $fcc0 113; LA64-NEXT: ret 114 %cmp = fcmp one float %a, %b 115 ret i1 %cmp 116} 117 118define i1 @fcmp_ord(float %a, float %b) { 119; LA32-LABEL: fcmp_ord: 120; LA32: # %bb.0: 121; LA32-NEXT: fcmp.cor.s $fcc0, $fa0, $fa1 122; LA32-NEXT: movcf2gr $a0, $fcc0 123; LA32-NEXT: ret 124; 125; LA64-LABEL: fcmp_ord: 126; LA64: # %bb.0: 127; LA64-NEXT: fcmp.cor.s $fcc0, $fa0, $fa1 128; LA64-NEXT: movcf2gr $a0, $fcc0 129; LA64-NEXT: ret 130 %cmp = fcmp ord float %a, %b 131 ret i1 %cmp 132} 133 134define i1 @fcmp_ueq(float %a, float %b) { 135; LA32-LABEL: fcmp_ueq: 136; LA32: # %bb.0: 137; LA32-NEXT: fcmp.cueq.s $fcc0, $fa0, $fa1 138; LA32-NEXT: movcf2gr $a0, $fcc0 139; LA32-NEXT: ret 140; 141; LA64-LABEL: fcmp_ueq: 142; LA64: # %bb.0: 143; LA64-NEXT: fcmp.cueq.s $fcc0, $fa0, $fa1 144; LA64-NEXT: movcf2gr $a0, $fcc0 145; LA64-NEXT: ret 146 %cmp = fcmp ueq float %a, %b 147 ret i1 %cmp 148} 149 150define i1 @fcmp_ugt(float %a, float %b) { 151; LA32-LABEL: fcmp_ugt: 152; LA32: # %bb.0: 153; LA32-NEXT: fcmp.cult.s $fcc0, $fa1, $fa0 154; LA32-NEXT: movcf2gr $a0, $fcc0 155; LA32-NEXT: ret 156; 157; LA64-LABEL: fcmp_ugt: 158; LA64: # %bb.0: 159; LA64-NEXT: fcmp.cult.s $fcc0, $fa1, $fa0 160; LA64-NEXT: movcf2gr $a0, $fcc0 161; LA64-NEXT: ret 162 %cmp = fcmp ugt float %a, %b 163 ret i1 %cmp 164} 165 166define i1 @fcmp_uge(float %a, float %b) { 167; LA32-LABEL: fcmp_uge: 168; LA32: # %bb.0: 169; LA32-NEXT: fcmp.cule.s $fcc0, $fa1, $fa0 170; LA32-NEXT: movcf2gr $a0, $fcc0 171; LA32-NEXT: ret 172; 173; LA64-LABEL: fcmp_uge: 174; LA64: # %bb.0: 175; LA64-NEXT: fcmp.cule.s $fcc0, $fa1, $fa0 176; LA64-NEXT: movcf2gr $a0, $fcc0 177; LA64-NEXT: ret 178 %cmp = fcmp uge float %a, %b 179 ret i1 %cmp 180} 181 182define i1 @fcmp_ult(float %a, float %b) { 183; LA32-LABEL: fcmp_ult: 184; LA32: # %bb.0: 185; LA32-NEXT: fcmp.cult.s $fcc0, $fa0, $fa1 186; LA32-NEXT: movcf2gr $a0, $fcc0 187; LA32-NEXT: ret 188; 189; LA64-LABEL: fcmp_ult: 190; LA64: # %bb.0: 191; LA64-NEXT: fcmp.cult.s $fcc0, $fa0, $fa1 192; LA64-NEXT: movcf2gr $a0, $fcc0 193; LA64-NEXT: ret 194 %cmp = fcmp ult float %a, %b 195 ret i1 %cmp 196} 197 198define i1 @fcmp_ule(float %a, float %b) { 199; LA32-LABEL: fcmp_ule: 200; LA32: # %bb.0: 201; LA32-NEXT: fcmp.cule.s $fcc0, $fa0, $fa1 202; LA32-NEXT: movcf2gr $a0, $fcc0 203; LA32-NEXT: ret 204; 205; LA64-LABEL: fcmp_ule: 206; LA64: # %bb.0: 207; LA64-NEXT: fcmp.cule.s $fcc0, $fa0, $fa1 208; LA64-NEXT: movcf2gr $a0, $fcc0 209; LA64-NEXT: ret 210 %cmp = fcmp ule float %a, %b 211 ret i1 %cmp 212} 213 214define i1 @fcmp_une(float %a, float %b) { 215; LA32-LABEL: fcmp_une: 216; LA32: # %bb.0: 217; LA32-NEXT: fcmp.cune.s $fcc0, $fa0, $fa1 218; LA32-NEXT: movcf2gr $a0, $fcc0 219; LA32-NEXT: ret 220; 221; LA64-LABEL: fcmp_une: 222; LA64: # %bb.0: 223; LA64-NEXT: fcmp.cune.s $fcc0, $fa0, $fa1 224; LA64-NEXT: movcf2gr $a0, $fcc0 225; LA64-NEXT: ret 226 %cmp = fcmp une float %a, %b 227 ret i1 %cmp 228} 229 230define i1 @fcmp_uno(float %a, float %b) { 231; LA32-LABEL: fcmp_uno: 232; LA32: # %bb.0: 233; LA32-NEXT: fcmp.cun.s $fcc0, $fa0, $fa1 234; LA32-NEXT: movcf2gr $a0, $fcc0 235; LA32-NEXT: ret 236; 237; LA64-LABEL: fcmp_uno: 238; LA64: # %bb.0: 239; LA64-NEXT: fcmp.cun.s $fcc0, $fa0, $fa1 240; LA64-NEXT: movcf2gr $a0, $fcc0 241; LA64-NEXT: ret 242 %cmp = fcmp uno float %a, %b 243 ret i1 %cmp 244} 245 246define i1 @fcmp_true(float %a, float %b) { 247; LA32-LABEL: fcmp_true: 248; LA32: # %bb.0: 249; LA32-NEXT: ori $a0, $zero, 1 250; LA32-NEXT: ret 251; 252; LA64-LABEL: fcmp_true: 253; LA64: # %bb.0: 254; LA64-NEXT: ori $a0, $zero, 1 255; LA64-NEXT: ret 256 %cmp = fcmp true float %a, %b 257 ret i1 %cmp 258} 259 260define i1 @fcmp_fast_olt(float %a, float %b, i1 %c) nounwind { 261; LA32-LABEL: fcmp_fast_olt: 262; LA32: # %bb.0: 263; LA32-NEXT: movgr2fr.w $fa1, $zero 264; LA32-NEXT: fcmp.cle.s $fcc0, $fa1, $fa0 265; LA32-NEXT: movcf2gr $a1, $fcc0 266; LA32-NEXT: bnez $a1, .LBB16_2 267; LA32-NEXT: # %bb.1: # %if.then 268; LA32-NEXT: ret 269; LA32-NEXT: .LBB16_2: # %if.else 270; LA32-NEXT: fcmp.clt.s $fcc0, $fa0, $fa1 271; LA32-NEXT: movcf2gr $a0, $fcc0 272; LA32-NEXT: ret 273; 274; LA64-LABEL: fcmp_fast_olt: 275; LA64: # %bb.0: 276; LA64-NEXT: movgr2fr.w $fa1, $zero 277; LA64-NEXT: fcmp.cle.s $fcc0, $fa1, $fa0 278; LA64-NEXT: movcf2gr $a1, $fcc0 279; LA64-NEXT: bnez $a1, .LBB16_2 280; LA64-NEXT: # %bb.1: # %if.then 281; LA64-NEXT: ret 282; LA64-NEXT: .LBB16_2: # %if.else 283; LA64-NEXT: fcmp.clt.s $fcc0, $fa0, $fa1 284; LA64-NEXT: movcf2gr $a0, $fcc0 285; LA64-NEXT: ret 286 %cmp = fcmp fast olt float %a, 0.000000e+00 287 br i1 %cmp, label %if.then, label %if.else 288 289if.then: 290 ret i1 %c 291 292if.else: 293 ret i1 %cmp 294} 295 296define i1 @fcmp_fast_oeq(float %a, float %b, i1 %c) nounwind { 297; LA32-LABEL: fcmp_fast_oeq: 298; LA32: # %bb.0: 299; LA32-NEXT: movgr2fr.w $fa1, $zero 300; LA32-NEXT: fcmp.ceq.s $fcc0, $fa0, $fa1 301; LA32-NEXT: movcf2gr $a1, $fcc0 302; LA32-NEXT: xori $a1, $a1, 1 303; LA32-NEXT: bnez $a1, .LBB17_2 304; LA32-NEXT: # %bb.1: # %if.then 305; LA32-NEXT: ret 306; LA32-NEXT: .LBB17_2: # %if.else 307; LA32-NEXT: movcf2gr $a0, $fcc0 308; LA32-NEXT: ret 309; 310; LA64-LABEL: fcmp_fast_oeq: 311; LA64: # %bb.0: 312; LA64-NEXT: movgr2fr.w $fa1, $zero 313; LA64-NEXT: fcmp.ceq.s $fcc0, $fa0, $fa1 314; LA64-NEXT: movcf2gr $a1, $fcc0 315; LA64-NEXT: xori $a1, $a1, 1 316; LA64-NEXT: bnez $a1, .LBB17_2 317; LA64-NEXT: # %bb.1: # %if.then 318; LA64-NEXT: ret 319; LA64-NEXT: .LBB17_2: # %if.else 320; LA64-NEXT: movcf2gr $a0, $fcc0 321; LA64-NEXT: ret 322 %cmp = fcmp fast oeq float %a, 0.000000e+00 323 br i1 %cmp, label %if.then, label %if.else 324 325if.then: 326 ret i1 %c 327 328if.else: 329 ret i1 %cmp 330} 331 332define i1 @fcmp_fast_ole(float %a, float %b, i1 %c) nounwind { 333; LA32-LABEL: fcmp_fast_ole: 334; LA32: # %bb.0: 335; LA32-NEXT: movgr2fr.w $fa1, $zero 336; LA32-NEXT: fcmp.clt.s $fcc0, $fa1, $fa0 337; LA32-NEXT: bcnez $fcc0, .LBB18_2 338; LA32-NEXT: # %bb.1: # %if.then 339; LA32-NEXT: ret 340; LA32-NEXT: .LBB18_2: # %if.else 341; LA32-NEXT: fcmp.cle.s $fcc0, $fa0, $fa1 342; LA32-NEXT: movcf2gr $a0, $fcc0 343; LA32-NEXT: ret 344; 345; LA64-LABEL: fcmp_fast_ole: 346; LA64: # %bb.0: 347; LA64-NEXT: movgr2fr.w $fa1, $zero 348; LA64-NEXT: fcmp.clt.s $fcc0, $fa1, $fa0 349; LA64-NEXT: bcnez $fcc0, .LBB18_2 350; LA64-NEXT: # %bb.1: # %if.then 351; LA64-NEXT: ret 352; LA64-NEXT: .LBB18_2: # %if.else 353; LA64-NEXT: fcmp.cle.s $fcc0, $fa0, $fa1 354; LA64-NEXT: movcf2gr $a0, $fcc0 355; LA64-NEXT: ret 356 %cmp = fcmp fast ole float %a, 0.000000e+00 357 br i1 %cmp, label %if.then, label %if.else 358 359if.then: 360 ret i1 %c 361 362if.else: 363 ret i1 %cmp 364} 365