| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -verify-machineinstrs \ |
| ; RUN: | FileCheck -check-prefix=RV32 %s |
| ; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+experimental-zilx -verify-machineinstrs \ |
| ; RUN: | FileCheck -check-prefix=RV32-ZILX %s |
| ; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zba -verify-machineinstrs \ |
| ; RUN: | FileCheck -check-prefix=RV32-ZBA %s |
| ; RUN: sed 's/iXLen/i32/g' %s | llc -mtriple=riscv32 -mattr=+zba,+experimental-zilx -verify-machineinstrs \ |
| ; RUN: | FileCheck -check-prefix=RV32-ZBA-ZILX %s |
| ; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -verify-machineinstrs \ |
| ; RUN: | FileCheck -check-prefix=RV64 %s |
| ; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+experimental-zilx -verify-machineinstrs \ |
| ; RUN: | FileCheck -check-prefix=RV64-ZILX %s |
| ; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zba -verify-machineinstrs \ |
| ; RUN: | FileCheck -check-prefix=RV64-ZBA %s |
| ; RUN: sed 's/iXLen/i64/g' %s | llc -mtriple=riscv64 -mattr=+zba,+experimental-zilx -verify-machineinstrs \ |
| ; RUN: | FileCheck -check-prefix=RV64-ZBA-ZILX %s |
| |
| ;------------------------------------------------------------------------------ |
| ; Unscaled indexed loads: address = base + index. |
| ;------------------------------------------------------------------------------ |
| |
| define i16 @lxh(ptr %a, iXLen %b) { |
| ; RV32-LABEL: lxh: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lh a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxh: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: lxh a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxh: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: add a0, a0, a1 |
| ; RV32-ZBA-NEXT: lh a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxh: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: lxh a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxh: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lh a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxh: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxh a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxh: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: add a0, a0, a1 |
| ; RV64-ZBA-NEXT: lh a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxh: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxh a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = getelementptr i8, ptr %a, iXLen %b |
| %2 = load i16, ptr %1, align 2 |
| ret i16 %2 |
| } |
| |
| define i32 @lxhu(ptr %a, iXLen %b) { |
| ; RV32-LABEL: lxhu: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lhu a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxhu: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: lxhu a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxhu: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: add a0, a0, a1 |
| ; RV32-ZBA-NEXT: lhu a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxhu: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: lxhu a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxhu: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lhu a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxhu: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxhu a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxhu: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: add a0, a0, a1 |
| ; RV64-ZBA-NEXT: lhu a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxhu: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxhu a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = getelementptr i8, ptr %a, iXLen %b |
| %2 = load i16, ptr %1, align 2 |
| %3 = zext i16 %2 to i32 |
| ret i32 %3 |
| } |
| |
| define i32 @lxw(ptr %a, iXLen %b) { |
| ; RV32-LABEL: lxw: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lw a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxw: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: lxw a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxw: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: add a0, a0, a1 |
| ; RV32-ZBA-NEXT: lw a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxw: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: lxw a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxw: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lw a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxw: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxw a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxw: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: add a0, a0, a1 |
| ; RV64-ZBA-NEXT: lw a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxw: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxw a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = getelementptr i8, ptr %a, iXLen %b |
| %2 = load i32, ptr %1, align 4 |
| ret i32 %2 |
| } |
| |
| define i64 @lxwu(ptr %a, iXLen %b) { |
| ; RV32-LABEL: lxwu: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lw a0, 0(a0) |
| ; RV32-NEXT: li a1, 0 |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxwu: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: lxw a0, (a0), a1 |
| ; RV32-ZILX-NEXT: li a1, 0 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxwu: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: add a0, a0, a1 |
| ; RV32-ZBA-NEXT: lw a0, 0(a0) |
| ; RV32-ZBA-NEXT: li a1, 0 |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxwu: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: lxw a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: li a1, 0 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxwu: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lwu a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxwu: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxwu a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxwu: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: add a0, a0, a1 |
| ; RV64-ZBA-NEXT: lwu a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxwu: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxwu a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = getelementptr i8, ptr %a, iXLen %b |
| %2 = load i32, ptr %1, align 4 |
| %3 = zext i32 %2 to i64 |
| ret i64 %3 |
| } |
| |
| define i64 @lxd(ptr %a, iXLen %b) { |
| ; RV32-LABEL: lxd: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: add a1, a0, a1 |
| ; RV32-NEXT: lw a0, 0(a1) |
| ; RV32-NEXT: lw a1, 4(a1) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxd: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: add a1, a0, a1 |
| ; RV32-ZILX-NEXT: lw a0, 0(a1) |
| ; RV32-ZILX-NEXT: lw a1, 4(a1) |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxd: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: add a1, a0, a1 |
| ; RV32-ZBA-NEXT: lw a0, 0(a1) |
| ; RV32-ZBA-NEXT: lw a1, 4(a1) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxd: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: add a1, a0, a1 |
| ; RV32-ZBA-ZILX-NEXT: lw a0, 0(a1) |
| ; RV32-ZBA-ZILX-NEXT: lw a1, 4(a1) |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxd: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: ld a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxd: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxd a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxd: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: add a0, a0, a1 |
| ; RV64-ZBA-NEXT: ld a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxd: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxd a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = getelementptr i8, ptr %a, iXLen %b |
| %2 = load i64, ptr %1, align 8 |
| ret i64 %2 |
| } |
| |
| ;------------------------------------------------------------------------------ |
| ; Scaled indexed loads: address = base + (index << log2(access-size)). |
| ; Byte loads are provided only in scaled form (the byte scale factor is 1). |
| ;------------------------------------------------------------------------------ |
| |
| define i8 @lxsb_anyext(ptr %a, iXLen %b) { |
| ; RV32-LABEL: lxsb_anyext: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lbu a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsb_anyext: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: lxsb a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsb_anyext: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: add a0, a0, a1 |
| ; RV32-ZBA-NEXT: lbu a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsb_anyext: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: lxsb a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsb_anyext: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lbu a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsb_anyext: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxsb a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsb_anyext: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: add a0, a0, a1 |
| ; RV64-ZBA-NEXT: lbu a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsb_anyext: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxsb a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = getelementptr i8, ptr %a, iXLen %b |
| %2 = load i8, ptr %1, align 1 |
| ret i8 %2 |
| } |
| |
| define i32 @lxsb(ptr %a, iXLen %b) { |
| ; RV32-LABEL: lxsb: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lb a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsb: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: lxsb a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsb: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: add a0, a0, a1 |
| ; RV32-ZBA-NEXT: lb a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsb: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: lxsb a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsb: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lb a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsb: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxsb a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsb: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: add a0, a0, a1 |
| ; RV64-ZBA-NEXT: lb a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsb: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxsb a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = getelementptr i8, ptr %a, iXLen %b |
| %2 = load i8, ptr %1, align 1 |
| %3 = sext i8 %2 to i32 |
| ret i32 %3 |
| } |
| |
| define i32 @lxsbu(ptr %a, iXLen %b) { |
| ; RV32-LABEL: lxsbu: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lbu a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsbu: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: lxsbu a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsbu: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: add a0, a0, a1 |
| ; RV32-ZBA-NEXT: lbu a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsbu: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: lxsbu a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsbu: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lbu a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsbu: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxsbu a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsbu: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: add a0, a0, a1 |
| ; RV64-ZBA-NEXT: lbu a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsbu: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxsbu a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = getelementptr i8, ptr %a, iXLen %b |
| %2 = load i8, ptr %1, align 1 |
| %3 = zext i8 %2 to i32 |
| ret i32 %3 |
| } |
| |
| define i16 @lxsh_anyext(ptr %a, iXLen %b) { |
| ; RV32-LABEL: lxsh_anyext: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 1 |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lh a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsh_anyext: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: lxsh a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsh_anyext: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh1add a0, a1, a0 |
| ; RV32-ZBA-NEXT: lh a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsh_anyext: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: lxsh a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsh_anyext: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 1 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lh a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsh_anyext: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxsh a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsh_anyext: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh1add a0, a1, a0 |
| ; RV64-ZBA-NEXT: lh a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsh_anyext: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxsh a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = getelementptr i16, ptr %a, iXLen %b |
| %2 = load i16, ptr %1, align 2 |
| ret i16 %2 |
| } |
| |
| define i32 @lxsh(ptr %a, iXLen %b) { |
| ; RV32-LABEL: lxsh: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 1 |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lh a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsh: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: lxsh a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsh: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh1add a0, a1, a0 |
| ; RV32-ZBA-NEXT: lh a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsh: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: lxsh a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsh: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 1 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lh a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsh: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxsh a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsh: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh1add a0, a1, a0 |
| ; RV64-ZBA-NEXT: lh a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsh: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxsh a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = getelementptr i16, ptr %a, iXLen %b |
| %2 = load i16, ptr %1, align 2 |
| %3 = sext i16 %2 to i32 |
| ret i32 %3 |
| } |
| |
| define i32 @lxshu(ptr %a, iXLen %b) { |
| ; RV32-LABEL: lxshu: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 1 |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lhu a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxshu: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: lxshu a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxshu: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh1add a0, a1, a0 |
| ; RV32-ZBA-NEXT: lhu a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxshu: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: lxshu a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxshu: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 1 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lhu a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxshu: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxshu a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxshu: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh1add a0, a1, a0 |
| ; RV64-ZBA-NEXT: lhu a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxshu: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxshu a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = getelementptr i16, ptr %a, iXLen %b |
| %2 = load i16, ptr %1, align 2 |
| %3 = zext i16 %2 to i32 |
| ret i32 %3 |
| } |
| |
| define i32 @lxsw_anyext(ptr %a, iXLen %b) { |
| ; RV32-LABEL: lxsw_anyext: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 2 |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lw a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsw_anyext: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: lxsw a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsw_anyext: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh2add a0, a1, a0 |
| ; RV32-ZBA-NEXT: lw a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsw_anyext: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: lxsw a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsw_anyext: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 2 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lw a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsw_anyext: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxsw a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsw_anyext: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh2add a0, a1, a0 |
| ; RV64-ZBA-NEXT: lw a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsw_anyext: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxsw a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = getelementptr i32, ptr %a, iXLen %b |
| %2 = load i32, ptr %1, align 4 |
| ret i32 %2 |
| } |
| |
| define i64 @lxsw(ptr %a, iXLen %b) { |
| ; RV32-LABEL: lxsw: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 2 |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lw a0, 0(a0) |
| ; RV32-NEXT: srai a1, a0, 31 |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsw: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: lxsw a0, (a0), a1 |
| ; RV32-ZILX-NEXT: srai a1, a0, 31 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsw: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh2add a0, a1, a0 |
| ; RV32-ZBA-NEXT: lw a0, 0(a0) |
| ; RV32-ZBA-NEXT: srai a1, a0, 31 |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsw: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: lxsw a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: srai a1, a0, 31 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsw: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 2 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lw a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsw: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxsw a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsw: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh2add a0, a1, a0 |
| ; RV64-ZBA-NEXT: lw a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsw: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxsw a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = getelementptr i32, ptr %a, iXLen %b |
| %2 = load i32, ptr %1, align 4 |
| %3 = sext i32 %2 to i64 |
| ret i64 %3 |
| } |
| |
| define i64 @lxswu(ptr %a, iXLen %b) { |
| ; RV32-LABEL: lxswu: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 2 |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lw a0, 0(a0) |
| ; RV32-NEXT: li a1, 0 |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxswu: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: lxsw a0, (a0), a1 |
| ; RV32-ZILX-NEXT: li a1, 0 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxswu: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh2add a0, a1, a0 |
| ; RV32-ZBA-NEXT: lw a0, 0(a0) |
| ; RV32-ZBA-NEXT: li a1, 0 |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxswu: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: lxsw a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: li a1, 0 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxswu: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 2 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lwu a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxswu: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxswu a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxswu: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh2add a0, a1, a0 |
| ; RV64-ZBA-NEXT: lwu a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxswu: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxswu a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = getelementptr i32, ptr %a, iXLen %b |
| %2 = load i32, ptr %1, align 4 |
| %3 = zext i32 %2 to i64 |
| ret i64 %3 |
| } |
| |
| define i64 @lxsd(ptr %a, iXLen %b) { |
| ; RV32-LABEL: lxsd: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 3 |
| ; RV32-NEXT: add a1, a0, a1 |
| ; RV32-NEXT: lw a0, 0(a1) |
| ; RV32-NEXT: lw a1, 4(a1) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsd: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: slli a1, a1, 3 |
| ; RV32-ZILX-NEXT: add a1, a0, a1 |
| ; RV32-ZILX-NEXT: lw a0, 0(a1) |
| ; RV32-ZILX-NEXT: lw a1, 4(a1) |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsd: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh3add a1, a1, a0 |
| ; RV32-ZBA-NEXT: lw a0, 0(a1) |
| ; RV32-ZBA-NEXT: lw a1, 4(a1) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsd: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: sh3add a1, a1, a0 |
| ; RV32-ZBA-ZILX-NEXT: lw a0, 0(a1) |
| ; RV32-ZBA-ZILX-NEXT: lw a1, 4(a1) |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsd: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 3 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: ld a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsd: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxsd a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsd: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh3add a0, a1, a0 |
| ; RV64-ZBA-NEXT: ld a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsd: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxsd a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = getelementptr i64, ptr %a, iXLen %b |
| %2 = load i64, ptr %1, align 8 |
| ret i64 %2 |
| } |
| |
| define i64 @lxsd_disjoint(ptr %a, iXLen %b) { |
| ; RV32-LABEL: lxsd_disjoint: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 3 |
| ; RV32-NEXT: add a1, a1, a0 |
| ; RV32-NEXT: lw a0, 96(a1) |
| ; RV32-NEXT: lw a1, 100(a1) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsd_disjoint: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: slli a1, a1, 3 |
| ; RV32-ZILX-NEXT: add a1, a1, a0 |
| ; RV32-ZILX-NEXT: lw a0, 96(a1) |
| ; RV32-ZILX-NEXT: lw a1, 100(a1) |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsd_disjoint: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh3add a1, a1, a0 |
| ; RV32-ZBA-NEXT: lw a0, 96(a1) |
| ; RV32-ZBA-NEXT: lw a1, 100(a1) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsd_disjoint: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: sh3add a1, a1, a0 |
| ; RV32-ZBA-ZILX-NEXT: lw a0, 96(a1) |
| ; RV32-ZBA-ZILX-NEXT: lw a1, 100(a1) |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsd_disjoint: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 3 |
| ; RV64-NEXT: add a0, a1, a0 |
| ; RV64-NEXT: ld a0, 96(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsd_disjoint: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: addi a0, a0, 96 |
| ; RV64-ZILX-NEXT: lxsd a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsd_disjoint: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh3add a0, a1, a0 |
| ; RV64-ZBA-NEXT: ld a0, 96(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsd_disjoint: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: sh3add a0, a1, a0 |
| ; RV64-ZBA-ZILX-NEXT: ld a0, 96(a0) |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = add iXLen %b, 12 |
| %2 = getelementptr i64, ptr %a, iXLen %1 |
| %3 = load i64, ptr %2, align 8 |
| ret i64 %3 |
| } |
| |
| ;------------------------------------------------------------------------------ |
| ; Scaled indexed loads with a zero-extended 32-bit index (RV64-only): |
| ; address = base + (zext32(index) << log2(access-size)). |
| ;------------------------------------------------------------------------------ |
| |
| define i8 @lxsuwb_anyext(ptr %a, i32 %b) { |
| ; RV32-LABEL: lxsuwb_anyext: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lbu a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsuwb_anyext: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: lxsb a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsuwb_anyext: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: add a0, a0, a1 |
| ; RV32-ZBA-NEXT: lbu a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsuwb_anyext: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: lxsb a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsuwb_anyext: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 32 |
| ; RV64-NEXT: srli a1, a1, 32 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lbu a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsuwb_anyext: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxsuwb a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsuwb_anyext: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: add.uw a0, a1, a0 |
| ; RV64-ZBA-NEXT: lbu a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsuwb_anyext: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxsuwb a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = zext i32 %b to i64 |
| %2 = getelementptr i8, ptr %a, i64 %1 |
| %3 = load i8, ptr %2, align 1 |
| ret i8 %3 |
| } |
| |
| define i32 @lxsuwb(ptr %a, i32 %b) { |
| ; RV32-LABEL: lxsuwb: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lb a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsuwb: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: lxsb a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsuwb: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: add a0, a0, a1 |
| ; RV32-ZBA-NEXT: lb a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsuwb: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: lxsb a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsuwb: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 32 |
| ; RV64-NEXT: srli a1, a1, 32 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lb a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsuwb: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxsuwb a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsuwb: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: add.uw a0, a1, a0 |
| ; RV64-ZBA-NEXT: lb a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsuwb: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxsuwb a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = zext i32 %b to i64 |
| %2 = getelementptr i8, ptr %a, i64 %1 |
| %3 = load i8, ptr %2, align 1 |
| %4 = sext i8 %3 to i32 |
| ret i32 %4 |
| } |
| |
| define i32 @lxsuwbu(ptr %a, i32 %b) { |
| ; RV32-LABEL: lxsuwbu: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lbu a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsuwbu: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: lxsbu a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsuwbu: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: add a0, a0, a1 |
| ; RV32-ZBA-NEXT: lbu a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsuwbu: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: lxsbu a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsuwbu: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 32 |
| ; RV64-NEXT: srli a1, a1, 32 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lbu a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsuwbu: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxsuwbu a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsuwbu: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: add.uw a0, a1, a0 |
| ; RV64-ZBA-NEXT: lbu a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsuwbu: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxsuwbu a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = zext i32 %b to i64 |
| %2 = getelementptr i8, ptr %a, i64 %1 |
| %3 = load i8, ptr %2, align 1 |
| %4 = zext i8 %3 to i32 |
| ret i32 %4 |
| } |
| |
| define i16 @lxsuwh_anyext(ptr %a, i32 %b) { |
| ; RV32-LABEL: lxsuwh_anyext: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 1 |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lh a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsuwh_anyext: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: lxsh a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsuwh_anyext: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh1add a0, a1, a0 |
| ; RV32-ZBA-NEXT: lh a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsuwh_anyext: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: lxsh a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsuwh_anyext: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 32 |
| ; RV64-NEXT: srli a1, a1, 31 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lh a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsuwh_anyext: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxsuwh a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsuwh_anyext: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh1add.uw a0, a1, a0 |
| ; RV64-ZBA-NEXT: lh a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsuwh_anyext: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxsuwh a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = zext i32 %b to i64 |
| %2 = getelementptr i16, ptr %a, i64 %1 |
| %3 = load i16, ptr %2, align 2 |
| ret i16 %3 |
| } |
| |
| define i32 @lxsuwh(ptr %a, i32 %b) { |
| ; RV32-LABEL: lxsuwh: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 1 |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lh a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsuwh: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: lxsh a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsuwh: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh1add a0, a1, a0 |
| ; RV32-ZBA-NEXT: lh a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsuwh: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: lxsh a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsuwh: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 32 |
| ; RV64-NEXT: srli a1, a1, 31 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lh a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsuwh: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxsuwh a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsuwh: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh1add.uw a0, a1, a0 |
| ; RV64-ZBA-NEXT: lh a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsuwh: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxsuwh a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = zext i32 %b to i64 |
| %2 = getelementptr i16, ptr %a, i64 %1 |
| %3 = load i16, ptr %2, align 2 |
| %4 = sext i16 %3 to i32 |
| ret i32 %4 |
| } |
| |
| define i32 @lxsuwhu(ptr %a, i32 %b) { |
| ; RV32-LABEL: lxsuwhu: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 1 |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lhu a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsuwhu: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: lxshu a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsuwhu: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh1add a0, a1, a0 |
| ; RV32-ZBA-NEXT: lhu a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsuwhu: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: lxshu a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsuwhu: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 32 |
| ; RV64-NEXT: srli a1, a1, 31 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lhu a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsuwhu: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxsuwhu a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsuwhu: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh1add.uw a0, a1, a0 |
| ; RV64-ZBA-NEXT: lhu a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsuwhu: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxsuwhu a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = zext i32 %b to i64 |
| %2 = getelementptr i16, ptr %a, i64 %1 |
| %3 = load i16, ptr %2, align 2 |
| %4 = zext i16 %3 to i32 |
| ret i32 %4 |
| } |
| |
| define i32 @lxsuww_anyext(ptr %a, i32 %b) { |
| ; RV32-LABEL: lxsuww_anyext: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 2 |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lw a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsuww_anyext: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: lxsw a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsuww_anyext: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh2add a0, a1, a0 |
| ; RV32-ZBA-NEXT: lw a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsuww_anyext: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: lxsw a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsuww_anyext: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 32 |
| ; RV64-NEXT: srli a1, a1, 30 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lw a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsuww_anyext: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxsuww a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsuww_anyext: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh2add.uw a0, a1, a0 |
| ; RV64-ZBA-NEXT: lw a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsuww_anyext: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxsuww a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = zext i32 %b to i64 |
| %2 = getelementptr i32, ptr %a, i64 %1 |
| %3 = load i32, ptr %2, align 4 |
| ret i32 %3 |
| } |
| |
| define i64 @lxsuww(ptr %a, i32 %b) { |
| ; RV32-LABEL: lxsuww: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 2 |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lw a0, 0(a0) |
| ; RV32-NEXT: srai a1, a0, 31 |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsuww: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: lxsw a0, (a0), a1 |
| ; RV32-ZILX-NEXT: srai a1, a0, 31 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsuww: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh2add a0, a1, a0 |
| ; RV32-ZBA-NEXT: lw a0, 0(a0) |
| ; RV32-ZBA-NEXT: srai a1, a0, 31 |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsuww: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: lxsw a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: srai a1, a0, 31 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsuww: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 32 |
| ; RV64-NEXT: srli a1, a1, 30 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lw a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsuww: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxsuww a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsuww: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh2add.uw a0, a1, a0 |
| ; RV64-ZBA-NEXT: lw a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsuww: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxsuww a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = zext i32 %b to i64 |
| %2 = getelementptr i32, ptr %a, i64 %1 |
| %3 = load i32, ptr %2, align 4 |
| %4 = sext i32 %3 to i64 |
| ret i64 %4 |
| } |
| |
| define i64 @lxsuwwu(ptr %a, i32 %b) { |
| ; RV32-LABEL: lxsuwwu: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 2 |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lw a0, 0(a0) |
| ; RV32-NEXT: li a1, 0 |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsuwwu: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: lxsw a0, (a0), a1 |
| ; RV32-ZILX-NEXT: li a1, 0 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsuwwu: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh2add a0, a1, a0 |
| ; RV32-ZBA-NEXT: lw a0, 0(a0) |
| ; RV32-ZBA-NEXT: li a1, 0 |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsuwwu: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: lxsw a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: li a1, 0 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsuwwu: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 32 |
| ; RV64-NEXT: srli a1, a1, 30 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lwu a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsuwwu: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxsuwwu a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsuwwu: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh2add.uw a0, a1, a0 |
| ; RV64-ZBA-NEXT: lwu a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsuwwu: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxsuwwu a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = zext i32 %b to i64 |
| %2 = getelementptr i32, ptr %a, i64 %1 |
| %3 = load i32, ptr %2, align 4 |
| %4 = zext i32 %3 to i64 |
| ret i64 %4 |
| } |
| |
| define i64 @lxsuwd(ptr %a, i32 %b) { |
| ; RV32-LABEL: lxsuwd: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 3 |
| ; RV32-NEXT: add a1, a0, a1 |
| ; RV32-NEXT: lw a0, 0(a1) |
| ; RV32-NEXT: lw a1, 4(a1) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsuwd: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: slli a1, a1, 3 |
| ; RV32-ZILX-NEXT: add a1, a0, a1 |
| ; RV32-ZILX-NEXT: lw a0, 0(a1) |
| ; RV32-ZILX-NEXT: lw a1, 4(a1) |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsuwd: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh3add a1, a1, a0 |
| ; RV32-ZBA-NEXT: lw a0, 0(a1) |
| ; RV32-ZBA-NEXT: lw a1, 4(a1) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsuwd: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: sh3add a1, a1, a0 |
| ; RV32-ZBA-ZILX-NEXT: lw a0, 0(a1) |
| ; RV32-ZBA-ZILX-NEXT: lw a1, 4(a1) |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsuwd: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 32 |
| ; RV64-NEXT: srli a1, a1, 29 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: ld a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsuwd: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: lxsuwd a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsuwd: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh3add.uw a0, a1, a0 |
| ; RV64-ZBA-NEXT: ld a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsuwd: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: lxsuwd a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = zext i32 %b to i64 |
| %2 = getelementptr i64, ptr %a, i64 %1 |
| %3 = load i64, ptr %2, align 8 |
| ret i64 %3 |
| } |
| |
| ;------------------------------------------------------------------------------ |
| ; Mismatched shift amount: the shift does not match the access size, so the |
| ; scaled forms must not be selected. |
| ;------------------------------------------------------------------------------ |
| |
| define zeroext i8 @lxsbu_shl_too_large(ptr %a, iXLen %b) { |
| ; RV32-LABEL: lxsbu_shl_too_large: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 2 |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lbu a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsbu_shl_too_large: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: slli a1, a1, 2 |
| ; RV32-ZILX-NEXT: lxsbu a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsbu_shl_too_large: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh2add a0, a1, a0 |
| ; RV32-ZBA-NEXT: lbu a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsbu_shl_too_large: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: slli a1, a1, 2 |
| ; RV32-ZBA-ZILX-NEXT: lxsbu a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsbu_shl_too_large: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 2 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lbu a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsbu_shl_too_large: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: slli a1, a1, 2 |
| ; RV64-ZILX-NEXT: lxsbu a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsbu_shl_too_large: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh2add a0, a1, a0 |
| ; RV64-ZBA-NEXT: lbu a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsbu_shl_too_large: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: slli a1, a1, 2 |
| ; RV64-ZBA-ZILX-NEXT: lxsbu a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = getelementptr i32, ptr %a, iXLen %b |
| %2 = load i8, ptr %1, align 1 |
| ret i8 %2 |
| } |
| |
| define signext i16 @lxsh_shl_too_large(ptr %a, iXLen %b) { |
| ; RV32-LABEL: lxsh_shl_too_large: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 2 |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lh a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsh_shl_too_large: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: slli a1, a1, 2 |
| ; RV32-ZILX-NEXT: lxh a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsh_shl_too_large: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh2add a0, a1, a0 |
| ; RV32-ZBA-NEXT: lh a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsh_shl_too_large: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: slli a1, a1, 2 |
| ; RV32-ZBA-ZILX-NEXT: lxh a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsh_shl_too_large: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 2 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lh a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsh_shl_too_large: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: slli a1, a1, 2 |
| ; RV64-ZILX-NEXT: lxh a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsh_shl_too_large: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh2add a0, a1, a0 |
| ; RV64-ZBA-NEXT: lh a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsh_shl_too_large: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: slli a1, a1, 2 |
| ; RV64-ZBA-ZILX-NEXT: lxh a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = getelementptr i32, ptr %a, iXLen %b |
| %2 = load i16, ptr %1, align 2 |
| ret i16 %2 |
| } |
| |
| define i32 @lxsw_shl_too_small(ptr %a, iXLen %b) { |
| ; RV32-LABEL: lxsw_shl_too_small: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 1 |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lw a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsw_shl_too_small: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: slli a1, a1, 1 |
| ; RV32-ZILX-NEXT: lxw a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsw_shl_too_small: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh1add a0, a1, a0 |
| ; RV32-ZBA-NEXT: lw a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsw_shl_too_small: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: slli a1, a1, 1 |
| ; RV32-ZBA-ZILX-NEXT: lxw a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsw_shl_too_small: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 1 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lw a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsw_shl_too_small: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: slli a1, a1, 1 |
| ; RV64-ZILX-NEXT: lxw a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsw_shl_too_small: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh1add a0, a1, a0 |
| ; RV64-ZBA-NEXT: lw a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsw_shl_too_small: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: slli a1, a1, 1 |
| ; RV64-ZBA-ZILX-NEXT: lxw a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = getelementptr i16, ptr %a, iXLen %b |
| %2 = load i32, ptr %1, align 4 |
| ret i32 %2 |
| } |
| |
| define i32 @lxsw_shl_too_large(ptr %a, iXLen %b) { |
| ; RV32-LABEL: lxsw_shl_too_large: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 3 |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lw a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsw_shl_too_large: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: slli a1, a1, 3 |
| ; RV32-ZILX-NEXT: lxw a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsw_shl_too_large: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh3add a0, a1, a0 |
| ; RV32-ZBA-NEXT: lw a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsw_shl_too_large: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: slli a1, a1, 3 |
| ; RV32-ZBA-ZILX-NEXT: lxw a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsw_shl_too_large: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 3 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lw a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsw_shl_too_large: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: slli a1, a1, 3 |
| ; RV64-ZILX-NEXT: lxw a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsw_shl_too_large: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh3add a0, a1, a0 |
| ; RV64-ZBA-NEXT: lw a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsw_shl_too_large: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: slli a1, a1, 3 |
| ; RV64-ZBA-ZILX-NEXT: lxw a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = getelementptr i64, ptr %a, iXLen %b |
| %2 = load i32, ptr %1, align 4 |
| ret i32 %2 |
| } |
| |
| define i64 @lxsd_shl_too_small(ptr %a, iXLen %b) { |
| ; RV32-LABEL: lxsd_shl_too_small: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 2 |
| ; RV32-NEXT: add a1, a0, a1 |
| ; RV32-NEXT: lw a0, 0(a1) |
| ; RV32-NEXT: lw a1, 4(a1) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsd_shl_too_small: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: addi a2, a0, 4 |
| ; RV32-ZILX-NEXT: lxsw a0, (a0), a1 |
| ; RV32-ZILX-NEXT: lxsw a1, (a2), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsd_shl_too_small: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh2add a1, a1, a0 |
| ; RV32-ZBA-NEXT: lw a0, 0(a1) |
| ; RV32-ZBA-NEXT: lw a1, 4(a1) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsd_shl_too_small: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: sh2add a1, a1, a0 |
| ; RV32-ZBA-ZILX-NEXT: lw a0, 0(a1) |
| ; RV32-ZBA-ZILX-NEXT: lw a1, 4(a1) |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsd_shl_too_small: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 2 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: ld a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsd_shl_too_small: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: slli a1, a1, 2 |
| ; RV64-ZILX-NEXT: lxd a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsd_shl_too_small: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh2add a0, a1, a0 |
| ; RV64-ZBA-NEXT: ld a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsd_shl_too_small: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: slli a1, a1, 2 |
| ; RV64-ZBA-ZILX-NEXT: lxd a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = getelementptr i32, ptr %a, iXLen %b |
| %2 = load i64, ptr %1, align 8 |
| ret i64 %2 |
| } |
| |
| define signext i16 @lxsuwh_shl_too_large(ptr %a, i32 %b) { |
| ; RV32-LABEL: lxsuwh_shl_too_large: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 2 |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lh a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsuwh_shl_too_large: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: slli a1, a1, 2 |
| ; RV32-ZILX-NEXT: lxh a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsuwh_shl_too_large: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh2add a0, a1, a0 |
| ; RV32-ZBA-NEXT: lh a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsuwh_shl_too_large: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: slli a1, a1, 2 |
| ; RV32-ZBA-ZILX-NEXT: lxh a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsuwh_shl_too_large: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 32 |
| ; RV64-NEXT: srli a1, a1, 30 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lh a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsuwh_shl_too_large: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: slli a1, a1, 32 |
| ; RV64-ZILX-NEXT: srli a1, a1, 30 |
| ; RV64-ZILX-NEXT: lxh a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsuwh_shl_too_large: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh2add.uw a0, a1, a0 |
| ; RV64-ZBA-NEXT: lh a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsuwh_shl_too_large: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: slli.uw a1, a1, 2 |
| ; RV64-ZBA-ZILX-NEXT: lxh a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = zext i32 %b to i64 |
| %2 = getelementptr i32, ptr %a, i64 %1 |
| %3 = load i16, ptr %2, align 2 |
| ret i16 %3 |
| } |
| |
| define i32 @lxsuww_shl_too_small(ptr %a, i32 %b) { |
| ; RV32-LABEL: lxsuww_shl_too_small: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 1 |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lw a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsuww_shl_too_small: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: slli a1, a1, 1 |
| ; RV32-ZILX-NEXT: lxw a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsuww_shl_too_small: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh1add a0, a1, a0 |
| ; RV32-ZBA-NEXT: lw a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsuww_shl_too_small: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: slli a1, a1, 1 |
| ; RV32-ZBA-ZILX-NEXT: lxw a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsuww_shl_too_small: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 32 |
| ; RV64-NEXT: srli a1, a1, 31 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lw a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsuww_shl_too_small: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: slli a1, a1, 32 |
| ; RV64-ZILX-NEXT: srli a1, a1, 31 |
| ; RV64-ZILX-NEXT: lxw a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsuww_shl_too_small: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh1add.uw a0, a1, a0 |
| ; RV64-ZBA-NEXT: lw a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsuww_shl_too_small: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: slli.uw a1, a1, 1 |
| ; RV64-ZBA-ZILX-NEXT: lxw a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = zext i32 %b to i64 |
| %2 = getelementptr i16, ptr %a, i64 %1 |
| %3 = load i32, ptr %2, align 4 |
| ret i32 %3 |
| } |
| |
| define i32 @lxsuww_shl_too_large(ptr %a, i32 %b) { |
| ; RV32-LABEL: lxsuww_shl_too_large: |
| ; RV32: # %bb.0: |
| ; RV32-NEXT: slli a1, a1, 3 |
| ; RV32-NEXT: add a0, a0, a1 |
| ; RV32-NEXT: lw a0, 0(a0) |
| ; RV32-NEXT: ret |
| ; |
| ; RV32-ZILX-LABEL: lxsuww_shl_too_large: |
| ; RV32-ZILX: # %bb.0: |
| ; RV32-ZILX-NEXT: slli a1, a1, 3 |
| ; RV32-ZILX-NEXT: lxw a0, (a0), a1 |
| ; RV32-ZILX-NEXT: ret |
| ; |
| ; RV32-ZBA-LABEL: lxsuww_shl_too_large: |
| ; RV32-ZBA: # %bb.0: |
| ; RV32-ZBA-NEXT: sh3add a0, a1, a0 |
| ; RV32-ZBA-NEXT: lw a0, 0(a0) |
| ; RV32-ZBA-NEXT: ret |
| ; |
| ; RV32-ZBA-ZILX-LABEL: lxsuww_shl_too_large: |
| ; RV32-ZBA-ZILX: # %bb.0: |
| ; RV32-ZBA-ZILX-NEXT: slli a1, a1, 3 |
| ; RV32-ZBA-ZILX-NEXT: lxw a0, (a0), a1 |
| ; RV32-ZBA-ZILX-NEXT: ret |
| ; |
| ; RV64-LABEL: lxsuww_shl_too_large: |
| ; RV64: # %bb.0: |
| ; RV64-NEXT: slli a1, a1, 32 |
| ; RV64-NEXT: srli a1, a1, 29 |
| ; RV64-NEXT: add a0, a0, a1 |
| ; RV64-NEXT: lw a0, 0(a0) |
| ; RV64-NEXT: ret |
| ; |
| ; RV64-ZILX-LABEL: lxsuww_shl_too_large: |
| ; RV64-ZILX: # %bb.0: |
| ; RV64-ZILX-NEXT: slli a1, a1, 32 |
| ; RV64-ZILX-NEXT: srli a1, a1, 29 |
| ; RV64-ZILX-NEXT: lxw a0, (a0), a1 |
| ; RV64-ZILX-NEXT: ret |
| ; |
| ; RV64-ZBA-LABEL: lxsuww_shl_too_large: |
| ; RV64-ZBA: # %bb.0: |
| ; RV64-ZBA-NEXT: sh3add.uw a0, a1, a0 |
| ; RV64-ZBA-NEXT: lw a0, 0(a0) |
| ; RV64-ZBA-NEXT: ret |
| ; |
| ; RV64-ZBA-ZILX-LABEL: lxsuww_shl_too_large: |
| ; RV64-ZBA-ZILX: # %bb.0: |
| ; RV64-ZBA-ZILX-NEXT: slli.uw a1, a1, 3 |
| ; RV64-ZBA-ZILX-NEXT: lxw a0, (a0), a1 |
| ; RV64-ZBA-ZILX-NEXT: ret |
| %1 = zext i32 %b to i64 |
| %2 = getelementptr i64, ptr %a, i64 %1 |
| %3 = load i32, ptr %2, align 4 |
| ret i32 %3 |
| } |