493 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+f -verify-machineinstrs < %s \3; RUN: -target-abi=ilp32f | FileCheck %s4; RUN: llc -mtriple=riscv64 -mattr=+f -verify-machineinstrs < %s \5; RUN: -target-abi=lp64f | FileCheck %s6; RUN: llc -mtriple=riscv32 -mattr=+zfinx -verify-machineinstrs < %s \7; RUN: -target-abi=ilp32 | FileCheck --check-prefix=CHECKZFINX %s8; RUN: llc -mtriple=riscv64 -mattr=+zfinx -verify-machineinstrs < %s \9; RUN: -target-abi=lp64 | FileCheck --check-prefix=CHECKZFINX %s10 11define float @select_fcmp_false(float %a, float %b) nounwind {12; CHECK-LABEL: select_fcmp_false:13; CHECK: # %bb.0:14; CHECK-NEXT: fmv.s fa0, fa115; CHECK-NEXT: ret16;17; CHECKZFINX-LABEL: select_fcmp_false:18; CHECKZFINX: # %bb.0:19; CHECKZFINX-NEXT: mv a0, a120; CHECKZFINX-NEXT: ret21 %1 = fcmp false float %a, %b22 %2 = select i1 %1, float %a, float %b23 ret float %224}25 26define float @select_fcmp_oeq(float %a, float %b) nounwind {27; CHECK-LABEL: select_fcmp_oeq:28; CHECK: # %bb.0:29; CHECK-NEXT: feq.s a0, fa0, fa130; CHECK-NEXT: bnez a0, .LBB1_231; CHECK-NEXT: # %bb.1:32; CHECK-NEXT: fmv.s fa0, fa133; CHECK-NEXT: .LBB1_2:34; CHECK-NEXT: ret35;36; CHECKZFINX-LABEL: select_fcmp_oeq:37; CHECKZFINX: # %bb.0:38; CHECKZFINX-NEXT: feq.s a2, a0, a139; CHECKZFINX-NEXT: bnez a2, .LBB1_240; CHECKZFINX-NEXT: # %bb.1:41; CHECKZFINX-NEXT: mv a0, a142; CHECKZFINX-NEXT: .LBB1_2:43; CHECKZFINX-NEXT: ret44 %1 = fcmp oeq float %a, %b45 %2 = select i1 %1, float %a, float %b46 ret float %247}48 49define float @select_fcmp_ogt(float %a, float %b) nounwind {50; CHECK-LABEL: select_fcmp_ogt:51; CHECK: # %bb.0:52; CHECK-NEXT: flt.s a0, fa1, fa053; CHECK-NEXT: bnez a0, .LBB2_254; CHECK-NEXT: # %bb.1:55; CHECK-NEXT: fmv.s fa0, fa156; CHECK-NEXT: .LBB2_2:57; CHECK-NEXT: ret58;59; CHECKZFINX-LABEL: select_fcmp_ogt:60; CHECKZFINX: # %bb.0:61; CHECKZFINX-NEXT: flt.s a2, a1, a062; CHECKZFINX-NEXT: bnez a2, .LBB2_263; CHECKZFINX-NEXT: # %bb.1:64; CHECKZFINX-NEXT: mv a0, a165; CHECKZFINX-NEXT: .LBB2_2:66; CHECKZFINX-NEXT: ret67 %1 = fcmp ogt float %a, %b68 %2 = select i1 %1, float %a, float %b69 ret float %270}71 72define float @select_fcmp_oge(float %a, float %b) nounwind {73; CHECK-LABEL: select_fcmp_oge:74; CHECK: # %bb.0:75; CHECK-NEXT: fle.s a0, fa1, fa076; CHECK-NEXT: bnez a0, .LBB3_277; CHECK-NEXT: # %bb.1:78; CHECK-NEXT: fmv.s fa0, fa179; CHECK-NEXT: .LBB3_2:80; CHECK-NEXT: ret81;82; CHECKZFINX-LABEL: select_fcmp_oge:83; CHECKZFINX: # %bb.0:84; CHECKZFINX-NEXT: fle.s a2, a1, a085; CHECKZFINX-NEXT: bnez a2, .LBB3_286; CHECKZFINX-NEXT: # %bb.1:87; CHECKZFINX-NEXT: mv a0, a188; CHECKZFINX-NEXT: .LBB3_2:89; CHECKZFINX-NEXT: ret90 %1 = fcmp oge float %a, %b91 %2 = select i1 %1, float %a, float %b92 ret float %293}94 95define float @select_fcmp_olt(float %a, float %b) nounwind {96; CHECK-LABEL: select_fcmp_olt:97; CHECK: # %bb.0:98; CHECK-NEXT: flt.s a0, fa0, fa199; CHECK-NEXT: bnez a0, .LBB4_2100; CHECK-NEXT: # %bb.1:101; CHECK-NEXT: fmv.s fa0, fa1102; CHECK-NEXT: .LBB4_2:103; CHECK-NEXT: ret104;105; CHECKZFINX-LABEL: select_fcmp_olt:106; CHECKZFINX: # %bb.0:107; CHECKZFINX-NEXT: flt.s a2, a0, a1108; CHECKZFINX-NEXT: bnez a2, .LBB4_2109; CHECKZFINX-NEXT: # %bb.1:110; CHECKZFINX-NEXT: mv a0, a1111; CHECKZFINX-NEXT: .LBB4_2:112; CHECKZFINX-NEXT: ret113 %1 = fcmp olt float %a, %b114 %2 = select i1 %1, float %a, float %b115 ret float %2116}117 118define float @select_fcmp_ole(float %a, float %b) nounwind {119; CHECK-LABEL: select_fcmp_ole:120; CHECK: # %bb.0:121; CHECK-NEXT: fle.s a0, fa0, fa1122; CHECK-NEXT: bnez a0, .LBB5_2123; CHECK-NEXT: # %bb.1:124; CHECK-NEXT: fmv.s fa0, fa1125; CHECK-NEXT: .LBB5_2:126; CHECK-NEXT: ret127;128; CHECKZFINX-LABEL: select_fcmp_ole:129; CHECKZFINX: # %bb.0:130; CHECKZFINX-NEXT: fle.s a2, a0, a1131; CHECKZFINX-NEXT: bnez a2, .LBB5_2132; CHECKZFINX-NEXT: # %bb.1:133; CHECKZFINX-NEXT: mv a0, a1134; CHECKZFINX-NEXT: .LBB5_2:135; CHECKZFINX-NEXT: ret136 %1 = fcmp ole float %a, %b137 %2 = select i1 %1, float %a, float %b138 ret float %2139}140 141define float @select_fcmp_one(float %a, float %b) nounwind {142; CHECK-LABEL: select_fcmp_one:143; CHECK: # %bb.0:144; CHECK-NEXT: flt.s a0, fa0, fa1145; CHECK-NEXT: flt.s a1, fa1, fa0146; CHECK-NEXT: or a0, a1, a0147; CHECK-NEXT: bnez a0, .LBB6_2148; CHECK-NEXT: # %bb.1:149; CHECK-NEXT: fmv.s fa0, fa1150; CHECK-NEXT: .LBB6_2:151; CHECK-NEXT: ret152;153; CHECKZFINX-LABEL: select_fcmp_one:154; CHECKZFINX: # %bb.0:155; CHECKZFINX-NEXT: flt.s a2, a0, a1156; CHECKZFINX-NEXT: flt.s a3, a1, a0157; CHECKZFINX-NEXT: or a2, a3, a2158; CHECKZFINX-NEXT: bnez a2, .LBB6_2159; CHECKZFINX-NEXT: # %bb.1:160; CHECKZFINX-NEXT: mv a0, a1161; CHECKZFINX-NEXT: .LBB6_2:162; CHECKZFINX-NEXT: ret163 %1 = fcmp one float %a, %b164 %2 = select i1 %1, float %a, float %b165 ret float %2166}167 168define float @select_fcmp_ord(float %a, float %b) nounwind {169; CHECK-LABEL: select_fcmp_ord:170; CHECK: # %bb.0:171; CHECK-NEXT: feq.s a0, fa1, fa1172; CHECK-NEXT: feq.s a1, fa0, fa0173; CHECK-NEXT: and a0, a1, a0174; CHECK-NEXT: bnez a0, .LBB7_2175; CHECK-NEXT: # %bb.1:176; CHECK-NEXT: fmv.s fa0, fa1177; CHECK-NEXT: .LBB7_2:178; CHECK-NEXT: ret179;180; CHECKZFINX-LABEL: select_fcmp_ord:181; CHECKZFINX: # %bb.0:182; CHECKZFINX-NEXT: feq.s a2, a1, a1183; CHECKZFINX-NEXT: feq.s a3, a0, a0184; CHECKZFINX-NEXT: and a2, a3, a2185; CHECKZFINX-NEXT: bnez a2, .LBB7_2186; CHECKZFINX-NEXT: # %bb.1:187; CHECKZFINX-NEXT: mv a0, a1188; CHECKZFINX-NEXT: .LBB7_2:189; CHECKZFINX-NEXT: ret190 %1 = fcmp ord float %a, %b191 %2 = select i1 %1, float %a, float %b192 ret float %2193}194 195define float @select_fcmp_ueq(float %a, float %b) nounwind {196; CHECK-LABEL: select_fcmp_ueq:197; CHECK: # %bb.0:198; CHECK-NEXT: flt.s a0, fa0, fa1199; CHECK-NEXT: flt.s a1, fa1, fa0200; CHECK-NEXT: or a0, a1, a0201; CHECK-NEXT: beqz a0, .LBB8_2202; CHECK-NEXT: # %bb.1:203; CHECK-NEXT: fmv.s fa0, fa1204; CHECK-NEXT: .LBB8_2:205; CHECK-NEXT: ret206;207; CHECKZFINX-LABEL: select_fcmp_ueq:208; CHECKZFINX: # %bb.0:209; CHECKZFINX-NEXT: flt.s a2, a0, a1210; CHECKZFINX-NEXT: flt.s a3, a1, a0211; CHECKZFINX-NEXT: or a2, a3, a2212; CHECKZFINX-NEXT: beqz a2, .LBB8_2213; CHECKZFINX-NEXT: # %bb.1:214; CHECKZFINX-NEXT: mv a0, a1215; CHECKZFINX-NEXT: .LBB8_2:216; CHECKZFINX-NEXT: ret217 %1 = fcmp ueq float %a, %b218 %2 = select i1 %1, float %a, float %b219 ret float %2220}221 222define float @select_fcmp_ugt(float %a, float %b) nounwind {223; CHECK-LABEL: select_fcmp_ugt:224; CHECK: # %bb.0:225; CHECK-NEXT: fle.s a0, fa0, fa1226; CHECK-NEXT: beqz a0, .LBB9_2227; CHECK-NEXT: # %bb.1:228; CHECK-NEXT: fmv.s fa0, fa1229; CHECK-NEXT: .LBB9_2:230; CHECK-NEXT: ret231;232; CHECKZFINX-LABEL: select_fcmp_ugt:233; CHECKZFINX: # %bb.0:234; CHECKZFINX-NEXT: fle.s a2, a0, a1235; CHECKZFINX-NEXT: beqz a2, .LBB9_2236; CHECKZFINX-NEXT: # %bb.1:237; CHECKZFINX-NEXT: mv a0, a1238; CHECKZFINX-NEXT: .LBB9_2:239; CHECKZFINX-NEXT: ret240 %1 = fcmp ugt float %a, %b241 %2 = select i1 %1, float %a, float %b242 ret float %2243}244 245define float @select_fcmp_uge(float %a, float %b) nounwind {246; CHECK-LABEL: select_fcmp_uge:247; CHECK: # %bb.0:248; CHECK-NEXT: flt.s a0, fa0, fa1249; CHECK-NEXT: beqz a0, .LBB10_2250; CHECK-NEXT: # %bb.1:251; CHECK-NEXT: fmv.s fa0, fa1252; CHECK-NEXT: .LBB10_2:253; CHECK-NEXT: ret254;255; CHECKZFINX-LABEL: select_fcmp_uge:256; CHECKZFINX: # %bb.0:257; CHECKZFINX-NEXT: flt.s a2, a0, a1258; CHECKZFINX-NEXT: beqz a2, .LBB10_2259; CHECKZFINX-NEXT: # %bb.1:260; CHECKZFINX-NEXT: mv a0, a1261; CHECKZFINX-NEXT: .LBB10_2:262; CHECKZFINX-NEXT: ret263 %1 = fcmp uge float %a, %b264 %2 = select i1 %1, float %a, float %b265 ret float %2266}267 268define float @select_fcmp_ult(float %a, float %b) nounwind {269; CHECK-LABEL: select_fcmp_ult:270; CHECK: # %bb.0:271; CHECK-NEXT: fle.s a0, fa1, fa0272; CHECK-NEXT: beqz a0, .LBB11_2273; CHECK-NEXT: # %bb.1:274; CHECK-NEXT: fmv.s fa0, fa1275; CHECK-NEXT: .LBB11_2:276; CHECK-NEXT: ret277;278; CHECKZFINX-LABEL: select_fcmp_ult:279; CHECKZFINX: # %bb.0:280; CHECKZFINX-NEXT: fle.s a2, a1, a0281; CHECKZFINX-NEXT: beqz a2, .LBB11_2282; CHECKZFINX-NEXT: # %bb.1:283; CHECKZFINX-NEXT: mv a0, a1284; CHECKZFINX-NEXT: .LBB11_2:285; CHECKZFINX-NEXT: ret286 %1 = fcmp ult float %a, %b287 %2 = select i1 %1, float %a, float %b288 ret float %2289}290 291define float @select_fcmp_ule(float %a, float %b) nounwind {292; CHECK-LABEL: select_fcmp_ule:293; CHECK: # %bb.0:294; CHECK-NEXT: flt.s a0, fa1, fa0295; CHECK-NEXT: beqz a0, .LBB12_2296; CHECK-NEXT: # %bb.1:297; CHECK-NEXT: fmv.s fa0, fa1298; CHECK-NEXT: .LBB12_2:299; CHECK-NEXT: ret300;301; CHECKZFINX-LABEL: select_fcmp_ule:302; CHECKZFINX: # %bb.0:303; CHECKZFINX-NEXT: flt.s a2, a1, a0304; CHECKZFINX-NEXT: beqz a2, .LBB12_2305; CHECKZFINX-NEXT: # %bb.1:306; CHECKZFINX-NEXT: mv a0, a1307; CHECKZFINX-NEXT: .LBB12_2:308; CHECKZFINX-NEXT: ret309 %1 = fcmp ule float %a, %b310 %2 = select i1 %1, float %a, float %b311 ret float %2312}313 314define float @select_fcmp_une(float %a, float %b) nounwind {315; CHECK-LABEL: select_fcmp_une:316; CHECK: # %bb.0:317; CHECK-NEXT: feq.s a0, fa0, fa1318; CHECK-NEXT: beqz a0, .LBB13_2319; CHECK-NEXT: # %bb.1:320; CHECK-NEXT: fmv.s fa0, fa1321; CHECK-NEXT: .LBB13_2:322; CHECK-NEXT: ret323;324; CHECKZFINX-LABEL: select_fcmp_une:325; CHECKZFINX: # %bb.0:326; CHECKZFINX-NEXT: feq.s a2, a0, a1327; CHECKZFINX-NEXT: beqz a2, .LBB13_2328; CHECKZFINX-NEXT: # %bb.1:329; CHECKZFINX-NEXT: mv a0, a1330; CHECKZFINX-NEXT: .LBB13_2:331; CHECKZFINX-NEXT: ret332 %1 = fcmp une float %a, %b333 %2 = select i1 %1, float %a, float %b334 ret float %2335}336 337define float @select_fcmp_uno(float %a, float %b) nounwind {338; CHECK-LABEL: select_fcmp_uno:339; CHECK: # %bb.0:340; CHECK-NEXT: feq.s a0, fa1, fa1341; CHECK-NEXT: feq.s a1, fa0, fa0342; CHECK-NEXT: and a0, a1, a0343; CHECK-NEXT: beqz a0, .LBB14_2344; CHECK-NEXT: # %bb.1:345; CHECK-NEXT: fmv.s fa0, fa1346; CHECK-NEXT: .LBB14_2:347; CHECK-NEXT: ret348;349; CHECKZFINX-LABEL: select_fcmp_uno:350; CHECKZFINX: # %bb.0:351; CHECKZFINX-NEXT: feq.s a2, a1, a1352; CHECKZFINX-NEXT: feq.s a3, a0, a0353; CHECKZFINX-NEXT: and a2, a3, a2354; CHECKZFINX-NEXT: beqz a2, .LBB14_2355; CHECKZFINX-NEXT: # %bb.1:356; CHECKZFINX-NEXT: mv a0, a1357; CHECKZFINX-NEXT: .LBB14_2:358; CHECKZFINX-NEXT: ret359 %1 = fcmp uno float %a, %b360 %2 = select i1 %1, float %a, float %b361 ret float %2362}363 364define float @select_fcmp_true(float %a, float %b) nounwind {365; CHECK-LABEL: select_fcmp_true:366; CHECK: # %bb.0:367; CHECK-NEXT: ret368;369; CHECKZFINX-LABEL: select_fcmp_true:370; CHECKZFINX: # %bb.0:371; CHECKZFINX-NEXT: ret372 %1 = fcmp true float %a, %b373 %2 = select i1 %1, float %a, float %b374 ret float %2375}376 377; Ensure that ISel succeeds for a select+fcmp that has an i32 result type.378define i32 @i32_select_fcmp_oeq(float %a, float %b, i32 %c, i32 %d) nounwind {379; CHECK-LABEL: i32_select_fcmp_oeq:380; CHECK: # %bb.0:381; CHECK-NEXT: feq.s a2, fa0, fa1382; CHECK-NEXT: bnez a2, .LBB16_2383; CHECK-NEXT: # %bb.1:384; CHECK-NEXT: mv a0, a1385; CHECK-NEXT: .LBB16_2:386; CHECK-NEXT: ret387;388; CHECKZFINX-LABEL: i32_select_fcmp_oeq:389; CHECKZFINX: # %bb.0:390; CHECKZFINX-NEXT: feq.s a1, a0, a1391; CHECKZFINX-NEXT: mv a0, a2392; CHECKZFINX-NEXT: bnez a1, .LBB16_2393; CHECKZFINX-NEXT: # %bb.1:394; CHECKZFINX-NEXT: mv a0, a3395; CHECKZFINX-NEXT: .LBB16_2:396; CHECKZFINX-NEXT: ret397 %1 = fcmp oeq float %a, %b398 %2 = select i1 %1, i32 %c, i32 %d399 ret i32 %2400}401 402define i32 @select_fcmp_oeq_1_2(float %a, float %b) {403; CHECK-LABEL: select_fcmp_oeq_1_2:404; CHECK: # %bb.0:405; CHECK-NEXT: feq.s a0, fa0, fa1406; CHECK-NEXT: li a1, 2407; CHECK-NEXT: sub a0, a1, a0408; CHECK-NEXT: ret409;410; CHECKZFINX-LABEL: select_fcmp_oeq_1_2:411; CHECKZFINX: # %bb.0:412; CHECKZFINX-NEXT: feq.s a0, a0, a1413; CHECKZFINX-NEXT: li a1, 2414; CHECKZFINX-NEXT: sub a0, a1, a0415; CHECKZFINX-NEXT: ret416 %1 = fcmp fast oeq float %a, %b417 %2 = select i1 %1, i32 1, i32 2418 ret i32 %2419}420 421define signext i32 @select_fcmp_uge_negone_zero(float %a, float %b) nounwind {422; CHECK-LABEL: select_fcmp_uge_negone_zero:423; CHECK: # %bb.0:424; CHECK-NEXT: fle.s a0, fa0, fa1425; CHECK-NEXT: addi a0, a0, -1426; CHECK-NEXT: ret427;428; CHECKZFINX-LABEL: select_fcmp_uge_negone_zero:429; CHECKZFINX: # %bb.0:430; CHECKZFINX-NEXT: fle.s a0, a0, a1431; CHECKZFINX-NEXT: addi a0, a0, -1432; CHECKZFINX-NEXT: ret433 %1 = fcmp ugt float %a, %b434 %2 = select i1 %1, i32 -1, i32 0435 ret i32 %2436}437 438define signext i32 @select_fcmp_uge_1_2(float %a, float %b) nounwind {439; CHECK-LABEL: select_fcmp_uge_1_2:440; CHECK: # %bb.0:441; CHECK-NEXT: fle.s a0, fa0, fa1442; CHECK-NEXT: addi a0, a0, 1443; CHECK-NEXT: ret444;445; CHECKZFINX-LABEL: select_fcmp_uge_1_2:446; CHECKZFINX: # %bb.0:447; CHECKZFINX-NEXT: fle.s a0, a0, a1448; CHECKZFINX-NEXT: addi a0, a0, 1449; CHECKZFINX-NEXT: ret450 %1 = fcmp ugt float %a, %b451 %2 = select i1 %1, i32 1, i32 2452 ret i32 %2453}454 455define float @CascadedSelect(float noundef %a) {456; CHECK-LABEL: CascadedSelect:457; CHECK: # %bb.0: # %entry458; CHECK-NEXT: lui a0, 260096459; CHECK-NEXT: fmv.w.x fa5, a0460; CHECK-NEXT: flt.s a0, fa5, fa0461; CHECK-NEXT: bnez a0, .LBB20_3462; CHECK-NEXT: # %bb.1: # %entry463; CHECK-NEXT: fmv.w.x fa5, zero464; CHECK-NEXT: flt.s a0, fa0, fa5465; CHECK-NEXT: bnez a0, .LBB20_3466; CHECK-NEXT: # %bb.2: # %entry467; CHECK-NEXT: fmv.s fa5, fa0468; CHECK-NEXT: .LBB20_3: # %entry469; CHECK-NEXT: fmv.s fa0, fa5470; CHECK-NEXT: ret471;472; CHECKZFINX-LABEL: CascadedSelect:473; CHECKZFINX: # %bb.0: # %entry474; CHECKZFINX-NEXT: lui a1, 260096475; CHECKZFINX-NEXT: flt.s a2, a1, a0476; CHECKZFINX-NEXT: bnez a2, .LBB20_3477; CHECKZFINX-NEXT: # %bb.1: # %entry478; CHECKZFINX-NEXT: flt.s a2, a0, zero479; CHECKZFINX-NEXT: li a1, 0480; CHECKZFINX-NEXT: bnez a2, .LBB20_3481; CHECKZFINX-NEXT: # %bb.2: # %entry482; CHECKZFINX-NEXT: mv a1, a0483; CHECKZFINX-NEXT: .LBB20_3: # %entry484; CHECKZFINX-NEXT: mv a0, a1485; CHECKZFINX-NEXT: ret486entry:487 %cmp = fcmp ogt float %a, 1.000000e+00488 %cmp1 = fcmp olt float %a, 0.000000e+00489 %.a = select i1 %cmp1, float 0.000000e+00, float %a490 %retval.0 = select i1 %cmp, float 1.000000e+00, float %.a491 ret float %retval.0492}493