Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 138 ; CHECK: movups [[REG:xmm[0-9]+]],XMMWORD PTR [{{.*}}+0x10] | 138 ; CHECK: movups [[REG:xmm[0-9]+]],XMMWORD PTR [{{.*}}+0x10] |
| 139 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}+0x10],[[REG]] | 139 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}+0x10],[[REG]] |
| 140 ; CHECK-NEXT: movups [[REG:xmm[0-9]+]],XMMWORD PTR [{{.*}}] | 140 ; CHECK-NEXT: movups [[REG:xmm[0-9]+]],XMMWORD PTR [{{.*}}] |
| 141 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}],[[REG]] | 141 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}],[[REG]] |
| 142 ; CHECK-NEXT: mov [[REG:[^,]*]],BYTE PTR [{{.*}}+0x20] | 142 ; CHECK-NEXT: mov [[REG:[^,]*]],BYTE PTR [{{.*}}+0x20] |
| 143 ; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x20],[[REG]] | 143 ; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x20],[[REG]] |
| 144 ; CHECK-NOT: mov | 144 ; CHECK-NOT: mov |
| 145 ; ARM32-LABEL: test_memcpy_large_const_len | 145 ; ARM32-LABEL: test_memcpy_large_const_len |
| 146 ; ARM32: bl {{.*}} memcpy | 146 ; ARM32: bl {{.*}} memcpy |
| 147 | 147 |
| 148 ; TODO(jvoung) -- if we want to be clever, we can do memset without a function | |
| 149 ; call similar to memcpy. | |
| 150 define void @test_memmove(i32 %iptr_dst, i32 %iptr_src, i32 %len) { | 148 define void @test_memmove(i32 %iptr_dst, i32 %iptr_src, i32 %len) { |
| 151 entry: | 149 entry: |
| 152 %dst = inttoptr i32 %iptr_dst to i8* | 150 %dst = inttoptr i32 %iptr_dst to i8* |
| 153 %src = inttoptr i32 %iptr_src to i8* | 151 %src = inttoptr i32 %iptr_src to i8* |
| 154 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, | 152 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, |
| 155 i32 %len, i32 1, i1 false) | 153 i32 %len, i32 1, i1 false) |
| 156 ret void | 154 ret void |
| 157 } | 155 } |
| 158 ; CHECK-LABEL: test_memmove | 156 ; CHECK-LABEL: test_memmove |
| 159 ; CHECK: call {{.*}} R_{{.*}} memmove | 157 ; CHECK: call {{.*}} R_{{.*}} memmove |
| 160 ; ARM32-LABEL: test_memmove | 158 ; ARM32-LABEL: test_memmove |
| 161 ; ARM32: bl {{.*}} memmove | 159 ; ARM32: bl {{.*}} memmove |
| 162 | 160 |
| 163 define void @test_memmove_const_len_align(i32 %iptr_dst, i32 %iptr_src) { | 161 define void @test_memmove_long_const_len(i32 %iptr_dst, i32 %iptr_src) { |
| 164 entry: | 162 entry: |
| 165 %dst = inttoptr i32 %iptr_dst to i8* | 163 %dst = inttoptr i32 %iptr_dst to i8* |
| 166 %src = inttoptr i32 %iptr_src to i8* | 164 %src = inttoptr i32 %iptr_src to i8* |
| 167 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, | 165 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, |
| 168 i32 32, i32 1, i1 false) | 166 i32 4876, i32 1, i1 false) |
| 169 ret void | 167 ret void |
| 170 } | 168 } |
| 171 ; CHECK-LABEL: test_memmove_const_len_align | 169 ; CHECK-LABEL: test_memmove_long_const_len |
| 172 ; CHECK: call {{.*}} R_{{.*}} memmove | 170 ; CHECK: call {{.*}} R_{{.*}} memmove |
| 173 ; ARM32-LABEL: test_memmove_const_len_align | 171 ; ARM32-LABEL: test_memmove_long_const_len |
| 172 ; ARM32: bl {{.*}} memmove | |
| 173 | |
| 174 define void @test_memmove_very_small_const_len(i32 %iptr_dst, i32 %iptr_src) { | |
| 175 entry: | |
| 176 %dst = inttoptr i32 %iptr_dst to i8* | |
| 177 %src = inttoptr i32 %iptr_src to i8* | |
| 178 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, | |
| 179 i32 2, i32 1, i1 false) | |
| 180 ret void | |
| 181 } | |
| 182 ; CHECK-LABEL: test_memmove_very_small_const_len | |
| 183 ; CHECK: cmp {{.*}},{{.*}} | |
| 184 ; CHECK-NEXT: jb | |
| 185 ; CHECK-NEXT: xchg {{.*}},{{.*}} | |
| 186 ; CHECK-NEXT: mov [[REG:[^,]*]],WORD PTR [{{.*}}] | |
| 187 ; CHECK-NEXT: mov WORD PTR [{{.*}}],[[REG]] | |
| 188 ; CHECK-NOT: mov | |
| 189 ; ARM32-LABEL: test_memmove_very_small_const_len | |
| 190 ; ARM32: bl {{.*}} memmove | |
| 191 | |
| 192 define void @test_memmove_const_len_3(i32 %iptr_dst, i32 %iptr_src) { | |
| 193 entry: | |
| 194 %dst = inttoptr i32 %iptr_dst to i8* | |
| 195 %src = inttoptr i32 %iptr_src to i8* | |
| 196 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, | |
| 197 i32 3, i32 1, i1 false) | |
| 198 ret void | |
| 199 } | |
| 200 ; CHECK-LABEL: test_memmove_const_len_3 | |
| 201 ; CHECK: cmp {{.*}},{{.*}} | |
| 202 ; CHECK-NEXT: jb | |
| 203 ; CHECK-NEXT: xchg {{.*}},{{.*}} | |
| 204 ; CHECK-NEXT: mov [[REG:[^,]*]],WORD PTR [{{.*}}] | |
| 205 ; CHECK-NEXT: mov WORD PTR [{{.*}}],[[REG]] | |
| 206 ; CHECK-NEXT: mov [[REG:[^,]*]],BYTE PTR [{{.*}}+0x2] | |
| 207 ; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x2],[[REG]] | |
| 208 ; CHECK-NOT: mov | |
| 209 ; ARM32-LABEL: test_memmove_const_len_3 | |
| 210 ; ARM32: bl {{.*}} memmove | |
| 211 | |
| 212 define void @test_memmove_mid_const_len(i32 %iptr_dst, i32 %iptr_src) { | |
| 213 entry: | |
| 214 %dst = inttoptr i32 %iptr_dst to i8* | |
| 215 %src = inttoptr i32 %iptr_src to i8* | |
| 216 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, | |
| 217 i32 9, i32 1, i1 false) | |
| 218 ret void | |
| 219 } | |
| 220 ; CHECK-LABEL: test_memmove_mid_const_len | |
| 221 ; CHECK: cmp {{.*}},{{.*}} | |
| 222 ; CHECK-NEXT: jb | |
| 223 ; CHECK-NEXT: xchg {{.*}},{{.*}} | |
| 224 ; CHECK-NEXT: movq [[REG:xmm[0-9]+]],QWORD PTR [{{.*}}] | |
| 225 ; CHECK-NEXT: movq QWORD PTR [{{.*}}],[[REG]] | |
| 226 ; CHECK-NEXT: mov [[REG:[^,]*]],BYTE PTR [{{.*}}+0x8] | |
| 227 ; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x8],[[REG]] | |
| 228 ; CHECK-NOT: mov | |
| 229 ; ARM32-LABEL: test_memmove_mid_const_len | |
| 230 ; ARM32: bl {{.*}} memmove | |
| 231 | |
| 232 define void @test_memmove_mid_const_len_no_overlap(i32 %iptr_dst, i32 %iptr_src) { | |
| 233 entry: | |
| 234 %dst = inttoptr i32 %iptr_dst to i8* | |
| 235 %src = inttoptr i32 %iptr_src to i8* | |
| 236 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, | |
| 237 i32 15, i32 1, i1 false) | |
| 238 ret void | |
| 239 } | |
| 240 ; CHECK-LABEL: test_memmove_mid_const_len_no_overlap | |
| 241 ; CHECK: cmp {{.*}},{{.*}} | |
| 242 ; CHECK-NEXT: jb | |
| 243 ; CHECK-NEXT: xchg {{.*}},{{.*}} | |
| 244 ; CHECK-NEXT: movq [[REG:xmm[0-9]+]],QWORD PTR [{{.*}}] | |
| 245 ; CHECK-NEXT: movq QWORD PTR [{{.*}}],[[REG]] | |
| 246 ; CHECK-NEXT: mov [[REG:[^,]*]],DWORD PTR [{{.*}}+0x8] | |
| 247 ; CHECK-NEXT: mov DWORD PTR [{{.*}}+0x8],[[REG]] | |
| 248 ; CHECK-NEXT: mov [[REG:[^,]*]],WORD PTR [{{.*}}+0xc] | |
| 249 ; CHECK: mov WORD PTR [{{.*}}+0xc],[[REG]] | |
|
Jim Stichnoth
2015/08/12 13:41:47
Is this a CHECK instead of CHECK-NEXT because sand
ascull
2015/08/17 22:18:53
With the new (and correct) implementation on memmo
| |
| 250 ; CHECK-NEXT: mov [[REG:[^,]*]],BYTE PTR [{{.*}}+0xe] | |
| 251 ; CHECK-NEXT: mov BYTE PTR [{{.*}}+0xe],[[REG]] | |
| 252 ; CHECK-NOT: mov | |
| 253 ; ARM32-LABEL: test_memmove_mid_const_len_no_overlap | |
| 254 ; ARM32: bl {{.*}} memmove | |
| 255 | |
| 256 define void @test_memmove_big_const_len_no_overlap(i32 %iptr_dst, i32 %iptr_src) { | |
| 257 entry: | |
| 258 %dst = inttoptr i32 %iptr_dst to i8* | |
| 259 %src = inttoptr i32 %iptr_src to i8* | |
| 260 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, | |
| 261 i32 30, i32 1, i1 false) | |
| 262 ret void | |
| 263 } | |
| 264 ; CHECK-LABEL: test_memmove_big_const_len_no_overlap | |
| 265 ; CHECK: cmp {{.*}},{{.*}} | |
| 266 ; CHECK-NEXT: jb | |
| 267 ; CHECK-NEXT: xchg {{.*}},{{.*}} | |
| 268 ; CHECK-NEXT: movups [[REG:xmm[0-9]+]],XMMWORD PTR [{{.*}}] | |
| 269 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}],[[REG]] | |
| 270 ; CHECK-NEXT: movq [[REG:xmm[0-9]+]],QWORD PTR [{{.*}}+0x10] | |
| 271 ; CHECK-NEXT: movq QWORD PTR [{{.*}}+0x10],[[REG]] | |
| 272 ; CHECK-NEXT: mov [[REG:[^,]*]],DWORD PTR [{{.*}}+0x18] | |
| 273 ; CHECK-NEXT: mov DWORD PTR [{{.*}}+0x18],[[REG]] | |
| 274 ; CHECK-NEXT: mov [[REG:[^,]*]],WORD PTR [{{.*}}+0x1c] | |
| 275 ; CHECK-NEXT: mov WORD PTR [{{.*}}+0x1c],[[REG]] | |
| 276 ; CHECK-NOT: mov | |
| 277 ; ARM32-LABEL: test_memmove_big_const_len_no_overlap | |
| 278 ; ARM32: bl {{.*}} memmove | |
| 279 | |
| 280 define void @test_memmove_large_const_len(i32 %iptr_dst, i32 %iptr_src) { | |
| 281 entry: | |
| 282 %dst = inttoptr i32 %iptr_dst to i8* | |
| 283 %src = inttoptr i32 %iptr_src to i8* | |
| 284 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, | |
| 285 i32 33, i32 1, i1 false) | |
| 286 ret void | |
| 287 } | |
| 288 ; CHECK-LABEL: test_memmove_large_const_len | |
| 289 ; CHECK: cmp {{.*}},{{.*}} | |
| 290 ; CHECK-NEXT: jb | |
| 291 ; CHECK-NEXT: xchg {{.*}},{{.*}} | |
| 292 ; CHECK-NEXT: movups [[REG:xmm[0-9]+]],XMMWORD PTR [{{.*}}] | |
| 293 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}],[[REG]] | |
| 294 ; CHECK-NEXT: movups [[REG:xmm[0-9]+]],XMMWORD PTR [{{.*}}+0x10] | |
| 295 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}+0x10],[[REG]] | |
| 296 ; CHECK-NEXT: mov [[REG:[^,]*]],BYTE PTR [{{.*}}+0x20] | |
| 297 ; CHECK: mov BYTE PTR [{{.*}}+0x20],[[REG]] | |
| 298 ; CHECK-NOT: mov | |
| 299 ; ARM32-LABEL: test_memmove_large_const_len | |
| 174 ; ARM32: bl {{.*}} memmove | 300 ; ARM32: bl {{.*}} memmove |
| 175 | 301 |
| 176 define void @test_memset(i32 %iptr_dst, i32 %wide_val, i32 %len) { | 302 define void @test_memset(i32 %iptr_dst, i32 %wide_val, i32 %len) { |
| 177 entry: | 303 entry: |
| 178 %val = trunc i32 %wide_val to i8 | 304 %val = trunc i32 %wide_val to i8 |
| 179 %dst = inttoptr i32 %iptr_dst to i8* | 305 %dst = inttoptr i32 %iptr_dst to i8* |
| 180 call void @llvm.memset.p0i8.i32(i8* %dst, i8 %val, | 306 call void @llvm.memset.p0i8.i32(i8* %dst, i8 %val, |
| 181 i32 %len, i32 1, i1 false) | 307 i32 %len, i32 1, i1 false) |
| 182 ret void | 308 ret void |
| 183 } | 309 } |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 324 } | 450 } |
| 325 ; CHECK-LABEL: test_memset_zero_const_len_large | 451 ; CHECK-LABEL: test_memset_zero_const_len_large |
| 326 ; CHECK: pxor [[ZERO:xmm[0-9]+]],[[ZERO]] | 452 ; CHECK: pxor [[ZERO:xmm[0-9]+]],[[ZERO]] |
| 327 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}+0x10],[[ZERO]] | 453 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}+0x10],[[ZERO]] |
| 328 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}],[[ZERO]] | 454 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}],[[ZERO]] |
| 329 ; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x20],0x0 | 455 ; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x20],0x0 |
| 330 ; CHECK-NOT: mov | 456 ; CHECK-NOT: mov |
| 331 ; ARM32-LABEL: test_memset_zero_const_len_large | 457 ; ARM32-LABEL: test_memset_zero_const_len_large |
| 332 ; ARM32: uxtb | 458 ; ARM32: uxtb |
| 333 ; ARM32: bl {{.*}} memset | 459 ; ARM32: bl {{.*}} memset |
| OLD | NEW |