; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=riscv32 -global-isel -mattr=+m -verify-machineinstrs < %s \ ; RUN: | FileCheck %s -check-prefixes=CHECK,RV32I ; RUN: llc -mtriple=riscv32 -global-isel -mattr=+m,+zba -verify-machineinstrs < %s \ ; RUN: | FileCheck %s -check-prefixes=CHECK,RV32ZBA define signext i16 @sh1add(i64 %0, ptr %1) { ; RV32I-LABEL: sh1add: ; RV32I: # %bb.0: ; RV32I-NEXT: slli a0, a0, 1 ; RV32I-NEXT: add a0, a2, a0 ; RV32I-NEXT: lh a0, 0(a0) ; RV32I-NEXT: ret ; ; RV32ZBA-LABEL: sh1add: ; RV32ZBA: # %bb.0: ; RV32ZBA-NEXT: sh1add a0, a0, a2 ; RV32ZBA-NEXT: lh a0, 0(a0) ; RV32ZBA-NEXT: ret %3 = getelementptr inbounds i16, ptr %1, i64 %0 %4 = load i16, ptr %3 ret i16 %4 } define i32 @sh2add(i64 %0, ptr %1) { ; RV32I-LABEL: sh2add: ; RV32I: # %bb.0: ; RV32I-NEXT: slli a0, a0, 2 ; RV32I-NEXT: add a0, a2, a0 ; RV32I-NEXT: lw a0, 0(a0) ; RV32I-NEXT: ret ; ; RV32ZBA-LABEL: sh2add: ; RV32ZBA: # %bb.0: ; RV32ZBA-NEXT: sh2add a0, a0, a2 ; RV32ZBA-NEXT: lw a0, 0(a0) ; RV32ZBA-NEXT: ret %3 = getelementptr inbounds i32, ptr %1, i64 %0 %4 = load i32, ptr %3 ret i32 %4 } define i64 @sh3add(i64 %0, ptr %1) { ; RV32I-LABEL: sh3add: ; RV32I: # %bb.0: ; RV32I-NEXT: slli a0, a0, 3 ; RV32I-NEXT: add a2, a2, a0 ; RV32I-NEXT: lw a0, 0(a2) ; RV32I-NEXT: lw a1, 4(a2) ; RV32I-NEXT: ret ; ; RV32ZBA-LABEL: sh3add: ; RV32ZBA: # %bb.0: ; RV32ZBA-NEXT: sh3add a1, a0, a2 ; RV32ZBA-NEXT: lw a0, 0(a1) ; RV32ZBA-NEXT: lw a1, 4(a1) ; RV32ZBA-NEXT: ret %3 = getelementptr inbounds i64, ptr %1, i64 %0 %4 = load i64, ptr %3 ret i64 %4 } define i32 @srli_1_sh2add(ptr %0, i32 %1) { ; RV32I-LABEL: srli_1_sh2add: ; RV32I: # %bb.0: ; RV32I-NEXT: srli a1, a1, 1 ; RV32I-NEXT: slli a1, a1, 2 ; RV32I-NEXT: add a0, a0, a1 ; RV32I-NEXT: lw a0, 0(a0) ; RV32I-NEXT: ret ; ; RV32ZBA-LABEL: srli_1_sh2add: ; RV32ZBA: # %bb.0: ; RV32ZBA-NEXT: srli a1, a1, 1 ; RV32ZBA-NEXT: sh2add a0, a1, a0 ; RV32ZBA-NEXT: lw a0, 0(a0) ; RV32ZBA-NEXT: ret %3 = lshr i32 %1, 1 %4 = getelementptr inbounds i32, ptr %0, i32 %3 %5 = load i32, ptr %4, align 4 ret i32 %5 } define i64 @srli_2_sh3add(ptr %0, i32 %1) { ; RV32I-LABEL: srli_2_sh3add: ; RV32I: # %bb.0: ; RV32I-NEXT: srli a1, a1, 2 ; RV32I-NEXT: slli a1, a1, 3 ; RV32I-NEXT: add a1, a0, a1 ; RV32I-NEXT: lw a0, 0(a1) ; RV32I-NEXT: lw a1, 4(a1) ; RV32I-NEXT: ret ; ; RV32ZBA-LABEL: srli_2_sh3add: ; RV32ZBA: # %bb.0: ; RV32ZBA-NEXT: srli a1, a1, 2 ; RV32ZBA-NEXT: sh3add a1, a1, a0 ; RV32ZBA-NEXT: lw a0, 0(a1) ; RV32ZBA-NEXT: lw a1, 4(a1) ; RV32ZBA-NEXT: ret %3 = lshr i32 %1, 2 %4 = getelementptr inbounds i64, ptr %0, i32 %3 %5 = load i64, ptr %4, align 8 ret i64 %5 } define signext i16 @srli_2_sh1add(ptr %0, i32 %1) { ; RV32I-LABEL: srli_2_sh1add: ; RV32I: # %bb.0: ; RV32I-NEXT: srli a1, a1, 2 ; RV32I-NEXT: slli a1, a1, 1 ; RV32I-NEXT: add a0, a0, a1 ; RV32I-NEXT: lh a0, 0(a0) ; RV32I-NEXT: ret ; ; RV32ZBA-LABEL: srli_2_sh1add: ; RV32ZBA: # %bb.0: ; RV32ZBA-NEXT: srli a1, a1, 2 ; RV32ZBA-NEXT: sh1add a0, a1, a0 ; RV32ZBA-NEXT: lh a0, 0(a0) ; RV32ZBA-NEXT: ret %3 = lshr i32 %1, 2 %4 = getelementptr inbounds i16, ptr %0, i32 %3 %5 = load i16, ptr %4, align 2 ret i16 %5 } define i32 @srli_3_sh2add(ptr %0, i32 %1) { ; RV32I-LABEL: srli_3_sh2add: ; RV32I: # %bb.0: ; RV32I-NEXT: srli a1, a1, 3 ; RV32I-NEXT: slli a1, a1, 2 ; RV32I-NEXT: add a0, a0, a1 ; RV32I-NEXT: lw a0, 0(a0) ; RV32I-NEXT: ret ; ; RV32ZBA-LABEL: srli_3_sh2add: ; RV32ZBA: # %bb.0: ; RV32ZBA-NEXT: srli a1, a1, 3 ; RV32ZBA-NEXT: sh2add a0, a1, a0 ; RV32ZBA-NEXT: lw a0, 0(a0) ; RV32ZBA-NEXT: ret %3 = lshr i32 %1, 3 %4 = getelementptr inbounds i32, ptr %0, i32 %3 %5 = load i32, ptr %4, align 4 ret i32 %5 } define i64 @srli_4_sh3add(ptr %0, i32 %1) { ; RV32I-LABEL: srli_4_sh3add: ; RV32I: # %bb.0: ; RV32I-NEXT: srli a1, a1, 4 ; RV32I-NEXT: slli a1, a1, 3 ; RV32I-NEXT: add a1, a0, a1 ; RV32I-NEXT: lw a0, 0(a1) ; RV32I-NEXT: lw a1, 4(a1) ; RV32I-NEXT: ret ; ; RV32ZBA-LABEL: srli_4_sh3add: ; RV32ZBA: # %bb.0: ; RV32ZBA-NEXT: srli a1, a1, 4 ; RV32ZBA-NEXT: sh3add a1, a1, a0 ; RV32ZBA-NEXT: lw a0, 0(a1) ; RV32ZBA-NEXT: lw a1, 4(a1) ; RV32ZBA-NEXT: ret %3 = lshr i32 %1, 4 %4 = getelementptr inbounds i64, ptr %0, i32 %3 %5 = load i64, ptr %4, align 8 ret i64 %5 } ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: ; CHECK: {{.*}}