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 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
; RUN: llc < %s -mtriple=arm64-eabi -mcpu=cyclone | FileCheck %s
%struct.x = type { i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8 }
@src = external dso_local global %struct.x
@dst = external dso_local global %struct.x
@.str1 = private unnamed_addr constant [31 x i8] c"DHRYSTONE PROGRAM, SOME STRING\00", align 1
@.str2 = private unnamed_addr constant [36 x i8] c"DHRYSTONE PROGRAM, SOME STRING BLAH\00", align 1
@.str3 = private unnamed_addr constant [24 x i8] c"DHRYSTONE PROGRAM, SOME\00", align 1
@.str4 = private unnamed_addr constant [18 x i8] c"DHRYSTONE PROGR \00", align 1
@.str5 = private unnamed_addr constant [7 x i8] c"DHRYST\00", align 1
@.str6 = private unnamed_addr constant [14 x i8] c"/tmp/rmXXXXXX\00", align 1
@spool.splbuf = internal global [512 x i8] zeroinitializer, align 16
define i32 @t0() {
; CHECK-LABEL: t0:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: adrp x8, src
; CHECK-NEXT: add x8, x8, :lo12:src
; CHECK-NEXT: ldr x9, [x8]
; CHECK-NEXT: adrp x10, dst
; CHECK-NEXT: add x10, x10, :lo12:dst
; CHECK-NEXT: str x9, [x10]
; CHECK-NEXT: ldur w8, [x8, #7]
; CHECK-NEXT: stur w8, [x10, #7]
; CHECK-NEXT: mov w0, #0 // =0x0
; CHECK-NEXT: ret
entry:
call void @llvm.memcpy.p0.p0.i32(ptr align 8 @dst, ptr align 8 @src, i32 11, i1 false)
ret i32 0
}
define void @t1(ptr nocapture %C) nounwind {
; CHECK-LABEL: t1:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: adrp x8, .L.str1
; CHECK-NEXT: add x8, x8, :lo12:.L.str1
; CHECK-NEXT: ldr q0, [x8]
; CHECK-NEXT: str q0, [x0]
; CHECK-NEXT: ldur q0, [x8, #15]
; CHECK-NEXT: stur q0, [x0, #15]
; CHECK-NEXT: ret
entry:
tail call void @llvm.memcpy.p0.p0.i64(ptr %C, ptr @.str1, i64 31, i1 false)
ret void
}
define void @t2(ptr nocapture %C) nounwind {
; CHECK-LABEL: t2:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: mov w8, #16716 // =0x414c
; CHECK-NEXT: movk w8, #72, lsl #16
; CHECK-NEXT: str w8, [x0, #32]
; CHECK-NEXT: adrp x8, .L.str2
; CHECK-NEXT: add x8, x8, :lo12:.L.str2
; CHECK-NEXT: ldp q0, q1, [x8]
; CHECK-NEXT: stp q0, q1, [x0]
; CHECK-NEXT: ret
entry:
tail call void @llvm.memcpy.p0.p0.i64(ptr %C, ptr @.str2, i64 36, i1 false)
ret void
}
define void @t3(ptr nocapture %C) nounwind {
; CHECK-LABEL: t3:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: adrp x8, .L.str3
; CHECK-NEXT: add x8, x8, :lo12:.L.str3
; CHECK-NEXT: ldr q0, [x8]
; CHECK-NEXT: str q0, [x0]
; CHECK-NEXT: ldr x8, [x8, #16]
; CHECK-NEXT: str x8, [x0, #16]
; CHECK-NEXT: ret
entry:
tail call void @llvm.memcpy.p0.p0.i64(ptr %C, ptr @.str3, i64 24, i1 false)
ret void
}
define void @t4(ptr nocapture %C) nounwind {
; CHECK-LABEL: t4:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: mov w8, #32 // =0x20
; CHECK-NEXT: strh w8, [x0, #16]
; CHECK-NEXT: adrp x8, .L.str4
; CHECK-NEXT: add x8, x8, :lo12:.L.str4
; CHECK-NEXT: ldr q0, [x8]
; CHECK-NEXT: str q0, [x0]
; CHECK-NEXT: ret
entry:
tail call void @llvm.memcpy.p0.p0.i64(ptr %C, ptr @.str4, i64 18, i1 false)
ret void
}
define void @t5(ptr nocapture %C) nounwind {
; CHECK-LABEL: t5:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: mov w8, #21337 // =0x5359
; CHECK-NEXT: movk w8, #84, lsl #16
; CHECK-NEXT: stur w8, [x0, #3]
; CHECK-NEXT: mov w8, #18500 // =0x4844
; CHECK-NEXT: movk w8, #22866, lsl #16
; CHECK-NEXT: str w8, [x0]
; CHECK-NEXT: ret
entry:
tail call void @llvm.memcpy.p0.p0.i64(ptr %C, ptr @.str5, i64 7, i1 false)
ret void
}
define void @t6() nounwind {
; CHECK-LABEL: t6:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: adrp x8, .L.str6
; CHECK-NEXT: add x8, x8, :lo12:.L.str6
; CHECK-NEXT: ldr x9, [x8]
; CHECK-NEXT: adrp x10, spool.splbuf
; CHECK-NEXT: add x10, x10, :lo12:spool.splbuf
; CHECK-NEXT: str x9, [x10]
; CHECK-NEXT: ldur x8, [x8, #6]
; CHECK-NEXT: stur x8, [x10, #6]
; CHECK-NEXT: ret
entry:
call void @llvm.memcpy.p0.p0.i64(ptr @spool.splbuf, ptr @.str6, i64 14, i1 false)
ret void
}
%struct.Foo = type { i32, i32, i32, i32 }
define void @t7(ptr nocapture %a, ptr nocapture %b) nounwind {
; CHECK-LABEL: t7:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: ldr q0, [x1]
; CHECK-NEXT: str q0, [x0]
; CHECK-NEXT: ret
entry:
tail call void @llvm.memcpy.p0.p0.i32(ptr align 4 %a, ptr align 4 %b, i32 16, i1 false)
ret void
}
declare void @llvm.memcpy.p0.p0.i32(ptr nocapture, ptr nocapture, i32, i1) nounwind
declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind
|