brintos

brintos / llvm-project-archived public Read only

0
0
Text · 17.5 KiB · 9ec8c32 Raw
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