316 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 %s -o - | FileCheck %s --check-prefix=RV323; RUN: llc -mtriple=riscv64 %s -o - | FileCheck %s --check-prefix=RV644 5define i32 @xori64i32(i64 %a) {6; RV32-LABEL: xori64i32:7; RV32: # %bb.0:8; RV32-NEXT: srai a1, a1, 319; RV32-NEXT: lui a0, 52428810; RV32-NEXT: addi a0, a0, -111; RV32-NEXT: xor a0, a1, a012; RV32-NEXT: ret13;14; RV64-LABEL: xori64i32:15; RV64: # %bb.0:16; RV64-NEXT: srai a0, a0, 6317; RV64-NEXT: lui a1, 52428818; RV64-NEXT: addiw a1, a1, -119; RV64-NEXT: xor a0, a0, a120; RV64-NEXT: ret21 %shr4 = ashr i64 %a, 6322 %conv5 = trunc i64 %shr4 to i3223 %xor = xor i32 %conv5, 214748364724 ret i32 %xor25}26 27define i64 @selecti64i64(i64 %a) {28; RV32-LABEL: selecti64i64:29; RV32: # %bb.0:30; RV32-NEXT: srai a1, a1, 3131; RV32-NEXT: lui a0, 52428832; RV32-NEXT: addi a0, a0, -133; RV32-NEXT: xor a0, a1, a034; RV32-NEXT: ret35;36; RV64-LABEL: selecti64i64:37; RV64: # %bb.0:38; RV64-NEXT: srai a0, a0, 6339; RV64-NEXT: lui a1, 52428840; RV64-NEXT: addiw a1, a1, -141; RV64-NEXT: xor a0, a0, a142; RV64-NEXT: ret43 %c = icmp sgt i64 %a, -144 %s = select i1 %c, i64 2147483647, i64 -214748364845 ret i64 %s46}47 48define i32 @selecti64i32(i64 %a) {49; RV32-LABEL: selecti64i32:50; RV32: # %bb.0:51; RV32-NEXT: srli a1, a1, 3152; RV32-NEXT: xori a0, a1, 153; RV32-NEXT: lui a1, 52428854; RV32-NEXT: sub a0, a1, a055; RV32-NEXT: ret56;57; RV64-LABEL: selecti64i32:58; RV64: # %bb.0:59; RV64-NEXT: srai a0, a0, 6360; RV64-NEXT: lui a1, 52428861; RV64-NEXT: addiw a1, a1, -162; RV64-NEXT: xor a0, a0, a163; RV64-NEXT: ret64 %c = icmp sgt i64 %a, -165 %s = select i1 %c, i32 2147483647, i32 -214748364866 ret i32 %s67}68 69define i64 @selecti32i64(i32 %a) {70; RV32-LABEL: selecti32i64:71; RV32: # %bb.0:72; RV32-NEXT: srai a1, a0, 3173; RV32-NEXT: lui a0, 52428874; RV32-NEXT: addi a0, a0, -175; RV32-NEXT: xor a0, a1, a076; RV32-NEXT: ret77;78; RV64-LABEL: selecti32i64:79; RV64: # %bb.0:80; RV64-NEXT: sraiw a0, a0, 3181; RV64-NEXT: lui a1, 52428882; RV64-NEXT: addiw a1, a1, -183; RV64-NEXT: xor a0, a0, a184; RV64-NEXT: ret85 %c = icmp sgt i32 %a, -186 %s = select i1 %c, i64 2147483647, i64 -214748364887 ret i64 %s88}89 90 91 92define i8 @xori32i8(i32 %a) {93; RV32-LABEL: xori32i8:94; RV32: # %bb.0:95; RV32-NEXT: srai a0, a0, 3196; RV32-NEXT: xori a0, a0, 8497; RV32-NEXT: ret98;99; RV64-LABEL: xori32i8:100; RV64: # %bb.0:101; RV64-NEXT: sraiw a0, a0, 31102; RV64-NEXT: xori a0, a0, 84103; RV64-NEXT: ret104 %shr4 = ashr i32 %a, 31105 %conv5 = trunc i32 %shr4 to i8106 %xor = xor i8 %conv5, 84107 ret i8 %xor108}109 110define i32 @selecti32i32(i32 %a) {111; RV32-LABEL: selecti32i32:112; RV32: # %bb.0:113; RV32-NEXT: srai a0, a0, 31114; RV32-NEXT: xori a0, a0, 84115; RV32-NEXT: ret116;117; RV64-LABEL: selecti32i32:118; RV64: # %bb.0:119; RV64-NEXT: sraiw a0, a0, 31120; RV64-NEXT: xori a0, a0, 84121; RV64-NEXT: ret122 %c = icmp sgt i32 %a, -1123 %s = select i1 %c, i32 84, i32 -85124 ret i32 %s125}126 127define i8 @selecti32i8(i32 %a) {128; RV32-LABEL: selecti32i8:129; RV32: # %bb.0:130; RV32-NEXT: srai a0, a0, 31131; RV32-NEXT: xori a0, a0, 84132; RV32-NEXT: ret133;134; RV64-LABEL: selecti32i8:135; RV64: # %bb.0:136; RV64-NEXT: sraiw a0, a0, 31137; RV64-NEXT: xori a0, a0, 84138; RV64-NEXT: ret139 %c = icmp sgt i32 %a, -1140 %s = select i1 %c, i8 84, i8 -85141 ret i8 %s142}143 144define i32 @selecti8i32(i8 %a) {145; RV32-LABEL: selecti8i32:146; RV32: # %bb.0:147; RV32-NEXT: slli a0, a0, 24148; RV32-NEXT: srai a0, a0, 31149; RV32-NEXT: xori a0, a0, 84150; RV32-NEXT: ret151;152; RV64-LABEL: selecti8i32:153; RV64: # %bb.0:154; RV64-NEXT: slli a0, a0, 56155; RV64-NEXT: srai a0, a0, 63156; RV64-NEXT: xori a0, a0, 84157; RV64-NEXT: ret158 %c = icmp sgt i8 %a, -1159 %s = select i1 %c, i32 84, i32 -85160 ret i32 %s161}162 163define i32 @icmpasreq(i32 %input, i32 %a, i32 %b) {164; RV32-LABEL: icmpasreq:165; RV32: # %bb.0:166; RV32-NEXT: bltz a0, .LBB8_2167; RV32-NEXT: # %bb.1:168; RV32-NEXT: mv a1, a2169; RV32-NEXT: .LBB8_2:170; RV32-NEXT: mv a0, a1171; RV32-NEXT: ret172;173; RV64-LABEL: icmpasreq:174; RV64: # %bb.0:175; RV64-NEXT: sext.w a3, a0176; RV64-NEXT: mv a0, a1177; RV64-NEXT: bltz a3, .LBB8_2178; RV64-NEXT: # %bb.1:179; RV64-NEXT: mv a0, a2180; RV64-NEXT: .LBB8_2:181; RV64-NEXT: ret182 %sh = ashr i32 %input, 31183 %c = icmp eq i32 %sh, -1184 %s = select i1 %c, i32 %a, i32 %b185 ret i32 %s186}187 188define i32 @icmpasrne(i32 %input, i32 %a, i32 %b) {189; RV32-LABEL: icmpasrne:190; RV32: # %bb.0:191; RV32-NEXT: bgez a0, .LBB9_2192; RV32-NEXT: # %bb.1:193; RV32-NEXT: mv a1, a2194; RV32-NEXT: .LBB9_2:195; RV32-NEXT: mv a0, a1196; RV32-NEXT: ret197;198; RV64-LABEL: icmpasrne:199; RV64: # %bb.0:200; RV64-NEXT: sext.w a3, a0201; RV64-NEXT: mv a0, a1202; RV64-NEXT: bgez a3, .LBB9_2203; RV64-NEXT: # %bb.1:204; RV64-NEXT: mv a0, a2205; RV64-NEXT: .LBB9_2:206; RV64-NEXT: ret207 %sh = ashr i32 %input, 31208 %c = icmp ne i32 %sh, -1209 %s = select i1 %c, i32 %a, i32 %b210 ret i32 %s211}212 213define i32 @oneusecmp(i32 %a, i32 %b, i32 %d) {214; RV32-LABEL: oneusecmp:215; RV32: # %bb.0:216; RV32-NEXT: srai a3, a0, 31217; RV32-NEXT: xori a3, a3, 127218; RV32-NEXT: bltz a0, .LBB10_2219; RV32-NEXT: # %bb.1:220; RV32-NEXT: mv a2, a1221; RV32-NEXT: .LBB10_2:222; RV32-NEXT: add a0, a3, a2223; RV32-NEXT: ret224;225; RV64-LABEL: oneusecmp:226; RV64: # %bb.0:227; RV64-NEXT: sext.w a3, a0228; RV64-NEXT: sraiw a0, a0, 31229; RV64-NEXT: xori a0, a0, 127230; RV64-NEXT: bltz a3, .LBB10_2231; RV64-NEXT: # %bb.1:232; RV64-NEXT: mv a2, a1233; RV64-NEXT: .LBB10_2:234; RV64-NEXT: addw a0, a0, a2235; RV64-NEXT: ret236 %c = icmp sle i32 %a, -1237 %s = select i1 %c, i32 -128, i32 127238 %s2 = select i1 %c, i32 %d, i32 %b239 %x = add i32 %s, %s2240 ret i32 %x241}242 243define i32 @xor_branch_imm_ret(i32 %x) nounwind {244; RV32-LABEL: xor_branch_imm_ret:245; RV32: # %bb.0: # %entry246; RV32-NEXT: xori a0, a0, -1365247; RV32-NEXT: beqz a0, .LBB11_2248; RV32-NEXT: # %bb.1: # %if.then249; RV32-NEXT: ret250; RV32-NEXT: .LBB11_2: # %if.end251; RV32-NEXT: addi sp, sp, -16252; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill253; RV32-NEXT: call abort254;255; RV64-LABEL: xor_branch_imm_ret:256; RV64: # %bb.0: # %entry257; RV64-NEXT: xori a0, a0, -1365258; RV64-NEXT: sext.w a1, a0259; RV64-NEXT: beqz a1, .LBB11_2260; RV64-NEXT: # %bb.1: # %if.then261; RV64-NEXT: ret262; RV64-NEXT: .LBB11_2: # %if.end263; RV64-NEXT: addi sp, sp, -16264; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill265; RV64-NEXT: call abort266entry:267 %cmp.not = icmp eq i32 %x, -1365268 br i1 %cmp.not, label %if.end, label %if.then269if.then:270 %xor = xor i32 %x, -1365271 ret i32 %xor272if.end:273 tail call void @abort() #2274 unreachable275}276 277define i32 @xor_branch_ret(i32 %x) nounwind {278; RV32-LABEL: xor_branch_ret:279; RV32: # %bb.0: # %entry280; RV32-NEXT: li a1, 1281; RV32-NEXT: slli a1, a1, 11282; RV32-NEXT: beq a0, a1, .LBB12_2283; RV32-NEXT: # %bb.1: # %if.then284; RV32-NEXT: xor a0, a0, a1285; RV32-NEXT: ret286; RV32-NEXT: .LBB12_2: # %if.end287; RV32-NEXT: addi sp, sp, -16288; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill289; RV32-NEXT: call abort290;291; RV64-LABEL: xor_branch_ret:292; RV64: # %bb.0: # %entry293; RV64-NEXT: li a1, 1294; RV64-NEXT: slli a1, a1, 11295; RV64-NEXT: sext.w a2, a0296; RV64-NEXT: beq a2, a1, .LBB12_2297; RV64-NEXT: # %bb.1: # %if.then298; RV64-NEXT: xor a0, a0, a1299; RV64-NEXT: ret300; RV64-NEXT: .LBB12_2: # %if.end301; RV64-NEXT: addi sp, sp, -16302; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill303; RV64-NEXT: call abort304entry:305 %cmp.not = icmp eq i32 %x, 2048306 br i1 %cmp.not, label %if.end, label %if.then307if.then:308 %xor = xor i32 %x, 2048309 ret i32 %xor310if.end:311 tail call void @abort() #2312 unreachable313}314 315declare void @abort()316