| OLD | NEW |
| (Empty) | |
| 1 ; This tests the NaCl intrinsics memset, memcpy and memmove. |
| 2 |
| 3 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ |
| 4 ; RUN: --target x8632 -i %s --args -O2 -sandbox \ |
| 5 ; RUN: | %if --need=target_X8632 --command FileCheck %s |
| 6 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ |
| 7 ; RUN: --target x8632 -i %s --args -Om1 -sandbox \ |
| 8 ; RUN: | %if --need=target_X8632 --command FileCheck %s |
| 9 |
| 10 ; RUN: %if --need=target_ARM32 --need=allow_dump \ |
| 11 ; RUN: --command %p2i --filetype=asm --assemble --disassemble --target arm32 \ |
| 12 ; RUN: -i %s --args -O2 --skip-unimplemented \ |
| 13 ; RUN: | %if --need=target_ARM32 --need=allow_dump \ |
| 14 ; RUN: --command FileCheck --check-prefix ARM32 %s |
| 15 |
| 16 declare void @llvm.memcpy.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1) |
| 17 declare void @llvm.memmove.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1) |
| 18 declare void @llvm.memset.p0i8.i32(i8*, i8, i32, i32, i1) |
| 19 |
| 20 define void @test_memcpy(i32 %iptr_dst, i32 %iptr_src, i32 %len) { |
| 21 entry: |
| 22 %dst = inttoptr i32 %iptr_dst to i8* |
| 23 %src = inttoptr i32 %iptr_src to i8* |
| 24 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src, |
| 25 i32 %len, i32 1, i1 false) |
| 26 ret void |
| 27 } |
| 28 ; CHECK-LABEL: test_memcpy |
| 29 ; CHECK: call {{.*}} R_{{.*}} memcpy |
| 30 ; ARM32-LABEL: test_memcpy |
| 31 ; ARM32: bl {{.*}} memcpy |
| 32 |
| 33 ; TODO(jvoung) -- if we want to be clever, we can do this and the memmove, |
| 34 ; memset without a function call. |
| 35 define void @test_memcpy_const_len_align(i32 %iptr_dst, i32 %iptr_src) { |
| 36 entry: |
| 37 %dst = inttoptr i32 %iptr_dst to i8* |
| 38 %src = inttoptr i32 %iptr_src to i8* |
| 39 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src, |
| 40 i32 32, i32 1, i1 false) |
| 41 ret void |
| 42 } |
| 43 ; CHECK-LABEL: test_memcpy_const_len_align |
| 44 ; CHECK: call {{.*}} R_{{.*}} memcpy |
| 45 ; ARM32-LABEL: test_memcpy_const_len_align |
| 46 ; ARM32: bl {{.*}} memcpy |
| 47 |
| 48 define void @test_memmove(i32 %iptr_dst, i32 %iptr_src, i32 %len) { |
| 49 entry: |
| 50 %dst = inttoptr i32 %iptr_dst to i8* |
| 51 %src = inttoptr i32 %iptr_src to i8* |
| 52 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, |
| 53 i32 %len, i32 1, i1 false) |
| 54 ret void |
| 55 } |
| 56 ; CHECK-LABEL: test_memmove |
| 57 ; CHECK: call {{.*}} R_{{.*}} memmove |
| 58 ; ARM32-LABEL: test_memmove |
| 59 ; ARM32: bl {{.*}} memmove |
| 60 |
| 61 define void @test_memmove_const_len_align(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.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, |
| 66 i32 32, i32 1, i1 false) |
| 67 ret void |
| 68 } |
| 69 ; CHECK-LABEL: test_memmove_const_len_align |
| 70 ; CHECK: call {{.*}} R_{{.*}} memmove |
| 71 ; ARM32-LABEL: test_memmove_const_len_align |
| 72 ; ARM32: bl {{.*}} memmove |
| 73 |
| 74 define void @test_memset(i32 %iptr_dst, i32 %wide_val, i32 %len) { |
| 75 entry: |
| 76 %val = trunc i32 %wide_val to i8 |
| 77 %dst = inttoptr i32 %iptr_dst to i8* |
| 78 call void @llvm.memset.p0i8.i32(i8* %dst, i8 %val, |
| 79 i32 %len, i32 1, i1 false) |
| 80 ret void |
| 81 } |
| 82 ; CHECK-LABEL: test_memset |
| 83 ; CHECK: movzx |
| 84 ; CHECK: call {{.*}} R_{{.*}} memset |
| 85 ; ARM32-LABEL: test_memset |
| 86 ; ARM32: uxtb |
| 87 ; ARM32: bl {{.*}} memset |
| 88 |
| 89 define void @test_memset_const_len_align(i32 %iptr_dst, i32 %wide_val) { |
| 90 entry: |
| 91 %val = trunc i32 %wide_val to i8 |
| 92 %dst = inttoptr i32 %iptr_dst to i8* |
| 93 call void @llvm.memset.p0i8.i32(i8* %dst, i8 %val, |
| 94 i32 32, i32 1, i1 false) |
| 95 ret void |
| 96 } |
| 97 ; CHECK-LABEL: test_memset_const_len_align |
| 98 ; CHECK: movzx |
| 99 ; CHECK: call {{.*}} R_{{.*}} memset |
| 100 ; ARM32-LABEL: test_memset_const_len_align |
| 101 ; ARM32: uxtb |
| 102 ; ARM32: bl {{.*}} memset |
| 103 |
| 104 define void @test_memset_const_val(i32 %iptr_dst, i32 %len) { |
| 105 entry: |
| 106 %dst = inttoptr i32 %iptr_dst to i8* |
| 107 call void @llvm.memset.p0i8.i32(i8* %dst, i8 0, i32 %len, i32 1, i1 false) |
| 108 ret void |
| 109 } |
| 110 ; CHECK-LABEL: test_memset_const_val |
| 111 ; CHECK-NOT: movzx |
| 112 ; CHECK: call {{.*}} R_{{.*}} memset |
| 113 ; ARM32-LABEL: test_memset_const_val |
| 114 ; ARM32: uxtb |
| 115 ; ARM32: bl {{.*}} memset |
| 116 |
| 117 define void @test_memset_const_val_len_very_small(i32 %iptr_dst) { |
| 118 entry: |
| 119 %dst = inttoptr i32 %iptr_dst to i8* |
| 120 call void @llvm.memset.p0i8.i32(i8* %dst, i8 10, i32 2, i32 1, i1 false) |
| 121 ret void |
| 122 } |
| 123 ; CHECK-LABEL: test_memset_const_val_len_very_small |
| 124 ; CHECK: mov WORD PTR [{{.*}}],0xa0a |
| 125 ; CHECK-NOT: mov |
| 126 ; ARM32-LABEL: test_memset_const_val_len_very_small |
| 127 ; ARM32: uxtb |
| 128 ; ARM32: bl {{.*}} memset |
| 129 |
| 130 define void @test_memset_const_val_len_3(i32 %iptr_dst) { |
| 131 entry: |
| 132 %dst = inttoptr i32 %iptr_dst to i8* |
| 133 call void @llvm.memset.p0i8.i32(i8* %dst, i8 16, i32 3, i32 1, i1 false) |
| 134 ret void |
| 135 } |
| 136 ; CHECK-LABEL: test_memset_const_val_len_3 |
| 137 ; CHECK: mov WORD PTR [{{.*}}],0x1010 |
| 138 ; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x2],0x10 |
| 139 ; CHECK-NOT: mov |
| 140 ; ARM32-LABEL: test_memset_const_val_len_3 |
| 141 ; ARM32: uxtb |
| 142 ; ARM32: bl {{.*}} memset |
| 143 |
| 144 define void @test_memset_const_val_len_mid(i32 %iptr_dst) { |
| 145 entry: |
| 146 %dst = inttoptr i32 %iptr_dst to i8* |
| 147 call void @llvm.memset.p0i8.i32(i8* %dst, i8 32, i32 9, i32 1, i1 false) |
| 148 ret void |
| 149 } |
| 150 ; CHECK-LABEL: test_memset_const_val_len_mid |
| 151 ; CHECK: mov DWORD PTR [{{.*}}+0x4],0x20202020 |
| 152 ; CHECK: mov DWORD PTR [{{.*}}],0x20202020 |
| 153 ; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x8],0x20 |
| 154 ; CHECK-NOT: mov |
| 155 ; ARM32-LABEL: test_memset_const_val_len_mid |
| 156 ; ARM32: uxtb |
| 157 ; ARM32: bl {{.*}} memset |
| 158 |
| 159 define void @test_memset_zero_const_len_small(i32 %iptr_dst) { |
| 160 entry: |
| 161 %dst = inttoptr i32 %iptr_dst to i8* |
| 162 call void @llvm.memset.p0i8.i32(i8* %dst, i8 0, i32 12, i32 1, i1 false) |
| 163 ret void |
| 164 } |
| 165 ; CHECK-LABEL: test_memset_zero_const_len_small |
| 166 ; CHECK: pxor [[ZERO:xmm[0-9]+]],[[ZERO]] |
| 167 ; CHECK-NEXT: movq QWORD PTR [{{.*}}],[[ZERO]] |
| 168 ; CHECK-NEXT: mov DWORD PTR [{{.*}}+0x8],0x0 |
| 169 ; CHECK-NOT: mov |
| 170 ; ARM32-LABEL: test_memset_zero_const_len_small |
| 171 ; ARM32: uxtb |
| 172 ; ARM32: bl {{.*}} memset |
| 173 |
| 174 define void @test_memset_zero_const_len_small_overlap(i32 %iptr_dst) { |
| 175 entry: |
| 176 %dst = inttoptr i32 %iptr_dst to i8* |
| 177 call void @llvm.memset.p0i8.i32(i8* %dst, i8 0, i32 15, i32 1, i1 false) |
| 178 ret void |
| 179 } |
| 180 ; CHECK-LABEL: test_memset_zero_const_len_small_overlap |
| 181 ; CHECK: pxor [[ZERO:xmm[0-9]+]],[[ZERO]] |
| 182 ; CHECK-NEXT: movq QWORD PTR [{{.*}}],[[ZERO]] |
| 183 ; CHECK-NEXT: movq QWORD PTR [{{.*}}+0x7],[[ZERO]] |
| 184 ; CHECK-NOT: mov |
| 185 ; ARM32-LABEL: test_memset_zero_const_len_small_overlap |
| 186 ; ARM32: uxtb |
| 187 ; ARM32: bl {{.*}} memset |
| 188 |
| 189 define void @test_memset_zero_const_len_large_overlap(i32 %iptr_dst) { |
| 190 entry: |
| 191 %dst = inttoptr i32 %iptr_dst to i8* |
| 192 call void @llvm.memset.p0i8.i32(i8* %dst, i8 0, i32 30, i32 1, i1 false) |
| 193 ret void |
| 194 } |
| 195 ; CHECK-LABEL: test_memset_zero_const_len_large_overlap |
| 196 ; CHECK: pxor [[ZERO:xmm[0-9]+]],[[ZERO]] |
| 197 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}],[[ZERO]] |
| 198 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}+0xe],[[ZERO]] |
| 199 ; CHECK-NOT: mov |
| 200 ; ARM32-LABEL: test_memset_zero_const_len_large_overlap |
| 201 ; ARM32: uxtb |
| 202 ; ARM32: bl {{.*}} memset |
| 203 |
| 204 define void @test_memset_zero_const_len_large(i32 %iptr_dst) { |
| 205 entry: |
| 206 %dst = inttoptr i32 %iptr_dst to i8* |
| 207 call void @llvm.memset.p0i8.i32(i8* %dst, i8 0, i32 33, i32 1, i1 false) |
| 208 ret void |
| 209 } |
| 210 ; CHECK-LABEL: test_memset_zero_const_len_large |
| 211 ; CHECK: pxor [[ZERO:xmm[0-9]+]],[[ZERO]] |
| 212 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}+0x10],[[ZERO]] |
| 213 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}],[[ZERO]] |
| 214 ; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x20],0x0 |
| 215 ; CHECK-NOT: mov |
| 216 ; ARM32-LABEL: test_memset_zero_const_len_large |
| 217 ; ARM32: uxtb |
| 218 ; ARM32: bl {{.*}} memset |
| OLD | NEW |