93 lines
2.4 KiB
LLVM
93 lines
2.4 KiB
LLVM
|
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
||
|
; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
|
||
|
; RUN: -riscv-experimental-rv64-legal-i32 | FileCheck -check-prefix=RV64I %s
|
||
|
|
||
|
; Check indexed and unindexed, sext, zext and anyext loads
|
||
|
|
||
|
define void @lb(ptr %a, ptr %b) nounwind {
|
||
|
; RV64I-LABEL: lb:
|
||
|
; RV64I: # %bb.0:
|
||
|
; RV64I-NEXT: lb a2, 1(a0)
|
||
|
; RV64I-NEXT: lbu zero, 0(a0)
|
||
|
; RV64I-NEXT: sw a2, 0(a1)
|
||
|
; RV64I-NEXT: ret
|
||
|
%1 = getelementptr i8, ptr %a, i32 1
|
||
|
%2 = load i8, ptr %1
|
||
|
%3 = sext i8 %2 to i32
|
||
|
; the unused load will produce an anyext for selection
|
||
|
%4 = load volatile i8, ptr %a
|
||
|
store i32 %3, ptr %b
|
||
|
ret void
|
||
|
}
|
||
|
|
||
|
define void @lbu(ptr %a, ptr %b) nounwind {
|
||
|
; RV64I-LABEL: lbu:
|
||
|
; RV64I: # %bb.0:
|
||
|
; RV64I-NEXT: lbu a0, 1(a0)
|
||
|
; RV64I-NEXT: sw a0, 0(a1)
|
||
|
; RV64I-NEXT: ret
|
||
|
%1 = getelementptr i8, ptr %a, i32 1
|
||
|
%2 = load i8, ptr %1
|
||
|
%3 = zext i8 %2 to i32
|
||
|
store i32 %3, ptr %b
|
||
|
ret void
|
||
|
}
|
||
|
|
||
|
define void @lh(ptr %a, ptr %b) nounwind {
|
||
|
; RV64I-LABEL: lh:
|
||
|
; RV64I: # %bb.0:
|
||
|
; RV64I-NEXT: lh a2, 2(a0)
|
||
|
; RV64I-NEXT: lh zero, 0(a0)
|
||
|
; RV64I-NEXT: sw a2, 0(a1)
|
||
|
; RV64I-NEXT: ret
|
||
|
%1 = getelementptr i16, ptr %a, i32 1
|
||
|
%2 = load i16, ptr %1
|
||
|
%3 = sext i16 %2 to i32
|
||
|
; the unused load will produce an anyext for selection
|
||
|
%4 = load volatile i16, ptr %a
|
||
|
store i32 %3, ptr %b
|
||
|
ret void
|
||
|
}
|
||
|
|
||
|
define void @lhu(ptr %a, ptr %b) nounwind {
|
||
|
; RV64I-LABEL: lhu:
|
||
|
; RV64I: # %bb.0:
|
||
|
; RV64I-NEXT: lhu a0, 2(a0)
|
||
|
; RV64I-NEXT: sw a0, 0(a1)
|
||
|
; RV64I-NEXT: ret
|
||
|
%1 = getelementptr i16, ptr %a, i32 1
|
||
|
%2 = load i16, ptr %1
|
||
|
%3 = zext i16 %2 to i32
|
||
|
store i32 %3, ptr %b
|
||
|
ret void
|
||
|
}
|
||
|
|
||
|
define void @lw(ptr %a, ptr %b) nounwind {
|
||
|
; RV64I-LABEL: lw:
|
||
|
; RV64I: # %bb.0:
|
||
|
; RV64I-NEXT: lw a2, 4(a0)
|
||
|
; RV64I-NEXT: lw zero, 0(a0)
|
||
|
; RV64I-NEXT: sd a2, 0(a1)
|
||
|
; RV64I-NEXT: ret
|
||
|
%1 = getelementptr i32, ptr %a, i64 1
|
||
|
%2 = load i32, ptr %1
|
||
|
%3 = sext i32 %2 to i64
|
||
|
; the unused load will produce an anyext for selection
|
||
|
%4 = load volatile i32, ptr %a
|
||
|
store i64 %3, ptr %b
|
||
|
ret void
|
||
|
}
|
||
|
|
||
|
define void @lwu(ptr %a, ptr %b) nounwind {
|
||
|
; RV64I-LABEL: lwu:
|
||
|
; RV64I: # %bb.0:
|
||
|
; RV64I-NEXT: lwu a0, 4(a0)
|
||
|
; RV64I-NEXT: sd a0, 0(a1)
|
||
|
; RV64I-NEXT: ret
|
||
|
%1 = getelementptr i32, ptr %a, i64 1
|
||
|
%2 = load i32, ptr %1
|
||
|
%3 = zext i32 %2 to i64
|
||
|
store i64 %3, ptr %b
|
||
|
ret void
|
||
|
}
|