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 12 matching lines...) Expand all Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |