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