326 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA323; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA644 5define signext i32 @select_const_int_one_away(i1 zeroext %a) nounwind {6; LA32-LABEL: select_const_int_one_away:7; LA32: # %bb.0:8; LA32-NEXT: ori $a1, $zero, 49; LA32-NEXT: sub.w $a0, $a1, $a010; LA32-NEXT: ret11;12; LA64-LABEL: select_const_int_one_away:13; LA64: # %bb.0:14; LA64-NEXT: ori $a1, $zero, 415; LA64-NEXT: sub.d $a0, $a1, $a016; LA64-NEXT: ret17 %1 = select i1 %a, i32 3, i32 418 ret i32 %119}20 21define signext i32 @select_const_int_pow2_zero(i1 zeroext %a) nounwind {22; LA32-LABEL: select_const_int_pow2_zero:23; LA32: # %bb.0:24; LA32-NEXT: slli.w $a0, $a0, 225; LA32-NEXT: ret26;27; LA64-LABEL: select_const_int_pow2_zero:28; LA64: # %bb.0:29; LA64-NEXT: slli.d $a0, $a0, 230; LA64-NEXT: ret31 %1 = select i1 %a, i32 4, i32 032 ret i32 %133}34 35define signext i32 @select_eq_zero_negone(i32 signext %a, i32 signext %b) nounwind {36; LA32-LABEL: select_eq_zero_negone:37; LA32: # %bb.0:38; LA32-NEXT: xor $a0, $a0, $a139; LA32-NEXT: sltui $a0, $a0, 140; LA32-NEXT: sub.w $a0, $zero, $a041; LA32-NEXT: ret42;43; LA64-LABEL: select_eq_zero_negone:44; LA64: # %bb.0:45; LA64-NEXT: xor $a0, $a0, $a146; LA64-NEXT: sltui $a0, $a0, 147; LA64-NEXT: sub.d $a0, $zero, $a048; LA64-NEXT: ret49 %1 = icmp eq i32 %a, %b50 %2 = select i1 %1, i32 -1, i32 051 ret i32 %252}53 54define signext i32 @select_ne_zero_negone(i32 signext %a, i32 signext %b) nounwind {55; LA32-LABEL: select_ne_zero_negone:56; LA32: # %bb.0:57; LA32-NEXT: xor $a0, $a0, $a158; LA32-NEXT: sltu $a0, $zero, $a059; LA32-NEXT: sub.w $a0, $zero, $a060; LA32-NEXT: ret61;62; LA64-LABEL: select_ne_zero_negone:63; LA64: # %bb.0:64; LA64-NEXT: xor $a0, $a0, $a165; LA64-NEXT: sltu $a0, $zero, $a066; LA64-NEXT: sub.d $a0, $zero, $a067; LA64-NEXT: ret68 %1 = icmp ne i32 %a, %b69 %2 = select i1 %1, i32 -1, i32 070 ret i32 %271}72 73define signext i32 @select_sgt_zero_negone(i32 signext %a, i32 signext %b) nounwind {74; LA32-LABEL: select_sgt_zero_negone:75; LA32: # %bb.0:76; LA32-NEXT: slt $a0, $a1, $a077; LA32-NEXT: sub.w $a0, $zero, $a078; LA32-NEXT: ret79;80; LA64-LABEL: select_sgt_zero_negone:81; LA64: # %bb.0:82; LA64-NEXT: slt $a0, $a1, $a083; LA64-NEXT: sub.d $a0, $zero, $a084; LA64-NEXT: ret85 %1 = icmp sgt i32 %a, %b86 %2 = select i1 %1, i32 -1, i32 087 ret i32 %288}89 90define signext i32 @select_slt_zero_negone(i32 signext %a, i32 signext %b) nounwind {91; LA32-LABEL: select_slt_zero_negone:92; LA32: # %bb.0:93; LA32-NEXT: slt $a0, $a0, $a194; LA32-NEXT: sub.w $a0, $zero, $a095; LA32-NEXT: ret96;97; LA64-LABEL: select_slt_zero_negone:98; LA64: # %bb.0:99; LA64-NEXT: slt $a0, $a0, $a1100; LA64-NEXT: sub.d $a0, $zero, $a0101; LA64-NEXT: ret102 %1 = icmp slt i32 %a, %b103 %2 = select i1 %1, i32 -1, i32 0104 ret i32 %2105}106 107define signext i32 @select_sge_zero_negone(i32 signext %a, i32 signext %b) nounwind {108; LA32-LABEL: select_sge_zero_negone:109; LA32: # %bb.0:110; LA32-NEXT: slt $a0, $a0, $a1111; LA32-NEXT: xori $a0, $a0, 1112; LA32-NEXT: sub.w $a0, $zero, $a0113; LA32-NEXT: ret114;115; LA64-LABEL: select_sge_zero_negone:116; LA64: # %bb.0:117; LA64-NEXT: slt $a0, $a0, $a1118; LA64-NEXT: xori $a0, $a0, 1119; LA64-NEXT: sub.d $a0, $zero, $a0120; LA64-NEXT: ret121 %1 = icmp sge i32 %a, %b122 %2 = select i1 %1, i32 -1, i32 0123 ret i32 %2124}125 126define signext i32 @select_sle_zero_negone(i32 signext %a, i32 signext %b) nounwind {127; LA32-LABEL: select_sle_zero_negone:128; LA32: # %bb.0:129; LA32-NEXT: slt $a0, $a1, $a0130; LA32-NEXT: xori $a0, $a0, 1131; LA32-NEXT: sub.w $a0, $zero, $a0132; LA32-NEXT: ret133;134; LA64-LABEL: select_sle_zero_negone:135; LA64: # %bb.0:136; LA64-NEXT: slt $a0, $a1, $a0137; LA64-NEXT: xori $a0, $a0, 1138; LA64-NEXT: sub.d $a0, $zero, $a0139; LA64-NEXT: ret140 %1 = icmp sle i32 %a, %b141 %2 = select i1 %1, i32 -1, i32 0142 ret i32 %2143}144 145define signext i32 @select_ugt_zero_negone(i32 signext %a, i32 signext %b) nounwind {146; LA32-LABEL: select_ugt_zero_negone:147; LA32: # %bb.0:148; LA32-NEXT: sltu $a0, $a1, $a0149; LA32-NEXT: sub.w $a0, $zero, $a0150; LA32-NEXT: ret151;152; LA64-LABEL: select_ugt_zero_negone:153; LA64: # %bb.0:154; LA64-NEXT: sltu $a0, $a1, $a0155; LA64-NEXT: sub.d $a0, $zero, $a0156; LA64-NEXT: ret157 %1 = icmp ugt i32 %a, %b158 %2 = select i1 %1, i32 -1, i32 0159 ret i32 %2160}161 162define signext i32 @select_ult_zero_negone(i32 signext %a, i32 signext %b) nounwind {163; LA32-LABEL: select_ult_zero_negone:164; LA32: # %bb.0:165; LA32-NEXT: sltu $a0, $a0, $a1166; LA32-NEXT: sub.w $a0, $zero, $a0167; LA32-NEXT: ret168;169; LA64-LABEL: select_ult_zero_negone:170; LA64: # %bb.0:171; LA64-NEXT: sltu $a0, $a0, $a1172; LA64-NEXT: sub.d $a0, $zero, $a0173; LA64-NEXT: ret174 %1 = icmp ult i32 %a, %b175 %2 = select i1 %1, i32 -1, i32 0176 ret i32 %2177}178 179define signext i32 @select_uge_zero_negone(i32 signext %a, i32 signext %b) nounwind {180; LA32-LABEL: select_uge_zero_negone:181; LA32: # %bb.0:182; LA32-NEXT: sltu $a0, $a0, $a1183; LA32-NEXT: xori $a0, $a0, 1184; LA32-NEXT: sub.w $a0, $zero, $a0185; LA32-NEXT: ret186;187; LA64-LABEL: select_uge_zero_negone:188; LA64: # %bb.0:189; LA64-NEXT: sltu $a0, $a0, $a1190; LA64-NEXT: xori $a0, $a0, 1191; LA64-NEXT: sub.d $a0, $zero, $a0192; LA64-NEXT: ret193 %1 = icmp uge i32 %a, %b194 %2 = select i1 %1, i32 -1, i32 0195 ret i32 %2196}197 198define signext i32 @select_ule_zero_negone(i32 signext %a, i32 signext %b) nounwind {199; LA32-LABEL: select_ule_zero_negone:200; LA32: # %bb.0:201; LA32-NEXT: sltu $a0, $a1, $a0202; LA32-NEXT: xori $a0, $a0, 1203; LA32-NEXT: sub.w $a0, $zero, $a0204; LA32-NEXT: ret205;206; LA64-LABEL: select_ule_zero_negone:207; LA64: # %bb.0:208; LA64-NEXT: sltu $a0, $a1, $a0209; LA64-NEXT: xori $a0, $a0, 1210; LA64-NEXT: sub.d $a0, $zero, $a0211; LA64-NEXT: ret212 %1 = icmp ule i32 %a, %b213 %2 = select i1 %1, i32 -1, i32 0214 ret i32 %2215}216 217define i32 @select_eq_1_2(i32 signext %a, i32 signext %b) {218; LA32-LABEL: select_eq_1_2:219; LA32: # %bb.0:220; LA32-NEXT: xor $a0, $a0, $a1221; LA32-NEXT: sltui $a0, $a0, 1222; LA32-NEXT: ori $a1, $zero, 2223; LA32-NEXT: sub.w $a0, $a1, $a0224; LA32-NEXT: ret225;226; LA64-LABEL: select_eq_1_2:227; LA64: # %bb.0:228; LA64-NEXT: xor $a0, $a0, $a1229; LA64-NEXT: sltui $a0, $a0, 1230; LA64-NEXT: ori $a1, $zero, 2231; LA64-NEXT: sub.d $a0, $a1, $a0232; LA64-NEXT: ret233 %1 = icmp eq i32 %a, %b234 %2 = select i1 %1, i32 1, i32 2235 ret i32 %2236}237 238define i32 @select_ne_1_2(i32 signext %a, i32 signext %b) {239; LA32-LABEL: select_ne_1_2:240; LA32: # %bb.0:241; LA32-NEXT: xor $a0, $a0, $a1242; LA32-NEXT: sltu $a0, $zero, $a0243; LA32-NEXT: ori $a1, $zero, 2244; LA32-NEXT: sub.w $a0, $a1, $a0245; LA32-NEXT: ret246;247; LA64-LABEL: select_ne_1_2:248; LA64: # %bb.0:249; LA64-NEXT: xor $a0, $a0, $a1250; LA64-NEXT: sltu $a0, $zero, $a0251; LA64-NEXT: ori $a1, $zero, 2252; LA64-NEXT: sub.d $a0, $a1, $a0253; LA64-NEXT: ret254 %1 = icmp ne i32 %a, %b255 %2 = select i1 %1, i32 1, i32 2256 ret i32 %2257}258 259define i32 @select_eq_10000_10001(i32 signext %a, i32 signext %b) {260; LA32-LABEL: select_eq_10000_10001:261; LA32: # %bb.0:262; LA32-NEXT: xor $a0, $a0, $a1263; LA32-NEXT: sltui $a0, $a0, 1264; LA32-NEXT: lu12i.w $a1, 2265; LA32-NEXT: ori $a1, $a1, 1810266; LA32-NEXT: sub.w $a0, $a1, $a0267; LA32-NEXT: ret268;269; LA64-LABEL: select_eq_10000_10001:270; LA64: # %bb.0:271; LA64-NEXT: xor $a0, $a0, $a1272; LA64-NEXT: sltui $a0, $a0, 1273; LA64-NEXT: lu12i.w $a1, 2274; LA64-NEXT: ori $a1, $a1, 1810275; LA64-NEXT: sub.d $a0, $a1, $a0276; LA64-NEXT: ret277 %1 = icmp eq i32 %a, %b278 %2 = select i1 %1, i32 10001, i32 10002279 ret i32 %2280}281 282define i32 @select_ne_10001_10002(i32 signext %a, i32 signext %b) {283; LA32-LABEL: select_ne_10001_10002:284; LA32: # %bb.0:285; LA32-NEXT: xor $a0, $a0, $a1286; LA32-NEXT: sltu $a0, $zero, $a0287; LA32-NEXT: lu12i.w $a1, 2288; LA32-NEXT: ori $a1, $a1, 1810289; LA32-NEXT: sub.w $a0, $a1, $a0290; LA32-NEXT: ret291;292; LA64-LABEL: select_ne_10001_10002:293; LA64: # %bb.0:294; LA64-NEXT: xor $a0, $a0, $a1295; LA64-NEXT: sltu $a0, $zero, $a0296; LA64-NEXT: lu12i.w $a1, 2297; LA64-NEXT: ori $a1, $a1, 1810298; LA64-NEXT: sub.d $a0, $a1, $a0299; LA64-NEXT: ret300 %1 = icmp ne i32 %a, %b301 %2 = select i1 %1, i32 10001, i32 10002302 ret i32 %2303}304 305define i32 @select_slt_zero_constant1_constant2(i32 signext %x) {306; LA32-LABEL: select_slt_zero_constant1_constant2:307; LA32: # %bb.0:308; LA32-NEXT: srai.w $a0, $a0, 31309; LA32-NEXT: andi $a0, $a0, 10310; LA32-NEXT: addi.w $a0, $a0, -3311; LA32-NEXT: ret312;313; LA64-LABEL: select_slt_zero_constant1_constant2:314; LA64: # %bb.0:315; LA64-NEXT: slti $a0, $a0, 0316; LA64-NEXT: addi.w $a1, $zero, -3317; LA64-NEXT: masknez $a1, $a1, $a0318; LA64-NEXT: ori $a2, $zero, 7319; LA64-NEXT: maskeqz $a0, $a2, $a0320; LA64-NEXT: or $a0, $a0, $a1321; LA64-NEXT: ret322 %cmp = icmp slt i32 %x, 0323 %cond = select i1 %cmp, i32 7, i32 -3324 ret i32 %cond325}326