575 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -global-isel -mattr=+f -verify-machineinstrs < %s \3; RUN: -target-abi=ilp32f | FileCheck -check-prefix=CHECKIF %s4; RUN: llc -mtriple=riscv64 -global-isel -mattr=+f -verify-machineinstrs < %s \5; RUN: -target-abi=lp64f | FileCheck -check-prefix=CHECKIF %s6; RUN: llc -mtriple=riscv32 -global-isel -verify-machineinstrs < %s \7; RUN: | FileCheck -check-prefix=RV32I %s8; RUN: llc -mtriple=riscv64 -global-isel -verify-machineinstrs < %s \9; RUN: | FileCheck -check-prefix=RV64I %s10 11define i32 @fcmp_false(float %a, float %b) nounwind {12; CHECKIF-LABEL: fcmp_false:13; CHECKIF: # %bb.0:14; CHECKIF-NEXT: li a0, 015; CHECKIF-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 float %a, %b27 %2 = zext i1 %1 to i3228 ret i32 %229}30 31; FIXME: slli+srli on RV64 are unnecessary32define i32 @fcmp_oeq(float %a, float %b) nounwind {33; CHECKIF-LABEL: fcmp_oeq:34; CHECKIF: # %bb.0:35; CHECKIF-NEXT: feq.s a0, fa0, fa136; CHECKIF-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 __eqsf243; 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 __eqsf253; 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 float %a, %b59 %2 = zext i1 %1 to i3260 ret i32 %261}62 63; FIXME: sext.w on RV64 is unnecessary64define i32 @fcmp_ogt(float %a, float %b) nounwind {65; CHECKIF-LABEL: fcmp_ogt:66; CHECKIF: # %bb.0:67; CHECKIF-NEXT: flt.s a0, fa1, fa068; CHECKIF-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 __gtsf275; 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 __gtsf285; 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 float %a, %b91 %2 = zext i1 %1 to i3292 ret i32 %293}94 95; FIXME: sext.w on RV64 is unnecessary96define i32 @fcmp_oge(float %a, float %b) nounwind {97; CHECKIF-LABEL: fcmp_oge:98; CHECKIF: # %bb.0:99; CHECKIF-NEXT: fle.s a0, fa1, fa0100; CHECKIF-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 __gesf2107; 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 __gesf2118; 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 float %a, %b125 %2 = zext i1 %1 to i32126 ret i32 %2127}128 129; FIXME: sext.w on RV64 is unnecessary130define i32 @fcmp_olt(float %a, float %b) nounwind {131; CHECKIF-LABEL: fcmp_olt:132; CHECKIF: # %bb.0:133; CHECKIF-NEXT: flt.s a0, fa0, fa1134; CHECKIF-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 __ltsf2141; 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 __ltsf2151; 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 float %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(float %a, float %b) nounwind {163; CHECKIF-LABEL: fcmp_ole:164; CHECKIF: # %bb.0:165; CHECKIF-NEXT: fle.s a0, fa0, fa1166; CHECKIF-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 __lesf2173; 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 __lesf2184; 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 float %a, %b191 %2 = zext i1 %1 to i32192 ret i32 %2193}194 195; FIXME: slli+srli on RV64 are unnecessary196define i32 @fcmp_one(float %a, float %b) nounwind {197; CHECKIF-LABEL: fcmp_one:198; CHECKIF: # %bb.0:199; CHECKIF-NEXT: flt.s a0, fa0, fa1200; CHECKIF-NEXT: flt.s a1, fa1, fa0201; CHECKIF-NEXT: or a0, a0, a1202; CHECKIF-NEXT: ret203;204; RV32I-LABEL: fcmp_one:205; RV32I: # %bb.0:206; RV32I-NEXT: addi sp, sp, -16207; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill208; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill209; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill210; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill211; RV32I-NEXT: mv s0, a0212; RV32I-NEXT: mv s1, a1213; RV32I-NEXT: call __eqsf2214; RV32I-NEXT: snez s2, a0215; RV32I-NEXT: mv a0, s0216; RV32I-NEXT: mv a1, s1217; RV32I-NEXT: call __unordsf2218; RV32I-NEXT: seqz a0, a0219; RV32I-NEXT: and a0, s2, a0220; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload221; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload222; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload223; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload224; RV32I-NEXT: addi sp, sp, 16225; RV32I-NEXT: ret226;227; RV64I-LABEL: fcmp_one:228; RV64I: # %bb.0:229; RV64I-NEXT: addi sp, sp, -32230; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill231; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill232; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill233; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill234; RV64I-NEXT: mv s0, a0235; RV64I-NEXT: mv s1, a1236; RV64I-NEXT: call __eqsf2237; RV64I-NEXT: sext.w a0, a0238; RV64I-NEXT: snez s2, a0239; RV64I-NEXT: mv a0, s0240; RV64I-NEXT: mv a1, s1241; RV64I-NEXT: call __unordsf2242; RV64I-NEXT: sext.w a0, a0243; RV64I-NEXT: seqz a0, a0244; RV64I-NEXT: and a0, s2, a0245; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload246; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload247; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload248; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload249; RV64I-NEXT: addi sp, sp, 32250; RV64I-NEXT: ret251 %1 = fcmp one float %a, %b252 %2 = zext i1 %1 to i32253 ret i32 %2254}255 256; FIXME: slli+srli on RV64 are unnecessary257define i32 @fcmp_ord(float %a, float %b) nounwind {258; CHECKIF-LABEL: fcmp_ord:259; CHECKIF: # %bb.0:260; CHECKIF-NEXT: feq.s a0, fa0, fa0261; CHECKIF-NEXT: feq.s a1, fa1, fa1262; CHECKIF-NEXT: and a0, a0, a1263; CHECKIF-NEXT: ret264;265; RV32I-LABEL: fcmp_ord:266; RV32I: # %bb.0:267; RV32I-NEXT: addi sp, sp, -16268; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill269; RV32I-NEXT: call __unordsf2270; RV32I-NEXT: seqz a0, a0271; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload272; RV32I-NEXT: addi sp, sp, 16273; RV32I-NEXT: ret274;275; RV64I-LABEL: fcmp_ord:276; RV64I: # %bb.0:277; RV64I-NEXT: addi sp, sp, -16278; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill279; RV64I-NEXT: call __unordsf2280; RV64I-NEXT: sext.w a0, a0281; RV64I-NEXT: seqz a0, a0282; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload283; RV64I-NEXT: addi sp, sp, 16284; RV64I-NEXT: ret285 %1 = fcmp ord float %a, %b286 %2 = zext i1 %1 to i32287 ret i32 %2288}289 290; FIXME: slli+srli on RV64 are unnecessary291define i32 @fcmp_ueq(float %a, float %b) nounwind {292; CHECKIF-LABEL: fcmp_ueq:293; CHECKIF: # %bb.0:294; CHECKIF-NEXT: flt.s a0, fa0, fa1295; CHECKIF-NEXT: flt.s a1, fa1, fa0296; CHECKIF-NEXT: or a0, a0, a1297; CHECKIF-NEXT: xori a0, a0, 1298; CHECKIF-NEXT: ret299;300; RV32I-LABEL: fcmp_ueq:301; RV32I: # %bb.0:302; RV32I-NEXT: addi sp, sp, -16303; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill304; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill305; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill306; RV32I-NEXT: sw s2, 0(sp) # 4-byte Folded Spill307; RV32I-NEXT: mv s0, a0308; RV32I-NEXT: mv s1, a1309; RV32I-NEXT: call __eqsf2310; RV32I-NEXT: seqz s2, a0311; RV32I-NEXT: mv a0, s0312; RV32I-NEXT: mv a1, s1313; RV32I-NEXT: call __unordsf2314; RV32I-NEXT: snez a0, a0315; RV32I-NEXT: or a0, s2, a0316; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload317; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload318; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload319; RV32I-NEXT: lw s2, 0(sp) # 4-byte Folded Reload320; RV32I-NEXT: addi sp, sp, 16321; RV32I-NEXT: ret322;323; RV64I-LABEL: fcmp_ueq:324; RV64I: # %bb.0:325; RV64I-NEXT: addi sp, sp, -32326; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill327; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill328; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill329; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill330; RV64I-NEXT: mv s0, a0331; RV64I-NEXT: mv s1, a1332; RV64I-NEXT: call __eqsf2333; RV64I-NEXT: sext.w a0, a0334; RV64I-NEXT: seqz s2, a0335; RV64I-NEXT: mv a0, s0336; RV64I-NEXT: mv a1, s1337; RV64I-NEXT: call __unordsf2338; RV64I-NEXT: sext.w a0, a0339; RV64I-NEXT: snez a0, a0340; RV64I-NEXT: or a0, s2, a0341; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload342; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload343; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload344; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload345; RV64I-NEXT: addi sp, sp, 32346; RV64I-NEXT: ret347 %1 = fcmp ueq float %a, %b348 %2 = zext i1 %1 to i32349 ret i32 %2350}351 352; FIXME: sext.w on RV64 is unnecessary353define i32 @fcmp_ugt(float %a, float %b) nounwind {354; CHECKIF-LABEL: fcmp_ugt:355; CHECKIF: # %bb.0:356; CHECKIF-NEXT: fle.s a0, fa0, fa1357; CHECKIF-NEXT: xori a0, a0, 1358; CHECKIF-NEXT: ret359;360; RV32I-LABEL: fcmp_ugt:361; RV32I: # %bb.0:362; RV32I-NEXT: addi sp, sp, -16363; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill364; RV32I-NEXT: call __lesf2365; RV32I-NEXT: sgtz a0, a0366; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload367; RV32I-NEXT: addi sp, sp, 16368; RV32I-NEXT: ret369;370; RV64I-LABEL: fcmp_ugt:371; RV64I: # %bb.0:372; RV64I-NEXT: addi sp, sp, -16373; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill374; RV64I-NEXT: call __lesf2375; RV64I-NEXT: sext.w a0, a0376; RV64I-NEXT: sgtz a0, a0377; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload378; RV64I-NEXT: addi sp, sp, 16379; RV64I-NEXT: ret380 %1 = fcmp ugt float %a, %b381 %2 = zext i1 %1 to i32382 ret i32 %2383}384 385; FIXME: sext.w on RV64 is unnecessary386define i32 @fcmp_uge(float %a, float %b) nounwind {387; CHECKIF-LABEL: fcmp_uge:388; CHECKIF: # %bb.0:389; CHECKIF-NEXT: flt.s a0, fa0, fa1390; CHECKIF-NEXT: xori a0, a0, 1391; CHECKIF-NEXT: ret392;393; RV32I-LABEL: fcmp_uge:394; RV32I: # %bb.0:395; RV32I-NEXT: addi sp, sp, -16396; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill397; RV32I-NEXT: call __ltsf2398; RV32I-NEXT: slti a0, a0, 0399; RV32I-NEXT: xori a0, a0, 1400; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload401; RV32I-NEXT: addi sp, sp, 16402; RV32I-NEXT: ret403;404; RV64I-LABEL: fcmp_uge:405; RV64I: # %bb.0:406; RV64I-NEXT: addi sp, sp, -16407; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill408; RV64I-NEXT: call __ltsf2409; RV64I-NEXT: sext.w a0, a0410; RV64I-NEXT: slti a0, a0, 0411; RV64I-NEXT: xori a0, a0, 1412; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload413; RV64I-NEXT: addi sp, sp, 16414; RV64I-NEXT: ret415 %1 = fcmp uge float %a, %b416 %2 = zext i1 %1 to i32417 ret i32 %2418}419 420; FIXME: sext.w on RV64 is unnecessary421define i32 @fcmp_ult(float %a, float %b) nounwind {422; CHECKIF-LABEL: fcmp_ult:423; CHECKIF: # %bb.0:424; CHECKIF-NEXT: fle.s a0, fa1, fa0425; CHECKIF-NEXT: xori a0, a0, 1426; CHECKIF-NEXT: ret427;428; RV32I-LABEL: fcmp_ult:429; RV32I: # %bb.0:430; RV32I-NEXT: addi sp, sp, -16431; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill432; RV32I-NEXT: call __gesf2433; RV32I-NEXT: srli a0, a0, 31434; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload435; RV32I-NEXT: addi sp, sp, 16436; RV32I-NEXT: ret437;438; RV64I-LABEL: fcmp_ult:439; RV64I: # %bb.0:440; RV64I-NEXT: addi sp, sp, -16441; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill442; RV64I-NEXT: call __gesf2443; RV64I-NEXT: srliw a0, a0, 31444; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload445; RV64I-NEXT: addi sp, sp, 16446; RV64I-NEXT: ret447 %1 = fcmp ult float %a, %b448 %2 = zext i1 %1 to i32449 ret i32 %2450}451 452; FIXME: sext.w on RV64 is unnecessary453; FIXME: sgtz+xori can be slti a0, a0, 1454define i32 @fcmp_ule(float %a, float %b) nounwind {455; CHECKIF-LABEL: fcmp_ule:456; CHECKIF: # %bb.0:457; CHECKIF-NEXT: flt.s a0, fa1, fa0458; CHECKIF-NEXT: xori a0, a0, 1459; CHECKIF-NEXT: ret460;461; RV32I-LABEL: fcmp_ule:462; RV32I: # %bb.0:463; RV32I-NEXT: addi sp, sp, -16464; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill465; RV32I-NEXT: call __gtsf2466; RV32I-NEXT: sgtz a0, a0467; RV32I-NEXT: xori a0, a0, 1468; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload469; RV32I-NEXT: addi sp, sp, 16470; RV32I-NEXT: ret471;472; RV64I-LABEL: fcmp_ule:473; RV64I: # %bb.0:474; RV64I-NEXT: addi sp, sp, -16475; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill476; RV64I-NEXT: call __gtsf2477; RV64I-NEXT: sext.w a0, a0478; RV64I-NEXT: sgtz a0, a0479; RV64I-NEXT: xori a0, a0, 1480; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload481; RV64I-NEXT: addi sp, sp, 16482; RV64I-NEXT: ret483 %1 = fcmp ule float %a, %b484 %2 = zext i1 %1 to i32485 ret i32 %2486}487 488; FIXME: slli+srli on RV64 are unnecessary489define i32 @fcmp_une(float %a, float %b) nounwind {490; CHECKIF-LABEL: fcmp_une:491; CHECKIF: # %bb.0:492; CHECKIF-NEXT: feq.s a0, fa0, fa1493; CHECKIF-NEXT: xori a0, a0, 1494; CHECKIF-NEXT: ret495;496; RV32I-LABEL: fcmp_une:497; RV32I: # %bb.0:498; RV32I-NEXT: addi sp, sp, -16499; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill500; RV32I-NEXT: call __nesf2501; RV32I-NEXT: snez a0, a0502; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload503; RV32I-NEXT: addi sp, sp, 16504; RV32I-NEXT: ret505;506; RV64I-LABEL: fcmp_une:507; RV64I: # %bb.0:508; RV64I-NEXT: addi sp, sp, -16509; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill510; RV64I-NEXT: call __nesf2511; RV64I-NEXT: sext.w a0, a0512; RV64I-NEXT: snez a0, a0513; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload514; RV64I-NEXT: addi sp, sp, 16515; RV64I-NEXT: ret516 %1 = fcmp une float %a, %b517 %2 = zext i1 %1 to i32518 ret i32 %2519}520 521; FIXME: slli+srli on RV64 are unnecessary522define i32 @fcmp_uno(float %a, float %b) nounwind {523; CHECKIF-LABEL: fcmp_uno:524; CHECKIF: # %bb.0:525; CHECKIF-NEXT: feq.s a0, fa0, fa0526; CHECKIF-NEXT: feq.s a1, fa1, fa1527; CHECKIF-NEXT: and a0, a0, a1528; CHECKIF-NEXT: xori a0, a0, 1529; CHECKIF-NEXT: ret530;531; RV32I-LABEL: fcmp_uno:532; RV32I: # %bb.0:533; RV32I-NEXT: addi sp, sp, -16534; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill535; RV32I-NEXT: call __unordsf2536; RV32I-NEXT: snez a0, a0537; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload538; RV32I-NEXT: addi sp, sp, 16539; RV32I-NEXT: ret540;541; RV64I-LABEL: fcmp_uno:542; RV64I: # %bb.0:543; RV64I-NEXT: addi sp, sp, -16544; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill545; RV64I-NEXT: call __unordsf2546; RV64I-NEXT: sext.w a0, a0547; RV64I-NEXT: snez a0, a0548; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload549; RV64I-NEXT: addi sp, sp, 16550; RV64I-NEXT: ret551 %1 = fcmp uno float %a, %b552 %2 = zext i1 %1 to i32553 ret i32 %2554}555 556define i32 @fcmp_true(float %a, float %b) nounwind {557; CHECKIF-LABEL: fcmp_true:558; CHECKIF: # %bb.0:559; CHECKIF-NEXT: li a0, 1560; CHECKIF-NEXT: ret561;562; RV32I-LABEL: fcmp_true:563; RV32I: # %bb.0:564; RV32I-NEXT: li a0, 1565; RV32I-NEXT: ret566;567; RV64I-LABEL: fcmp_true:568; RV64I: # %bb.0:569; RV64I-NEXT: li a0, 1570; RV64I-NEXT: ret571 %1 = fcmp true float %a, %b572 %2 = zext i1 %1 to i32573 ret i32 %2574}575