1; RUN: llc < %s -mtriple=arm64-eabi | FileCheck %s 2 3define i64 @_f0(ptr %p) { 4; CHECK: f0: 5; CHECK: ldur x0, [x0, #-8] 6; CHECK-NEXT: ret 7 %tmp = getelementptr inbounds i64, ptr %p, i64 -1 8 %ret = load i64, ptr %tmp, align 2 9 ret i64 %ret 10} 11define i32 @_f1(ptr %p) { 12; CHECK: f1: 13; CHECK: ldur w0, [x0, #-4] 14; CHECK-NEXT: ret 15 %tmp = getelementptr inbounds i32, ptr %p, i64 -1 16 %ret = load i32, ptr %tmp, align 2 17 ret i32 %ret 18} 19define i16 @_f2(ptr %p) { 20; CHECK: f2: 21; CHECK: ldurh w0, [x0, #-2] 22; CHECK-NEXT: ret 23 %tmp = getelementptr inbounds i16, ptr %p, i64 -1 24 %ret = load i16, ptr %tmp, align 2 25 ret i16 %ret 26} 27define i8 @_f3(ptr %p) { 28; CHECK: f3: 29; CHECK: ldurb w0, [x0, #-1] 30; CHECK-NEXT: ret 31 %tmp = getelementptr inbounds i8, ptr %p, i64 -1 32 %ret = load i8, ptr %tmp, align 2 33 ret i8 %ret 34} 35 36define i64 @zext32(ptr %a) nounwind ssp { 37; CHECK-LABEL: zext32: 38; CHECK: ldur w0, [x0, #-12] 39; CHECK-NEXT: ret 40 %p = getelementptr inbounds i8, ptr %a, i64 -12 41 %tmp2 = load i32, ptr %p, align 4 42 %ret = zext i32 %tmp2 to i64 43 44 ret i64 %ret 45} 46define i64 @zext16(ptr %a) nounwind ssp { 47; CHECK-LABEL: zext16: 48; CHECK: ldurh w0, [x0, #-12] 49; CHECK-NEXT: ret 50 %p = getelementptr inbounds i8, ptr %a, i64 -12 51 %tmp2 = load i16, ptr %p, align 2 52 %ret = zext i16 %tmp2 to i64 53 54 ret i64 %ret 55} 56define i64 @zext8(ptr %a) nounwind ssp { 57; CHECK-LABEL: zext8: 58; CHECK: ldurb w0, [x0, #-12] 59; CHECK-NEXT: ret 60 %p = getelementptr inbounds i8, ptr %a, i64 -12 61 %tmp2 = load i8, ptr %p, align 1 62 %ret = zext i8 %tmp2 to i64 63 64 ret i64 %ret 65} 66