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