| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 |
| ; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ |
| ; RUN: | FileCheck %s -check-prefixes=CHECK,RV32I |
| ; RUN: llc -mtriple=riscv32 -mattr=+zbb -verify-machineinstrs < %s \ |
| ; RUN: | FileCheck %s -check-prefixes=CHECK,RV32ZBB |
| |
| define i32 @orc_b_i32_mul255(i32 %x) nounwind { |
| ; RV32I-LABEL: orc_b_i32_mul255: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a1, 4112 |
| ; RV32I-NEXT: addi a1, a1, 257 |
| ; RV32I-NEXT: and a0, a0, a1 |
| ; RV32I-NEXT: slli a1, a0, 8 |
| ; RV32I-NEXT: sub a0, a1, a0 |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32ZBB-LABEL: orc_b_i32_mul255: |
| ; RV32ZBB: # %bb.0: # %entry |
| ; RV32ZBB-NEXT: lui a1, 4112 |
| ; RV32ZBB-NEXT: addi a1, a1, 257 |
| ; RV32ZBB-NEXT: and a0, a0, a1 |
| ; RV32ZBB-NEXT: orc.b a0, a0 |
| ; RV32ZBB-NEXT: ret |
| entry: |
| %and = and i32 %x, 16843009 |
| %mul = mul nuw nsw i32 %and, 255 |
| ret i32 %mul |
| } |
| |
| |
| define i32 @orc_b_i32_sub_shl8x_x_lsb(i32 %x) { |
| ; RV32I-LABEL: orc_b_i32_sub_shl8x_x_lsb: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a1, 4112 |
| ; RV32I-NEXT: addi a1, a1, 257 |
| ; RV32I-NEXT: and a0, a0, a1 |
| ; RV32I-NEXT: slli a1, a0, 8 |
| ; RV32I-NEXT: sub a0, a1, a0 |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32ZBB-LABEL: orc_b_i32_sub_shl8x_x_lsb: |
| ; RV32ZBB: # %bb.0: # %entry |
| ; RV32ZBB-NEXT: lui a1, 4112 |
| ; RV32ZBB-NEXT: addi a1, a1, 257 |
| ; RV32ZBB-NEXT: and a0, a0, a1 |
| ; RV32ZBB-NEXT: orc.b a0, a0 |
| ; RV32ZBB-NEXT: ret |
| entry: |
| %and = and i32 %x, 16843009 |
| %sub = mul nuw i32 %and, 255 |
| ret i32 %sub |
| } |
| |
| define i32 @orc_b_i32_sub_shl8x_x_lsb_preshifted(i32 %x){ |
| ; RV32I-LABEL: orc_b_i32_sub_shl8x_x_lsb_preshifted: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: srli a0, a0, 11 |
| ; RV32I-NEXT: lui a1, 16 |
| ; RV32I-NEXT: addi a1, a1, 257 |
| ; RV32I-NEXT: and a0, a0, a1 |
| ; RV32I-NEXT: slli a1, a0, 8 |
| ; RV32I-NEXT: sub a0, a1, a0 |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32ZBB-LABEL: orc_b_i32_sub_shl8x_x_lsb_preshifted: |
| ; RV32ZBB: # %bb.0: # %entry |
| ; RV32ZBB-NEXT: srli a0, a0, 11 |
| ; RV32ZBB-NEXT: lui a1, 16 |
| ; RV32ZBB-NEXT: addi a1, a1, 257 |
| ; RV32ZBB-NEXT: and a0, a0, a1 |
| ; RV32ZBB-NEXT: orc.b a0, a0 |
| ; RV32ZBB-NEXT: ret |
| entry: |
| %shr = lshr i32 %x, 11 |
| %and = and i32 %shr, 16843009 |
| %sub = mul nuw i32 %and, 255 |
| ret i32 %sub |
| } |
| |
| |
| define i32 @orc_b_i32_sub_shl8x_x_b1(i32 %x) { |
| ; RV32I-LABEL: orc_b_i32_sub_shl8x_x_b1: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a1, 8224 |
| ; RV32I-NEXT: addi a1, a1, 514 |
| ; RV32I-NEXT: and a0, a0, a1 |
| ; RV32I-NEXT: slli a1, a0, 7 |
| ; RV32I-NEXT: srli a0, a0, 1 |
| ; RV32I-NEXT: sub a0, a1, a0 |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32ZBB-LABEL: orc_b_i32_sub_shl8x_x_b1: |
| ; RV32ZBB: # %bb.0: # %entry |
| ; RV32ZBB-NEXT: lui a1, 8224 |
| ; RV32ZBB-NEXT: addi a1, a1, 514 |
| ; RV32ZBB-NEXT: and a0, a0, a1 |
| ; RV32ZBB-NEXT: orc.b a0, a0 |
| ; RV32ZBB-NEXT: ret |
| entry: |
| %and = and i32 %x, 33686018 |
| %shl = shl i32 %and, 7 |
| %shr = lshr exact i32 %and, 1 |
| %sub = sub nsw i32 %shl, %shr |
| ret i32 %sub |
| } |
| |
| |
| define i32 @orc_b_i32_sub_shl8x_x_b2(i32 %x) { |
| ; RV32I-LABEL: orc_b_i32_sub_shl8x_x_b2: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a1, 16448 |
| ; RV32I-NEXT: addi a1, a1, 1028 |
| ; RV32I-NEXT: and a0, a0, a1 |
| ; RV32I-NEXT: slli a1, a0, 6 |
| ; RV32I-NEXT: srli a0, a0, 2 |
| ; RV32I-NEXT: sub a0, a1, a0 |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32ZBB-LABEL: orc_b_i32_sub_shl8x_x_b2: |
| ; RV32ZBB: # %bb.0: # %entry |
| ; RV32ZBB-NEXT: lui a1, 16448 |
| ; RV32ZBB-NEXT: addi a1, a1, 1028 |
| ; RV32ZBB-NEXT: and a0, a0, a1 |
| ; RV32ZBB-NEXT: orc.b a0, a0 |
| ; RV32ZBB-NEXT: ret |
| entry: |
| %and = and i32 %x, 67372036 |
| %shl = shl i32 %and, 6 |
| %shr = lshr exact i32 %and, 2 |
| %sub = sub nsw i32 %shl, %shr |
| ret i32 %sub |
| } |
| |
| |
| define i32 @orc_b_i32_sub_shl8x_x_b3(i32 %x) { |
| ; CHECK-LABEL: orc_b_i32_sub_shl8x_x_b3: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: lui a1, 24672 |
| ; CHECK-NEXT: addi a1, a1, 1542 |
| ; CHECK-NEXT: and a0, a0, a1 |
| ; CHECK-NEXT: slli a1, a0, 5 |
| ; CHECK-NEXT: srli a0, a0, 3 |
| ; CHECK-NEXT: sub a0, a1, a0 |
| ; CHECK-NEXT: ret |
| entry: |
| %and = and i32 %x, 101058054 |
| %shl = shl nuw i32 %and, 5 |
| %shr = lshr i32 %and, 3 |
| %sub = sub nsw i32 %shl, %shr |
| ret i32 %sub |
| } |
| |
| |
| define i32 @orc_b_i32_sub_shl8x_x_b4(i32 %x) { |
| ; CHECK-LABEL: orc_b_i32_sub_shl8x_x_b4: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: lui a1, 32897 |
| ; CHECK-NEXT: addi a1, a1, -2040 |
| ; CHECK-NEXT: and a0, a0, a1 |
| ; CHECK-NEXT: slli a1, a0, 4 |
| ; CHECK-NEXT: srli a0, a0, 4 |
| ; CHECK-NEXT: sub a0, a1, a0 |
| ; CHECK-NEXT: ret |
| entry: |
| %and = and i32 %x, 134744072 |
| %shl = shl nuw i32 %and, 4 |
| %shr = lshr i32 %and, 4 |
| %sub = sub nsw i32 %shl, %shr |
| ret i32 %sub |
| } |
| |
| |
| define i32 @orc_b_i32_sub_shl8x_x_b5(i32 %x) { |
| ; CHECK-LABEL: orc_b_i32_sub_shl8x_x_b5: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: lui a1, 65793 |
| ; CHECK-NEXT: addi a1, a1, 16 |
| ; CHECK-NEXT: and a0, a0, a1 |
| ; CHECK-NEXT: slli a1, a0, 3 |
| ; CHECK-NEXT: srli a0, a0, 5 |
| ; CHECK-NEXT: sub a0, a1, a0 |
| ; CHECK-NEXT: ret |
| entry: |
| %and = and i32 %x, 269488144 |
| %shl = shl nuw i32 %and, 3 |
| %shr = lshr i32 %and, 5 |
| %sub = sub nsw i32 %shl, %shr |
| ret i32 %sub |
| } |
| |
| |
| define i32 @orc_b_i32_sub_shl8x_x_b6(i32 %x) { |
| ; CHECK-LABEL: orc_b_i32_sub_shl8x_x_b6: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: lui a1, 131586 |
| ; CHECK-NEXT: addi a1, a1, 32 |
| ; CHECK-NEXT: and a0, a0, a1 |
| ; CHECK-NEXT: slli a1, a0, 2 |
| ; CHECK-NEXT: srli a0, a0, 6 |
| ; CHECK-NEXT: sub a0, a1, a0 |
| ; CHECK-NEXT: ret |
| entry: |
| %and = and i32 %x, 538976288 |
| %shl = shl nuw i32 %and, 2 |
| %shr = lshr i32 %and, 6 |
| %sub = sub nsw i32 %shl, %shr |
| ret i32 %sub |
| } |
| |
| |
| define i32 @orc_b_i32_sub_shl8x_x_b7(i32 %x) { |
| ; CHECK-LABEL: orc_b_i32_sub_shl8x_x_b7: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: lui a1, 263172 |
| ; CHECK-NEXT: addi a1, a1, 64 |
| ; CHECK-NEXT: and a0, a0, a1 |
| ; CHECK-NEXT: slli a1, a0, 1 |
| ; CHECK-NEXT: srli a0, a0, 7 |
| ; CHECK-NEXT: sub a0, a1, a0 |
| ; CHECK-NEXT: ret |
| entry: |
| %and = and i32 %x, 1077952576 |
| %shl = shl nuw i32 %and, 1 |
| %shr = lshr i32 %and, 7 |
| %sub = sub nsw i32 %shl, %shr |
| ret i32 %sub |
| } |
| |
| define i32 @orc_b_i32_sub_shl8x_x_b1_shl_used(i32 %x, ptr %arr) { |
| ; RV32I-LABEL: orc_b_i32_sub_shl8x_x_b1_shl_used: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a2, 8224 |
| ; RV32I-NEXT: addi a2, a2, 514 |
| ; RV32I-NEXT: and a0, a0, a2 |
| ; RV32I-NEXT: slli a2, a0, 7 |
| ; RV32I-NEXT: srli a3, a0, 1 |
| ; RV32I-NEXT: sub a0, a2, a3 |
| ; RV32I-NEXT: sw a3, 0(a1) |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32ZBB-LABEL: orc_b_i32_sub_shl8x_x_b1_shl_used: |
| ; RV32ZBB: # %bb.0: # %entry |
| ; RV32ZBB-NEXT: lui a2, 8224 |
| ; RV32ZBB-NEXT: addi a2, a2, 514 |
| ; RV32ZBB-NEXT: and a0, a0, a2 |
| ; RV32ZBB-NEXT: srli a2, a0, 1 |
| ; RV32ZBB-NEXT: orc.b a0, a0 |
| ; RV32ZBB-NEXT: sw a2, 0(a1) |
| ; RV32ZBB-NEXT: ret |
| entry: |
| %and = and i32 %x, 33686018 |
| %shl = shl i32 %and, 7 |
| %shr = lshr exact i32 %and, 1 |
| store i32 %shr, ptr %arr, align 4 |
| %sub = sub nsw i32 %shl, %shr |
| ret i32 %sub |
| } |
| |
| define i32 @orc_b_i32_sub_shl8x_x_b1_srl_used(i32 %x, ptr %arr) { |
| ; RV32I-LABEL: orc_b_i32_sub_shl8x_x_b1_srl_used: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a2, 8224 |
| ; RV32I-NEXT: addi a2, a2, 514 |
| ; RV32I-NEXT: and a0, a0, a2 |
| ; RV32I-NEXT: slli a2, a0, 7 |
| ; RV32I-NEXT: srli a0, a0, 1 |
| ; RV32I-NEXT: sub a0, a2, a0 |
| ; RV32I-NEXT: sw a2, 0(a1) |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32ZBB-LABEL: orc_b_i32_sub_shl8x_x_b1_srl_used: |
| ; RV32ZBB: # %bb.0: # %entry |
| ; RV32ZBB-NEXT: lui a2, 8224 |
| ; RV32ZBB-NEXT: addi a2, a2, 514 |
| ; RV32ZBB-NEXT: and a0, a0, a2 |
| ; RV32ZBB-NEXT: slli a2, a0, 7 |
| ; RV32ZBB-NEXT: orc.b a0, a0 |
| ; RV32ZBB-NEXT: sw a2, 0(a1) |
| ; RV32ZBB-NEXT: ret |
| entry: |
| %and = and i32 %x, 33686018 |
| %shl = shl i32 %and, 7 |
| %shr = lshr exact i32 %and, 1 |
| store i32 %shl, ptr %arr, align 4 |
| %sub = sub nsw i32 %shl, %shr |
| ret i32 %sub |
| } |
| |
| |
| define i32 @orc_b_i32_sub_shl8x_x_b1_not_used(i32 %x, ptr %arr) { |
| ; RV32I-LABEL: orc_b_i32_sub_shl8x_x_b1_not_used: |
| ; RV32I: # %bb.0: # %entry |
| ; RV32I-NEXT: lui a1, 8224 |
| ; RV32I-NEXT: addi a1, a1, 514 |
| ; RV32I-NEXT: and a0, a0, a1 |
| ; RV32I-NEXT: slli a1, a0, 7 |
| ; RV32I-NEXT: srli a0, a0, 1 |
| ; RV32I-NEXT: sub a0, a1, a0 |
| ; RV32I-NEXT: ret |
| ; |
| ; RV32ZBB-LABEL: orc_b_i32_sub_shl8x_x_b1_not_used: |
| ; RV32ZBB: # %bb.0: # %entry |
| ; RV32ZBB-NEXT: lui a1, 8224 |
| ; RV32ZBB-NEXT: addi a1, a1, 514 |
| ; RV32ZBB-NEXT: and a0, a0, a1 |
| ; RV32ZBB-NEXT: orc.b a0, a0 |
| ; RV32ZBB-NEXT: ret |
| entry: |
| %and = and i32 %x, 33686018 |
| %shl = shl i32 %and, 7 |
| %shr = lshr exact i32 %and, 1 |
| %sub = sub nsw i32 %shl, %shr |
| ret i32 %sub |
| } |
| |
| define i32 @orc_b_i32_sub_shl8x_x_shl_used(i32 %x, ptr %arr){ |
| ; CHECK-LABEL: orc_b_i32_sub_shl8x_x_shl_used: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: lui a2, 4112 |
| ; CHECK-NEXT: addi a2, a2, 257 |
| ; CHECK-NEXT: and a0, a0, a2 |
| ; CHECK-NEXT: slli a2, a0, 8 |
| ; CHECK-NEXT: sub a0, a2, a0 |
| ; CHECK-NEXT: sw a2, 0(a1) |
| ; CHECK-NEXT: ret |
| entry: |
| %and = and i32 %x, 16843009 |
| %shl = shl i32 %and, 8 |
| store i32 %shl, ptr %arr, align 4 |
| %sub = mul nuw i32 %and, 255 |
| ret i32 %sub |
| } |
| |
| define i32 @orc_b_i32_sub_shl8x_x_b1_both_used(i32 %x, ptr %arr) { |
| ; CHECK-LABEL: orc_b_i32_sub_shl8x_x_b1_both_used: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: lui a2, 8224 |
| ; CHECK-NEXT: addi a2, a2, 514 |
| ; CHECK-NEXT: and a0, a0, a2 |
| ; CHECK-NEXT: slli a2, a0, 7 |
| ; CHECK-NEXT: srli a3, a0, 1 |
| ; CHECK-NEXT: sub a0, a2, a3 |
| ; CHECK-NEXT: sw a2, 0(a1) |
| ; CHECK-NEXT: sw a3, 4(a1) |
| ; CHECK-NEXT: ret |
| entry: |
| %and = and i32 %x, 33686018 |
| %shl = shl i32 %and, 7 |
| %shr = lshr exact i32 %and, 1 |
| store i32 %shl, ptr %arr, align 4 |
| %arrayidx1 = getelementptr inbounds i8, ptr %arr, i32 4 |
| store i32 %shr, ptr %arrayidx1, align 4 |
| %sub = sub nsw i32 %shl, %shr |
| ret i32 %sub |
| } |
| |
| |
| define i32 @orc_b_i32_sub_x_shr8x(i32 %x) { |
| ; CHECK-LABEL: orc_b_i32_sub_x_shr8x: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: lui a1, 4112 |
| ; CHECK-NEXT: addi a1, a1, 257 |
| ; CHECK-NEXT: and a0, a0, a1 |
| ; CHECK-NEXT: srli a1, a0, 8 |
| ; CHECK-NEXT: sub a0, a0, a1 |
| ; CHECK-NEXT: ret |
| entry: |
| %and = and i32 %x, 16843009 |
| %shr = lshr i32 %and, 8 |
| %sub = sub nsw i32 %and, %shr |
| ret i32 %sub |
| } |