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 5;; Test integers selection after integers comparison 6 7define i32 @select_eq(i32 signext %a, i32 signext %b, i32 %x, i32 %y) { 8; LA32-LABEL: select_eq: 9; LA32: # %bb.0: 10; LA32-NEXT: xor $a0, $a0, $a1 11; LA32-NEXT: sltui $a0, $a0, 1 12; LA32-NEXT: masknez $a1, $a3, $a0 13; LA32-NEXT: maskeqz $a0, $a2, $a0 14; LA32-NEXT: or $a0, $a0, $a1 15; LA32-NEXT: ret 16; 17; LA64-LABEL: select_eq: 18; LA64: # %bb.0: 19; LA64-NEXT: xor $a0, $a0, $a1 20; LA64-NEXT: sltui $a0, $a0, 1 21; LA64-NEXT: masknez $a1, $a3, $a0 22; LA64-NEXT: maskeqz $a0, $a2, $a0 23; LA64-NEXT: or $a0, $a0, $a1 24; LA64-NEXT: ret 25 %cond = icmp eq i32 %a, %b 26 %res = select i1 %cond, i32 %x, i32 %y 27 ret i32 %res 28} 29 30define i32 @select_ne(i32 signext %a, i32 signext %b, i32 %x, i32 %y) { 31; LA32-LABEL: select_ne: 32; LA32: # %bb.0: 33; LA32-NEXT: xor $a0, $a0, $a1 34; LA32-NEXT: sltu $a0, $zero, $a0 35; LA32-NEXT: masknez $a1, $a3, $a0 36; LA32-NEXT: maskeqz $a0, $a2, $a0 37; LA32-NEXT: or $a0, $a0, $a1 38; LA32-NEXT: ret 39; 40; LA64-LABEL: select_ne: 41; LA64: # %bb.0: 42; LA64-NEXT: xor $a0, $a0, $a1 43; LA64-NEXT: sltu $a0, $zero, $a0 44; LA64-NEXT: masknez $a1, $a3, $a0 45; LA64-NEXT: maskeqz $a0, $a2, $a0 46; LA64-NEXT: or $a0, $a0, $a1 47; LA64-NEXT: ret 48 %cond = icmp ne i32 %a, %b 49 %res = select i1 %cond, i32 %x, i32 %y 50 ret i32 %res 51} 52 53define i32 @select_ugt(i32 signext %a, i32 signext %b, i32 %x, i32 %y) { 54; LA32-LABEL: select_ugt: 55; LA32: # %bb.0: 56; LA32-NEXT: sltu $a0, $a1, $a0 57; LA32-NEXT: masknez $a1, $a3, $a0 58; LA32-NEXT: maskeqz $a0, $a2, $a0 59; LA32-NEXT: or $a0, $a0, $a1 60; LA32-NEXT: ret 61; 62; LA64-LABEL: select_ugt: 63; LA64: # %bb.0: 64; LA64-NEXT: sltu $a0, $a1, $a0 65; LA64-NEXT: masknez $a1, $a3, $a0 66; LA64-NEXT: maskeqz $a0, $a2, $a0 67; LA64-NEXT: or $a0, $a0, $a1 68; LA64-NEXT: ret 69 %cond = icmp ugt i32 %a, %b 70 %res = select i1 %cond, i32 %x, i32 %y 71 ret i32 %res 72} 73 74define i32 @select_uge(i32 signext %a, i32 signext %b, i32 %x, i32 %y) { 75; LA32-LABEL: select_uge: 76; LA32: # %bb.0: 77; LA32-NEXT: sltu $a0, $a0, $a1 78; LA32-NEXT: xori $a0, $a0, 1 79; LA32-NEXT: masknez $a1, $a3, $a0 80; LA32-NEXT: maskeqz $a0, $a2, $a0 81; LA32-NEXT: or $a0, $a0, $a1 82; LA32-NEXT: ret 83; 84; LA64-LABEL: select_uge: 85; LA64: # %bb.0: 86; LA64-NEXT: sltu $a0, $a0, $a1 87; LA64-NEXT: xori $a0, $a0, 1 88; LA64-NEXT: masknez $a1, $a3, $a0 89; LA64-NEXT: maskeqz $a0, $a2, $a0 90; LA64-NEXT: or $a0, $a0, $a1 91; LA64-NEXT: ret 92 %cond = icmp uge i32 %a, %b 93 %res = select i1 %cond, i32 %x, i32 %y 94 ret i32 %res 95} 96 97define i32 @select_ult(i32 signext %a, i32 signext %b, i32 %x, i32 %y) { 98; LA32-LABEL: select_ult: 99; LA32: # %bb.0: 100; LA32-NEXT: sltu $a0, $a0, $a1 101; LA32-NEXT: masknez $a1, $a3, $a0 102; LA32-NEXT: maskeqz $a0, $a2, $a0 103; LA32-NEXT: or $a0, $a0, $a1 104; LA32-NEXT: ret 105; 106; LA64-LABEL: select_ult: 107; LA64: # %bb.0: 108; LA64-NEXT: sltu $a0, $a0, $a1 109; LA64-NEXT: masknez $a1, $a3, $a0 110; LA64-NEXT: maskeqz $a0, $a2, $a0 111; LA64-NEXT: or $a0, $a0, $a1 112; LA64-NEXT: ret 113 %cond = icmp ult i32 %a, %b 114 %res = select i1 %cond, i32 %x, i32 %y 115 ret i32 %res 116} 117 118define i32 @select_ule(i32 signext %a, i32 signext %b, i32 %x, i32 %y) { 119; LA32-LABEL: select_ule: 120; LA32: # %bb.0: 121; LA32-NEXT: sltu $a0, $a1, $a0 122; LA32-NEXT: xori $a0, $a0, 1 123; LA32-NEXT: masknez $a1, $a3, $a0 124; LA32-NEXT: maskeqz $a0, $a2, $a0 125; LA32-NEXT: or $a0, $a0, $a1 126; LA32-NEXT: ret 127; 128; LA64-LABEL: select_ule: 129; LA64: # %bb.0: 130; LA64-NEXT: sltu $a0, $a1, $a0 131; LA64-NEXT: xori $a0, $a0, 1 132; LA64-NEXT: masknez $a1, $a3, $a0 133; LA64-NEXT: maskeqz $a0, $a2, $a0 134; LA64-NEXT: or $a0, $a0, $a1 135; LA64-NEXT: ret 136 %cond = icmp ule i32 %a, %b 137 %res = select i1 %cond, i32 %x, i32 %y 138 ret i32 %res 139} 140 141define i32 @select_sgt(i32 signext %a, i32 signext %b, i32 %x, i32 %y) { 142; LA32-LABEL: select_sgt: 143; LA32: # %bb.0: 144; LA32-NEXT: slt $a0, $a1, $a0 145; LA32-NEXT: masknez $a1, $a3, $a0 146; LA32-NEXT: maskeqz $a0, $a2, $a0 147; LA32-NEXT: or $a0, $a0, $a1 148; LA32-NEXT: ret 149; 150; LA64-LABEL: select_sgt: 151; LA64: # %bb.0: 152; LA64-NEXT: slt $a0, $a1, $a0 153; LA64-NEXT: masknez $a1, $a3, $a0 154; LA64-NEXT: maskeqz $a0, $a2, $a0 155; LA64-NEXT: or $a0, $a0, $a1 156; LA64-NEXT: ret 157 %cond = icmp sgt i32 %a, %b 158 %res = select i1 %cond, i32 %x, i32 %y 159 ret i32 %res 160} 161 162define i32 @select_sge(i32 signext %a, i32 signext %b, i32 %x, i32 %y) { 163; LA32-LABEL: select_sge: 164; LA32: # %bb.0: 165; LA32-NEXT: slt $a0, $a0, $a1 166; LA32-NEXT: xori $a0, $a0, 1 167; LA32-NEXT: masknez $a1, $a3, $a0 168; LA32-NEXT: maskeqz $a0, $a2, $a0 169; LA32-NEXT: or $a0, $a0, $a1 170; LA32-NEXT: ret 171; 172; LA64-LABEL: select_sge: 173; LA64: # %bb.0: 174; LA64-NEXT: slt $a0, $a0, $a1 175; LA64-NEXT: xori $a0, $a0, 1 176; LA64-NEXT: masknez $a1, $a3, $a0 177; LA64-NEXT: maskeqz $a0, $a2, $a0 178; LA64-NEXT: or $a0, $a0, $a1 179; LA64-NEXT: ret 180 %cond = icmp sge i32 %a, %b 181 %res = select i1 %cond, i32 %x, i32 %y 182 ret i32 %res 183} 184 185define i32 @select_slt(i32 signext %a, i32 signext %b, i32 %x, i32 %y) { 186; LA32-LABEL: select_slt: 187; LA32: # %bb.0: 188; LA32-NEXT: slt $a0, $a0, $a1 189; LA32-NEXT: masknez $a1, $a3, $a0 190; LA32-NEXT: maskeqz $a0, $a2, $a0 191; LA32-NEXT: or $a0, $a0, $a1 192; LA32-NEXT: ret 193; 194; LA64-LABEL: select_slt: 195; LA64: # %bb.0: 196; LA64-NEXT: slt $a0, $a0, $a1 197; LA64-NEXT: masknez $a1, $a3, $a0 198; LA64-NEXT: maskeqz $a0, $a2, $a0 199; LA64-NEXT: or $a0, $a0, $a1 200; LA64-NEXT: ret 201 %cond = icmp slt i32 %a, %b 202 %res = select i1 %cond, i32 %x, i32 %y 203 ret i32 %res 204} 205 206define i32 @select_sle(i32 signext %a, i32 signext %b, i32 %x, i32 %y) { 207; LA32-LABEL: select_sle: 208; LA32: # %bb.0: 209; LA32-NEXT: slt $a0, $a1, $a0 210; LA32-NEXT: xori $a0, $a0, 1 211; LA32-NEXT: masknez $a1, $a3, $a0 212; LA32-NEXT: maskeqz $a0, $a2, $a0 213; LA32-NEXT: or $a0, $a0, $a1 214; LA32-NEXT: ret 215; 216; LA64-LABEL: select_sle: 217; LA64: # %bb.0: 218; LA64-NEXT: slt $a0, $a1, $a0 219; LA64-NEXT: xori $a0, $a0, 1 220; LA64-NEXT: masknez $a1, $a3, $a0 221; LA64-NEXT: maskeqz $a0, $a2, $a0 222; LA64-NEXT: or $a0, $a0, $a1 223; LA64-NEXT: ret 224 %cond = icmp sle i32 %a, %b 225 %res = select i1 %cond, i32 %x, i32 %y 226 ret i32 %res 227} 228