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