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