blob: 4dc5b1ba03398dd26321441798119cf62c26f2a2 [file] [log] [blame]
Igor Laevsky4f31e522016-12-29 14:31:07 +00001; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s
2
3define i8* @test_memcpy1(i8* %P, i8* %Q) {
4 ; CHECK: test_memcpy
5 call void @llvm.memcpy.element.atomic.p0i8.p0i8(i8* align 4 %P, i8* align 4 %Q, i64 1, i32 1)
6 ret i8* %P
7 ; CHECK-DAG: movl $1, %edx
8 ; CHECK-DAG: movl $1, %ecx
9 ; CHECK: __llvm_memcpy_element_atomic_1
10}
11
12define i8* @test_memcpy2(i8* %P, i8* %Q) {
13 ; CHECK: test_memcpy2
14 call void @llvm.memcpy.element.atomic.p0i8.p0i8(i8* align 4 %P, i8* align 4 %Q, i64 2, i32 2)
15 ret i8* %P
16 ; CHECK-DAG: movl $2, %edx
17 ; CHECK-DAG: movl $2, %ecx
18 ; CHECK: __llvm_memcpy_element_atomic_2
19}
20
21define i8* @test_memcpy4(i8* %P, i8* %Q) {
22 ; CHECK: test_memcpy4
23 call void @llvm.memcpy.element.atomic.p0i8.p0i8(i8* align 4 %P, i8* align 4 %Q, i64 4, i32 4)
24 ret i8* %P
25 ; CHECK-DAG: movl $4, %edx
26 ; CHECK-DAG: movl $4, %ecx
27 ; CHECK: __llvm_memcpy_element_atomic_4
28}
29
30define i8* @test_memcpy8(i8* %P, i8* %Q) {
31 ; CHECK: test_memcpy8
32 call void @llvm.memcpy.element.atomic.p0i8.p0i8(i8* align 8 %P, i8* align 8 %Q, i64 8, i32 8)
33 ret i8* %P
34 ; CHECK-DAG: movl $8, %edx
35 ; CHECK-DAG: movl $8, %ecx
36 ; CHECK: __llvm_memcpy_element_atomic_8
37}
38
39define i8* @test_memcpy16(i8* %P, i8* %Q) {
40 ; CHECK: test_memcpy16
41 call void @llvm.memcpy.element.atomic.p0i8.p0i8(i8* align 16 %P, i8* align 16 %Q, i64 16, i32 16)
42 ret i8* %P
43 ; CHECK-DAG: movl $16, %edx
44 ; CHECK-DAG: movl $16, %ecx
45 ; CHECK: __llvm_memcpy_element_atomic_16
46}
47
48define 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
53
54 ; First argument
55 ; CHECK-DAG: movq (%rdi), [[REG1:%r.+]]
56 ; CHECK-DAG: movq [[REG1]], %rdi
57 ; Second argument
58 ; CHECK-DAG: movq 8(%rdi), %rsi
59 ; Third argument
60 ; CHECK-DAG: movl $4, %edx
61 ; Fourth argument
62 ; CHECK-DAG: movl $4, %ecx
63 ; CHECK: __llvm_memcpy_element_atomic_4
64 call void @llvm.memcpy.element.atomic.p0i8.p0i8(i8* align 4 %Dst, i8* align 4 %Src, i64 4, i32 4)
65 ret void
66}
67
68declare void @llvm.memcpy.element.atomic.p0i8.p0i8(i8* nocapture, i8* nocapture, i64, i32) nounwind