1; RUN: llc --mtriple=loongarch32 < %s | FileCheck %s --check-prefix=LA32 2; RUN: llc --mtriple=loongarch64 < %s | FileCheck %s --check-prefix=LA64 3 4;; Exercise the 'icmp' LLVM IR: https://llvm.org/docs/LangRef.html#icmp-instruction 5 6define i1 @icmp_eq(i32 signext %a, i32 signext %b) { 7; LA32-LABEL: icmp_eq: 8; LA32: # %bb.0: 9; LA32-NEXT: xor $a0, $a0, $a1 10; LA32-NEXT: sltui $a0, $a0, 1 11; LA32-NEXT: jirl $zero, $ra, 0 12; 13; LA64-LABEL: icmp_eq: 14; LA64: # %bb.0: 15; LA64-NEXT: xor $a0, $a0, $a1 16; LA64-NEXT: sltui $a0, $a0, 1 17; LA64-NEXT: jirl $zero, $ra, 0 18 %res = icmp eq i32 %a, %b 19 ret i1 %res 20} 21 22define i1 @icmp_ne(i32 signext %a, i32 signext %b) { 23; LA32-LABEL: icmp_ne: 24; LA32: # %bb.0: 25; LA32-NEXT: xor $a0, $a0, $a1 26; LA32-NEXT: sltu $a0, $zero, $a0 27; LA32-NEXT: jirl $zero, $ra, 0 28; 29; LA64-LABEL: icmp_ne: 30; LA64: # %bb.0: 31; LA64-NEXT: xor $a0, $a0, $a1 32; LA64-NEXT: sltu $a0, $zero, $a0 33; LA64-NEXT: jirl $zero, $ra, 0 34 %res = icmp ne i32 %a, %b 35 ret i1 %res 36} 37 38define i1 @icmp_ugt(i32 signext %a, i32 signext %b) { 39; LA32-LABEL: icmp_ugt: 40; LA32: # %bb.0: 41; LA32-NEXT: sltu $a0, $a1, $a0 42; LA32-NEXT: jirl $zero, $ra, 0 43; 44; LA64-LABEL: icmp_ugt: 45; LA64: # %bb.0: 46; LA64-NEXT: sltu $a0, $a1, $a0 47; LA64-NEXT: jirl $zero, $ra, 0 48 %res = icmp ugt i32 %a, %b 49 ret i1 %res 50} 51 52define i1 @icmp_uge(i32 signext %a, i32 signext %b) { 53; LA32-LABEL: icmp_uge: 54; LA32: # %bb.0: 55; LA32-NEXT: sltu $a0, $a0, $a1 56; LA32-NEXT: xori $a0, $a0, 1 57; LA32-NEXT: jirl $zero, $ra, 0 58; 59; LA64-LABEL: icmp_uge: 60; LA64: # %bb.0: 61; LA64-NEXT: sltu $a0, $a0, $a1 62; LA64-NEXT: xori $a0, $a0, 1 63; LA64-NEXT: jirl $zero, $ra, 0 64 %res = icmp uge i32 %a, %b 65 ret i1 %res 66} 67 68define i1 @icmp_ult(i32 signext %a, i32 signext %b) { 69; LA32-LABEL: icmp_ult: 70; LA32: # %bb.0: 71; LA32-NEXT: sltu $a0, $a0, $a1 72; LA32-NEXT: jirl $zero, $ra, 0 73; 74; LA64-LABEL: icmp_ult: 75; LA64: # %bb.0: 76; LA64-NEXT: sltu $a0, $a0, $a1 77; LA64-NEXT: jirl $zero, $ra, 0 78 %res = icmp ult i32 %a, %b 79 ret i1 %res 80} 81 82define i1 @icmp_ule(i32 signext %a, i32 signext %b) { 83; LA32-LABEL: icmp_ule: 84; LA32: # %bb.0: 85; LA32-NEXT: sltu $a0, $a1, $a0 86; LA32-NEXT: xori $a0, $a0, 1 87; LA32-NEXT: jirl $zero, $ra, 0 88; 89; LA64-LABEL: icmp_ule: 90; LA64: # %bb.0: 91; LA64-NEXT: sltu $a0, $a1, $a0 92; LA64-NEXT: xori $a0, $a0, 1 93; LA64-NEXT: jirl $zero, $ra, 0 94 %res = icmp ule i32 %a, %b 95 ret i1 %res 96} 97 98define i1 @icmp_sgt(i32 signext %a, i32 signext %b) { 99; LA32-LABEL: icmp_sgt: 100; LA32: # %bb.0: 101; LA32-NEXT: slt $a0, $a1, $a0 102; LA32-NEXT: jirl $zero, $ra, 0 103; 104; LA64-LABEL: icmp_sgt: 105; LA64: # %bb.0: 106; LA64-NEXT: slt $a0, $a1, $a0 107; LA64-NEXT: jirl $zero, $ra, 0 108 %res = icmp sgt i32 %a, %b 109 ret i1 %res 110} 111 112define i1 @icmp_sge(i32 signext %a, i32 signext %b) { 113; LA32-LABEL: icmp_sge: 114; LA32: # %bb.0: 115; LA32-NEXT: slt $a0, $a0, $a1 116; LA32-NEXT: xori $a0, $a0, 1 117; LA32-NEXT: jirl $zero, $ra, 0 118; 119; LA64-LABEL: icmp_sge: 120; LA64: # %bb.0: 121; LA64-NEXT: slt $a0, $a0, $a1 122; LA64-NEXT: xori $a0, $a0, 1 123; LA64-NEXT: jirl $zero, $ra, 0 124 %res = icmp sge i32 %a, %b 125 ret i1 %res 126} 127 128define i1 @icmp_slt(i32 signext %a, i32 signext %b) { 129; LA32-LABEL: icmp_slt: 130; LA32: # %bb.0: 131; LA32-NEXT: slt $a0, $a0, $a1 132; LA32-NEXT: jirl $zero, $ra, 0 133; 134; LA64-LABEL: icmp_slt: 135; LA64: # %bb.0: 136; LA64-NEXT: slt $a0, $a0, $a1 137; LA64-NEXT: jirl $zero, $ra, 0 138 %res = icmp slt i32 %a, %b 139 ret i1 %res 140} 141 142define i1 @icmp_sle(i32 signext %a, i32 signext %b) { 143; LA32-LABEL: icmp_sle: 144; LA32: # %bb.0: 145; LA32-NEXT: slt $a0, $a1, $a0 146; LA32-NEXT: xori $a0, $a0, 1 147; LA32-NEXT: jirl $zero, $ra, 0 148; 149; LA64-LABEL: icmp_sle: 150; LA64: # %bb.0: 151; LA64-NEXT: slt $a0, $a1, $a0 152; LA64-NEXT: xori $a0, $a0, 1 153; LA64-NEXT: jirl $zero, $ra, 0 154 %res = icmp sle i32 %a, %b 155 ret i1 %res 156} 157 158define i1 @icmp_slt_3(i32 signext %a) { 159; LA32-LABEL: icmp_slt_3: 160; LA32: # %bb.0: 161; LA32-NEXT: slti $a0, $a0, 3 162; LA32-NEXT: jirl $zero, $ra, 0 163; 164; LA64-LABEL: icmp_slt_3: 165; LA64: # %bb.0: 166; LA64-NEXT: slti $a0, $a0, 3 167; LA64-NEXT: jirl $zero, $ra, 0 168 %res = icmp slt i32 %a, 3 169 ret i1 %res 170} 171 172define i1 @icmp_ult_3(i32 signext %a) { 173; LA32-LABEL: icmp_ult_3: 174; LA32: # %bb.0: 175; LA32-NEXT: sltui $a0, $a0, 3 176; LA32-NEXT: jirl $zero, $ra, 0 177; 178; LA64-LABEL: icmp_ult_3: 179; LA64: # %bb.0: 180; LA64-NEXT: sltui $a0, $a0, 3 181; LA64-NEXT: jirl $zero, $ra, 0 182 %res = icmp ult i32 %a, 3 183 ret i1 %res 184} 185 186define i1 @icmp_eq_0(i32 signext %a) { 187; LA32-LABEL: icmp_eq_0: 188; LA32: # %bb.0: 189; LA32-NEXT: sltui $a0, $a0, 1 190; LA32-NEXT: jirl $zero, $ra, 0 191; 192; LA64-LABEL: icmp_eq_0: 193; LA64: # %bb.0: 194; LA64-NEXT: sltui $a0, $a0, 1 195; LA64-NEXT: jirl $zero, $ra, 0 196 %res = icmp eq i32 %a, 0 197 ret i1 %res 198} 199 200define i1 @icmp_eq_3(i32 signext %a) { 201; LA32-LABEL: icmp_eq_3: 202; LA32: # %bb.0: 203; LA32-NEXT: addi.w $a0, $a0, -3 204; LA32-NEXT: sltui $a0, $a0, 1 205; LA32-NEXT: jirl $zero, $ra, 0 206; 207; LA64-LABEL: icmp_eq_3: 208; LA64: # %bb.0: 209; LA64-NEXT: addi.d $a0, $a0, -3 210; LA64-NEXT: sltui $a0, $a0, 1 211; LA64-NEXT: jirl $zero, $ra, 0 212 %res = icmp eq i32 %a, 3 213 ret i1 %res 214} 215 216define i1 @icmp_ne_0(i32 signext %a) { 217; LA32-LABEL: icmp_ne_0: 218; LA32: # %bb.0: 219; LA32-NEXT: sltu $a0, $zero, $a0 220; LA32-NEXT: jirl $zero, $ra, 0 221; 222; LA64-LABEL: icmp_ne_0: 223; LA64: # %bb.0: 224; LA64-NEXT: sltu $a0, $zero, $a0 225; LA64-NEXT: jirl $zero, $ra, 0 226 %res = icmp ne i32 %a, 0 227 ret i1 %res 228} 229 230define i1 @icmp_ne_3(i32 signext %a) { 231; LA32-LABEL: icmp_ne_3: 232; LA32: # %bb.0: 233; LA32-NEXT: addi.w $a0, $a0, -3 234; LA32-NEXT: sltu $a0, $zero, $a0 235; LA32-NEXT: jirl $zero, $ra, 0 236; 237; LA64-LABEL: icmp_ne_3: 238; LA64: # %bb.0: 239; LA64-NEXT: addi.d $a0, $a0, -3 240; LA64-NEXT: sltu $a0, $zero, $a0 241; LA64-NEXT: jirl $zero, $ra, 0 242 %res = icmp ne i32 %a, 3 243 ret i1 %res 244} 245