362 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch32 --mattr=+32s,+d < %s | FileCheck %s --check-prefix=LA323; RUN: llc --mtriple=loongarch64 --mattr=+d < %s | FileCheck %s --check-prefix=LA644 5;; Test the 'fcmp' LLVM IR: https://llvm.org/docs/LangRef.html#fcmp-instruction6;; 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, $zero12; LA32-NEXT: ret13;14; LA64-LABEL: fcmp_false:15; LA64: # %bb.0:16; LA64-NEXT: move $a0, $zero17; LA64-NEXT: ret18 %cmp = fcmp false double %a, %b19 ret i1 %cmp20}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, $fa126; LA32-NEXT: movcf2gr $a0, $fcc027; LA32-NEXT: ret28;29; LA64-LABEL: fcmp_oeq:30; LA64: # %bb.0:31; LA64-NEXT: fcmp.ceq.d $fcc0, $fa0, $fa132; LA64-NEXT: movcf2gr $a0, $fcc033; LA64-NEXT: ret34 %cmp = fcmp oeq double %a, %b35 ret i1 %cmp36}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, $fa042; LA32-NEXT: movcf2gr $a0, $fcc043; LA32-NEXT: ret44;45; LA64-LABEL: fcmp_ogt:46; LA64: # %bb.0:47; LA64-NEXT: fcmp.clt.d $fcc0, $fa1, $fa048; LA64-NEXT: movcf2gr $a0, $fcc049; LA64-NEXT: ret50 %cmp = fcmp ogt double %a, %b51 ret i1 %cmp52}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, $fa058; LA32-NEXT: movcf2gr $a0, $fcc059; LA32-NEXT: ret60;61; LA64-LABEL: fcmp_oge:62; LA64: # %bb.0:63; LA64-NEXT: fcmp.cle.d $fcc0, $fa1, $fa064; LA64-NEXT: movcf2gr $a0, $fcc065; LA64-NEXT: ret66 %cmp = fcmp oge double %a, %b67 ret i1 %cmp68}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, $fa174; LA32-NEXT: movcf2gr $a0, $fcc075; LA32-NEXT: ret76;77; LA64-LABEL: fcmp_olt:78; LA64: # %bb.0:79; LA64-NEXT: fcmp.clt.d $fcc0, $fa0, $fa180; LA64-NEXT: movcf2gr $a0, $fcc081; LA64-NEXT: ret82 %cmp = fcmp olt double %a, %b83 ret i1 %cmp84}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, $fa190; LA32-NEXT: movcf2gr $a0, $fcc091; LA32-NEXT: ret92;93; LA64-LABEL: fcmp_ole:94; LA64: # %bb.0:95; LA64-NEXT: fcmp.cle.d $fcc0, $fa0, $fa196; LA64-NEXT: movcf2gr $a0, $fcc097; LA64-NEXT: ret98 %cmp = fcmp ole double %a, %b99 ret i1 %cmp100}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, $fa1106; LA32-NEXT: movcf2gr $a0, $fcc0107; LA32-NEXT: ret108;109; LA64-LABEL: fcmp_one:110; LA64: # %bb.0:111; LA64-NEXT: fcmp.cne.d $fcc0, $fa0, $fa1112; LA64-NEXT: movcf2gr $a0, $fcc0113; LA64-NEXT: ret114 %cmp = fcmp one double %a, %b115 ret i1 %cmp116}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, $fa1122; LA32-NEXT: movcf2gr $a0, $fcc0123; LA32-NEXT: ret124;125; LA64-LABEL: fcmp_ord:126; LA64: # %bb.0:127; LA64-NEXT: fcmp.cor.d $fcc0, $fa0, $fa1128; LA64-NEXT: movcf2gr $a0, $fcc0129; LA64-NEXT: ret130 %cmp = fcmp ord double %a, %b131 ret i1 %cmp132}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, $fa1138; LA32-NEXT: movcf2gr $a0, $fcc0139; LA32-NEXT: ret140;141; LA64-LABEL: fcmp_ueq:142; LA64: # %bb.0:143; LA64-NEXT: fcmp.cueq.d $fcc0, $fa0, $fa1144; LA64-NEXT: movcf2gr $a0, $fcc0145; LA64-NEXT: ret146 %cmp = fcmp ueq double %a, %b147 ret i1 %cmp148}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, $fa0154; LA32-NEXT: movcf2gr $a0, $fcc0155; LA32-NEXT: ret156;157; LA64-LABEL: fcmp_ugt:158; LA64: # %bb.0:159; LA64-NEXT: fcmp.cult.d $fcc0, $fa1, $fa0160; LA64-NEXT: movcf2gr $a0, $fcc0161; LA64-NEXT: ret162 %cmp = fcmp ugt double %a, %b163 ret i1 %cmp164}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, $fa0170; LA32-NEXT: movcf2gr $a0, $fcc0171; LA32-NEXT: ret172;173; LA64-LABEL: fcmp_uge:174; LA64: # %bb.0:175; LA64-NEXT: fcmp.cule.d $fcc0, $fa1, $fa0176; LA64-NEXT: movcf2gr $a0, $fcc0177; LA64-NEXT: ret178 %cmp = fcmp uge double %a, %b179 ret i1 %cmp180}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, $fa1186; LA32-NEXT: movcf2gr $a0, $fcc0187; LA32-NEXT: ret188;189; LA64-LABEL: fcmp_ult:190; LA64: # %bb.0:191; LA64-NEXT: fcmp.cult.d $fcc0, $fa0, $fa1192; LA64-NEXT: movcf2gr $a0, $fcc0193; LA64-NEXT: ret194 %cmp = fcmp ult double %a, %b195 ret i1 %cmp196}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, $fa1202; LA32-NEXT: movcf2gr $a0, $fcc0203; LA32-NEXT: ret204;205; LA64-LABEL: fcmp_ule:206; LA64: # %bb.0:207; LA64-NEXT: fcmp.cule.d $fcc0, $fa0, $fa1208; LA64-NEXT: movcf2gr $a0, $fcc0209; LA64-NEXT: ret210 %cmp = fcmp ule double %a, %b211 ret i1 %cmp212}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, $fa1218; LA32-NEXT: movcf2gr $a0, $fcc0219; LA32-NEXT: ret220;221; LA64-LABEL: fcmp_une:222; LA64: # %bb.0:223; LA64-NEXT: fcmp.cune.d $fcc0, $fa0, $fa1224; LA64-NEXT: movcf2gr $a0, $fcc0225; LA64-NEXT: ret226 %cmp = fcmp une double %a, %b227 ret i1 %cmp228}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, $fa1234; LA32-NEXT: movcf2gr $a0, $fcc0235; LA32-NEXT: ret236;237; LA64-LABEL: fcmp_uno:238; LA64: # %bb.0:239; LA64-NEXT: fcmp.cun.d $fcc0, $fa0, $fa1240; LA64-NEXT: movcf2gr $a0, $fcc0241; LA64-NEXT: ret242 %cmp = fcmp uno double %a, %b243 ret i1 %cmp244}245 246define i1 @fcmp_true(double %a, double %b) {247; LA32-LABEL: fcmp_true:248; LA32: # %bb.0:249; LA32-NEXT: ori $a0, $zero, 1250; LA32-NEXT: ret251;252; LA64-LABEL: fcmp_true:253; LA64: # %bb.0:254; LA64-NEXT: ori $a0, $zero, 1255; LA64-NEXT: ret256 %cmp = fcmp true double %a, %b257 ret i1 %cmp258}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, $zero264; LA32-NEXT: movgr2frh.w $fa1, $zero265; LA32-NEXT: fcmp.cle.d $fcc0, $fa1, $fa0266; LA32-NEXT: bcnez $fcc0, .LBB16_2267; LA32-NEXT: # %bb.1: # %if.then268; LA32-NEXT: ret269; LA32-NEXT: .LBB16_2: # %if.else270; LA32-NEXT: fcmp.clt.d $fcc0, $fa0, $fa1271; LA32-NEXT: movcf2gr $a0, $fcc0272; LA32-NEXT: ret273;274; LA64-LABEL: fcmp_fast_olt:275; LA64: # %bb.0:276; LA64-NEXT: movgr2fr.d $fa1, $zero277; LA64-NEXT: fcmp.cle.d $fcc0, $fa1, $fa0278; LA64-NEXT: bcnez $fcc0, .LBB16_2279; LA64-NEXT: # %bb.1: # %if.then280; LA64-NEXT: ret281; LA64-NEXT: .LBB16_2: # %if.else282; LA64-NEXT: fcmp.clt.d $fcc0, $fa0, $fa1283; LA64-NEXT: movcf2gr $a0, $fcc0284; LA64-NEXT: ret285 %cmp = fcmp fast olt double %a, 0.000000e+00286 br i1 %cmp, label %if.then, label %if.else287 288if.then:289 ret i1 %c290 291if.else:292 ret i1 %cmp293}294 295define i1 @fcmp_fast_oeq(double %a, double %b, i1 %c) nounwind {296; LA32-LABEL: fcmp_fast_oeq:297; LA32: # %bb.0:298; LA32-NEXT: movgr2fr.w $fa1, $zero299; LA32-NEXT: movgr2frh.w $fa1, $zero300; LA32-NEXT: fcmp.ceq.d $fcc0, $fa0, $fa1301; LA32-NEXT: bceqz $fcc0, .LBB17_2302; LA32-NEXT: # %bb.1: # %if.then303; LA32-NEXT: ret304; LA32-NEXT: .LBB17_2: # %if.else305; LA32-NEXT: movcf2gr $a0, $fcc0306; LA32-NEXT: ret307;308; LA64-LABEL: fcmp_fast_oeq:309; LA64: # %bb.0:310; LA64-NEXT: movgr2fr.d $fa1, $zero311; LA64-NEXT: fcmp.ceq.d $fcc0, $fa0, $fa1312; LA64-NEXT: bceqz $fcc0, .LBB17_2313; LA64-NEXT: # %bb.1: # %if.then314; LA64-NEXT: ret315; LA64-NEXT: .LBB17_2: # %if.else316; LA64-NEXT: movcf2gr $a0, $fcc0317; LA64-NEXT: ret318 %cmp = fcmp fast oeq double %a, 0.000000e+00319 br i1 %cmp, label %if.then, label %if.else320 321if.then:322 ret i1 %c323 324if.else:325 ret i1 %cmp326}327 328define i1 @fcmp_fast_ole(double %a, double %b, i1 %c) nounwind {329; LA32-LABEL: fcmp_fast_ole:330; LA32: # %bb.0:331; LA32-NEXT: movgr2fr.w $fa1, $zero332; LA32-NEXT: movgr2frh.w $fa1, $zero333; LA32-NEXT: fcmp.clt.d $fcc0, $fa1, $fa0334; LA32-NEXT: bcnez $fcc0, .LBB18_2335; LA32-NEXT: # %bb.1: # %if.then336; LA32-NEXT: ret337; LA32-NEXT: .LBB18_2: # %if.else338; LA32-NEXT: fcmp.cle.d $fcc0, $fa0, $fa1339; LA32-NEXT: movcf2gr $a0, $fcc0340; LA32-NEXT: ret341;342; LA64-LABEL: fcmp_fast_ole:343; LA64: # %bb.0:344; LA64-NEXT: movgr2fr.d $fa1, $zero345; LA64-NEXT: fcmp.clt.d $fcc0, $fa1, $fa0346; LA64-NEXT: bcnez $fcc0, .LBB18_2347; LA64-NEXT: # %bb.1: # %if.then348; LA64-NEXT: ret349; LA64-NEXT: .LBB18_2: # %if.else350; LA64-NEXT: fcmp.cle.d $fcc0, $fa0, $fa1351; LA64-NEXT: movcf2gr $a0, $fcc0352; LA64-NEXT: ret353 %cmp = fcmp fast ole double %a, 0.000000e+00354 br i1 %cmp, label %if.then, label %if.else355 356if.then:357 ret i1 %c358 359if.else:360 ret i1 %cmp361}362