314 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -mtriple=riscv32 -mattr=+zfbfmin -verify-machineinstrs \3; RUN: -target-abi ilp32f < %s | FileCheck %s4; RUN: llc -mtriple=riscv64 -mattr=+zfbfmin -verify-machineinstrs \5; RUN: -target-abi lp64f < %s | FileCheck %s6 7define bfloat @select_fcmp_false(bfloat %a, bfloat %b) nounwind {8; CHECK-LABEL: select_fcmp_false:9; CHECK: # %bb.0:10; CHECK-NEXT: fmv.s fa0, fa111; CHECK-NEXT: ret12 %1 = fcmp false bfloat %a, %b13 %2 = select i1 %1, bfloat %a, bfloat %b14 ret bfloat %215}16 17define bfloat @select_fcmp_oeq(bfloat %a, bfloat %b) nounwind {18; CHECK-LABEL: select_fcmp_oeq:19; CHECK: # %bb.0:20; CHECK-NEXT: fcvt.s.bf16 fa5, fa121; CHECK-NEXT: fcvt.s.bf16 fa4, fa022; CHECK-NEXT: feq.s a0, fa4, fa523; CHECK-NEXT: bnez a0, .LBB1_224; CHECK-NEXT: # %bb.1:25; CHECK-NEXT: fmv.s fa0, fa126; CHECK-NEXT: .LBB1_2:27; CHECK-NEXT: ret28 %1 = fcmp oeq bfloat %a, %b29 %2 = select i1 %1, bfloat %a, bfloat %b30 ret bfloat %231}32 33define bfloat @select_fcmp_ogt(bfloat %a, bfloat %b) nounwind {34; CHECK-LABEL: select_fcmp_ogt:35; CHECK: # %bb.0:36; CHECK-NEXT: fcvt.s.bf16 fa5, fa037; CHECK-NEXT: fcvt.s.bf16 fa4, fa138; CHECK-NEXT: flt.s a0, fa4, fa539; CHECK-NEXT: bnez a0, .LBB2_240; CHECK-NEXT: # %bb.1:41; CHECK-NEXT: fmv.s fa0, fa142; CHECK-NEXT: .LBB2_2:43; CHECK-NEXT: ret44 %1 = fcmp ogt bfloat %a, %b45 %2 = select i1 %1, bfloat %a, bfloat %b46 ret bfloat %247}48 49define bfloat @select_fcmp_oge(bfloat %a, bfloat %b) nounwind {50; CHECK-LABEL: select_fcmp_oge:51; CHECK: # %bb.0:52; CHECK-NEXT: fcvt.s.bf16 fa5, fa053; CHECK-NEXT: fcvt.s.bf16 fa4, fa154; CHECK-NEXT: fle.s a0, fa4, fa555; CHECK-NEXT: bnez a0, .LBB3_256; CHECK-NEXT: # %bb.1:57; CHECK-NEXT: fmv.s fa0, fa158; CHECK-NEXT: .LBB3_2:59; CHECK-NEXT: ret60 %1 = fcmp oge bfloat %a, %b61 %2 = select i1 %1, bfloat %a, bfloat %b62 ret bfloat %263}64 65define bfloat @select_fcmp_olt(bfloat %a, bfloat %b) nounwind {66; CHECK-LABEL: select_fcmp_olt:67; CHECK: # %bb.0:68; CHECK-NEXT: fcvt.s.bf16 fa5, fa169; CHECK-NEXT: fcvt.s.bf16 fa4, fa070; CHECK-NEXT: flt.s a0, fa4, fa571; CHECK-NEXT: bnez a0, .LBB4_272; CHECK-NEXT: # %bb.1:73; CHECK-NEXT: fmv.s fa0, fa174; CHECK-NEXT: .LBB4_2:75; CHECK-NEXT: ret76 %1 = fcmp olt bfloat %a, %b77 %2 = select i1 %1, bfloat %a, bfloat %b78 ret bfloat %279}80 81define bfloat @select_fcmp_ole(bfloat %a, bfloat %b) nounwind {82; CHECK-LABEL: select_fcmp_ole:83; CHECK: # %bb.0:84; CHECK-NEXT: fcvt.s.bf16 fa5, fa185; CHECK-NEXT: fcvt.s.bf16 fa4, fa086; CHECK-NEXT: fle.s a0, fa4, fa587; CHECK-NEXT: bnez a0, .LBB5_288; CHECK-NEXT: # %bb.1:89; CHECK-NEXT: fmv.s fa0, fa190; CHECK-NEXT: .LBB5_2:91; CHECK-NEXT: ret92 %1 = fcmp ole bfloat %a, %b93 %2 = select i1 %1, bfloat %a, bfloat %b94 ret bfloat %295}96 97define bfloat @select_fcmp_one(bfloat %a, bfloat %b) nounwind {98; CHECK-LABEL: select_fcmp_one:99; CHECK: # %bb.0:100; CHECK-NEXT: fcvt.s.bf16 fa5, fa1101; CHECK-NEXT: fcvt.s.bf16 fa4, fa0102; CHECK-NEXT: flt.s a0, fa4, fa5103; CHECK-NEXT: flt.s a1, fa5, fa4104; CHECK-NEXT: or a0, a1, a0105; CHECK-NEXT: bnez a0, .LBB6_2106; CHECK-NEXT: # %bb.1:107; CHECK-NEXT: fmv.s fa0, fa1108; CHECK-NEXT: .LBB6_2:109; CHECK-NEXT: ret110 %1 = fcmp one bfloat %a, %b111 %2 = select i1 %1, bfloat %a, bfloat %b112 ret bfloat %2113}114 115define bfloat @select_fcmp_ord(bfloat %a, bfloat %b) nounwind {116; CHECK-LABEL: select_fcmp_ord:117; CHECK: # %bb.0:118; CHECK-NEXT: fcvt.s.bf16 fa5, fa1119; CHECK-NEXT: feq.s a0, fa5, fa5120; CHECK-NEXT: fcvt.s.bf16 fa5, fa0121; CHECK-NEXT: feq.s a1, fa5, fa5122; CHECK-NEXT: and a0, a1, a0123; CHECK-NEXT: bnez a0, .LBB7_2124; CHECK-NEXT: # %bb.1:125; CHECK-NEXT: fmv.s fa0, fa1126; CHECK-NEXT: .LBB7_2:127; CHECK-NEXT: ret128 %1 = fcmp ord bfloat %a, %b129 %2 = select i1 %1, bfloat %a, bfloat %b130 ret bfloat %2131}132 133define bfloat @select_fcmp_ueq(bfloat %a, bfloat %b) nounwind {134; CHECK-LABEL: select_fcmp_ueq:135; CHECK: # %bb.0:136; CHECK-NEXT: fcvt.s.bf16 fa5, fa1137; CHECK-NEXT: fcvt.s.bf16 fa4, fa0138; CHECK-NEXT: flt.s a0, fa4, fa5139; CHECK-NEXT: flt.s a1, fa5, fa4140; CHECK-NEXT: or a0, a1, a0141; CHECK-NEXT: beqz a0, .LBB8_2142; CHECK-NEXT: # %bb.1:143; CHECK-NEXT: fmv.s fa0, fa1144; CHECK-NEXT: .LBB8_2:145; CHECK-NEXT: ret146 %1 = fcmp ueq bfloat %a, %b147 %2 = select i1 %1, bfloat %a, bfloat %b148 ret bfloat %2149}150 151define bfloat @select_fcmp_ugt(bfloat %a, bfloat %b) nounwind {152; CHECK-LABEL: select_fcmp_ugt:153; CHECK: # %bb.0:154; CHECK-NEXT: fcvt.s.bf16 fa5, fa1155; CHECK-NEXT: fcvt.s.bf16 fa4, fa0156; CHECK-NEXT: fle.s a0, fa4, fa5157; CHECK-NEXT: beqz a0, .LBB9_2158; CHECK-NEXT: # %bb.1:159; CHECK-NEXT: fmv.s fa0, fa1160; CHECK-NEXT: .LBB9_2:161; CHECK-NEXT: ret162 %1 = fcmp ugt bfloat %a, %b163 %2 = select i1 %1, bfloat %a, bfloat %b164 ret bfloat %2165}166 167define bfloat @select_fcmp_uge(bfloat %a, bfloat %b) nounwind {168; CHECK-LABEL: select_fcmp_uge:169; CHECK: # %bb.0:170; CHECK-NEXT: fcvt.s.bf16 fa5, fa1171; CHECK-NEXT: fcvt.s.bf16 fa4, fa0172; CHECK-NEXT: flt.s a0, fa4, fa5173; CHECK-NEXT: beqz a0, .LBB10_2174; CHECK-NEXT: # %bb.1:175; CHECK-NEXT: fmv.s fa0, fa1176; CHECK-NEXT: .LBB10_2:177; CHECK-NEXT: ret178 %1 = fcmp uge bfloat %a, %b179 %2 = select i1 %1, bfloat %a, bfloat %b180 ret bfloat %2181}182 183define bfloat @select_fcmp_ult(bfloat %a, bfloat %b) nounwind {184; CHECK-LABEL: select_fcmp_ult:185; CHECK: # %bb.0:186; CHECK-NEXT: fcvt.s.bf16 fa5, fa0187; CHECK-NEXT: fcvt.s.bf16 fa4, fa1188; CHECK-NEXT: fle.s a0, fa4, fa5189; CHECK-NEXT: beqz a0, .LBB11_2190; CHECK-NEXT: # %bb.1:191; CHECK-NEXT: fmv.s fa0, fa1192; CHECK-NEXT: .LBB11_2:193; CHECK-NEXT: ret194 %1 = fcmp ult bfloat %a, %b195 %2 = select i1 %1, bfloat %a, bfloat %b196 ret bfloat %2197}198 199define bfloat @select_fcmp_ule(bfloat %a, bfloat %b) nounwind {200; CHECK-LABEL: select_fcmp_ule:201; CHECK: # %bb.0:202; CHECK-NEXT: fcvt.s.bf16 fa5, fa0203; CHECK-NEXT: fcvt.s.bf16 fa4, fa1204; CHECK-NEXT: flt.s a0, fa4, fa5205; CHECK-NEXT: beqz a0, .LBB12_2206; CHECK-NEXT: # %bb.1:207; CHECK-NEXT: fmv.s fa0, fa1208; CHECK-NEXT: .LBB12_2:209; CHECK-NEXT: ret210 %1 = fcmp ule bfloat %a, %b211 %2 = select i1 %1, bfloat %a, bfloat %b212 ret bfloat %2213}214 215define bfloat @select_fcmp_une(bfloat %a, bfloat %b) nounwind {216; CHECK-LABEL: select_fcmp_une:217; CHECK: # %bb.0:218; CHECK-NEXT: fcvt.s.bf16 fa5, fa1219; CHECK-NEXT: fcvt.s.bf16 fa4, fa0220; CHECK-NEXT: feq.s a0, fa4, fa5221; CHECK-NEXT: beqz a0, .LBB13_2222; CHECK-NEXT: # %bb.1:223; CHECK-NEXT: fmv.s fa0, fa1224; CHECK-NEXT: .LBB13_2:225; CHECK-NEXT: ret226 %1 = fcmp une bfloat %a, %b227 %2 = select i1 %1, bfloat %a, bfloat %b228 ret bfloat %2229}230 231define bfloat @select_fcmp_uno(bfloat %a, bfloat %b) nounwind {232; CHECK-LABEL: select_fcmp_uno:233; CHECK: # %bb.0:234; CHECK-NEXT: fcvt.s.bf16 fa5, fa1235; CHECK-NEXT: feq.s a0, fa5, fa5236; CHECK-NEXT: fcvt.s.bf16 fa5, fa0237; CHECK-NEXT: feq.s a1, fa5, fa5238; CHECK-NEXT: and a0, a1, a0239; CHECK-NEXT: beqz a0, .LBB14_2240; CHECK-NEXT: # %bb.1:241; CHECK-NEXT: fmv.s fa0, fa1242; CHECK-NEXT: .LBB14_2:243; CHECK-NEXT: ret244 %1 = fcmp uno bfloat %a, %b245 %2 = select i1 %1, bfloat %a, bfloat %b246 ret bfloat %2247}248 249define bfloat @select_fcmp_true(bfloat %a, bfloat %b) nounwind {250; CHECK-LABEL: select_fcmp_true:251; CHECK: # %bb.0:252; CHECK-NEXT: ret253 %1 = fcmp true bfloat %a, %b254 %2 = select i1 %1, bfloat %a, bfloat %b255 ret bfloat %2256}257 258; Ensure that ISel succeeds for a select+fcmp that has an i32 result type.259define i32 @i32_select_fcmp_oeq(bfloat %a, bfloat %b, i32 %c, i32 %d) nounwind {260; CHECK-LABEL: i32_select_fcmp_oeq:261; CHECK: # %bb.0:262; CHECK-NEXT: fcvt.s.bf16 fa5, fa1263; CHECK-NEXT: fcvt.s.bf16 fa4, fa0264; CHECK-NEXT: feq.s a2, fa4, fa5265; CHECK-NEXT: bnez a2, .LBB16_2266; CHECK-NEXT: # %bb.1:267; CHECK-NEXT: mv a0, a1268; CHECK-NEXT: .LBB16_2:269; CHECK-NEXT: ret270 %1 = fcmp oeq bfloat %a, %b271 %2 = select i1 %1, i32 %c, i32 %d272 ret i32 %2273}274 275define i32 @select_fcmp_oeq_1_2(bfloat %a, bfloat %b) {276; CHECK-LABEL: select_fcmp_oeq_1_2:277; CHECK: # %bb.0:278; CHECK-NEXT: fcvt.s.bf16 fa5, fa1279; CHECK-NEXT: fcvt.s.bf16 fa4, fa0280; CHECK-NEXT: feq.s a0, fa4, fa5281; CHECK-NEXT: li a1, 2282; CHECK-NEXT: sub a0, a1, a0283; CHECK-NEXT: ret284 %1 = fcmp fast oeq bfloat %a, %b285 %2 = select i1 %1, i32 1, i32 2286 ret i32 %2287}288 289define signext i32 @select_fcmp_uge_negone_zero(bfloat %a, bfloat %b) nounwind {290; CHECK-LABEL: select_fcmp_uge_negone_zero:291; CHECK: # %bb.0:292; CHECK-NEXT: fcvt.s.bf16 fa5, fa1293; CHECK-NEXT: fcvt.s.bf16 fa4, fa0294; CHECK-NEXT: fle.s a0, fa4, fa5295; CHECK-NEXT: addi a0, a0, -1296; CHECK-NEXT: ret297 %1 = fcmp ugt bfloat %a, %b298 %2 = select i1 %1, i32 -1, i32 0299 ret i32 %2300}301 302define signext i32 @select_fcmp_uge_1_2(bfloat %a, bfloat %b) nounwind {303; CHECK-LABEL: select_fcmp_uge_1_2:304; CHECK: # %bb.0:305; CHECK-NEXT: fcvt.s.bf16 fa5, fa1306; CHECK-NEXT: fcvt.s.bf16 fa4, fa0307; CHECK-NEXT: fle.s a0, fa4, fa5308; CHECK-NEXT: addi a0, a0, 1309; CHECK-NEXT: ret310 %1 = fcmp ugt bfloat %a, %b311 %2 = select i1 %1, i32 1, i32 2312 ret i32 %2313}314