blob: 4c045e581eefac99d29b46a03c732d276b575be0 [file] [edit]
; 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
}