Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(503)

Side by Side Diff: tests_lit/llvm2ice_tests/nacl-mem-intrinsics.ll

Issue 1279833005: Inline memcpy for small constant sizes. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/IceTargetLoweringX86BaseImpl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 ; This tests the NaCl intrinsics memset, memcpy and memmove. 1 ; This tests the NaCl intrinsics memset, memcpy and memmove.
2 2
3 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ 3 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \
4 ; RUN: --target x8632 -i %s --args -O2 -sandbox \ 4 ; RUN: --target x8632 -i %s --args -O2 -sandbox \
5 ; RUN: | %if --need=target_X8632 --command FileCheck %s 5 ; RUN: | %if --need=target_X8632 --command FileCheck %s
6 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ 6 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \
7 ; RUN: --target x8632 -i %s --args -Om1 -sandbox \ 7 ; RUN: --target x8632 -i %s --args -Om1 -sandbox \
8 ; RUN: | %if --need=target_X8632 --command FileCheck %s 8 ; RUN: | %if --need=target_X8632 --command FileCheck %s
9 9
10 ; RUN: %if --need=target_ARM32 --need=allow_dump \ 10 ; RUN: %if --need=target_ARM32 --need=allow_dump \
(...skipping 12 matching lines...) Expand all
23 %src = inttoptr i32 %iptr_src to i8* 23 %src = inttoptr i32 %iptr_src to i8*
24 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src, 24 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src,
25 i32 %len, i32 1, i1 false) 25 i32 %len, i32 1, i1 false)
26 ret void 26 ret void
27 } 27 }
28 ; CHECK-LABEL: test_memcpy 28 ; CHECK-LABEL: test_memcpy
29 ; CHECK: call {{.*}} R_{{.*}} memcpy 29 ; CHECK: call {{.*}} R_{{.*}} memcpy
30 ; ARM32-LABEL: test_memcpy 30 ; ARM32-LABEL: test_memcpy
31 ; ARM32: bl {{.*}} memcpy 31 ; ARM32: bl {{.*}} memcpy
32 32
33 ; TODO(jvoung) -- if we want to be clever, we can do this and the memmove, 33 define void @test_memcpy_long_const_len(i32 %iptr_dst, i32 %iptr_src) {
34 ; memset without a function call.
35 define void @test_memcpy_const_len_align(i32 %iptr_dst, i32 %iptr_src) {
36 entry: 34 entry:
37 %dst = inttoptr i32 %iptr_dst to i8* 35 %dst = inttoptr i32 %iptr_dst to i8*
38 %src = inttoptr i32 %iptr_src to i8* 36 %src = inttoptr i32 %iptr_src to i8*
39 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src, 37 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src,
40 i32 32, i32 1, i1 false) 38 i32 4876, i32 1, i1 false)
41 ret void 39 ret void
42 } 40 }
43 ; CHECK-LABEL: test_memcpy_const_len_align 41 ; CHECK-LABEL: test_memcpy_long_const_len
44 ; CHECK: call {{.*}} R_{{.*}} memcpy 42 ; CHECK: call {{.*}} R_{{.*}} memcpy
45 ; ARM32-LABEL: test_memcpy_const_len_align 43 ; ARM32-LABEL: test_memcpy_long_const_len
46 ; ARM32: bl {{.*}} memcpy 44 ; ARM32: bl {{.*}} memcpy
47 45
46 define void @test_memcpy_very_small_const_len(i32 %iptr_dst, i32 %iptr_src) {
47 entry:
48 %dst = inttoptr i32 %iptr_dst to i8*
49 %src = inttoptr i32 %iptr_src to i8*
50 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src,
51 i32 2, i32 1, i1 false)
52 ret void
53 }
54 ; CHECK-LABEL: test_memcpy_very_small_const_len
55 ; CHECK: mov [[REG:[^,]*]],WORD PTR [{{.*}}]
56 ; CHECK-NEXT: mov WORD PTR [{{.*}}],[[REG]]
57 ; CHECK-NOT: mov
58 ; ARM32-LABEL: test_memcpy_very_small_const_len
59 ; ARM32: bl {{.*}} memcpy
60
61 define void @test_memcpy_const_len_3(i32 %iptr_dst, i32 %iptr_src) {
62 entry:
63 %dst = inttoptr i32 %iptr_dst to i8*
64 %src = inttoptr i32 %iptr_src to i8*
65 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src,
66 i32 3, i32 1, i1 false)
67 ret void
68 }
69 ; CHECK-LABEL: test_memcpy_const_len_3
70 ; CHECK: mov [[REG:[^,]*]],WORD PTR [{{.*}}]
71 ; CHECK-NEXT: mov WORD PTR [{{.*}}],[[REG]]
72 ; CHECK-NEXT: mov [[REG:[^,]*]],BYTE PTR [{{.*}}+0x2]
73 ; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x2],[[REG]]
74 ; CHECK-NOT: mov
75 ; ARM32-LABEL: test_memcpy_const_len_3
76 ; ARM32: bl {{.*}} memcpy
77
78 define void @test_memcpy_mid_const_len(i32 %iptr_dst, i32 %iptr_src) {
79 entry:
80 %dst = inttoptr i32 %iptr_dst to i8*
81 %src = inttoptr i32 %iptr_src to i8*
82 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src,
83 i32 9, i32 1, i1 false)
84 ret void
85 }
86 ; CHECK-LABEL: test_memcpy_mid_const_len
87 ; CHECK: movq [[REG:xmm[0-9]+]],QWORD PTR [{{.*}}]
88 ; CHECK-NEXT: movq QWORD PTR [{{.*}}],[[REG]]
89 ; CHECK-NEXT: mov [[REG:[^,]*]],BYTE PTR [{{.*}}+0x8]
90 ; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x8],[[REG]]
91 ; CHECK-NOT: mov
92 ; ARM32-LABEL: test_memcpy_mid_const_len
93 ; ARM32: bl {{.*}} memcpy
94
95 define void @test_memcpy_mid_const_len_overlap(i32 %iptr_dst, i32 %iptr_src) {
96 entry:
97 %dst = inttoptr i32 %iptr_dst to i8*
98 %src = inttoptr i32 %iptr_src to i8*
99 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src,
100 i32 15, i32 1, i1 false)
101 ret void
102 }
103 ; CHECK-LABEL: test_memcpy_mid_const_len_overlap
104 ; CHECK: movq [[REG:xmm[0-9]+]],QWORD PTR [{{.*}}]
105 ; CHECK-NEXT: movq QWORD PTR [{{.*}}],[[REG]]
106 ; CHECK-NEXT: movq [[REG:xmm[0-9]+]],QWORD PTR [{{.*}}+0x7]
107 ; CHECK-NEXT: movq QWORD PTR [{{.*}}+0x7],[[REG]]
108 ; CHECK-NOT: mov
109 ; ARM32-LABEL: test_memcpy_mid_const_len_overlap
110 ; ARM32: bl {{.*}} memcpy
111
112 define void @test_memcpy_large_const_len_overlap(i32 %iptr_dst, i32 %iptr_src) {
113 entry:
114 %dst = inttoptr i32 %iptr_dst to i8*
115 %src = inttoptr i32 %iptr_src to i8*
116 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src,
117 i32 30, i32 1, i1 false)
118 ret void
119 }
120 ; CHECK-LABEL: test_memcpy_large_const_len_overlap
121 ; CHECK: movups [[REG:xmm[0-9]+]],XMMWORD PTR [{{.*}}]
122 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}],[[REG]]
123 ; CHECK-NEXT: movups [[REG:xmm[0-9]+]],XMMWORD PTR [{{.*}}+0xe]
124 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}+0xe],[[REG]]
125 ; CHECK-NOT: mov
126 ; ARM32-LABEL: test_memcpy_large_const_len_overlap
127 ; ARM32: bl {{.*}} memcpy
128
129 define void @test_memcpy_large_const_len(i32 %iptr_dst, i32 %iptr_src) {
130 entry:
131 %dst = inttoptr i32 %iptr_dst to i8*
132 %src = inttoptr i32 %iptr_src to i8*
133 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src,
134 i32 33, i32 1, i1 false)
135 ret void
136 }
137 ; CHECK-LABEL: test_memcpy_large_const_len
138 ; CHECK: movups [[REG:xmm[0-9]+]],XMMWORD PTR [{{.*}}+0x10]
139 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}+0x10],[[REG]]
140 ; CHECK-NEXT: movups [[REG:xmm[0-9]+]],XMMWORD PTR [{{.*}}]
141 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}],[[REG]]
142 ; CHECK-NEXT: mov [[REG:[^,]*]],BYTE PTR [{{.*}}+0x20]
143 ; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x20],[[REG]]
144 ; CHECK-NOT: mov
145 ; ARM32-LABEL: test_memcpy_large_const_len
146 ; ARM32: bl {{.*}} memcpy
147
148 ; TODO(jvoung) -- if we want to be clever, we can do memset without a function
jvoung (off chromium) 2015/08/07 15:37:08 "we can do memset" -> "we can do memmove"
149 ; call similar to memcpy.
48 define void @test_memmove(i32 %iptr_dst, i32 %iptr_src, i32 %len) { 150 define void @test_memmove(i32 %iptr_dst, i32 %iptr_src, i32 %len) {
49 entry: 151 entry:
50 %dst = inttoptr i32 %iptr_dst to i8* 152 %dst = inttoptr i32 %iptr_dst to i8*
51 %src = inttoptr i32 %iptr_src to i8* 153 %src = inttoptr i32 %iptr_src to i8*
52 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, 154 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src,
53 i32 %len, i32 1, i1 false) 155 i32 %len, i32 1, i1 false)
54 ret void 156 ret void
55 } 157 }
56 ; CHECK-LABEL: test_memmove 158 ; CHECK-LABEL: test_memmove
57 ; CHECK: call {{.*}} R_{{.*}} memmove 159 ; CHECK: call {{.*}} R_{{.*}} memmove
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 ; ARM32-LABEL: test_memset_const_val_len_very_small 241 ; ARM32-LABEL: test_memset_const_val_len_very_small
140 ; ARM32: uxtb 242 ; ARM32: uxtb
141 ; ARM32: bl {{.*}} memset 243 ; ARM32: bl {{.*}} memset
142 244
143 define void @test_memset_const_val_len_3(i32 %iptr_dst) { 245 define void @test_memset_const_val_len_3(i32 %iptr_dst) {
144 entry: 246 entry:
145 %dst = inttoptr i32 %iptr_dst to i8* 247 %dst = inttoptr i32 %iptr_dst to i8*
146 call void @llvm.memset.p0i8.i32(i8* %dst, i8 16, i32 3, i32 1, i1 false) 248 call void @llvm.memset.p0i8.i32(i8* %dst, i8 16, i32 3, i32 1, i1 false)
147 ret void 249 ret void
148 } 250 }
149 ; CHECK-LABEL: test_memset_const_val_len_3 251 ; CHECK-LABEL: test_memset_const_val_len_3
jvoung (off chromium) 2015/08/07 15:37:08 Could you also add a test for len == 3, but val ==
150 ; CHECK: mov WORD PTR [{{.*}}],0x1010 252 ; CHECK: mov WORD PTR [{{.*}}],0x1010
151 ; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x2],0x10 253 ; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x2],0x10
152 ; CHECK-NOT: mov 254 ; CHECK-NOT: mov
153 ; ARM32-LABEL: test_memset_const_val_len_3 255 ; ARM32-LABEL: test_memset_const_val_len_3
154 ; ARM32: uxtb 256 ; ARM32: uxtb
155 ; ARM32: bl {{.*}} memset 257 ; ARM32: bl {{.*}} memset
156 258
157 define void @test_memset_const_val_len_mid(i32 %iptr_dst) { 259 define void @test_memset_const_val_len_mid(i32 %iptr_dst) {
158 entry: 260 entry:
159 %dst = inttoptr i32 %iptr_dst to i8* 261 %dst = inttoptr i32 %iptr_dst to i8*
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 } 324 }
223 ; CHECK-LABEL: test_memset_zero_const_len_large 325 ; CHECK-LABEL: test_memset_zero_const_len_large
224 ; CHECK: pxor [[ZERO:xmm[0-9]+]],[[ZERO]] 326 ; CHECK: pxor [[ZERO:xmm[0-9]+]],[[ZERO]]
225 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}+0x10],[[ZERO]] 327 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}+0x10],[[ZERO]]
226 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}],[[ZERO]] 328 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}],[[ZERO]]
227 ; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x20],0x0 329 ; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x20],0x0
228 ; CHECK-NOT: mov 330 ; CHECK-NOT: mov
229 ; ARM32-LABEL: test_memset_zero_const_len_large 331 ; ARM32-LABEL: test_memset_zero_const_len_large
230 ; ARM32: uxtb 332 ; ARM32: uxtb
231 ; ARM32: bl {{.*}} memset 333 ; ARM32: bl {{.*}} memset
OLDNEW
« no previous file with comments | « src/IceTargetLoweringX86BaseImpl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698