1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc --mtriple=loongarch32 --mattr=+d < %s | FileCheck %s --check-prefix=LA32 3; RUN: llc --mtriple=loongarch64 --mattr=+d < %s | FileCheck %s --check-prefix=LA64 4 5;; Test the 'fcmp' LLVM IR: https://llvm.org/docs/LangRef.html#fcmp-instruction 6;; over double values. 7 8define i1 @fcmp_false(double %a, double %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 double %a, %b 19 ret i1 %cmp 20} 21 22define i1 @fcmp_oeq(double %a, double %b) { 23; LA32-LABEL: fcmp_oeq: 24; LA32: # %bb.0: 25; LA32-NEXT: fcmp.ceq.d $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.d $fcc0, $fa0, $fa1 32; LA64-NEXT: movcf2gr $a0, $fcc0 33; LA64-NEXT: ret 34 %cmp = fcmp oeq double %a, %b 35 ret i1 %cmp 36} 37 38define i1 @fcmp_ogt(double %a, double %b) { 39; LA32-LABEL: fcmp_ogt: 40; LA32: # %bb.0: 41; LA32-NEXT: fcmp.clt.d $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.d $fcc0, $fa1, $fa0 48; LA64-NEXT: movcf2gr $a0, $fcc0 49; LA64-NEXT: ret 50 %cmp = fcmp ogt double %a, %b 51 ret i1 %cmp 52} 53 54define i1 @fcmp_oge(double %a, double %b) { 55; LA32-LABEL: fcmp_oge: 56; LA32: # %bb.0: 57; LA32-NEXT: fcmp.cle.d $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.d $fcc0, $fa1, $fa0 64; LA64-NEXT: movcf2gr $a0, $fcc0 65; LA64-NEXT: ret 66 %cmp = fcmp oge double %a, %b 67 ret i1 %cmp 68} 69 70define i1 @fcmp_olt(double %a, double %b) { 71; LA32-LABEL: fcmp_olt: 72; LA32: # %bb.0: 73; LA32-NEXT: fcmp.clt.d $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.d $fcc0, $fa0, $fa1 80; LA64-NEXT: movcf2gr $a0, $fcc0 81; LA64-NEXT: ret 82 %cmp = fcmp olt double %a, %b 83 ret i1 %cmp 84} 85 86define i1 @fcmp_ole(double %a, double %b) { 87; LA32-LABEL: fcmp_ole: 88; LA32: # %bb.0: 89; LA32-NEXT: fcmp.cle.d $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.d $fcc0, $fa0, $fa1 96; LA64-NEXT: movcf2gr $a0, $fcc0 97; LA64-NEXT: ret 98 %cmp = fcmp ole double %a, %b 99 ret i1 %cmp 100} 101 102define i1 @fcmp_one(double %a, double %b) { 103; LA32-LABEL: fcmp_one: 104; LA32: # %bb.0: 105; LA32-NEXT: fcmp.cne.d $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.d $fcc0, $fa0, $fa1 112; LA64-NEXT: movcf2gr $a0, $fcc0 113; LA64-NEXT: ret 114 %cmp = fcmp one double %a, %b 115 ret i1 %cmp 116} 117 118define i1 @fcmp_ord(double %a, double %b) { 119; LA32-LABEL: fcmp_ord: 120; LA32: # %bb.0: 121; LA32-NEXT: fcmp.cor.d $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.d $fcc0, $fa0, $fa1 128; LA64-NEXT: movcf2gr $a0, $fcc0 129; LA64-NEXT: ret 130 %cmp = fcmp ord double %a, %b 131 ret i1 %cmp 132} 133 134define i1 @fcmp_ueq(double %a, double %b) { 135; LA32-LABEL: fcmp_ueq: 136; LA32: # %bb.0: 137; LA32-NEXT: fcmp.cueq.d $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.d $fcc0, $fa0, $fa1 144; LA64-NEXT: movcf2gr $a0, $fcc0 145; LA64-NEXT: ret 146 %cmp = fcmp ueq double %a, %b 147 ret i1 %cmp 148} 149 150define i1 @fcmp_ugt(double %a, double %b) { 151; LA32-LABEL: fcmp_ugt: 152; LA32: # %bb.0: 153; LA32-NEXT: fcmp.cult.d $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.d $fcc0, $fa1, $fa0 160; LA64-NEXT: movcf2gr $a0, $fcc0 161; LA64-NEXT: ret 162 %cmp = fcmp ugt double %a, %b 163 ret i1 %cmp 164} 165 166define i1 @fcmp_uge(double %a, double %b) { 167; LA32-LABEL: fcmp_uge: 168; LA32: # %bb.0: 169; LA32-NEXT: fcmp.cule.d $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.d $fcc0, $fa1, $fa0 176; LA64-NEXT: movcf2gr $a0, $fcc0 177; LA64-NEXT: ret 178 %cmp = fcmp uge double %a, %b 179 ret i1 %cmp 180} 181 182define i1 @fcmp_ult(double %a, double %b) { 183; LA32-LABEL: fcmp_ult: 184; LA32: # %bb.0: 185; LA32-NEXT: fcmp.cult.d $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.d $fcc0, $fa0, $fa1 192; LA64-NEXT: movcf2gr $a0, $fcc0 193; LA64-NEXT: ret 194 %cmp = fcmp ult double %a, %b 195 ret i1 %cmp 196} 197 198define i1 @fcmp_ule(double %a, double %b) { 199; LA32-LABEL: fcmp_ule: 200; LA32: # %bb.0: 201; LA32-NEXT: fcmp.cule.d $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.d $fcc0, $fa0, $fa1 208; LA64-NEXT: movcf2gr $a0, $fcc0 209; LA64-NEXT: ret 210 %cmp = fcmp ule double %a, %b 211 ret i1 %cmp 212} 213 214define i1 @fcmp_une(double %a, double %b) { 215; LA32-LABEL: fcmp_une: 216; LA32: # %bb.0: 217; LA32-NEXT: fcmp.cune.d $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.d $fcc0, $fa0, $fa1 224; LA64-NEXT: movcf2gr $a0, $fcc0 225; LA64-NEXT: ret 226 %cmp = fcmp une double %a, %b 227 ret i1 %cmp 228} 229 230define i1 @fcmp_uno(double %a, double %b) { 231; LA32-LABEL: fcmp_uno: 232; LA32: # %bb.0: 233; LA32-NEXT: fcmp.cun.d $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.d $fcc0, $fa0, $fa1 240; LA64-NEXT: movcf2gr $a0, $fcc0 241; LA64-NEXT: ret 242 %cmp = fcmp uno double %a, %b 243 ret i1 %cmp 244} 245 246define i1 @fcmp_true(double %a, double %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 double %a, %b 257 ret i1 %cmp 258} 259 260define i1 @fcmp_fast_olt(double %a, double %b, i1 %c) nounwind { 261; LA32-LABEL: fcmp_fast_olt: 262; LA32: # %bb.0: 263; LA32-NEXT: movgr2fr.w $fa1, $zero 264; LA32-NEXT: movgr2frh.w $fa1, $zero 265; LA32-NEXT: fcmp.cle.d $fcc0, $fa1, $fa0 266; LA32-NEXT: movcf2gr $a1, $fcc0 267; LA32-NEXT: bnez $a1, .LBB16_2 268; LA32-NEXT: # %bb.1: # %if.then 269; LA32-NEXT: ret 270; LA32-NEXT: .LBB16_2: # %if.else 271; LA32-NEXT: fcmp.clt.d $fcc0, $fa0, $fa1 272; LA32-NEXT: movcf2gr $a0, $fcc0 273; LA32-NEXT: ret 274; 275; LA64-LABEL: fcmp_fast_olt: 276; LA64: # %bb.0: 277; LA64-NEXT: movgr2fr.d $fa1, $zero 278; LA64-NEXT: fcmp.cle.d $fcc0, $fa1, $fa0 279; LA64-NEXT: movcf2gr $a1, $fcc0 280; LA64-NEXT: bnez $a1, .LBB16_2 281; LA64-NEXT: # %bb.1: # %if.then 282; LA64-NEXT: ret 283; LA64-NEXT: .LBB16_2: # %if.else 284; LA64-NEXT: fcmp.clt.d $fcc0, $fa0, $fa1 285; LA64-NEXT: movcf2gr $a0, $fcc0 286; LA64-NEXT: ret 287 %cmp = fcmp fast olt double %a, 0.000000e+00 288 br i1 %cmp, label %if.then, label %if.else 289 290if.then: 291 ret i1 %c 292 293if.else: 294 ret i1 %cmp 295} 296 297define i1 @fcmp_fast_oeq(double %a, double %b, i1 %c) nounwind { 298; LA32-LABEL: fcmp_fast_oeq: 299; LA32: # %bb.0: 300; LA32-NEXT: movgr2fr.w $fa1, $zero 301; LA32-NEXT: movgr2frh.w $fa1, $zero 302; LA32-NEXT: fcmp.ceq.d $fcc0, $fa0, $fa1 303; LA32-NEXT: movcf2gr $a1, $fcc0 304; LA32-NEXT: xori $a1, $a1, 1 305; LA32-NEXT: bnez $a1, .LBB17_2 306; LA32-NEXT: # %bb.1: # %if.then 307; LA32-NEXT: ret 308; LA32-NEXT: .LBB17_2: # %if.else 309; LA32-NEXT: movcf2gr $a0, $fcc0 310; LA32-NEXT: ret 311; 312; LA64-LABEL: fcmp_fast_oeq: 313; LA64: # %bb.0: 314; LA64-NEXT: movgr2fr.d $fa1, $zero 315; LA64-NEXT: fcmp.ceq.d $fcc0, $fa0, $fa1 316; LA64-NEXT: movcf2gr $a1, $fcc0 317; LA64-NEXT: xori $a1, $a1, 1 318; LA64-NEXT: bnez $a1, .LBB17_2 319; LA64-NEXT: # %bb.1: # %if.then 320; LA64-NEXT: ret 321; LA64-NEXT: .LBB17_2: # %if.else 322; LA64-NEXT: movcf2gr $a0, $fcc0 323; LA64-NEXT: ret 324 %cmp = fcmp fast oeq double %a, 0.000000e+00 325 br i1 %cmp, label %if.then, label %if.else 326 327if.then: 328 ret i1 %c 329 330if.else: 331 ret i1 %cmp 332} 333 334define i1 @fcmp_fast_ole(double %a, double %b, i1 %c) nounwind { 335; LA32-LABEL: fcmp_fast_ole: 336; LA32: # %bb.0: 337; LA32-NEXT: movgr2fr.w $fa1, $zero 338; LA32-NEXT: movgr2frh.w $fa1, $zero 339; LA32-NEXT: fcmp.clt.d $fcc0, $fa1, $fa0 340; LA32-NEXT: bcnez $fcc0, .LBB18_2 341; LA32-NEXT: # %bb.1: # %if.then 342; LA32-NEXT: ret 343; LA32-NEXT: .LBB18_2: # %if.else 344; LA32-NEXT: fcmp.cle.d $fcc0, $fa0, $fa1 345; LA32-NEXT: movcf2gr $a0, $fcc0 346; LA32-NEXT: ret 347; 348; LA64-LABEL: fcmp_fast_ole: 349; LA64: # %bb.0: 350; LA64-NEXT: movgr2fr.d $fa1, $zero 351; LA64-NEXT: fcmp.clt.d $fcc0, $fa1, $fa0 352; LA64-NEXT: bcnez $fcc0, .LBB18_2 353; LA64-NEXT: # %bb.1: # %if.then 354; LA64-NEXT: ret 355; LA64-NEXT: .LBB18_2: # %if.else 356; LA64-NEXT: fcmp.cle.d $fcc0, $fa0, $fa1 357; LA64-NEXT: movcf2gr $a0, $fcc0 358; LA64-NEXT: ret 359 %cmp = fcmp fast ole double %a, 0.000000e+00 360 br i1 %cmp, label %if.then, label %if.else 361 362if.then: 363 ret i1 %c 364 365if.else: 366 ret i1 %cmp 367} 368