1516 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+d -verify-machineinstrs < %s \3; RUN: -disable-strictnode-mutation -target-abi=ilp32d \4; RUN: | FileCheck -check-prefix=CHECKIFD %s5; RUN: llc -mtriple=riscv64 -mattr=+d -verify-machineinstrs < %s \6; RUN: -disable-strictnode-mutation -target-abi=lp64d \7; RUN: | FileCheck -check-prefix=CHECKIFD %s8; RUN: llc -mtriple=riscv32 -mattr=+zdinx -verify-machineinstrs < %s \9; RUN: -disable-strictnode-mutation -target-abi=ilp32 \10; RUN: | FileCheck -check-prefix=RV32IZFINXZDINX %s11; RUN: llc -mtriple=riscv64 -mattr=+zdinx -verify-machineinstrs < %s \12; RUN: -disable-strictnode-mutation -target-abi=lp64 \13; RUN: | FileCheck -check-prefix=RV64IZFINXZDINX %s14; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \15; RUN: -disable-strictnode-mutation | FileCheck -check-prefix=RV32I %s16; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \17; RUN: -disable-strictnode-mutation | FileCheck -check-prefix=RV64I %s18 19define i32 @fcmp_oeq(double %a, double %b) nounwind strictfp {20; CHECKIFD-LABEL: fcmp_oeq:21; CHECKIFD: # %bb.0:22; CHECKIFD-NEXT: feq.d a0, fa0, fa123; CHECKIFD-NEXT: ret24;25; RV32IZFINXZDINX-LABEL: fcmp_oeq:26; RV32IZFINXZDINX: # %bb.0:27; RV32IZFINXZDINX-NEXT: feq.d a0, a0, a228; RV32IZFINXZDINX-NEXT: ret29;30; RV64IZFINXZDINX-LABEL: fcmp_oeq:31; RV64IZFINXZDINX: # %bb.0:32; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a133; RV64IZFINXZDINX-NEXT: ret34;35; RV32I-LABEL: fcmp_oeq:36; RV32I: # %bb.0:37; RV32I-NEXT: addi sp, sp, -1638; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill39; RV32I-NEXT: call __eqdf240; RV32I-NEXT: seqz a0, a041; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload42; RV32I-NEXT: addi sp, sp, 1643; RV32I-NEXT: ret44;45; RV64I-LABEL: fcmp_oeq:46; RV64I: # %bb.0:47; RV64I-NEXT: addi sp, sp, -1648; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill49; RV64I-NEXT: call __eqdf250; RV64I-NEXT: seqz a0, a051; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload52; RV64I-NEXT: addi sp, sp, 1653; RV64I-NEXT: ret54 %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.strict") strictfp55 %2 = zext i1 %1 to i3256 ret i32 %257}58 59define i32 @fcmp_ogt(double %a, double %b) nounwind strictfp {60; CHECKIFD-LABEL: fcmp_ogt:61; CHECKIFD: # %bb.0:62; CHECKIFD-NEXT: frflags a163; CHECKIFD-NEXT: flt.d a0, fa1, fa064; CHECKIFD-NEXT: fsflags a165; CHECKIFD-NEXT: feq.d zero, fa1, fa066; CHECKIFD-NEXT: ret67;68; RV32IZFINXZDINX-LABEL: fcmp_ogt:69; RV32IZFINXZDINX: # %bb.0:70; RV32IZFINXZDINX-NEXT: frflags a571; RV32IZFINXZDINX-NEXT: flt.d a4, a2, a072; RV32IZFINXZDINX-NEXT: fsflags a573; RV32IZFINXZDINX-NEXT: feq.d zero, a2, a074; RV32IZFINXZDINX-NEXT: mv a0, a475; RV32IZFINXZDINX-NEXT: ret76;77; RV64IZFINXZDINX-LABEL: fcmp_ogt:78; RV64IZFINXZDINX: # %bb.0:79; RV64IZFINXZDINX-NEXT: frflags a380; RV64IZFINXZDINX-NEXT: flt.d a2, a1, a081; RV64IZFINXZDINX-NEXT: fsflags a382; RV64IZFINXZDINX-NEXT: feq.d zero, a1, a083; RV64IZFINXZDINX-NEXT: mv a0, a284; RV64IZFINXZDINX-NEXT: ret85;86; RV32I-LABEL: fcmp_ogt:87; RV32I: # %bb.0:88; RV32I-NEXT: addi sp, sp, -1689; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill90; RV32I-NEXT: call __gtdf291; RV32I-NEXT: sgtz a0, a092; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload93; RV32I-NEXT: addi sp, sp, 1694; RV32I-NEXT: ret95;96; RV64I-LABEL: fcmp_ogt:97; RV64I: # %bb.0:98; RV64I-NEXT: addi sp, sp, -1699; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill100; RV64I-NEXT: call __gtdf2101; RV64I-NEXT: sgtz a0, a0102; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload103; RV64I-NEXT: addi sp, sp, 16104; RV64I-NEXT: ret105 %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ogt", metadata !"fpexcept.strict") strictfp106 %2 = zext i1 %1 to i32107 ret i32 %2108}109 110define i32 @fcmp_oge(double %a, double %b) nounwind strictfp {111; CHECKIFD-LABEL: fcmp_oge:112; CHECKIFD: # %bb.0:113; CHECKIFD-NEXT: frflags a1114; CHECKIFD-NEXT: fle.d a0, fa1, fa0115; CHECKIFD-NEXT: fsflags a1116; CHECKIFD-NEXT: feq.d zero, fa1, fa0117; CHECKIFD-NEXT: ret118;119; RV32IZFINXZDINX-LABEL: fcmp_oge:120; RV32IZFINXZDINX: # %bb.0:121; RV32IZFINXZDINX-NEXT: frflags a5122; RV32IZFINXZDINX-NEXT: fle.d a4, a2, a0123; RV32IZFINXZDINX-NEXT: fsflags a5124; RV32IZFINXZDINX-NEXT: feq.d zero, a2, a0125; RV32IZFINXZDINX-NEXT: mv a0, a4126; RV32IZFINXZDINX-NEXT: ret127;128; RV64IZFINXZDINX-LABEL: fcmp_oge:129; RV64IZFINXZDINX: # %bb.0:130; RV64IZFINXZDINX-NEXT: frflags a3131; RV64IZFINXZDINX-NEXT: fle.d a2, a1, a0132; RV64IZFINXZDINX-NEXT: fsflags a3133; RV64IZFINXZDINX-NEXT: feq.d zero, a1, a0134; RV64IZFINXZDINX-NEXT: mv a0, a2135; RV64IZFINXZDINX-NEXT: ret136;137; RV32I-LABEL: fcmp_oge:138; RV32I: # %bb.0:139; RV32I-NEXT: addi sp, sp, -16140; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill141; RV32I-NEXT: call __gedf2142; RV32I-NEXT: srli a0, a0, 31143; RV32I-NEXT: xori a0, a0, 1144; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload145; RV32I-NEXT: addi sp, sp, 16146; RV32I-NEXT: ret147;148; RV64I-LABEL: fcmp_oge:149; RV64I: # %bb.0:150; RV64I-NEXT: addi sp, sp, -16151; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill152; RV64I-NEXT: call __gedf2153; RV64I-NEXT: srli a0, a0, 63154; RV64I-NEXT: xori a0, a0, 1155; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload156; RV64I-NEXT: addi sp, sp, 16157; RV64I-NEXT: ret158 %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"oge", metadata !"fpexcept.strict") strictfp159 %2 = zext i1 %1 to i32160 ret i32 %2161}162 163define i32 @fcmp_olt(double %a, double %b) nounwind strictfp {164; CHECKIFD-LABEL: fcmp_olt:165; CHECKIFD: # %bb.0:166; CHECKIFD-NEXT: frflags a1167; CHECKIFD-NEXT: flt.d a0, fa0, fa1168; CHECKIFD-NEXT: fsflags a1169; CHECKIFD-NEXT: feq.d zero, fa0, fa1170; CHECKIFD-NEXT: ret171;172; RV32IZFINXZDINX-LABEL: fcmp_olt:173; RV32IZFINXZDINX: # %bb.0:174; RV32IZFINXZDINX-NEXT: frflags a5175; RV32IZFINXZDINX-NEXT: flt.d a4, a0, a2176; RV32IZFINXZDINX-NEXT: fsflags a5177; RV32IZFINXZDINX-NEXT: feq.d zero, a0, a2178; RV32IZFINXZDINX-NEXT: mv a0, a4179; RV32IZFINXZDINX-NEXT: ret180;181; RV64IZFINXZDINX-LABEL: fcmp_olt:182; RV64IZFINXZDINX: # %bb.0:183; RV64IZFINXZDINX-NEXT: frflags a3184; RV64IZFINXZDINX-NEXT: flt.d a2, a0, a1185; RV64IZFINXZDINX-NEXT: fsflags a3186; RV64IZFINXZDINX-NEXT: feq.d zero, a0, a1187; RV64IZFINXZDINX-NEXT: mv a0, a2188; RV64IZFINXZDINX-NEXT: ret189;190; RV32I-LABEL: fcmp_olt:191; RV32I: # %bb.0:192; RV32I-NEXT: addi sp, sp, -16193; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill194; RV32I-NEXT: call __ltdf2195; RV32I-NEXT: srli a0, a0, 31196; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload197; RV32I-NEXT: addi sp, sp, 16198; RV32I-NEXT: ret199;200; RV64I-LABEL: fcmp_olt:201; RV64I: # %bb.0:202; RV64I-NEXT: addi sp, sp, -16203; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill204; RV64I-NEXT: call __ltdf2205; RV64I-NEXT: srli a0, a0, 63206; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload207; RV64I-NEXT: addi sp, sp, 16208; RV64I-NEXT: ret209 %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"olt", metadata !"fpexcept.strict") strictfp210 %2 = zext i1 %1 to i32211 ret i32 %2212}213 214define i32 @fcmp_ole(double %a, double %b) nounwind strictfp {215; CHECKIFD-LABEL: fcmp_ole:216; CHECKIFD: # %bb.0:217; CHECKIFD-NEXT: frflags a1218; CHECKIFD-NEXT: fle.d a0, fa0, fa1219; CHECKIFD-NEXT: fsflags a1220; CHECKIFD-NEXT: feq.d zero, fa0, fa1221; CHECKIFD-NEXT: ret222;223; RV32IZFINXZDINX-LABEL: fcmp_ole:224; RV32IZFINXZDINX: # %bb.0:225; RV32IZFINXZDINX-NEXT: frflags a5226; RV32IZFINXZDINX-NEXT: fle.d a4, a0, a2227; RV32IZFINXZDINX-NEXT: fsflags a5228; RV32IZFINXZDINX-NEXT: feq.d zero, a0, a2229; RV32IZFINXZDINX-NEXT: mv a0, a4230; RV32IZFINXZDINX-NEXT: ret231;232; RV64IZFINXZDINX-LABEL: fcmp_ole:233; RV64IZFINXZDINX: # %bb.0:234; RV64IZFINXZDINX-NEXT: frflags a3235; RV64IZFINXZDINX-NEXT: fle.d a2, a0, a1236; RV64IZFINXZDINX-NEXT: fsflags a3237; RV64IZFINXZDINX-NEXT: feq.d zero, a0, a1238; RV64IZFINXZDINX-NEXT: mv a0, a2239; RV64IZFINXZDINX-NEXT: ret240;241; RV32I-LABEL: fcmp_ole:242; RV32I: # %bb.0:243; RV32I-NEXT: addi sp, sp, -16244; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill245; RV32I-NEXT: call __ledf2246; RV32I-NEXT: slti a0, a0, 1247; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload248; RV32I-NEXT: addi sp, sp, 16249; RV32I-NEXT: ret250;251; RV64I-LABEL: fcmp_ole:252; RV64I: # %bb.0:253; RV64I-NEXT: addi sp, sp, -16254; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill255; RV64I-NEXT: call __ledf2256; RV64I-NEXT: slti a0, a0, 1257; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload258; RV64I-NEXT: addi sp, sp, 16259; RV64I-NEXT: ret260 %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ole", metadata !"fpexcept.strict") strictfp261 %2 = zext i1 %1 to i32262 ret i32 %2263}264 265; FIXME: We only need one frflags before the two flts and one fsflags after the266; two flts.267define i32 @fcmp_one(double %a, double %b) nounwind strictfp {268; CHECKIFD-LABEL: fcmp_one:269; CHECKIFD: # %bb.0:270; CHECKIFD-NEXT: frflags a0271; CHECKIFD-NEXT: flt.d a1, fa0, fa1272; CHECKIFD-NEXT: fsflags a0273; CHECKIFD-NEXT: feq.d zero, fa0, fa1274; CHECKIFD-NEXT: frflags a0275; CHECKIFD-NEXT: flt.d a2, fa1, fa0276; CHECKIFD-NEXT: fsflags a0277; CHECKIFD-NEXT: or a0, a2, a1278; CHECKIFD-NEXT: feq.d zero, fa1, fa0279; CHECKIFD-NEXT: ret280;281; RV32IZFINXZDINX-LABEL: fcmp_one:282; RV32IZFINXZDINX: # %bb.0:283; RV32IZFINXZDINX-NEXT: frflags a4284; RV32IZFINXZDINX-NEXT: flt.d a5, a0, a2285; RV32IZFINXZDINX-NEXT: fsflags a4286; RV32IZFINXZDINX-NEXT: feq.d zero, a0, a2287; RV32IZFINXZDINX-NEXT: frflags a4288; RV32IZFINXZDINX-NEXT: flt.d a6, a2, a0289; RV32IZFINXZDINX-NEXT: fsflags a4290; RV32IZFINXZDINX-NEXT: or a4, a6, a5291; RV32IZFINXZDINX-NEXT: feq.d zero, a2, a0292; RV32IZFINXZDINX-NEXT: mv a0, a4293; RV32IZFINXZDINX-NEXT: ret294;295; RV64IZFINXZDINX-LABEL: fcmp_one:296; RV64IZFINXZDINX: # %bb.0:297; RV64IZFINXZDINX-NEXT: frflags a2298; RV64IZFINXZDINX-NEXT: flt.d a3, a0, a1299; RV64IZFINXZDINX-NEXT: fsflags a2300; RV64IZFINXZDINX-NEXT: feq.d zero, a0, a1301; RV64IZFINXZDINX-NEXT: frflags a2302; RV64IZFINXZDINX-NEXT: flt.d a4, a1, a0303; RV64IZFINXZDINX-NEXT: fsflags a2304; RV64IZFINXZDINX-NEXT: or a2, a4, a3305; RV64IZFINXZDINX-NEXT: feq.d zero, a1, a0306; RV64IZFINXZDINX-NEXT: mv a0, a2307; RV64IZFINXZDINX-NEXT: ret308;309; RV32I-LABEL: fcmp_one:310; RV32I: # %bb.0:311; RV32I-NEXT: addi sp, sp, -32312; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill313; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill314; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill315; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill316; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill317; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill318; RV32I-NEXT: mv s0, a3319; RV32I-NEXT: mv s1, a2320; RV32I-NEXT: mv s2, a1321; RV32I-NEXT: mv s3, a0322; RV32I-NEXT: call __eqdf2323; RV32I-NEXT: snez s4, a0324; RV32I-NEXT: mv a0, s3325; RV32I-NEXT: mv a1, s2326; RV32I-NEXT: mv a2, s1327; RV32I-NEXT: mv a3, s0328; RV32I-NEXT: call __unorddf2329; RV32I-NEXT: seqz a0, a0330; RV32I-NEXT: and a0, a0, s4331; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload332; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload333; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload334; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload335; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload336; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload337; RV32I-NEXT: addi sp, sp, 32338; RV32I-NEXT: ret339;340; RV64I-LABEL: fcmp_one:341; RV64I: # %bb.0:342; RV64I-NEXT: addi sp, sp, -32343; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill344; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill345; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill346; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill347; RV64I-NEXT: mv s0, a1348; RV64I-NEXT: mv s1, a0349; RV64I-NEXT: call __eqdf2350; RV64I-NEXT: snez s2, a0351; RV64I-NEXT: mv a0, s1352; RV64I-NEXT: mv a1, s0353; RV64I-NEXT: call __unorddf2354; RV64I-NEXT: seqz a0, a0355; RV64I-NEXT: and a0, a0, s2356; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload357; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload358; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload359; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload360; RV64I-NEXT: addi sp, sp, 32361; RV64I-NEXT: ret362 %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"one", metadata !"fpexcept.strict") strictfp363 %2 = zext i1 %1 to i32364 ret i32 %2365}366 367define i32 @fcmp_ord(double %a, double %b) nounwind strictfp {368; CHECKIFD-LABEL: fcmp_ord:369; CHECKIFD: # %bb.0:370; CHECKIFD-NEXT: feq.d a0, fa1, fa1371; CHECKIFD-NEXT: feq.d a1, fa0, fa0372; CHECKIFD-NEXT: and a0, a1, a0373; CHECKIFD-NEXT: ret374;375; RV32IZFINXZDINX-LABEL: fcmp_ord:376; RV32IZFINXZDINX: # %bb.0:377; RV32IZFINXZDINX-NEXT: feq.d a2, a2, a2378; RV32IZFINXZDINX-NEXT: feq.d a0, a0, a0379; RV32IZFINXZDINX-NEXT: and a0, a0, a2380; RV32IZFINXZDINX-NEXT: ret381;382; RV64IZFINXZDINX-LABEL: fcmp_ord:383; RV64IZFINXZDINX: # %bb.0:384; RV64IZFINXZDINX-NEXT: feq.d a1, a1, a1385; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a0386; RV64IZFINXZDINX-NEXT: and a0, a0, a1387; RV64IZFINXZDINX-NEXT: ret388;389; RV32I-LABEL: fcmp_ord:390; RV32I: # %bb.0:391; RV32I-NEXT: addi sp, sp, -16392; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill393; RV32I-NEXT: call __unorddf2394; RV32I-NEXT: seqz a0, a0395; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload396; RV32I-NEXT: addi sp, sp, 16397; RV32I-NEXT: ret398;399; RV64I-LABEL: fcmp_ord:400; RV64I: # %bb.0:401; RV64I-NEXT: addi sp, sp, -16402; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill403; RV64I-NEXT: call __unorddf2404; RV64I-NEXT: seqz a0, a0405; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload406; RV64I-NEXT: addi sp, sp, 16407; RV64I-NEXT: ret408 %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ord", metadata !"fpexcept.strict") strictfp409 %2 = zext i1 %1 to i32410 ret i32 %2411}412 413; FIXME: We only need one frflags before the two flts and one fsflags after the414; two flts.415define i32 @fcmp_ueq(double %a, double %b) nounwind strictfp {416; CHECKIFD-LABEL: fcmp_ueq:417; CHECKIFD: # %bb.0:418; CHECKIFD-NEXT: frflags a0419; CHECKIFD-NEXT: flt.d a1, fa0, fa1420; CHECKIFD-NEXT: fsflags a0421; CHECKIFD-NEXT: feq.d zero, fa0, fa1422; CHECKIFD-NEXT: frflags a0423; CHECKIFD-NEXT: flt.d a2, fa1, fa0424; CHECKIFD-NEXT: fsflags a0425; CHECKIFD-NEXT: or a1, a2, a1426; CHECKIFD-NEXT: xori a0, a1, 1427; CHECKIFD-NEXT: feq.d zero, fa1, fa0428; CHECKIFD-NEXT: ret429;430; RV32IZFINXZDINX-LABEL: fcmp_ueq:431; RV32IZFINXZDINX: # %bb.0:432; RV32IZFINXZDINX-NEXT: frflags a4433; RV32IZFINXZDINX-NEXT: flt.d a5, a0, a2434; RV32IZFINXZDINX-NEXT: fsflags a4435; RV32IZFINXZDINX-NEXT: feq.d zero, a0, a2436; RV32IZFINXZDINX-NEXT: frflags a4437; RV32IZFINXZDINX-NEXT: flt.d a6, a2, a0438; RV32IZFINXZDINX-NEXT: fsflags a4439; RV32IZFINXZDINX-NEXT: or a4, a6, a5440; RV32IZFINXZDINX-NEXT: xori a4, a4, 1441; RV32IZFINXZDINX-NEXT: feq.d zero, a2, a0442; RV32IZFINXZDINX-NEXT: mv a0, a4443; RV32IZFINXZDINX-NEXT: ret444;445; RV64IZFINXZDINX-LABEL: fcmp_ueq:446; RV64IZFINXZDINX: # %bb.0:447; RV64IZFINXZDINX-NEXT: frflags a2448; RV64IZFINXZDINX-NEXT: flt.d a3, a0, a1449; RV64IZFINXZDINX-NEXT: fsflags a2450; RV64IZFINXZDINX-NEXT: feq.d zero, a0, a1451; RV64IZFINXZDINX-NEXT: frflags a2452; RV64IZFINXZDINX-NEXT: flt.d a4, a1, a0453; RV64IZFINXZDINX-NEXT: fsflags a2454; RV64IZFINXZDINX-NEXT: or a3, a4, a3455; RV64IZFINXZDINX-NEXT: xori a2, a3, 1456; RV64IZFINXZDINX-NEXT: feq.d zero, a1, a0457; RV64IZFINXZDINX-NEXT: mv a0, a2458; RV64IZFINXZDINX-NEXT: ret459;460; RV32I-LABEL: fcmp_ueq:461; RV32I: # %bb.0:462; RV32I-NEXT: addi sp, sp, -32463; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill464; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill465; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill466; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill467; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill468; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill469; RV32I-NEXT: mv s0, a3470; RV32I-NEXT: mv s1, a2471; RV32I-NEXT: mv s2, a1472; RV32I-NEXT: mv s3, a0473; RV32I-NEXT: call __unorddf2474; RV32I-NEXT: mv s4, a0475; RV32I-NEXT: mv a0, s3476; RV32I-NEXT: mv a1, s2477; RV32I-NEXT: mv a2, s1478; RV32I-NEXT: mv a3, s0479; RV32I-NEXT: call __eqdf2480; RV32I-NEXT: seqz a0, a0481; RV32I-NEXT: or a0, s4, a0482; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload483; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload484; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload485; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload486; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload487; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload488; RV32I-NEXT: addi sp, sp, 32489; RV32I-NEXT: ret490;491; RV64I-LABEL: fcmp_ueq:492; RV64I: # %bb.0:493; RV64I-NEXT: addi sp, sp, -32494; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill495; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill496; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill497; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill498; RV64I-NEXT: mv s0, a1499; RV64I-NEXT: mv s1, a0500; RV64I-NEXT: call __unorddf2501; RV64I-NEXT: mv s2, a0502; RV64I-NEXT: mv a0, s1503; RV64I-NEXT: mv a1, s0504; RV64I-NEXT: call __eqdf2505; RV64I-NEXT: seqz a0, a0506; RV64I-NEXT: or a0, s2, a0507; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload508; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload509; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload510; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload511; RV64I-NEXT: addi sp, sp, 32512; RV64I-NEXT: ret513 %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ueq", metadata !"fpexcept.strict") strictfp514 %2 = zext i1 %1 to i32515 ret i32 %2516}517 518define i32 @fcmp_ugt(double %a, double %b) nounwind strictfp {519; CHECKIFD-LABEL: fcmp_ugt:520; CHECKIFD: # %bb.0:521; CHECKIFD-NEXT: frflags a0522; CHECKIFD-NEXT: fle.d a1, fa0, fa1523; CHECKIFD-NEXT: fsflags a0524; CHECKIFD-NEXT: xori a0, a1, 1525; CHECKIFD-NEXT: feq.d zero, fa0, fa1526; CHECKIFD-NEXT: ret527;528; RV32IZFINXZDINX-LABEL: fcmp_ugt:529; RV32IZFINXZDINX: # %bb.0:530; RV32IZFINXZDINX-NEXT: frflags a4531; RV32IZFINXZDINX-NEXT: fle.d a5, a0, a2532; RV32IZFINXZDINX-NEXT: fsflags a4533; RV32IZFINXZDINX-NEXT: xori a4, a5, 1534; RV32IZFINXZDINX-NEXT: feq.d zero, a0, a2535; RV32IZFINXZDINX-NEXT: mv a0, a4536; RV32IZFINXZDINX-NEXT: ret537;538; RV64IZFINXZDINX-LABEL: fcmp_ugt:539; RV64IZFINXZDINX: # %bb.0:540; RV64IZFINXZDINX-NEXT: frflags a2541; RV64IZFINXZDINX-NEXT: fle.d a3, a0, a1542; RV64IZFINXZDINX-NEXT: fsflags a2543; RV64IZFINXZDINX-NEXT: xori a2, a3, 1544; RV64IZFINXZDINX-NEXT: feq.d zero, a0, a1545; RV64IZFINXZDINX-NEXT: mv a0, a2546; RV64IZFINXZDINX-NEXT: ret547;548; RV32I-LABEL: fcmp_ugt:549; RV32I: # %bb.0:550; RV32I-NEXT: addi sp, sp, -16551; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill552; RV32I-NEXT: call __ledf2553; RV32I-NEXT: sgtz a0, a0554; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload555; RV32I-NEXT: addi sp, sp, 16556; RV32I-NEXT: ret557;558; RV64I-LABEL: fcmp_ugt:559; RV64I: # %bb.0:560; RV64I-NEXT: addi sp, sp, -16561; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill562; RV64I-NEXT: call __ledf2563; RV64I-NEXT: sgtz a0, a0564; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload565; RV64I-NEXT: addi sp, sp, 16566; RV64I-NEXT: ret567 %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ugt", metadata !"fpexcept.strict") strictfp568 %2 = zext i1 %1 to i32569 ret i32 %2570}571 572define i32 @fcmp_uge(double %a, double %b) nounwind strictfp {573; CHECKIFD-LABEL: fcmp_uge:574; CHECKIFD: # %bb.0:575; CHECKIFD-NEXT: frflags a0576; CHECKIFD-NEXT: flt.d a1, fa0, fa1577; CHECKIFD-NEXT: fsflags a0578; CHECKIFD-NEXT: xori a0, a1, 1579; CHECKIFD-NEXT: feq.d zero, fa0, fa1580; CHECKIFD-NEXT: ret581;582; RV32IZFINXZDINX-LABEL: fcmp_uge:583; RV32IZFINXZDINX: # %bb.0:584; RV32IZFINXZDINX-NEXT: frflags a4585; RV32IZFINXZDINX-NEXT: flt.d a5, a0, a2586; RV32IZFINXZDINX-NEXT: fsflags a4587; RV32IZFINXZDINX-NEXT: xori a4, a5, 1588; RV32IZFINXZDINX-NEXT: feq.d zero, a0, a2589; RV32IZFINXZDINX-NEXT: mv a0, a4590; RV32IZFINXZDINX-NEXT: ret591;592; RV64IZFINXZDINX-LABEL: fcmp_uge:593; RV64IZFINXZDINX: # %bb.0:594; RV64IZFINXZDINX-NEXT: frflags a2595; RV64IZFINXZDINX-NEXT: flt.d a3, a0, a1596; RV64IZFINXZDINX-NEXT: fsflags a2597; RV64IZFINXZDINX-NEXT: xori a2, a3, 1598; RV64IZFINXZDINX-NEXT: feq.d zero, a0, a1599; RV64IZFINXZDINX-NEXT: mv a0, a2600; RV64IZFINXZDINX-NEXT: ret601;602; RV32I-LABEL: fcmp_uge:603; RV32I: # %bb.0:604; RV32I-NEXT: addi sp, sp, -16605; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill606; RV32I-NEXT: call __ltdf2607; RV32I-NEXT: srli a0, a0, 31608; RV32I-NEXT: xori a0, a0, 1609; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload610; RV32I-NEXT: addi sp, sp, 16611; RV32I-NEXT: ret612;613; RV64I-LABEL: fcmp_uge:614; RV64I: # %bb.0:615; RV64I-NEXT: addi sp, sp, -16616; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill617; RV64I-NEXT: call __ltdf2618; RV64I-NEXT: srli a0, a0, 63619; RV64I-NEXT: xori a0, a0, 1620; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload621; RV64I-NEXT: addi sp, sp, 16622; RV64I-NEXT: ret623 %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"uge", metadata !"fpexcept.strict") strictfp624 %2 = zext i1 %1 to i32625 ret i32 %2626}627 628define i32 @fcmp_ult(double %a, double %b) nounwind strictfp {629; CHECKIFD-LABEL: fcmp_ult:630; CHECKIFD: # %bb.0:631; CHECKIFD-NEXT: frflags a0632; CHECKIFD-NEXT: fle.d a1, fa1, fa0633; CHECKIFD-NEXT: fsflags a0634; CHECKIFD-NEXT: xori a0, a1, 1635; CHECKIFD-NEXT: feq.d zero, fa1, fa0636; CHECKIFD-NEXT: ret637;638; RV32IZFINXZDINX-LABEL: fcmp_ult:639; RV32IZFINXZDINX: # %bb.0:640; RV32IZFINXZDINX-NEXT: frflags a4641; RV32IZFINXZDINX-NEXT: fle.d a5, a2, a0642; RV32IZFINXZDINX-NEXT: fsflags a4643; RV32IZFINXZDINX-NEXT: xori a4, a5, 1644; RV32IZFINXZDINX-NEXT: feq.d zero, a2, a0645; RV32IZFINXZDINX-NEXT: mv a0, a4646; RV32IZFINXZDINX-NEXT: ret647;648; RV64IZFINXZDINX-LABEL: fcmp_ult:649; RV64IZFINXZDINX: # %bb.0:650; RV64IZFINXZDINX-NEXT: frflags a2651; RV64IZFINXZDINX-NEXT: fle.d a3, a1, a0652; RV64IZFINXZDINX-NEXT: fsflags a2653; RV64IZFINXZDINX-NEXT: xori a2, a3, 1654; RV64IZFINXZDINX-NEXT: feq.d zero, a1, a0655; RV64IZFINXZDINX-NEXT: mv a0, a2656; RV64IZFINXZDINX-NEXT: ret657;658; RV32I-LABEL: fcmp_ult:659; RV32I: # %bb.0:660; RV32I-NEXT: addi sp, sp, -16661; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill662; RV32I-NEXT: call __gedf2663; RV32I-NEXT: srli a0, a0, 31664; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload665; RV32I-NEXT: addi sp, sp, 16666; RV32I-NEXT: ret667;668; RV64I-LABEL: fcmp_ult:669; RV64I: # %bb.0:670; RV64I-NEXT: addi sp, sp, -16671; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill672; RV64I-NEXT: call __gedf2673; RV64I-NEXT: srli a0, a0, 63674; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload675; RV64I-NEXT: addi sp, sp, 16676; RV64I-NEXT: ret677 %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ult", metadata !"fpexcept.strict") strictfp678 %2 = zext i1 %1 to i32679 ret i32 %2680}681 682define i32 @fcmp_ule(double %a, double %b) nounwind strictfp {683; CHECKIFD-LABEL: fcmp_ule:684; CHECKIFD: # %bb.0:685; CHECKIFD-NEXT: frflags a0686; CHECKIFD-NEXT: flt.d a1, fa1, fa0687; CHECKIFD-NEXT: fsflags a0688; CHECKIFD-NEXT: xori a0, a1, 1689; CHECKIFD-NEXT: feq.d zero, fa1, fa0690; CHECKIFD-NEXT: ret691;692; RV32IZFINXZDINX-LABEL: fcmp_ule:693; RV32IZFINXZDINX: # %bb.0:694; RV32IZFINXZDINX-NEXT: frflags a4695; RV32IZFINXZDINX-NEXT: flt.d a5, a2, a0696; RV32IZFINXZDINX-NEXT: fsflags a4697; RV32IZFINXZDINX-NEXT: xori a4, a5, 1698; RV32IZFINXZDINX-NEXT: feq.d zero, a2, a0699; RV32IZFINXZDINX-NEXT: mv a0, a4700; RV32IZFINXZDINX-NEXT: ret701;702; RV64IZFINXZDINX-LABEL: fcmp_ule:703; RV64IZFINXZDINX: # %bb.0:704; RV64IZFINXZDINX-NEXT: frflags a2705; RV64IZFINXZDINX-NEXT: flt.d a3, a1, a0706; RV64IZFINXZDINX-NEXT: fsflags a2707; RV64IZFINXZDINX-NEXT: xori a2, a3, 1708; RV64IZFINXZDINX-NEXT: feq.d zero, a1, a0709; RV64IZFINXZDINX-NEXT: mv a0, a2710; RV64IZFINXZDINX-NEXT: ret711;712; RV32I-LABEL: fcmp_ule:713; RV32I: # %bb.0:714; RV32I-NEXT: addi sp, sp, -16715; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill716; RV32I-NEXT: call __gtdf2717; RV32I-NEXT: slti a0, a0, 1718; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload719; RV32I-NEXT: addi sp, sp, 16720; RV32I-NEXT: ret721;722; RV64I-LABEL: fcmp_ule:723; RV64I: # %bb.0:724; RV64I-NEXT: addi sp, sp, -16725; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill726; RV64I-NEXT: call __gtdf2727; RV64I-NEXT: slti a0, a0, 1728; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload729; RV64I-NEXT: addi sp, sp, 16730; RV64I-NEXT: ret731 %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"ule", metadata !"fpexcept.strict") strictfp732 %2 = zext i1 %1 to i32733 ret i32 %2734}735 736define i32 @fcmp_une(double %a, double %b) nounwind strictfp {737; CHECKIFD-LABEL: fcmp_une:738; CHECKIFD: # %bb.0:739; CHECKIFD-NEXT: feq.d a0, fa0, fa1740; CHECKIFD-NEXT: xori a0, a0, 1741; CHECKIFD-NEXT: ret742;743; RV32IZFINXZDINX-LABEL: fcmp_une:744; RV32IZFINXZDINX: # %bb.0:745; RV32IZFINXZDINX-NEXT: feq.d a0, a0, a2746; RV32IZFINXZDINX-NEXT: xori a0, a0, 1747; RV32IZFINXZDINX-NEXT: ret748;749; RV64IZFINXZDINX-LABEL: fcmp_une:750; RV64IZFINXZDINX: # %bb.0:751; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a1752; RV64IZFINXZDINX-NEXT: xori a0, a0, 1753; RV64IZFINXZDINX-NEXT: ret754;755; RV32I-LABEL: fcmp_une:756; RV32I: # %bb.0:757; RV32I-NEXT: addi sp, sp, -16758; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill759; RV32I-NEXT: call __nedf2760; RV32I-NEXT: snez a0, a0761; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload762; RV32I-NEXT: addi sp, sp, 16763; RV32I-NEXT: ret764;765; RV64I-LABEL: fcmp_une:766; RV64I: # %bb.0:767; RV64I-NEXT: addi sp, sp, -16768; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill769; RV64I-NEXT: call __nedf2770; RV64I-NEXT: snez a0, a0771; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload772; RV64I-NEXT: addi sp, sp, 16773; RV64I-NEXT: ret774 %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"une", metadata !"fpexcept.strict") strictfp775 %2 = zext i1 %1 to i32776 ret i32 %2777}778 779define i32 @fcmp_uno(double %a, double %b) nounwind strictfp {780; CHECKIFD-LABEL: fcmp_uno:781; CHECKIFD: # %bb.0:782; CHECKIFD-NEXT: feq.d a0, fa1, fa1783; CHECKIFD-NEXT: feq.d a1, fa0, fa0784; CHECKIFD-NEXT: and a0, a1, a0785; CHECKIFD-NEXT: xori a0, a0, 1786; CHECKIFD-NEXT: ret787;788; RV32IZFINXZDINX-LABEL: fcmp_uno:789; RV32IZFINXZDINX: # %bb.0:790; RV32IZFINXZDINX-NEXT: feq.d a2, a2, a2791; RV32IZFINXZDINX-NEXT: feq.d a0, a0, a0792; RV32IZFINXZDINX-NEXT: and a0, a0, a2793; RV32IZFINXZDINX-NEXT: xori a0, a0, 1794; RV32IZFINXZDINX-NEXT: ret795;796; RV64IZFINXZDINX-LABEL: fcmp_uno:797; RV64IZFINXZDINX: # %bb.0:798; RV64IZFINXZDINX-NEXT: feq.d a1, a1, a1799; RV64IZFINXZDINX-NEXT: feq.d a0, a0, a0800; RV64IZFINXZDINX-NEXT: and a0, a0, a1801; RV64IZFINXZDINX-NEXT: xori a0, a0, 1802; RV64IZFINXZDINX-NEXT: ret803;804; RV32I-LABEL: fcmp_uno:805; RV32I: # %bb.0:806; RV32I-NEXT: addi sp, sp, -16807; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill808; RV32I-NEXT: call __unorddf2809; RV32I-NEXT: snez a0, a0810; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload811; RV32I-NEXT: addi sp, sp, 16812; RV32I-NEXT: ret813;814; RV64I-LABEL: fcmp_uno:815; RV64I: # %bb.0:816; RV64I-NEXT: addi sp, sp, -16817; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill818; RV64I-NEXT: call __unorddf2819; RV64I-NEXT: snez a0, a0820; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload821; RV64I-NEXT: addi sp, sp, 16822; RV64I-NEXT: ret823 %1 = call i1 @llvm.experimental.constrained.fcmp.f64(double %a, double %b, metadata !"uno", metadata !"fpexcept.strict") strictfp824 %2 = zext i1 %1 to i32825 ret i32 %2826}827 828define i32 @fcmps_oeq(double %a, double %b) nounwind strictfp {829; CHECKIFD-LABEL: fcmps_oeq:830; CHECKIFD: # %bb.0:831; CHECKIFD-NEXT: fle.d a0, fa1, fa0832; CHECKIFD-NEXT: fle.d a1, fa0, fa1833; CHECKIFD-NEXT: and a0, a1, a0834; CHECKIFD-NEXT: ret835;836; RV32IZFINXZDINX-LABEL: fcmps_oeq:837; RV32IZFINXZDINX: # %bb.0:838; RV32IZFINXZDINX-NEXT: fle.d a4, a2, a0839; RV32IZFINXZDINX-NEXT: fle.d a0, a0, a2840; RV32IZFINXZDINX-NEXT: and a0, a0, a4841; RV32IZFINXZDINX-NEXT: ret842;843; RV64IZFINXZDINX-LABEL: fcmps_oeq:844; RV64IZFINXZDINX: # %bb.0:845; RV64IZFINXZDINX-NEXT: fle.d a2, a1, a0846; RV64IZFINXZDINX-NEXT: fle.d a0, a0, a1847; RV64IZFINXZDINX-NEXT: and a0, a0, a2848; RV64IZFINXZDINX-NEXT: ret849;850; RV32I-LABEL: fcmps_oeq:851; RV32I: # %bb.0:852; RV32I-NEXT: addi sp, sp, -16853; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill854; RV32I-NEXT: call __eqdf2855; RV32I-NEXT: seqz a0, a0856; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload857; RV32I-NEXT: addi sp, sp, 16858; RV32I-NEXT: ret859;860; RV64I-LABEL: fcmps_oeq:861; RV64I: # %bb.0:862; RV64I-NEXT: addi sp, sp, -16863; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill864; RV64I-NEXT: call __eqdf2865; RV64I-NEXT: seqz a0, a0866; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload867; RV64I-NEXT: addi sp, sp, 16868; RV64I-NEXT: ret869 %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oeq", metadata !"fpexcept.strict") strictfp870 %2 = zext i1 %1 to i32871 ret i32 %2872}873 874define i32 @fcmps_ogt(double %a, double %b) nounwind strictfp {875; CHECKIFD-LABEL: fcmps_ogt:876; CHECKIFD: # %bb.0:877; CHECKIFD-NEXT: flt.d a0, fa1, fa0878; CHECKIFD-NEXT: ret879;880; RV32IZFINXZDINX-LABEL: fcmps_ogt:881; RV32IZFINXZDINX: # %bb.0:882; RV32IZFINXZDINX-NEXT: flt.d a0, a2, a0883; RV32IZFINXZDINX-NEXT: ret884;885; RV64IZFINXZDINX-LABEL: fcmps_ogt:886; RV64IZFINXZDINX: # %bb.0:887; RV64IZFINXZDINX-NEXT: flt.d a0, a1, a0888; RV64IZFINXZDINX-NEXT: ret889;890; RV32I-LABEL: fcmps_ogt:891; RV32I: # %bb.0:892; RV32I-NEXT: addi sp, sp, -16893; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill894; RV32I-NEXT: call __gtdf2895; RV32I-NEXT: sgtz a0, a0896; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload897; RV32I-NEXT: addi sp, sp, 16898; RV32I-NEXT: ret899;900; RV64I-LABEL: fcmps_ogt:901; RV64I: # %bb.0:902; RV64I-NEXT: addi sp, sp, -16903; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill904; RV64I-NEXT: call __gtdf2905; RV64I-NEXT: sgtz a0, a0906; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload907; RV64I-NEXT: addi sp, sp, 16908; RV64I-NEXT: ret909 %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"ogt", metadata !"fpexcept.strict") strictfp910 %2 = zext i1 %1 to i32911 ret i32 %2912}913 914define i32 @fcmps_oge(double %a, double %b) nounwind strictfp {915; CHECKIFD-LABEL: fcmps_oge:916; CHECKIFD: # %bb.0:917; CHECKIFD-NEXT: fle.d a0, fa1, fa0918; CHECKIFD-NEXT: ret919;920; RV32IZFINXZDINX-LABEL: fcmps_oge:921; RV32IZFINXZDINX: # %bb.0:922; RV32IZFINXZDINX-NEXT: fle.d a0, a2, a0923; RV32IZFINXZDINX-NEXT: ret924;925; RV64IZFINXZDINX-LABEL: fcmps_oge:926; RV64IZFINXZDINX: # %bb.0:927; RV64IZFINXZDINX-NEXT: fle.d a0, a1, a0928; RV64IZFINXZDINX-NEXT: ret929;930; RV32I-LABEL: fcmps_oge:931; RV32I: # %bb.0:932; RV32I-NEXT: addi sp, sp, -16933; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill934; RV32I-NEXT: call __gedf2935; RV32I-NEXT: srli a0, a0, 31936; RV32I-NEXT: xori a0, a0, 1937; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload938; RV32I-NEXT: addi sp, sp, 16939; RV32I-NEXT: ret940;941; RV64I-LABEL: fcmps_oge:942; RV64I: # %bb.0:943; RV64I-NEXT: addi sp, sp, -16944; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill945; RV64I-NEXT: call __gedf2946; RV64I-NEXT: srli a0, a0, 63947; RV64I-NEXT: xori a0, a0, 1948; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload949; RV64I-NEXT: addi sp, sp, 16950; RV64I-NEXT: ret951 %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"oge", metadata !"fpexcept.strict") strictfp952 %2 = zext i1 %1 to i32953 ret i32 %2954}955 956define i32 @fcmps_olt(double %a, double %b) nounwind strictfp {957; CHECKIFD-LABEL: fcmps_olt:958; CHECKIFD: # %bb.0:959; CHECKIFD-NEXT: flt.d a0, fa0, fa1960; CHECKIFD-NEXT: ret961;962; RV32IZFINXZDINX-LABEL: fcmps_olt:963; RV32IZFINXZDINX: # %bb.0:964; RV32IZFINXZDINX-NEXT: flt.d a0, a0, a2965; RV32IZFINXZDINX-NEXT: ret966;967; RV64IZFINXZDINX-LABEL: fcmps_olt:968; RV64IZFINXZDINX: # %bb.0:969; RV64IZFINXZDINX-NEXT: flt.d a0, a0, a1970; RV64IZFINXZDINX-NEXT: ret971;972; RV32I-LABEL: fcmps_olt:973; RV32I: # %bb.0:974; RV32I-NEXT: addi sp, sp, -16975; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill976; RV32I-NEXT: call __ltdf2977; RV32I-NEXT: srli a0, a0, 31978; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload979; RV32I-NEXT: addi sp, sp, 16980; RV32I-NEXT: ret981;982; RV64I-LABEL: fcmps_olt:983; RV64I: # %bb.0:984; RV64I-NEXT: addi sp, sp, -16985; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill986; RV64I-NEXT: call __ltdf2987; RV64I-NEXT: srli a0, a0, 63988; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload989; RV64I-NEXT: addi sp, sp, 16990; RV64I-NEXT: ret991 %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"olt", metadata !"fpexcept.strict") strictfp992 %2 = zext i1 %1 to i32993 ret i32 %2994}995 996define i32 @fcmps_ole(double %a, double %b) nounwind strictfp {997; CHECKIFD-LABEL: fcmps_ole:998; CHECKIFD: # %bb.0:999; CHECKIFD-NEXT: fle.d a0, fa0, fa11000; CHECKIFD-NEXT: ret1001;1002; RV32IZFINXZDINX-LABEL: fcmps_ole:1003; RV32IZFINXZDINX: # %bb.0:1004; RV32IZFINXZDINX-NEXT: fle.d a0, a0, a21005; RV32IZFINXZDINX-NEXT: ret1006;1007; RV64IZFINXZDINX-LABEL: fcmps_ole:1008; RV64IZFINXZDINX: # %bb.0:1009; RV64IZFINXZDINX-NEXT: fle.d a0, a0, a11010; RV64IZFINXZDINX-NEXT: ret1011;1012; RV32I-LABEL: fcmps_ole:1013; RV32I: # %bb.0:1014; RV32I-NEXT: addi sp, sp, -161015; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1016; RV32I-NEXT: call __ledf21017; RV32I-NEXT: slti a0, a0, 11018; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1019; RV32I-NEXT: addi sp, sp, 161020; RV32I-NEXT: ret1021;1022; RV64I-LABEL: fcmps_ole:1023; RV64I: # %bb.0:1024; RV64I-NEXT: addi sp, sp, -161025; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1026; RV64I-NEXT: call __ledf21027; RV64I-NEXT: slti a0, a0, 11028; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1029; RV64I-NEXT: addi sp, sp, 161030; RV64I-NEXT: ret1031 %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"ole", metadata !"fpexcept.strict") strictfp1032 %2 = zext i1 %1 to i321033 ret i32 %21034}1035 1036define i32 @fcmps_one(double %a, double %b) nounwind strictfp {1037; CHECKIFD-LABEL: fcmps_one:1038; CHECKIFD: # %bb.0:1039; CHECKIFD-NEXT: flt.d a0, fa0, fa11040; CHECKIFD-NEXT: flt.d a1, fa1, fa01041; CHECKIFD-NEXT: or a0, a1, a01042; CHECKIFD-NEXT: ret1043;1044; RV32IZFINXZDINX-LABEL: fcmps_one:1045; RV32IZFINXZDINX: # %bb.0:1046; RV32IZFINXZDINX-NEXT: flt.d a4, a0, a21047; RV32IZFINXZDINX-NEXT: flt.d a0, a2, a01048; RV32IZFINXZDINX-NEXT: or a0, a0, a41049; RV32IZFINXZDINX-NEXT: ret1050;1051; RV64IZFINXZDINX-LABEL: fcmps_one:1052; RV64IZFINXZDINX: # %bb.0:1053; RV64IZFINXZDINX-NEXT: flt.d a2, a0, a11054; RV64IZFINXZDINX-NEXT: flt.d a0, a1, a01055; RV64IZFINXZDINX-NEXT: or a0, a0, a21056; RV64IZFINXZDINX-NEXT: ret1057;1058; RV32I-LABEL: fcmps_one:1059; RV32I: # %bb.0:1060; RV32I-NEXT: addi sp, sp, -321061; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1062; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill1063; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill1064; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill1065; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill1066; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill1067; RV32I-NEXT: mv s0, a31068; RV32I-NEXT: mv s1, a21069; RV32I-NEXT: mv s2, a11070; RV32I-NEXT: mv s3, a01071; RV32I-NEXT: call __eqdf21072; RV32I-NEXT: snez s4, a01073; RV32I-NEXT: mv a0, s31074; RV32I-NEXT: mv a1, s21075; RV32I-NEXT: mv a2, s11076; RV32I-NEXT: mv a3, s01077; RV32I-NEXT: call __unorddf21078; RV32I-NEXT: seqz a0, a01079; RV32I-NEXT: and a0, a0, s41080; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1081; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload1082; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload1083; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload1084; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload1085; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload1086; RV32I-NEXT: addi sp, sp, 321087; RV32I-NEXT: ret1088;1089; RV64I-LABEL: fcmps_one:1090; RV64I: # %bb.0:1091; RV64I-NEXT: addi sp, sp, -321092; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1093; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1094; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill1095; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill1096; RV64I-NEXT: mv s0, a11097; RV64I-NEXT: mv s1, a01098; RV64I-NEXT: call __eqdf21099; RV64I-NEXT: snez s2, a01100; RV64I-NEXT: mv a0, s11101; RV64I-NEXT: mv a1, s01102; RV64I-NEXT: call __unorddf21103; RV64I-NEXT: seqz a0, a01104; RV64I-NEXT: and a0, a0, s21105; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1106; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1107; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload1108; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload1109; RV64I-NEXT: addi sp, sp, 321110; RV64I-NEXT: ret1111 %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"one", metadata !"fpexcept.strict") strictfp1112 %2 = zext i1 %1 to i321113 ret i32 %21114}1115 1116define i32 @fcmps_ord(double %a, double %b) nounwind strictfp {1117; CHECKIFD-LABEL: fcmps_ord:1118; CHECKIFD: # %bb.0:1119; CHECKIFD-NEXT: fle.d a0, fa1, fa11120; CHECKIFD-NEXT: fle.d a1, fa0, fa01121; CHECKIFD-NEXT: and a0, a1, a01122; CHECKIFD-NEXT: ret1123;1124; RV32IZFINXZDINX-LABEL: fcmps_ord:1125; RV32IZFINXZDINX: # %bb.0:1126; RV32IZFINXZDINX-NEXT: fle.d a2, a2, a21127; RV32IZFINXZDINX-NEXT: fle.d a0, a0, a01128; RV32IZFINXZDINX-NEXT: and a0, a0, a21129; RV32IZFINXZDINX-NEXT: ret1130;1131; RV64IZFINXZDINX-LABEL: fcmps_ord:1132; RV64IZFINXZDINX: # %bb.0:1133; RV64IZFINXZDINX-NEXT: fle.d a1, a1, a11134; RV64IZFINXZDINX-NEXT: fle.d a0, a0, a01135; RV64IZFINXZDINX-NEXT: and a0, a0, a11136; RV64IZFINXZDINX-NEXT: ret1137;1138; RV32I-LABEL: fcmps_ord:1139; RV32I: # %bb.0:1140; RV32I-NEXT: addi sp, sp, -161141; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1142; RV32I-NEXT: call __unorddf21143; RV32I-NEXT: seqz a0, a01144; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1145; RV32I-NEXT: addi sp, sp, 161146; RV32I-NEXT: ret1147;1148; RV64I-LABEL: fcmps_ord:1149; RV64I: # %bb.0:1150; RV64I-NEXT: addi sp, sp, -161151; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1152; RV64I-NEXT: call __unorddf21153; RV64I-NEXT: seqz a0, a01154; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1155; RV64I-NEXT: addi sp, sp, 161156; RV64I-NEXT: ret1157 %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"ord", metadata !"fpexcept.strict") strictfp1158 %2 = zext i1 %1 to i321159 ret i32 %21160}1161 1162define i32 @fcmps_ueq(double %a, double %b) nounwind strictfp {1163; CHECKIFD-LABEL: fcmps_ueq:1164; CHECKIFD: # %bb.0:1165; CHECKIFD-NEXT: flt.d a0, fa0, fa11166; CHECKIFD-NEXT: flt.d a1, fa1, fa01167; CHECKIFD-NEXT: or a0, a1, a01168; CHECKIFD-NEXT: xori a0, a0, 11169; CHECKIFD-NEXT: ret1170;1171; RV32IZFINXZDINX-LABEL: fcmps_ueq:1172; RV32IZFINXZDINX: # %bb.0:1173; RV32IZFINXZDINX-NEXT: flt.d a4, a0, a21174; RV32IZFINXZDINX-NEXT: flt.d a0, a2, a01175; RV32IZFINXZDINX-NEXT: or a0, a0, a41176; RV32IZFINXZDINX-NEXT: xori a0, a0, 11177; RV32IZFINXZDINX-NEXT: ret1178;1179; RV64IZFINXZDINX-LABEL: fcmps_ueq:1180; RV64IZFINXZDINX: # %bb.0:1181; RV64IZFINXZDINX-NEXT: flt.d a2, a0, a11182; RV64IZFINXZDINX-NEXT: flt.d a0, a1, a01183; RV64IZFINXZDINX-NEXT: or a0, a0, a21184; RV64IZFINXZDINX-NEXT: xori a0, a0, 11185; RV64IZFINXZDINX-NEXT: ret1186;1187; RV32I-LABEL: fcmps_ueq:1188; RV32I: # %bb.0:1189; RV32I-NEXT: addi sp, sp, -321190; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill1191; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill1192; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill1193; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill1194; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill1195; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill1196; RV32I-NEXT: mv s0, a31197; RV32I-NEXT: mv s1, a21198; RV32I-NEXT: mv s2, a11199; RV32I-NEXT: mv s3, a01200; RV32I-NEXT: call __unorddf21201; RV32I-NEXT: mv s4, a01202; RV32I-NEXT: mv a0, s31203; RV32I-NEXT: mv a1, s21204; RV32I-NEXT: mv a2, s11205; RV32I-NEXT: mv a3, s01206; RV32I-NEXT: call __eqdf21207; RV32I-NEXT: seqz a0, a01208; RV32I-NEXT: or a0, s4, a01209; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload1210; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload1211; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload1212; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload1213; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload1214; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload1215; RV32I-NEXT: addi sp, sp, 321216; RV32I-NEXT: ret1217;1218; RV64I-LABEL: fcmps_ueq:1219; RV64I: # %bb.0:1220; RV64I-NEXT: addi sp, sp, -321221; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill1222; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill1223; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill1224; RV64I-NEXT: sd s2, 0(sp) # 8-byte Folded Spill1225; RV64I-NEXT: mv s0, a11226; RV64I-NEXT: mv s1, a01227; RV64I-NEXT: call __unorddf21228; RV64I-NEXT: mv s2, a01229; RV64I-NEXT: mv a0, s11230; RV64I-NEXT: mv a1, s01231; RV64I-NEXT: call __eqdf21232; RV64I-NEXT: seqz a0, a01233; RV64I-NEXT: or a0, s2, a01234; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload1235; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload1236; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload1237; RV64I-NEXT: ld s2, 0(sp) # 8-byte Folded Reload1238; RV64I-NEXT: addi sp, sp, 321239; RV64I-NEXT: ret1240 %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"ueq", metadata !"fpexcept.strict") strictfp1241 %2 = zext i1 %1 to i321242 ret i32 %21243}1244 1245define i32 @fcmps_ugt(double %a, double %b) nounwind strictfp {1246; CHECKIFD-LABEL: fcmps_ugt:1247; CHECKIFD: # %bb.0:1248; CHECKIFD-NEXT: fle.d a0, fa0, fa11249; CHECKIFD-NEXT: xori a0, a0, 11250; CHECKIFD-NEXT: ret1251;1252; RV32IZFINXZDINX-LABEL: fcmps_ugt:1253; RV32IZFINXZDINX: # %bb.0:1254; RV32IZFINXZDINX-NEXT: fle.d a0, a0, a21255; RV32IZFINXZDINX-NEXT: xori a0, a0, 11256; RV32IZFINXZDINX-NEXT: ret1257;1258; RV64IZFINXZDINX-LABEL: fcmps_ugt:1259; RV64IZFINXZDINX: # %bb.0:1260; RV64IZFINXZDINX-NEXT: fle.d a0, a0, a11261; RV64IZFINXZDINX-NEXT: xori a0, a0, 11262; RV64IZFINXZDINX-NEXT: ret1263;1264; RV32I-LABEL: fcmps_ugt:1265; RV32I: # %bb.0:1266; RV32I-NEXT: addi sp, sp, -161267; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1268; RV32I-NEXT: call __ledf21269; RV32I-NEXT: sgtz a0, a01270; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1271; RV32I-NEXT: addi sp, sp, 161272; RV32I-NEXT: ret1273;1274; RV64I-LABEL: fcmps_ugt:1275; RV64I: # %bb.0:1276; RV64I-NEXT: addi sp, sp, -161277; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1278; RV64I-NEXT: call __ledf21279; RV64I-NEXT: sgtz a0, a01280; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1281; RV64I-NEXT: addi sp, sp, 161282; RV64I-NEXT: ret1283 %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"ugt", metadata !"fpexcept.strict") strictfp1284 %2 = zext i1 %1 to i321285 ret i32 %21286}1287 1288define i32 @fcmps_uge(double %a, double %b) nounwind strictfp {1289; CHECKIFD-LABEL: fcmps_uge:1290; CHECKIFD: # %bb.0:1291; CHECKIFD-NEXT: flt.d a0, fa0, fa11292; CHECKIFD-NEXT: xori a0, a0, 11293; CHECKIFD-NEXT: ret1294;1295; RV32IZFINXZDINX-LABEL: fcmps_uge:1296; RV32IZFINXZDINX: # %bb.0:1297; RV32IZFINXZDINX-NEXT: flt.d a0, a0, a21298; RV32IZFINXZDINX-NEXT: xori a0, a0, 11299; RV32IZFINXZDINX-NEXT: ret1300;1301; RV64IZFINXZDINX-LABEL: fcmps_uge:1302; RV64IZFINXZDINX: # %bb.0:1303; RV64IZFINXZDINX-NEXT: flt.d a0, a0, a11304; RV64IZFINXZDINX-NEXT: xori a0, a0, 11305; RV64IZFINXZDINX-NEXT: ret1306;1307; RV32I-LABEL: fcmps_uge:1308; RV32I: # %bb.0:1309; RV32I-NEXT: addi sp, sp, -161310; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1311; RV32I-NEXT: call __ltdf21312; RV32I-NEXT: srli a0, a0, 311313; RV32I-NEXT: xori a0, a0, 11314; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1315; RV32I-NEXT: addi sp, sp, 161316; RV32I-NEXT: ret1317;1318; RV64I-LABEL: fcmps_uge:1319; RV64I: # %bb.0:1320; RV64I-NEXT: addi sp, sp, -161321; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1322; RV64I-NEXT: call __ltdf21323; RV64I-NEXT: srli a0, a0, 631324; RV64I-NEXT: xori a0, a0, 11325; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1326; RV64I-NEXT: addi sp, sp, 161327; RV64I-NEXT: ret1328 %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"uge", metadata !"fpexcept.strict") strictfp1329 %2 = zext i1 %1 to i321330 ret i32 %21331}1332 1333define i32 @fcmps_ult(double %a, double %b) nounwind strictfp {1334; CHECKIFD-LABEL: fcmps_ult:1335; CHECKIFD: # %bb.0:1336; CHECKIFD-NEXT: fle.d a0, fa1, fa01337; CHECKIFD-NEXT: xori a0, a0, 11338; CHECKIFD-NEXT: ret1339;1340; RV32IZFINXZDINX-LABEL: fcmps_ult:1341; RV32IZFINXZDINX: # %bb.0:1342; RV32IZFINXZDINX-NEXT: fle.d a0, a2, a01343; RV32IZFINXZDINX-NEXT: xori a0, a0, 11344; RV32IZFINXZDINX-NEXT: ret1345;1346; RV64IZFINXZDINX-LABEL: fcmps_ult:1347; RV64IZFINXZDINX: # %bb.0:1348; RV64IZFINXZDINX-NEXT: fle.d a0, a1, a01349; RV64IZFINXZDINX-NEXT: xori a0, a0, 11350; RV64IZFINXZDINX-NEXT: ret1351;1352; RV32I-LABEL: fcmps_ult:1353; RV32I: # %bb.0:1354; RV32I-NEXT: addi sp, sp, -161355; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1356; RV32I-NEXT: call __gedf21357; RV32I-NEXT: srli a0, a0, 311358; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1359; RV32I-NEXT: addi sp, sp, 161360; RV32I-NEXT: ret1361;1362; RV64I-LABEL: fcmps_ult:1363; RV64I: # %bb.0:1364; RV64I-NEXT: addi sp, sp, -161365; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1366; RV64I-NEXT: call __gedf21367; RV64I-NEXT: srli a0, a0, 631368; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1369; RV64I-NEXT: addi sp, sp, 161370; RV64I-NEXT: ret1371 %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"ult", metadata !"fpexcept.strict") strictfp1372 %2 = zext i1 %1 to i321373 ret i32 %21374}1375 1376define i32 @fcmps_ule(double %a, double %b) nounwind strictfp {1377; CHECKIFD-LABEL: fcmps_ule:1378; CHECKIFD: # %bb.0:1379; CHECKIFD-NEXT: flt.d a0, fa1, fa01380; CHECKIFD-NEXT: xori a0, a0, 11381; CHECKIFD-NEXT: ret1382;1383; RV32IZFINXZDINX-LABEL: fcmps_ule:1384; RV32IZFINXZDINX: # %bb.0:1385; RV32IZFINXZDINX-NEXT: flt.d a0, a2, a01386; RV32IZFINXZDINX-NEXT: xori a0, a0, 11387; RV32IZFINXZDINX-NEXT: ret1388;1389; RV64IZFINXZDINX-LABEL: fcmps_ule:1390; RV64IZFINXZDINX: # %bb.0:1391; RV64IZFINXZDINX-NEXT: flt.d a0, a1, a01392; RV64IZFINXZDINX-NEXT: xori a0, a0, 11393; RV64IZFINXZDINX-NEXT: ret1394;1395; RV32I-LABEL: fcmps_ule:1396; RV32I: # %bb.0:1397; RV32I-NEXT: addi sp, sp, -161398; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1399; RV32I-NEXT: call __gtdf21400; RV32I-NEXT: slti a0, a0, 11401; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1402; RV32I-NEXT: addi sp, sp, 161403; RV32I-NEXT: ret1404;1405; RV64I-LABEL: fcmps_ule:1406; RV64I: # %bb.0:1407; RV64I-NEXT: addi sp, sp, -161408; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1409; RV64I-NEXT: call __gtdf21410; RV64I-NEXT: slti a0, a0, 11411; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1412; RV64I-NEXT: addi sp, sp, 161413; RV64I-NEXT: ret1414 %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"ule", metadata !"fpexcept.strict") strictfp1415 %2 = zext i1 %1 to i321416 ret i32 %21417}1418 1419define i32 @fcmps_une(double %a, double %b) nounwind strictfp {1420; CHECKIFD-LABEL: fcmps_une:1421; CHECKIFD: # %bb.0:1422; CHECKIFD-NEXT: fle.d a0, fa1, fa01423; CHECKIFD-NEXT: fle.d a1, fa0, fa11424; CHECKIFD-NEXT: and a0, a1, a01425; CHECKIFD-NEXT: xori a0, a0, 11426; CHECKIFD-NEXT: ret1427;1428; RV32IZFINXZDINX-LABEL: fcmps_une:1429; RV32IZFINXZDINX: # %bb.0:1430; RV32IZFINXZDINX-NEXT: fle.d a4, a2, a01431; RV32IZFINXZDINX-NEXT: fle.d a0, a0, a21432; RV32IZFINXZDINX-NEXT: and a0, a0, a41433; RV32IZFINXZDINX-NEXT: xori a0, a0, 11434; RV32IZFINXZDINX-NEXT: ret1435;1436; RV64IZFINXZDINX-LABEL: fcmps_une:1437; RV64IZFINXZDINX: # %bb.0:1438; RV64IZFINXZDINX-NEXT: fle.d a2, a1, a01439; RV64IZFINXZDINX-NEXT: fle.d a0, a0, a11440; RV64IZFINXZDINX-NEXT: and a0, a0, a21441; RV64IZFINXZDINX-NEXT: xori a0, a0, 11442; RV64IZFINXZDINX-NEXT: ret1443;1444; RV32I-LABEL: fcmps_une:1445; RV32I: # %bb.0:1446; RV32I-NEXT: addi sp, sp, -161447; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1448; RV32I-NEXT: call __nedf21449; RV32I-NEXT: snez a0, a01450; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1451; RV32I-NEXT: addi sp, sp, 161452; RV32I-NEXT: ret1453;1454; RV64I-LABEL: fcmps_une:1455; RV64I: # %bb.0:1456; RV64I-NEXT: addi sp, sp, -161457; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1458; RV64I-NEXT: call __nedf21459; RV64I-NEXT: snez a0, a01460; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1461; RV64I-NEXT: addi sp, sp, 161462; RV64I-NEXT: ret1463 %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"une", metadata !"fpexcept.strict") strictfp1464 %2 = zext i1 %1 to i321465 ret i32 %21466}1467 1468define i32 @fcmps_uno(double %a, double %b) nounwind strictfp {1469; CHECKIFD-LABEL: fcmps_uno:1470; CHECKIFD: # %bb.0:1471; CHECKIFD-NEXT: fle.d a0, fa1, fa11472; CHECKIFD-NEXT: fle.d a1, fa0, fa01473; CHECKIFD-NEXT: and a0, a1, a01474; CHECKIFD-NEXT: xori a0, a0, 11475; CHECKIFD-NEXT: ret1476;1477; RV32IZFINXZDINX-LABEL: fcmps_uno:1478; RV32IZFINXZDINX: # %bb.0:1479; RV32IZFINXZDINX-NEXT: fle.d a2, a2, a21480; RV32IZFINXZDINX-NEXT: fle.d a0, a0, a01481; RV32IZFINXZDINX-NEXT: and a0, a0, a21482; RV32IZFINXZDINX-NEXT: xori a0, a0, 11483; RV32IZFINXZDINX-NEXT: ret1484;1485; RV64IZFINXZDINX-LABEL: fcmps_uno:1486; RV64IZFINXZDINX: # %bb.0:1487; RV64IZFINXZDINX-NEXT: fle.d a1, a1, a11488; RV64IZFINXZDINX-NEXT: fle.d a0, a0, a01489; RV64IZFINXZDINX-NEXT: and a0, a0, a11490; RV64IZFINXZDINX-NEXT: xori a0, a0, 11491; RV64IZFINXZDINX-NEXT: ret1492;1493; RV32I-LABEL: fcmps_uno:1494; RV32I: # %bb.0:1495; RV32I-NEXT: addi sp, sp, -161496; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill1497; RV32I-NEXT: call __unorddf21498; RV32I-NEXT: snez a0, a01499; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload1500; RV32I-NEXT: addi sp, sp, 161501; RV32I-NEXT: ret1502;1503; RV64I-LABEL: fcmps_uno:1504; RV64I: # %bb.0:1505; RV64I-NEXT: addi sp, sp, -161506; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill1507; RV64I-NEXT: call __unorddf21508; RV64I-NEXT: snez a0, a01509; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload1510; RV64I-NEXT: addi sp, sp, 161511; RV64I-NEXT: ret1512 %1 = call i1 @llvm.experimental.constrained.fcmps.f64(double %a, double %b, metadata !"uno", metadata !"fpexcept.strict") strictfp1513 %2 = zext i1 %1 to i321514 ret i32 %21515}1516