1 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s
3 define i8* @test_memcpy1(i8* %P, i8* %Q) {
5 call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i32(i8* align 4 %P, i8* align 4 %Q, i32 1, i32 1)
7 ; 3rd arg (%edx) -- length
8 ; CHECK-DAG: movl $1, %edx
9 ; CHECK: __llvm_memcpy_element_unordered_atomic_1
12 define i8* @test_memcpy2(i8* %P, i8* %Q) {
14 call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i32(i8* align 4 %P, i8* align 4 %Q, i32 2, i32 2)
16 ; 3rd arg (%edx) -- length
17 ; CHECK-DAG: movl $2, %edx
18 ; CHECK: __llvm_memcpy_element_unordered_atomic_2
21 define i8* @test_memcpy4(i8* %P, i8* %Q) {
23 call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i32(i8* align 4 %P, i8* align 4 %Q, i32 4, i32 4)
25 ; 3rd arg (%edx) -- length
26 ; CHECK-DAG: movl $4, %edx
27 ; CHECK: __llvm_memcpy_element_unordered_atomic_4
30 define i8* @test_memcpy8(i8* %P, i8* %Q) {
32 call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i32(i8* align 8 %P, i8* align 8 %Q, i32 8, i32 8)
34 ; 3rd arg (%edx) -- length
35 ; CHECK-DAG: movl $8, %edx
36 ; CHECK: __llvm_memcpy_element_unordered_atomic_8
39 define i8* @test_memcpy16(i8* %P, i8* %Q) {
40 ; CHECK: test_memcpy16
41 call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i32(i8* align 16 %P, i8* align 16 %Q, i32 16, i32 16)
43 ; 3rd arg (%edx) -- length
44 ; CHECK-DAG: movl $16, %edx
45 ; CHECK: __llvm_memcpy_element_unordered_atomic_16
48 define void @test_memcpy_args(i8** %Storage) {
49 ; CHECK: test_memcpy_args
50 %Dst = load i8*, i8** %Storage
51 %Src.addr = getelementptr i8*, i8** %Storage, i64 1
52 %Src = load i8*, i8** %Src.addr
55 ; CHECK-DAG: movq (%rdi), [[REG1:%r.+]]
56 ; CHECK-DAG: movq [[REG1]], %rdi
58 ; CHECK-DAG: movq 8(%rdi), %rsi
59 ; 3rd arg (%edx) -- length
60 ; CHECK-DAG: movl $4, %edx
61 ; CHECK: __llvm_memcpy_element_unordered_atomic_4
62 call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i32(i8* align 4 %Dst, i8* align 4 %Src, i32 4, i32 4) ret void
65 define i8* @test_memmove1(i8* %P, i8* %Q) {
67 call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i32(i8* align 4 %P, i8* align 4 %Q, i32 1, i32 1)
69 ; 3rd arg (%edx) -- length
70 ; CHECK-DAG: movl $1, %edx
71 ; CHECK: __llvm_memmove_element_unordered_atomic_1
74 define i8* @test_memmove2(i8* %P, i8* %Q) {
75 ; CHECK: test_memmove2
76 call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i32(i8* align 4 %P, i8* align 4 %Q, i32 2, i32 2)
78 ; 3rd arg (%edx) -- length
79 ; CHECK-DAG: movl $2, %edx
80 ; CHECK: __llvm_memmove_element_unordered_atomic_2
83 define i8* @test_memmove4(i8* %P, i8* %Q) {
84 ; CHECK: test_memmove4
85 call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i32(i8* align 4 %P, i8* align 4 %Q, i32 4, i32 4)
87 ; 3rd arg (%edx) -- length
88 ; CHECK-DAG: movl $4, %edx
89 ; CHECK: __llvm_memmove_element_unordered_atomic_4
92 define i8* @test_memmove8(i8* %P, i8* %Q) {
93 ; CHECK: test_memmove8
94 call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i32(i8* align 8 %P, i8* align 8 %Q, i32 8, i32 8)
96 ; 3rd arg (%edx) -- length
97 ; CHECK-DAG: movl $8, %edx
98 ; CHECK: __llvm_memmove_element_unordered_atomic_8
101 define i8* @test_memmove16(i8* %P, i8* %Q) {
102 ; CHECK: test_memmove16
103 call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i32(i8* align 16 %P, i8* align 16 %Q, i32 16, i32 16)
105 ; 3rd arg (%edx) -- length
106 ; CHECK-DAG: movl $16, %edx
107 ; CHECK: __llvm_memmove_element_unordered_atomic_16
110 define void @test_memmove_args(i8** %Storage) {
111 ; CHECK: test_memmove_args
112 %Dst = load i8*, i8** %Storage
113 %Src.addr = getelementptr i8*, i8** %Storage, i64 1
114 %Src = load i8*, i8** %Src.addr
117 ; CHECK-DAG: movq (%rdi), [[REG1:%r.+]]
118 ; CHECK-DAG: movq [[REG1]], %rdi
120 ; CHECK-DAG: movq 8(%rdi), %rsi
121 ; 3rd arg (%edx) -- length
122 ; CHECK-DAG: movl $4, %edx
123 ; CHECK: __llvm_memmove_element_unordered_atomic_4
124 call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i32(i8* align 4 %Dst, i8* align 4 %Src, i32 4, i32 4) ret void
127 define i8* @test_memset1(i8* %P, i8 %V) {
129 call void @llvm.memset.element.unordered.atomic.p0i8.i32(i8* align 4 %P, i8 %V, i32 1, i32 1)
131 ; 3rd arg (%edx) -- length
132 ; CHECK-DAG: movl $1, %edx
133 ; CHECK: __llvm_memset_element_unordered_atomic_1
136 define i8* @test_memset2(i8* %P, i8 %V) {
137 ; CHECK: test_memset2
138 call void @llvm.memset.element.unordered.atomic.p0i8.i32(i8* align 4 %P, i8 %V, i32 2, i32 2)
140 ; 3rd arg (%edx) -- length
141 ; CHECK-DAG: movl $2, %edx
142 ; CHECK: __llvm_memset_element_unordered_atomic_2
145 define i8* @test_memset4(i8* %P, i8 %V) {
146 ; CHECK: test_memset4
147 call void @llvm.memset.element.unordered.atomic.p0i8.i32(i8* align 4 %P, i8 %V, i32 4, i32 4)
149 ; 3rd arg (%edx) -- length
150 ; CHECK-DAG: movl $4, %edx
151 ; CHECK: __llvm_memset_element_unordered_atomic_4
154 define i8* @test_memset8(i8* %P, i8 %V) {
155 ; CHECK: test_memset8
156 call void @llvm.memset.element.unordered.atomic.p0i8.i32(i8* align 8 %P, i8 %V, i32 8, i32 8)
158 ; 3rd arg (%edx) -- length
159 ; CHECK-DAG: movl $8, %edx
160 ; CHECK: __llvm_memset_element_unordered_atomic_8
163 define i8* @test_memset16(i8* %P, i8 %V) {
164 ; CHECK: test_memset16
165 call void @llvm.memset.element.unordered.atomic.p0i8.i32(i8* align 16 %P, i8 %V, i32 16, i32 16)
167 ; 3rd arg (%edx) -- length
168 ; CHECK-DAG: movl $16, %edx
169 ; CHECK: __llvm_memset_element_unordered_atomic_16
172 define void @test_memset_args(i8** %Storage, i8* %V) {
173 ; CHECK: test_memset_args
174 %Dst = load i8*, i8** %Storage
175 %Val = load i8, i8* %V
178 ; CHECK-DAG: movq (%rdi), %rdi
180 ; CHECK-DAG: movzbl (%rsi), %esi
181 ; 3rd arg (%edx) -- length
182 ; CHECK-DAG: movl $4, %edx
183 ; CHECK: __llvm_memset_element_unordered_atomic_4
184 call void @llvm.memset.element.unordered.atomic.p0i8.i32(i8* align 4 %Dst, i8 %Val, i32 4, i32 4) ret void
187 declare void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32) nounwind
188 declare void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32) nounwind
189 declare void @llvm.memset.element.unordered.atomic.p0i8.i32(i8* nocapture, i8, i32, i32) nounwind