590 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -global-isel -mattr=+d < %s \3; RUN: -target-abi=ilp32d | FileCheck -check-prefix=CHECKIFD %s4; RUN: llc -mtriple=riscv64 -global-isel -mattr=+d < %s \5; RUN: -target-abi=lp64d | FileCheck -check-prefix=CHECKIFD %s6; RUN: llc -mtriple=riscv32 -global-isel < %s \7; RUN: | FileCheck -check-prefix=RV32I %s8; RUN: llc -mtriple=riscv64 -global-isel < %s \9; RUN: | FileCheck -check-prefix=RV64I %s10 11define i32 @fcmp_false(double %a, double %b) nounwind {12; CHECKIFD-LABEL: fcmp_false:13; CHECKIFD: # %bb.0:14; CHECKIFD-NEXT: li a0, 015; CHECKIFD-NEXT: ret16;17; RV32I-LABEL: fcmp_false:18; RV32I: # %bb.0:19; RV32I-NEXT: li a0, 020; RV32I-NEXT: ret21;22; RV64I-LABEL: fcmp_false:23; RV64I: # %bb.0:24; RV64I-NEXT: li a0, 025; RV64I-NEXT: ret26 %1 = fcmp false double %a, %b27 %2 = zext i1 %1 to i3228 ret i32 %229}30 31; FIXME: slli+srli on RV64 are unnecessary32define i32 @fcmp_oeq(double %a, double %b) nounwind {33; CHECKIFD-LABEL: fcmp_oeq:34; CHECKIFD: # %bb.0:35; CHECKIFD-NEXT: feq.d a0, fa0, fa136; CHECKIFD-NEXT: ret37;38; RV32I-LABEL: fcmp_oeq:39; RV32I: # %bb.0:40; RV32I-NEXT: addi sp, sp, -1641; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill42; RV32I-NEXT: call __eqdf243; RV32I-NEXT: seqz a0, a044; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload45; RV32I-NEXT: addi sp, sp, 1646; RV32I-NEXT: ret47;48; RV64I-LABEL: fcmp_oeq:49; RV64I: # %bb.0:50; RV64I-NEXT: addi sp, sp, -1651; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill52; RV64I-NEXT: call __eqdf253; RV64I-NEXT: sext.w a0, a054; RV64I-NEXT: seqz a0, a055; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload56; RV64I-NEXT: addi sp, sp, 1657; RV64I-NEXT: ret58 %1 = fcmp oeq double %a, %b59 %2 = zext i1 %1 to i3260 ret i32 %261}62 63; FIXME: sext.w on RV64 is unnecessary64define i32 @fcmp_ogt(double %a, double %b) nounwind {65; CHECKIFD-LABEL: fcmp_ogt:66; CHECKIFD: # %bb.0:67; CHECKIFD-NEXT: flt.d a0, fa1, fa068; CHECKIFD-NEXT: ret69;70; RV32I-LABEL: fcmp_ogt:71; RV32I: # %bb.0:72; RV32I-NEXT: addi sp, sp, -1673; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill74; RV32I-NEXT: call __gtdf275; RV32I-NEXT: sgtz a0, a076; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload77; RV32I-NEXT: addi sp, sp, 1678; RV32I-NEXT: ret79;80; RV64I-LABEL: fcmp_ogt:81; RV64I: # %bb.0:82; RV64I-NEXT: addi sp, sp, -1683; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill84; RV64I-NEXT: call __gtdf285; RV64I-NEXT: sext.w a0, a086; RV64I-NEXT: sgtz a0, a087; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload88; RV64I-NEXT: addi sp, sp, 1689; RV64I-NEXT: ret90 %1 = fcmp ogt double %a, %b91 %2 = zext i1 %1 to i3292 ret i32 %293}94 95; FIXME: sext.w on RV64 is unnecessary96define i32 @fcmp_oge(double %a, double %b) nounwind {97; CHECKIFD-LABEL: fcmp_oge:98; CHECKIFD: # %bb.0:99; CHECKIFD-NEXT: fle.d a0, fa1, fa0100; CHECKIFD-NEXT: ret101;102; RV32I-LABEL: fcmp_oge:103; RV32I: # %bb.0:104; RV32I-NEXT: addi sp, sp, -16105; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill106; RV32I-NEXT: call __gedf2107; RV32I-NEXT: slti a0, a0, 0108; RV32I-NEXT: xori a0, a0, 1109; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload110; RV32I-NEXT: addi sp, sp, 16111; RV32I-NEXT: ret112;113; RV64I-LABEL: fcmp_oge:114; RV64I: # %bb.0:115; RV64I-NEXT: addi sp, sp, -16116; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill117; RV64I-NEXT: call __gedf2118; RV64I-NEXT: sext.w a0, a0119; RV64I-NEXT: slti a0, a0, 0120; RV64I-NEXT: xori a0, a0, 1121; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload122; RV64I-NEXT: addi sp, sp, 16123; RV64I-NEXT: ret124 %1 = fcmp oge double %a, %b125 %2 = zext i1 %1 to i32126 ret i32 %2127}128 129; FIXME: sext.w on RV64 is unnecessary130define i32 @fcmp_olt(double %a, double %b) nounwind {131; CHECKIFD-LABEL: fcmp_olt:132; CHECKIFD: # %bb.0:133; CHECKIFD-NEXT: flt.d a0, fa0, fa1134; CHECKIFD-NEXT: ret135;136; RV32I-LABEL: fcmp_olt:137; RV32I: # %bb.0:138; RV32I-NEXT: addi sp, sp, -16139; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill140; RV32I-NEXT: call __ltdf2141; RV32I-NEXT: srli a0, a0, 31142; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload143; RV32I-NEXT: addi sp, sp, 16144; RV32I-NEXT: ret145;146; RV64I-LABEL: fcmp_olt:147; RV64I: # %bb.0:148; RV64I-NEXT: addi sp, sp, -16149; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill150; RV64I-NEXT: call __ltdf2151; RV64I-NEXT: srliw a0, a0, 31152; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload153; RV64I-NEXT: addi sp, sp, 16154; RV64I-NEXT: ret155 %1 = fcmp olt double %a, %b156 %2 = zext i1 %1 to i32157 ret i32 %2158}159 160; FIXME: sext.w on RV64 is unnecessary161; FIXME: sgtz+xori can be slti a0, a0, 1162define i32 @fcmp_ole(double %a, double %b) nounwind {163; CHECKIFD-LABEL: fcmp_ole:164; CHECKIFD: # %bb.0:165; CHECKIFD-NEXT: fle.d a0, fa0, fa1166; CHECKIFD-NEXT: ret167;168; RV32I-LABEL: fcmp_ole:169; RV32I: # %bb.0:170; RV32I-NEXT: addi sp, sp, -16171; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill172; RV32I-NEXT: call __ledf2173; RV32I-NEXT: sgtz a0, a0174; RV32I-NEXT: xori a0, a0, 1175; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload176; RV32I-NEXT: addi sp, sp, 16177; RV32I-NEXT: ret178;179; RV64I-LABEL: fcmp_ole:180; RV64I: # %bb.0:181; RV64I-NEXT: addi sp, sp, -16182; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill183; RV64I-NEXT: call __ledf2184; RV64I-NEXT: sext.w a0, a0185; RV64I-NEXT: sgtz a0, a0186; RV64I-NEXT: xori a0, a0, 1187; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload188; RV64I-NEXT: addi sp, sp, 16189; RV64I-NEXT: ret190 %1 = fcmp ole double %a, %b191 %2 = zext i1 %1 to i32192 ret i32 %2193}194 195; FIXME: slli+srli on RV64 are unnecessary196define i32 @fcmp_one(double %a, double %b) nounwind {197; CHECKIFD-LABEL: fcmp_one:198; CHECKIFD: # %bb.0:199; CHECKIFD-NEXT: flt.d a0, fa0, fa1200; CHECKIFD-NEXT: flt.d a1, fa1, fa0201; CHECKIFD-NEXT: or a0, a0, a1202; CHECKIFD-NEXT: ret203;204; RV32I-LABEL: fcmp_one:205; RV32I: # %bb.0:206; RV32I-NEXT: addi sp, sp, -32207; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill208; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill209; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill210; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill211; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill212; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill213; RV32I-NEXT: mv s0, a0214; RV32I-NEXT: mv s1, a1215; RV32I-NEXT: mv s2, a2216; RV32I-NEXT: mv s3, a3217; RV32I-NEXT: call __eqdf2218; RV32I-NEXT: snez s4, a0219; RV32I-NEXT: mv a0, s0220; RV32I-NEXT: mv a1, s1221; RV32I-NEXT: mv a2, s2222; RV32I-NEXT: mv a3, s3223; RV32I-NEXT: call __unorddf2224; RV32I-NEXT: seqz a0, a0225; RV32I-NEXT: and a0, s4, a0226; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload227; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload228; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload229; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload230; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload231; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload232; RV32I-NEXT: addi sp, sp, 32233; RV32I-NEXT: ret234;235; RV64I-LABEL: fcmp_one:236; RV64I: # %bb.0:237; RV64I-NEXT: addi sp, sp, -32238; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill239; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill240; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill241; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill242; RV64I-NEXT: mv s0, a0243; RV64I-NEXT: mv s1, a1244; RV64I-NEXT: call __eqdf2245; RV64I-NEXT: sext.w a0, a0246; RV64I-NEXT: snez s2, a0247; RV64I-NEXT: mv a0, s0248; RV64I-NEXT: mv a1, s1249; RV64I-NEXT: call __unorddf2250; RV64I-NEXT: sext.w a0, a0251; RV64I-NEXT: seqz a0, a0252; RV64I-NEXT: and a0, s2, a0253; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload254; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload255; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload256; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload257; RV64I-NEXT: addi sp, sp, 32258; RV64I-NEXT: ret259 %1 = fcmp one double %a, %b260 %2 = zext i1 %1 to i32261 ret i32 %2262}263 264; FIXME: slli+srli on RV64 are unnecessary265define i32 @fcmp_ord(double %a, double %b) nounwind {266; CHECKIFD-LABEL: fcmp_ord:267; CHECKIFD: # %bb.0:268; CHECKIFD-NEXT: feq.d a0, fa0, fa0269; CHECKIFD-NEXT: feq.d a1, fa1, fa1270; CHECKIFD-NEXT: and a0, a0, a1271; CHECKIFD-NEXT: ret272;273; RV32I-LABEL: fcmp_ord:274; RV32I: # %bb.0:275; RV32I-NEXT: addi sp, sp, -16276; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill277; RV32I-NEXT: call __unorddf2278; RV32I-NEXT: seqz a0, a0279; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload280; RV32I-NEXT: addi sp, sp, 16281; RV32I-NEXT: ret282;283; RV64I-LABEL: fcmp_ord:284; RV64I: # %bb.0:285; RV64I-NEXT: addi sp, sp, -16286; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill287; RV64I-NEXT: call __unorddf2288; RV64I-NEXT: sext.w a0, a0289; RV64I-NEXT: seqz a0, a0290; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload291; RV64I-NEXT: addi sp, sp, 16292; RV64I-NEXT: ret293 %1 = fcmp ord double %a, %b294 %2 = zext i1 %1 to i32295 ret i32 %2296}297 298; FIXME: slli+srli on RV64 are unnecessary299define i32 @fcmp_ueq(double %a, double %b) nounwind {300; CHECKIFD-LABEL: fcmp_ueq:301; CHECKIFD: # %bb.0:302; CHECKIFD-NEXT: flt.d a0, fa0, fa1303; CHECKIFD-NEXT: flt.d a1, fa1, fa0304; CHECKIFD-NEXT: or a0, a0, a1305; CHECKIFD-NEXT: xori a0, a0, 1306; CHECKIFD-NEXT: ret307;308; RV32I-LABEL: fcmp_ueq:309; RV32I: # %bb.0:310; RV32I-NEXT: addi sp, sp, -32311; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill312; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill313; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill314; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill315; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill316; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill317; RV32I-NEXT: mv s0, a0318; RV32I-NEXT: mv s1, a1319; RV32I-NEXT: mv s2, a2320; RV32I-NEXT: mv s3, a3321; RV32I-NEXT: call __eqdf2322; RV32I-NEXT: seqz s4, a0323; RV32I-NEXT: mv a0, s0324; RV32I-NEXT: mv a1, s1325; RV32I-NEXT: mv a2, s2326; RV32I-NEXT: mv a3, s3327; RV32I-NEXT: call __unorddf2328; RV32I-NEXT: snez a0, a0329; RV32I-NEXT: or a0, s4, a0330; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload331; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload332; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload333; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload334; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload335; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload336; RV32I-NEXT: addi sp, sp, 32337; RV32I-NEXT: ret338;339; RV64I-LABEL: fcmp_ueq:340; RV64I: # %bb.0:341; RV64I-NEXT: addi sp, sp, -32342; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill343; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill344; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill345; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill346; RV64I-NEXT: mv s0, a0347; RV64I-NEXT: mv s1, a1348; RV64I-NEXT: call __eqdf2349; RV64I-NEXT: sext.w a0, a0350; RV64I-NEXT: seqz s2, a0351; RV64I-NEXT: mv a0, s0352; RV64I-NEXT: mv a1, s1353; RV64I-NEXT: call __unorddf2354; RV64I-NEXT: sext.w a0, a0355; RV64I-NEXT: snez a0, a0356; RV64I-NEXT: or a0, s2, a0357; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload358; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload359; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload360; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload361; RV64I-NEXT: addi sp, sp, 32362; RV64I-NEXT: ret363 %1 = fcmp ueq double %a, %b364 %2 = zext i1 %1 to i32365 ret i32 %2366}367 368; FIXME: sext.w on RV64 is unnecessary369define i32 @fcmp_ugt(double %a, double %b) nounwind {370; CHECKIFD-LABEL: fcmp_ugt:371; CHECKIFD: # %bb.0:372; CHECKIFD-NEXT: fle.d a0, fa0, fa1373; CHECKIFD-NEXT: xori a0, a0, 1374; CHECKIFD-NEXT: ret375;376; RV32I-LABEL: fcmp_ugt:377; RV32I: # %bb.0:378; RV32I-NEXT: addi sp, sp, -16379; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill380; RV32I-NEXT: call __ledf2381; RV32I-NEXT: sgtz a0, a0382; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload383; RV32I-NEXT: addi sp, sp, 16384; RV32I-NEXT: ret385;386; RV64I-LABEL: fcmp_ugt:387; RV64I: # %bb.0:388; RV64I-NEXT: addi sp, sp, -16389; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill390; RV64I-NEXT: call __ledf2391; RV64I-NEXT: sext.w a0, a0392; RV64I-NEXT: sgtz a0, a0393; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload394; RV64I-NEXT: addi sp, sp, 16395; RV64I-NEXT: ret396 %1 = fcmp ugt double %a, %b397 %2 = zext i1 %1 to i32398 ret i32 %2399}400 401define i32 @fcmp_uge(double %a, double %b) nounwind {402; CHECKIFD-LABEL: fcmp_uge:403; CHECKIFD: # %bb.0:404; CHECKIFD-NEXT: flt.d a0, fa0, fa1405; CHECKIFD-NEXT: xori a0, a0, 1406; CHECKIFD-NEXT: ret407;408; RV32I-LABEL: fcmp_uge:409; RV32I: # %bb.0:410; RV32I-NEXT: addi sp, sp, -16411; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill412; RV32I-NEXT: call __ltdf2413; RV32I-NEXT: slti a0, a0, 0414; RV32I-NEXT: xori a0, a0, 1415; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload416; RV32I-NEXT: addi sp, sp, 16417; RV32I-NEXT: ret418;419; RV64I-LABEL: fcmp_uge:420; RV64I: # %bb.0:421; RV64I-NEXT: addi sp, sp, -16422; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill423; RV64I-NEXT: call __ltdf2424; RV64I-NEXT: sext.w a0, a0425; RV64I-NEXT: slti a0, a0, 0426; RV64I-NEXT: xori a0, a0, 1427; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload428; RV64I-NEXT: addi sp, sp, 16429; RV64I-NEXT: ret430 %1 = fcmp uge double %a, %b431 %2 = zext i1 %1 to i32432 ret i32 %2433}434 435; FIXME: sext.w on RV64 is unnecessary436define i32 @fcmp_ult(double %a, double %b) nounwind {437; CHECKIFD-LABEL: fcmp_ult:438; CHECKIFD: # %bb.0:439; CHECKIFD-NEXT: fle.d a0, fa1, fa0440; CHECKIFD-NEXT: xori a0, a0, 1441; CHECKIFD-NEXT: ret442;443; RV32I-LABEL: fcmp_ult:444; RV32I: # %bb.0:445; RV32I-NEXT: addi sp, sp, -16446; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill447; RV32I-NEXT: call __gedf2448; RV32I-NEXT: srli a0, a0, 31449; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload450; RV32I-NEXT: addi sp, sp, 16451; RV32I-NEXT: ret452;453; RV64I-LABEL: fcmp_ult:454; RV64I: # %bb.0:455; RV64I-NEXT: addi sp, sp, -16456; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill457; RV64I-NEXT: call __gedf2458; RV64I-NEXT: srliw a0, a0, 31459; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload460; RV64I-NEXT: addi sp, sp, 16461; RV64I-NEXT: ret462 %1 = fcmp ult double %a, %b463 %2 = zext i1 %1 to i32464 ret i32 %2465}466 467; FIXME: sext.w on RV64 is unnecessary468; FIXME: sgtz+xori can be slti a0, a0, 1469define i32 @fcmp_ule(double %a, double %b) nounwind {470; CHECKIFD-LABEL: fcmp_ule:471; CHECKIFD: # %bb.0:472; CHECKIFD-NEXT: flt.d a0, fa1, fa0473; CHECKIFD-NEXT: xori a0, a0, 1474; CHECKIFD-NEXT: ret475;476; RV32I-LABEL: fcmp_ule:477; RV32I: # %bb.0:478; RV32I-NEXT: addi sp, sp, -16479; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill480; RV32I-NEXT: call __gtdf2481; RV32I-NEXT: sgtz a0, a0482; RV32I-NEXT: xori a0, a0, 1483; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload484; RV32I-NEXT: addi sp, sp, 16485; RV32I-NEXT: ret486;487; RV64I-LABEL: fcmp_ule:488; RV64I: # %bb.0:489; RV64I-NEXT: addi sp, sp, -16490; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill491; RV64I-NEXT: call __gtdf2492; RV64I-NEXT: sext.w a0, a0493; RV64I-NEXT: sgtz a0, a0494; RV64I-NEXT: xori a0, a0, 1495; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload496; RV64I-NEXT: addi sp, sp, 16497; RV64I-NEXT: ret498 %1 = fcmp ule double %a, %b499 %2 = zext i1 %1 to i32500 ret i32 %2501}502 503; FIXME: slli+srli on RV64 are unnecessary504define i32 @fcmp_une(double %a, double %b) nounwind {505; CHECKIFD-LABEL: fcmp_une:506; CHECKIFD: # %bb.0:507; CHECKIFD-NEXT: feq.d a0, fa0, fa1508; CHECKIFD-NEXT: xori a0, a0, 1509; CHECKIFD-NEXT: ret510;511; RV32I-LABEL: fcmp_une:512; RV32I: # %bb.0:513; RV32I-NEXT: addi sp, sp, -16514; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill515; RV32I-NEXT: call __nedf2516; RV32I-NEXT: snez a0, a0517; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload518; RV32I-NEXT: addi sp, sp, 16519; RV32I-NEXT: ret520;521; RV64I-LABEL: fcmp_une:522; RV64I: # %bb.0:523; RV64I-NEXT: addi sp, sp, -16524; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill525; RV64I-NEXT: call __nedf2526; RV64I-NEXT: sext.w a0, a0527; RV64I-NEXT: snez a0, a0528; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload529; RV64I-NEXT: addi sp, sp, 16530; RV64I-NEXT: ret531 %1 = fcmp une double %a, %b532 %2 = zext i1 %1 to i32533 ret i32 %2534}535 536; FIXME: slli+srli on RV64 are unnecessary537define i32 @fcmp_uno(double %a, double %b) nounwind {538; CHECKIFD-LABEL: fcmp_uno:539; CHECKIFD: # %bb.0:540; CHECKIFD-NEXT: feq.d a0, fa0, fa0541; CHECKIFD-NEXT: feq.d a1, fa1, fa1542; CHECKIFD-NEXT: and a0, a0, a1543; CHECKIFD-NEXT: xori a0, a0, 1544; CHECKIFD-NEXT: ret545;546; RV32I-LABEL: fcmp_uno:547; RV32I: # %bb.0:548; RV32I-NEXT: addi sp, sp, -16549; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill550; RV32I-NEXT: call __unorddf2551; RV32I-NEXT: snez a0, a0552; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload553; RV32I-NEXT: addi sp, sp, 16554; RV32I-NEXT: ret555;556; RV64I-LABEL: fcmp_uno:557; RV64I: # %bb.0:558; RV64I-NEXT: addi sp, sp, -16559; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill560; RV64I-NEXT: call __unorddf2561; RV64I-NEXT: sext.w a0, a0562; RV64I-NEXT: snez a0, a0563; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload564; RV64I-NEXT: addi sp, sp, 16565; RV64I-NEXT: ret566 %1 = fcmp uno double %a, %b567 %2 = zext i1 %1 to i32568 ret i32 %2569}570 571define i32 @fcmp_true(double %a, double %b) nounwind {572; CHECKIFD-LABEL: fcmp_true:573; CHECKIFD: # %bb.0:574; CHECKIFD-NEXT: li a0, 1575; CHECKIFD-NEXT: ret576;577; RV32I-LABEL: fcmp_true:578; RV32I: # %bb.0:579; RV32I-NEXT: li a0, 1580; RV32I-NEXT: ret581;582; RV64I-LABEL: fcmp_true:583; RV64I: # %bb.0:584; RV64I-NEXT: li a0, 1585; RV64I-NEXT: ret586 %1 = fcmp true double %a, %b587 %2 = zext i1 %1 to i32588 ret i32 %2589}590