1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA32 3; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA64 4 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, 4 9; LA32-NEXT: sub.w $a0, $a1, $a0 10; LA32-NEXT: ret 11; 12; LA64-LABEL: select_const_int_one_away: 13; LA64: # %bb.0: 14; LA64-NEXT: ori $a1, $zero, 4 15; LA64-NEXT: sub.d $a0, $a1, $a0 16; LA64-NEXT: ret 17 %1 = select i1 %a, i32 3, i32 4 18 ret i32 %1 19} 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, 2 25; LA32-NEXT: ret 26; 27; LA64-LABEL: select_const_int_pow2_zero: 28; LA64: # %bb.0: 29; LA64-NEXT: slli.d $a0, $a0, 2 30; LA64-NEXT: ret 31 %1 = select i1 %a, i32 4, i32 0 32 ret i32 %1 33} 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, $a1 39; LA32-NEXT: sltui $a0, $a0, 1 40; LA32-NEXT: sub.w $a0, $zero, $a0 41; LA32-NEXT: ret 42; 43; LA64-LABEL: select_eq_zero_negone: 44; LA64: # %bb.0: 45; LA64-NEXT: xor $a0, $a0, $a1 46; LA64-NEXT: sltui $a0, $a0, 1 47; LA64-NEXT: sub.d $a0, $zero, $a0 48; LA64-NEXT: ret 49 %1 = icmp eq i32 %a, %b 50 %2 = select i1 %1, i32 -1, i32 0 51 ret i32 %2 52} 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, $a1 58; LA32-NEXT: sltu $a0, $zero, $a0 59; LA32-NEXT: sub.w $a0, $zero, $a0 60; LA32-NEXT: ret 61; 62; LA64-LABEL: select_ne_zero_negone: 63; LA64: # %bb.0: 64; LA64-NEXT: xor $a0, $a0, $a1 65; LA64-NEXT: sltu $a0, $zero, $a0 66; LA64-NEXT: sub.d $a0, $zero, $a0 67; LA64-NEXT: ret 68 %1 = icmp ne i32 %a, %b 69 %2 = select i1 %1, i32 -1, i32 0 70 ret i32 %2 71} 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, $a0 77; LA32-NEXT: sub.w $a0, $zero, $a0 78; LA32-NEXT: ret 79; 80; LA64-LABEL: select_sgt_zero_negone: 81; LA64: # %bb.0: 82; LA64-NEXT: slt $a0, $a1, $a0 83; LA64-NEXT: sub.d $a0, $zero, $a0 84; LA64-NEXT: ret 85 %1 = icmp sgt i32 %a, %b 86 %2 = select i1 %1, i32 -1, i32 0 87 ret i32 %2 88} 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, $a1 94; LA32-NEXT: sub.w $a0, $zero, $a0 95; LA32-NEXT: ret 96; 97; LA64-LABEL: select_slt_zero_negone: 98; LA64: # %bb.0: 99; LA64-NEXT: slt $a0, $a0, $a1 100; LA64-NEXT: sub.d $a0, $zero, $a0 101; LA64-NEXT: ret 102 %1 = icmp slt i32 %a, %b 103 %2 = select i1 %1, i32 -1, i32 0 104 ret i32 %2 105} 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, $a1 111; LA32-NEXT: xori $a0, $a0, 1 112; LA32-NEXT: sub.w $a0, $zero, $a0 113; LA32-NEXT: ret 114; 115; LA64-LABEL: select_sge_zero_negone: 116; LA64: # %bb.0: 117; LA64-NEXT: slt $a0, $a0, $a1 118; LA64-NEXT: xori $a0, $a0, 1 119; LA64-NEXT: sub.d $a0, $zero, $a0 120; LA64-NEXT: ret 121 %1 = icmp sge i32 %a, %b 122 %2 = select i1 %1, i32 -1, i32 0 123 ret i32 %2 124} 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, $a0 130; LA32-NEXT: xori $a0, $a0, 1 131; LA32-NEXT: sub.w $a0, $zero, $a0 132; LA32-NEXT: ret 133; 134; LA64-LABEL: select_sle_zero_negone: 135; LA64: # %bb.0: 136; LA64-NEXT: slt $a0, $a1, $a0 137; LA64-NEXT: xori $a0, $a0, 1 138; LA64-NEXT: sub.d $a0, $zero, $a0 139; LA64-NEXT: ret 140 %1 = icmp sle i32 %a, %b 141 %2 = select i1 %1, i32 -1, i32 0 142 ret i32 %2 143} 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, $a0 149; LA32-NEXT: sub.w $a0, $zero, $a0 150; LA32-NEXT: ret 151; 152; LA64-LABEL: select_ugt_zero_negone: 153; LA64: # %bb.0: 154; LA64-NEXT: sltu $a0, $a1, $a0 155; LA64-NEXT: sub.d $a0, $zero, $a0 156; LA64-NEXT: ret 157 %1 = icmp ugt i32 %a, %b 158 %2 = select i1 %1, i32 -1, i32 0 159 ret i32 %2 160} 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, $a1 166; LA32-NEXT: sub.w $a0, $zero, $a0 167; LA32-NEXT: ret 168; 169; LA64-LABEL: select_ult_zero_negone: 170; LA64: # %bb.0: 171; LA64-NEXT: sltu $a0, $a0, $a1 172; LA64-NEXT: sub.d $a0, $zero, $a0 173; LA64-NEXT: ret 174 %1 = icmp ult i32 %a, %b 175 %2 = select i1 %1, i32 -1, i32 0 176 ret i32 %2 177} 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, $a1 183; LA32-NEXT: xori $a0, $a0, 1 184; LA32-NEXT: sub.w $a0, $zero, $a0 185; LA32-NEXT: ret 186; 187; LA64-LABEL: select_uge_zero_negone: 188; LA64: # %bb.0: 189; LA64-NEXT: sltu $a0, $a0, $a1 190; LA64-NEXT: xori $a0, $a0, 1 191; LA64-NEXT: sub.d $a0, $zero, $a0 192; LA64-NEXT: ret 193 %1 = icmp uge i32 %a, %b 194 %2 = select i1 %1, i32 -1, i32 0 195 ret i32 %2 196} 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, $a0 202; LA32-NEXT: xori $a0, $a0, 1 203; LA32-NEXT: sub.w $a0, $zero, $a0 204; LA32-NEXT: ret 205; 206; LA64-LABEL: select_ule_zero_negone: 207; LA64: # %bb.0: 208; LA64-NEXT: sltu $a0, $a1, $a0 209; LA64-NEXT: xori $a0, $a0, 1 210; LA64-NEXT: sub.d $a0, $zero, $a0 211; LA64-NEXT: ret 212 %1 = icmp ule i32 %a, %b 213 %2 = select i1 %1, i32 -1, i32 0 214 ret i32 %2 215} 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, $a1 221; LA32-NEXT: sltui $a0, $a0, 1 222; LA32-NEXT: ori $a1, $zero, 2 223; LA32-NEXT: sub.w $a0, $a1, $a0 224; LA32-NEXT: ret 225; 226; LA64-LABEL: select_eq_1_2: 227; LA64: # %bb.0: 228; LA64-NEXT: xor $a0, $a0, $a1 229; LA64-NEXT: sltui $a0, $a0, 1 230; LA64-NEXT: ori $a1, $zero, 2 231; LA64-NEXT: sub.d $a0, $a1, $a0 232; LA64-NEXT: ret 233 %1 = icmp eq i32 %a, %b 234 %2 = select i1 %1, i32 1, i32 2 235 ret i32 %2 236} 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, $a1 242; LA32-NEXT: sltu $a0, $zero, $a0 243; LA32-NEXT: ori $a1, $zero, 2 244; LA32-NEXT: sub.w $a0, $a1, $a0 245; LA32-NEXT: ret 246; 247; LA64-LABEL: select_ne_1_2: 248; LA64: # %bb.0: 249; LA64-NEXT: xor $a0, $a0, $a1 250; LA64-NEXT: sltu $a0, $zero, $a0 251; LA64-NEXT: ori $a1, $zero, 2 252; LA64-NEXT: sub.d $a0, $a1, $a0 253; LA64-NEXT: ret 254 %1 = icmp ne i32 %a, %b 255 %2 = select i1 %1, i32 1, i32 2 256 ret i32 %2 257} 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, $a1 263; LA32-NEXT: sltui $a0, $a0, 1 264; LA32-NEXT: lu12i.w $a1, 2 265; LA32-NEXT: ori $a1, $a1, 1810 266; LA32-NEXT: sub.w $a0, $a1, $a0 267; LA32-NEXT: ret 268; 269; LA64-LABEL: select_eq_10000_10001: 270; LA64: # %bb.0: 271; LA64-NEXT: xor $a0, $a0, $a1 272; LA64-NEXT: sltui $a0, $a0, 1 273; LA64-NEXT: lu12i.w $a1, 2 274; LA64-NEXT: ori $a1, $a1, 1810 275; LA64-NEXT: sub.d $a0, $a1, $a0 276; LA64-NEXT: ret 277 %1 = icmp eq i32 %a, %b 278 %2 = select i1 %1, i32 10001, i32 10002 279 ret i32 %2 280} 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, $a1 286; LA32-NEXT: sltu $a0, $zero, $a0 287; LA32-NEXT: lu12i.w $a1, 2 288; LA32-NEXT: ori $a1, $a1, 1810 289; LA32-NEXT: sub.w $a0, $a1, $a0 290; LA32-NEXT: ret 291; 292; LA64-LABEL: select_ne_10001_10002: 293; LA64: # %bb.0: 294; LA64-NEXT: xor $a0, $a0, $a1 295; LA64-NEXT: sltu $a0, $zero, $a0 296; LA64-NEXT: lu12i.w $a1, 2 297; LA64-NEXT: ori $a1, $a1, 1810 298; LA64-NEXT: sub.d $a0, $a1, $a0 299; LA64-NEXT: ret 300 %1 = icmp ne i32 %a, %b 301 %2 = select i1 %1, i32 10001, i32 10002 302 ret i32 %2 303} 304