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 double-precision floating-point values selection after comparison 6 7define double @fcmp_false(double %a, double %b, double %x, double %y) { 8; LA32-LABEL: fcmp_false: 9; LA32: # %bb.0: 10; LA32-NEXT: fmov.d $fa0, $fa3 11; LA32-NEXT: ret 12; 13; LA64-LABEL: fcmp_false: 14; LA64: # %bb.0: 15; LA64-NEXT: fmov.d $fa0, $fa3 16; LA64-NEXT: ret 17 %cmp = fcmp false double %a, %b 18 %res = select i1 %cmp, double %x, double %y 19 ret double %res 20} 21 22define double @fcmp_oeq(double %a, double %b, double %x, double %y) { 23; LA32-LABEL: fcmp_oeq: 24; LA32: # %bb.0: 25; LA32-NEXT: fcmp.ceq.d $fcc0, $fa0, $fa1 26; LA32-NEXT: fsel $fa0, $fa3, $fa2, $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: fsel $fa0, $fa3, $fa2, $fcc0 33; LA64-NEXT: ret 34 %cmp = fcmp oeq double %a, %b 35 %res = select i1 %cmp, double %x, double %y 36 ret double %res 37} 38 39define double @fcmp_ogt(double %a, double %b, double %x, double %y) { 40; LA32-LABEL: fcmp_ogt: 41; LA32: # %bb.0: 42; LA32-NEXT: fcmp.clt.d $fcc0, $fa1, $fa0 43; LA32-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 44; LA32-NEXT: ret 45; 46; LA64-LABEL: fcmp_ogt: 47; LA64: # %bb.0: 48; LA64-NEXT: fcmp.clt.d $fcc0, $fa1, $fa0 49; LA64-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 50; LA64-NEXT: ret 51 %cmp = fcmp ogt double %a, %b 52 %res = select i1 %cmp, double %x, double %y 53 ret double %res 54} 55 56define double @fcmp_oge(double %a, double %b, double %x, double %y) { 57; LA32-LABEL: fcmp_oge: 58; LA32: # %bb.0: 59; LA32-NEXT: fcmp.cle.d $fcc0, $fa1, $fa0 60; LA32-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 61; LA32-NEXT: ret 62; 63; LA64-LABEL: fcmp_oge: 64; LA64: # %bb.0: 65; LA64-NEXT: fcmp.cle.d $fcc0, $fa1, $fa0 66; LA64-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 67; LA64-NEXT: ret 68 %cmp = fcmp oge double %a, %b 69 %res = select i1 %cmp, double %x, double %y 70 ret double %res 71} 72 73define double @fcmp_olt(double %a, double %b, double %x, double %y) { 74; LA32-LABEL: fcmp_olt: 75; LA32: # %bb.0: 76; LA32-NEXT: fcmp.clt.d $fcc0, $fa0, $fa1 77; LA32-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 78; LA32-NEXT: ret 79; 80; LA64-LABEL: fcmp_olt: 81; LA64: # %bb.0: 82; LA64-NEXT: fcmp.clt.d $fcc0, $fa0, $fa1 83; LA64-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 84; LA64-NEXT: ret 85 %cmp = fcmp olt double %a, %b 86 %res = select i1 %cmp, double %x, double %y 87 ret double %res 88} 89 90define double @fcmp_ole(double %a, double %b, double %x, double %y) { 91; LA32-LABEL: fcmp_ole: 92; LA32: # %bb.0: 93; LA32-NEXT: fcmp.cle.d $fcc0, $fa0, $fa1 94; LA32-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 95; LA32-NEXT: ret 96; 97; LA64-LABEL: fcmp_ole: 98; LA64: # %bb.0: 99; LA64-NEXT: fcmp.cle.d $fcc0, $fa0, $fa1 100; LA64-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 101; LA64-NEXT: ret 102 %cmp = fcmp ole double %a, %b 103 %res = select i1 %cmp, double %x, double %y 104 ret double %res 105} 106 107define double @fcmp_one(double %a, double %b, double %x, double %y) { 108; LA32-LABEL: fcmp_one: 109; LA32: # %bb.0: 110; LA32-NEXT: fcmp.cne.d $fcc0, $fa0, $fa1 111; LA32-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 112; LA32-NEXT: ret 113; 114; LA64-LABEL: fcmp_one: 115; LA64: # %bb.0: 116; LA64-NEXT: fcmp.cne.d $fcc0, $fa0, $fa1 117; LA64-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 118; LA64-NEXT: ret 119 %cmp = fcmp one double %a, %b 120 %res = select i1 %cmp, double %x, double %y 121 ret double %res 122} 123 124define double @fcmp_ord(double %a, double %b, double %x, double %y) { 125; LA32-LABEL: fcmp_ord: 126; LA32: # %bb.0: 127; LA32-NEXT: fcmp.cor.d $fcc0, $fa0, $fa1 128; LA32-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 129; LA32-NEXT: ret 130; 131; LA64-LABEL: fcmp_ord: 132; LA64: # %bb.0: 133; LA64-NEXT: fcmp.cor.d $fcc0, $fa0, $fa1 134; LA64-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 135; LA64-NEXT: ret 136 %cmp = fcmp ord double %a, %b 137 %res = select i1 %cmp, double %x, double %y 138 ret double %res 139} 140 141define double @fcmp_ueq(double %a, double %b, double %x, double %y) { 142; LA32-LABEL: fcmp_ueq: 143; LA32: # %bb.0: 144; LA32-NEXT: fcmp.cueq.d $fcc0, $fa0, $fa1 145; LA32-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 146; LA32-NEXT: ret 147; 148; LA64-LABEL: fcmp_ueq: 149; LA64: # %bb.0: 150; LA64-NEXT: fcmp.cueq.d $fcc0, $fa0, $fa1 151; LA64-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 152; LA64-NEXT: ret 153 %cmp = fcmp ueq double %a, %b 154 %res = select i1 %cmp, double %x, double %y 155 ret double %res 156} 157 158define double @fcmp_ugt(double %a, double %b, double %x, double %y) { 159; LA32-LABEL: fcmp_ugt: 160; LA32: # %bb.0: 161; LA32-NEXT: fcmp.cult.d $fcc0, $fa1, $fa0 162; LA32-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 163; LA32-NEXT: ret 164; 165; LA64-LABEL: fcmp_ugt: 166; LA64: # %bb.0: 167; LA64-NEXT: fcmp.cult.d $fcc0, $fa1, $fa0 168; LA64-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 169; LA64-NEXT: ret 170 %cmp = fcmp ugt double %a, %b 171 %res = select i1 %cmp, double %x, double %y 172 ret double %res 173} 174 175define double @fcmp_uge(double %a, double %b, double %x, double %y) { 176; LA32-LABEL: fcmp_uge: 177; LA32: # %bb.0: 178; LA32-NEXT: fcmp.cule.d $fcc0, $fa1, $fa0 179; LA32-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 180; LA32-NEXT: ret 181; 182; LA64-LABEL: fcmp_uge: 183; LA64: # %bb.0: 184; LA64-NEXT: fcmp.cule.d $fcc0, $fa1, $fa0 185; LA64-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 186; LA64-NEXT: ret 187 %cmp = fcmp uge double %a, %b 188 %res = select i1 %cmp, double %x, double %y 189 ret double %res 190} 191 192define double @fcmp_ult(double %a, double %b, double %x, double %y) { 193; LA32-LABEL: fcmp_ult: 194; LA32: # %bb.0: 195; LA32-NEXT: fcmp.cult.d $fcc0, $fa0, $fa1 196; LA32-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 197; LA32-NEXT: ret 198; 199; LA64-LABEL: fcmp_ult: 200; LA64: # %bb.0: 201; LA64-NEXT: fcmp.cult.d $fcc0, $fa0, $fa1 202; LA64-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 203; LA64-NEXT: ret 204 %cmp = fcmp ult double %a, %b 205 %res = select i1 %cmp, double %x, double %y 206 ret double %res 207} 208 209define double @fcmp_ule(double %a, double %b, double %x, double %y) { 210; LA32-LABEL: fcmp_ule: 211; LA32: # %bb.0: 212; LA32-NEXT: fcmp.cule.d $fcc0, $fa0, $fa1 213; LA32-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 214; LA32-NEXT: ret 215; 216; LA64-LABEL: fcmp_ule: 217; LA64: # %bb.0: 218; LA64-NEXT: fcmp.cule.d $fcc0, $fa0, $fa1 219; LA64-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 220; LA64-NEXT: ret 221 %cmp = fcmp ule double %a, %b 222 %res = select i1 %cmp, double %x, double %y 223 ret double %res 224} 225 226define double @fcmp_une(double %a, double %b, double %x, double %y) { 227; LA32-LABEL: fcmp_une: 228; LA32: # %bb.0: 229; LA32-NEXT: fcmp.cune.d $fcc0, $fa0, $fa1 230; LA32-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 231; LA32-NEXT: ret 232; 233; LA64-LABEL: fcmp_une: 234; LA64: # %bb.0: 235; LA64-NEXT: fcmp.cune.d $fcc0, $fa0, $fa1 236; LA64-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 237; LA64-NEXT: ret 238 %cmp = fcmp une double %a, %b 239 %res = select i1 %cmp, double %x, double %y 240 ret double %res 241} 242 243define double @fcmp_uno(double %a, double %b, double %x, double %y) { 244; LA32-LABEL: fcmp_uno: 245; LA32: # %bb.0: 246; LA32-NEXT: fcmp.cun.d $fcc0, $fa0, $fa1 247; LA32-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 248; LA32-NEXT: ret 249; 250; LA64-LABEL: fcmp_uno: 251; LA64: # %bb.0: 252; LA64-NEXT: fcmp.cun.d $fcc0, $fa0, $fa1 253; LA64-NEXT: fsel $fa0, $fa3, $fa2, $fcc0 254; LA64-NEXT: ret 255 %cmp = fcmp uno double %a, %b 256 %res = select i1 %cmp, double %x, double %y 257 ret double %res 258} 259 260define double @fcmp_true(double %a, double %b, double %x, double %y) { 261; LA32-LABEL: fcmp_true: 262; LA32: # %bb.0: 263; LA32-NEXT: fmov.d $fa0, $fa2 264; LA32-NEXT: ret 265; 266; LA64-LABEL: fcmp_true: 267; LA64: # %bb.0: 268; LA64-NEXT: fmov.d $fa0, $fa2 269; LA64-NEXT: ret 270 %cmp = fcmp true double %a, %b 271 %res = select i1 %cmp, double %x, double %y 272 ret double %res 273} 274