1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
; 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
}
|