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 --sandbox -i %s --args -O2 \ 5; RUN: | %if --need=target_X8632 --command FileCheck %s 6; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ 7; RUN: --target x8632 --sandbox -i %s --args -Om1 --fmem-intrin-opt \ 8; RUN: | %if --need=target_X8632 --command FileCheck %s 9; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ 10; RUN: --target x8632 --sandbox -i %s --args -Om1 \ 11; RUN: | %if --need=target_X8632 --command FileCheck --check-prefix OM1 %s 12 13; RUN: %if --need=target_ARM32 \ 14; RUN: --command %p2i --filetype=obj --disassemble --target arm32 \ 15; RUN: -i %s --args -O2 \ 16; RUN: | %if --need=target_ARM32 \ 17; RUN: --command FileCheck --check-prefix ARM32 %s 18 19; RUN: %if --need=target_MIPS32 --need=allow_dump \ 20; RUN: --command %p2i --filetype=asm --assemble --disassemble --target mips32\ 21; RUN: -i %s --args -Om1 \ 22; RUN: | %if --need=target_MIPS32 --need=allow_dump \ 23; RUN: --command FileCheck --check-prefix MIPS32 %s 24 25declare void @llvm.memcpy.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1) 26declare void @llvm.memmove.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1) 27declare void @llvm.memset.p0i8.i32(i8*, i8, i32, i32, i1) 28 29define internal void @test_memcpy(i32 %iptr_dst, i32 %iptr_src, i32 %len) { 30entry: 31 %dst = inttoptr i32 %iptr_dst to i8* 32 %src = inttoptr i32 %iptr_src to i8* 33 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src, 34 i32 %len, i32 1, i1 false) 35 ret void 36} 37; CHECK-LABEL: test_memcpy 38; CHECK: call {{.*}} R_{{.*}} memcpy 39; OM1-LABEL: test_memcpy 40; OM1: call {{.*}} memcpy 41; ARM32-LABEL: test_memcpy 42; ARM32: bl {{.*}} memcpy 43; MIPS32-LABEL: test_memcpy 44; MIPS32: jal {{.*}} memcpy 45 46define internal void @test_memcpy_long_const_len(i32 %iptr_dst, i32 %iptr_src) { 47entry: 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 4876, i32 1, i1 false) 52 ret void 53} 54; CHECK-LABEL: test_memcpy_long_const_len 55; CHECK: call {{.*}} R_{{.*}} memcpy 56; OM1-LABEL: test_memcpy_long_const_len 57; OM1: call {{.*}} memcpy 58; ARM32-LABEL: test_memcpy_long_const_len 59; ARM32: bl {{.*}} memcpy 60; MIPS32-LABEL: test_memcpy_long_const_len 61; MIPS32: jal {{.*}} memcpy 62 63define internal void @test_memcpy_very_small_const_len(i32 %iptr_dst, 64 i32 %iptr_src) { 65entry: 66 %dst = inttoptr i32 %iptr_dst to i8* 67 %src = inttoptr i32 %iptr_src to i8* 68 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src, 69 i32 2, i32 1, i1 false) 70 ret void 71} 72; CHECK-LABEL: test_memcpy_very_small_const_len 73; CHECK: mov [[REG:[^,]*]],WORD PTR [{{.*}}] 74; CHECK-NEXT: mov WORD PTR [{{.*}}],[[REG]] 75; CHECK-NOT: mov 76; OM1-LABEL: test_memcpy_very_small_const_len 77; OM1: call {{.*}} memcpy 78; ARM32-LABEL: test_memcpy_very_small_const_len 79; ARM32: bl {{.*}} memcpy 80; MIPS32-LABEL: test_memcpy_very_small_const_len 81; MIPS32: jal {{.*}} memcpy 82 83define internal void @test_memcpy_const_len_3(i32 %iptr_dst, i32 %iptr_src) { 84entry: 85 %dst = inttoptr i32 %iptr_dst to i8* 86 %src = inttoptr i32 %iptr_src to i8* 87 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src, 88 i32 3, i32 1, i1 false) 89 ret void 90} 91; CHECK-LABEL: test_memcpy_const_len_3 92; CHECK: mov [[REG:[^,]*]],WORD PTR [{{.*}}] 93; CHECK-NEXT: mov WORD PTR [{{.*}}],[[REG]] 94; CHECK-NEXT: mov [[REG:[^,]*]],BYTE PTR [{{.*}}+0x2] 95; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x2],[[REG]] 96; CHECK-NOT: mov 97; OM1-LABEL: test_memcpy_const_len_3 98; OM1: call {{.*}} memcpy 99; ARM32-LABEL: test_memcpy_const_len_3 100; ARM32: bl {{.*}} memcpy 101; MIPS32-LABEL: test_memcpy_const_len_3 102; MIPS32: jal {{.*}} memcpy 103 104define internal void @test_memcpy_mid_const_len(i32 %iptr_dst, i32 %iptr_src) { 105entry: 106 %dst = inttoptr i32 %iptr_dst to i8* 107 %src = inttoptr i32 %iptr_src to i8* 108 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src, 109 i32 9, i32 1, i1 false) 110 ret void 111} 112; CHECK-LABEL: test_memcpy_mid_const_len 113; CHECK: movq [[REG:xmm[0-9]+]],QWORD PTR [{{.*}}] 114; CHECK-NEXT: movq QWORD PTR [{{.*}}],[[REG]] 115; CHECK-NEXT: mov [[REG:[^,]*]],BYTE PTR [{{.*}}+0x8] 116; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x8],[[REG]] 117; CHECK-NOT: mov 118; OM1-LABEL: test_memcpy_mid_const_len 119; OM1: call {{.*}} memcpy 120; ARM32-LABEL: test_memcpy_mid_const_len 121; ARM32: bl {{.*}} memcpy 122; MIPS32-LABEL: test_memcpy_mid_const_len 123; MIPS32: jal {{.*}} memcpy 124 125define internal void @test_memcpy_mid_const_len_overlap(i32 %iptr_dst, 126 i32 %iptr_src) { 127entry: 128 %dst = inttoptr i32 %iptr_dst to i8* 129 %src = inttoptr i32 %iptr_src to i8* 130 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src, 131 i32 15, i32 1, i1 false) 132 ret void 133} 134; CHECK-LABEL: test_memcpy_mid_const_len_overlap 135; CHECK: movq [[REG:xmm[0-9]+]],QWORD PTR [{{.*}}] 136; CHECK-NEXT: movq QWORD PTR [{{.*}}],[[REG]] 137; CHECK-NEXT: movq [[REG:xmm[0-9]+]],QWORD PTR [{{.*}}+0x7] 138; CHECK-NEXT: movq QWORD PTR [{{.*}}+0x7],[[REG]] 139; CHECK-NOT: mov 140; OM1-LABEL: test_memcpy_mid_const_len_overlap 141; OM1: call {{.*}} memcpy 142; ARM32-LABEL: test_memcpy_mid_const_len_overlap 143; ARM32: bl {{.*}} memcpy 144; MIPS32-LABEL: test_memcpy_mid_const_len_overlap 145; MIPS32: jal {{.*}} memcpy 146 147define internal void @test_memcpy_big_const_len_overlap(i32 %iptr_dst, 148 i32 %iptr_src) { 149entry: 150 %dst = inttoptr i32 %iptr_dst to i8* 151 %src = inttoptr i32 %iptr_src to i8* 152 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src, 153 i32 30, i32 1, i1 false) 154 ret void 155} 156; CHECK-LABEL: test_memcpy_big_const_len_overlap 157; CHECK: movups [[REG:xmm[0-9]+]],XMMWORD PTR [{{.*}}] 158; CHECK-NEXT: movups XMMWORD PTR [{{.*}}],[[REG]] 159; CHECK-NEXT: movups [[REG:xmm[0-9]+]],XMMWORD PTR [{{.*}}+0xe] 160; CHECK-NEXT: movups XMMWORD PTR [{{.*}}+0xe],[[REG]] 161; CHECK-NOT: mov 162; OM1-LABEL: test_memcpy_big_const_len_overlap 163; OM1: call {{.*}} memcpy 164; ARM32-LABEL: test_memcpy_big_const_len_overlap 165; ARM32: bl {{.*}} memcpy 166; MIPS32-LABEL: test_memcpy_big_const_len_overlap 167; MIPS32: jal {{.*}} memcpy 168 169define internal void @test_memcpy_large_const_len(i32 %iptr_dst, 170 i32 %iptr_src) { 171entry: 172 %dst = inttoptr i32 %iptr_dst to i8* 173 %src = inttoptr i32 %iptr_src to i8* 174 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src, 175 i32 33, i32 1, i1 false) 176 ret void 177} 178; CHECK-LABEL: test_memcpy_large_const_len 179; CHECK: movups [[REG:xmm[0-9]+]],XMMWORD PTR [{{.*}}+0x10] 180; CHECK-NEXT: movups XMMWORD PTR [{{.*}}+0x10],[[REG]] 181; CHECK-NEXT: movups [[REG:xmm[0-9]+]],XMMWORD PTR [{{.*}}] 182; CHECK-NEXT: movups XMMWORD PTR [{{.*}}],[[REG]] 183; CHECK-NEXT: mov [[REG:[^,]*]],BYTE PTR [{{.*}}+0x20] 184; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x20],[[REG]] 185; CHECK-NOT: mov 186; OM1-LABEL: test_memcpy_large_const_len 187; OM1: call {{.*}} memcpy 188; ARM32-LABEL: test_memcpy_large_const_len 189; ARM32: bl {{.*}} memcpy 190; MIPS32-LABEL: test_memcpy_large_const_len 191; MIPS32: jal {{.*}} memcpy 192 193define internal void @test_memmove(i32 %iptr_dst, i32 %iptr_src, i32 %len) { 194entry: 195 %dst = inttoptr i32 %iptr_dst to i8* 196 %src = inttoptr i32 %iptr_src to i8* 197 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, 198 i32 %len, i32 1, i1 false) 199 ret void 200} 201; CHECK-LABEL: test_memmove 202; CHECK: call {{.*}} R_{{.*}} memmove 203; OM1-LABEL: test_memmove 204; OM1: call {{.*}} memmove 205; ARM32-LABEL: test_memmove 206; ARM32: bl {{.*}} memmove 207; MIPS32-LABEL: test_memmove 208; MIPS32: jal {{.*}} memmove 209 210define internal void @test_memmove_long_const_len(i32 %iptr_dst, 211 i32 %iptr_src) { 212entry: 213 %dst = inttoptr i32 %iptr_dst to i8* 214 %src = inttoptr i32 %iptr_src to i8* 215 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, 216 i32 4876, i32 1, i1 false) 217 ret void 218} 219; CHECK-LABEL: test_memmove_long_const_len 220; CHECK: call {{.*}} R_{{.*}} memmove 221; OM1-LABEL: test_memmove_long_const_len 222; OM1: call {{.*}} memmove 223; ARM32-LABEL: test_memmove_long_const_len 224; ARM32: bl {{.*}} memmove 225; MIPS32-LABEL: test_memmove_long_const_len 226; MIPS32: jal {{.*}} memmove 227 228define internal void @test_memmove_very_small_const_len(i32 %iptr_dst, 229 i32 %iptr_src) { 230entry: 231 %dst = inttoptr i32 %iptr_dst to i8* 232 %src = inttoptr i32 %iptr_src to i8* 233 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, 234 i32 2, i32 1, i1 false) 235 ret void 236} 237; CHECK-LABEL: test_memmove_very_small_const_len 238; CHECK: mov [[REG:[^,]*]],WORD PTR [{{.*}}] 239; CHECK-NEXT: mov WORD PTR [{{.*}}],[[REG]] 240; CHECK-NOT: mov 241; OM1-LABEL: test_memmove_very_small_const_len 242; OM1: call {{.*}} memmove 243; ARM32-LABEL: test_memmove_very_small_const_len 244; ARM32: bl {{.*}} memmove 245; MIPS32-LABEL: test_memmove_very_small_const_len 246; MIPS32: jal {{.*}} memmove 247 248define internal void @test_memmove_const_len_3(i32 %iptr_dst, i32 %iptr_src) { 249entry: 250 %dst = inttoptr i32 %iptr_dst to i8* 251 %src = inttoptr i32 %iptr_src to i8* 252 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, 253 i32 3, i32 1, i1 false) 254 ret void 255} 256; CHECK-LABEL: test_memmove_const_len_3 257; CHECK: mov [[REG0:[^,]*]],WORD PTR [{{.*}}] 258; CHECK-NEXT: mov [[REG1:[^,]*]],BYTE PTR [{{.*}}+0x2] 259; CHECK-NEXT: mov WORD PTR [{{.*}}],[[REG0]] 260; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x2],[[REG1]] 261; CHECK-NOT: mov 262; OM1-LABEL: test_memmove_const_len_3 263; OM1: call {{.*}} memmove 264; ARM32-LABEL: test_memmove_const_len_3 265; ARM32: bl {{.*}} memmove 266; MIPS32-LABEL: test_memmove_const_len_3 267; MIPS32: jal {{.*}} memmove 268 269define internal void @test_memmove_mid_const_len(i32 %iptr_dst, i32 %iptr_src) { 270entry: 271 %dst = inttoptr i32 %iptr_dst to i8* 272 %src = inttoptr i32 %iptr_src to i8* 273 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, 274 i32 9, i32 1, i1 false) 275 ret void 276} 277; CHECK-LABEL: test_memmove_mid_const_len 278; CHECK: movq [[REG0:xmm[0-9]+]],QWORD PTR [{{.*}}] 279; CHECK-NEXT: mov [[REG1:[^,]*]],BYTE PTR [{{.*}}+0x8] 280; CHECK-NEXT: movq QWORD PTR [{{.*}}],[[REG0]] 281; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x8],[[REG1]] 282; CHECK-NOT: mov 283; OM1-LABEL: test_memmove_mid_const_len 284; OM1: call {{.*}} memmove 285; ARM32-LABEL: test_memmove_mid_const_len 286; ARM32: bl {{.*}} memmove 287; MIPS32-LABEL: test_memmove_mid_const_len 288; MIPS32: jal {{.*}} memmove 289 290define internal void @test_memmove_mid_const_len_overlap(i32 %iptr_dst, 291 i32 %iptr_src) { 292entry: 293 %dst = inttoptr i32 %iptr_dst to i8* 294 %src = inttoptr i32 %iptr_src to i8* 295 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, 296 i32 15, i32 1, i1 false) 297 ret void 298} 299; CHECK-LABEL: test_memmove_mid_const_len_overlap 300; CHECK: movq [[REG0:xmm[0-9]+]],QWORD PTR [{{.*}}] 301; CHECK-NEXT: movq [[REG1:xmm[0-9]+]],QWORD PTR [{{.*}}+0x7] 302; CHECK-NEXT: movq QWORD PTR [{{.*}}],[[REG0]] 303; CHECK-NEXT: movq QWORD PTR [{{.*}}+0x7],[[REG1]] 304; CHECK-NOT: mov 305; OM1-LABEL: test_memmove_mid_const_len_overlap 306; OM1: call {{.*}} memmove 307; ARM32-LABEL: test_memmove_mid_const_len_overlap 308; ARM32: bl {{.*}} memmove 309; MIPS32-LABEL: test_memmove_mid_const_len_overlap 310; MIPS32: jal {{.*}} memmove 311 312define internal void @test_memmove_big_const_len_overlap(i32 %iptr_dst, 313 i32 %iptr_src) { 314entry: 315 %dst = inttoptr i32 %iptr_dst to i8* 316 %src = inttoptr i32 %iptr_src to i8* 317 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, 318 i32 30, i32 1, i1 false) 319 ret void 320} 321; CHECK-LABEL: test_memmove_big_const_len_overlap 322; CHECK: movups [[REG0:xmm[0-9]+]],XMMWORD PTR [{{.*}}] 323; CHECK-NEXT: movups [[REG1:xmm[0-9]+]],XMMWORD PTR [{{.*}}+0xe] 324; CHECK-NEXT: movups XMMWORD PTR [{{.*}}],[[REG0]] 325; CHECK-NEXT: movups XMMWORD PTR [{{.*}}+0xe],[[REG1]] 326; CHECK-NOT: mov 327; OM1-LABEL: test_memmove_big_const_len_overlap 328; OM1: call {{.*}} memmove 329; ARM32-LABEL: test_memmove_big_const_len_overlap 330; ARM32: bl {{.*}} memmove 331; MIPS32-LABEL: test_memmove_big_const_len_overlap 332; MIPS32: jal {{.*}} memmove 333 334define internal void @test_memmove_large_const_len(i32 %iptr_dst, 335 i32 %iptr_src) { 336entry: 337 %dst = inttoptr i32 %iptr_dst to i8* 338 %src = inttoptr i32 %iptr_src to i8* 339 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, 340 i32 33, i32 1, i1 false) 341 ret void 342} 343; CHECK-LABEL: test_memmove_large_const_len 344; CHECK: movups [[REG0:xmm[0-9]+]],XMMWORD PTR [{{.*}}+0x10] 345; CHECK-NEXT: movups [[REG1:xmm[0-9]+]],XMMWORD PTR [{{.*}}] 346; CHECK-NEXT: mov [[REG2:[^,]*]],BYTE PTR [{{.*}}+0x20] 347; CHECK-NEXT: movups XMMWORD PTR [{{.*}}+0x10],[[REG0]] 348; CHECK-NEXT: movups XMMWORD PTR [{{.*}}],[[REG1]] 349; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x20],[[REG2]] 350; CHECK-NOT: mov 351; OM1-LABEL: test_memmove_large_const_len 352; OM1: call {{.*}} memmove 353; ARM32-LABEL: test_memmove_large_const_len 354; ARM32: bl {{.*}} memmove 355; MIPS32-LABEL: test_memmove_large_const_len 356; MIPS32: jal {{.*}} memmove 357 358define internal void @test_memset(i32 %iptr_dst, i32 %wide_val, i32 %len) { 359entry: 360 %val = trunc i32 %wide_val to i8 361 %dst = inttoptr i32 %iptr_dst to i8* 362 call void @llvm.memset.p0i8.i32(i8* %dst, i8 %val, 363 i32 %len, i32 1, i1 false) 364 ret void 365} 366; CHECK-LABEL: test_memset 367; CHECK: movzx 368; CHECK: call {{.*}} R_{{.*}} memset 369; OM1-LABEL: test_memset 370; OM1: movzx 371; OM1: call {{.*}} R_{{.*}} memset 372; ARM32-LABEL: test_memset 373; ARM32: uxtb 374; ARM32: bl {{.*}} memset 375; MIPS32-LABEL: test_memset 376; MIPS32: jal {{.*}} memset 377 378define internal void @test_memset_const_len_align(i32 %iptr_dst, 379 i32 %wide_val) { 380entry: 381 %val = trunc i32 %wide_val to i8 382 %dst = inttoptr i32 %iptr_dst to i8* 383 call void @llvm.memset.p0i8.i32(i8* %dst, i8 %val, 384 i32 32, i32 1, i1 false) 385 ret void 386} 387; CHECK-LABEL: test_memset_const_len_align 388; CHECK: movzx 389; CHECK: call {{.*}} R_{{.*}} memset 390; OM1-LABEL: test_memset_const_len_align 391; OM1: movzx 392; OM1: call {{.*}} R_{{.*}} memset 393; ARM32-LABEL: test_memset_const_len_align 394; ARM32: uxtb 395; ARM32: bl {{.*}} memset 396; MIPS32-LABEL: test_memset_const_len_align 397; MIPS32: jal {{.*}} memset 398 399define internal void @test_memset_long_const_len_zero_val_align( 400 i32 %iptr_dst) { 401entry: 402 %dst = inttoptr i32 %iptr_dst to i8* 403 call void @llvm.memset.p0i8.i32(i8* %dst, i8 0, 404 i32 4876, i32 1, i1 false) 405 ret void 406} 407; CHECK-LABEL: test_memset_long_const_len_zero_val_align 408; CHECK: call {{.*}} R_{{.*}} memset 409; OM1-LABEL: test_memset_long_const_len_zero_val_align 410; OM1: call {{.*}} R_{{.*}} memset 411; ARM32-LABEL: test_memset_long_const_len_zero_val_align 412; ARM32: uxtb 413; ARM32: bl {{.*}} memset 414; MIPS32-LABEL: test_memset_long_const_len_zero_val_align 415; MIPS32: jal {{.*}} memset 416 417define internal void @test_memset_const_val(i32 %iptr_dst, i32 %len) { 418entry: 419 %dst = inttoptr i32 %iptr_dst to i8* 420 call void @llvm.memset.p0i8.i32(i8* %dst, i8 0, i32 %len, i32 1, i1 false) 421 ret void 422} 423; CHECK-LABEL: test_memset_const_val 424; CHECK-NOT: movzx 425; CHECK: call {{.*}} R_{{.*}} memset 426; OM1-LABEL: test_memset_const_val 427; OM1: call {{.*}} R_{{.*}} memset 428; ARM32-LABEL: test_memset_const_val 429; ARM32: uxtb 430; ARM32: bl {{.*}} memset 431; MIPS32-LABEL: test_memset_const_val 432; MIPS32: jal {{.*}} memset 433 434define internal void @test_memset_const_val_len_very_small(i32 %iptr_dst) { 435entry: 436 %dst = inttoptr i32 %iptr_dst to i8* 437 call void @llvm.memset.p0i8.i32(i8* %dst, i8 10, i32 2, i32 1, i1 false) 438 ret void 439} 440; CHECK-LABEL: test_memset_const_val_len_very_small 441; CHECK: mov WORD PTR [{{.*}}],0xa0a 442; CHECK-NOT: mov 443; OM1-LABEL: test_memset_const_val_len_very_small 444; OM1: call {{.*}} R_{{.*}} memset 445; ARM32-LABEL: test_memset_const_val_len_very_small 446; ARM32: uxtb 447; ARM32: bl {{.*}} memset 448; MIPS32-LABEL: test_memset_const_val_len_very_small 449; MIPS32: jal {{.*}} memset 450 451define internal void @test_memset_const_val_len_3(i32 %iptr_dst) { 452entry: 453 %dst = inttoptr i32 %iptr_dst to i8* 454 call void @llvm.memset.p0i8.i32(i8* %dst, i8 16, i32 3, i32 1, i1 false) 455 ret void 456} 457; CHECK-LABEL: test_memset_const_val_len_3 458; CHECK: mov WORD PTR [{{.*}}],0x1010 459; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x2],0x10 460; CHECK-NOT: mov 461; OM1-LABEL: test_memset_const_val_len_3 462; OM1: call {{.*}} R_{{.*}} memset 463; ARM32-LABEL: test_memset_const_val_len_3 464; ARM32: uxtb 465; ARM32: bl {{.*}} memset 466; MIPS32-LABEL: test_memset_const_val_len_3 467; MIPS32: jal {{.*}} memset 468 469define internal void @test_memset_const_val_len_mid(i32 %iptr_dst) { 470entry: 471 %dst = inttoptr i32 %iptr_dst to i8* 472 call void @llvm.memset.p0i8.i32(i8* %dst, i8 32, i32 9, i32 1, i1 false) 473 ret void 474} 475; CHECK-LABEL: test_memset_const_val_len_mid 476; CHECK: mov DWORD PTR [{{.*}}+0x4],0x20202020 477; CHECK: mov DWORD PTR [{{.*}}],0x20202020 478; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x8],0x20 479; CHECK-NOT: mov 480; OM1-LABEL: test_memset_const_val_len_mid 481; OM1: call {{.*}} R_{{.*}} memset 482; ARM32-LABEL: test_memset_const_val_len_mid 483; ARM32: uxtb 484; ARM32: bl {{.*}} memset 485; MIPS32-LABEL: test_memset_const_val_len_mid 486; MIPS32: jal {{.*}} memset 487 488; Same as above, but with a negative value. 489define internal void @test_memset_const_neg_val_len_mid(i32 %iptr_dst) { 490entry: 491 %dst = inttoptr i32 %iptr_dst to i8* 492 call void @llvm.memset.p0i8.i32(i8* %dst, i8 -128, i32 9, i32 1, i1 false) 493 ret void 494} 495; CHECK-LABEL: test_memset_const_neg_val_len_mid 496; CHECK: mov DWORD PTR [{{.*}}+0x4],0x80808080 497; CHECK: mov DWORD PTR [{{.*}}],0x80808080 498; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x8],0x80 499; CHECK-NOT: mov 500; OM1-LABEL: test_memset_const_neg_val_len_mid 501; OM1: call {{.*}} R_{{.*}} memset 502; ARM32-LABEL: test_memset_const_neg_val_len_mid 503; ARM32: uxtb 504; ARM32: bl {{.*}} memset 505; MIPS32-LABEL: test_memset_const_neg_val_len_mid 506; MIPS32: jal {{.*}} memset 507 508define internal void @test_memset_zero_const_len_small(i32 %iptr_dst) { 509entry: 510 %dst = inttoptr i32 %iptr_dst to i8* 511 call void @llvm.memset.p0i8.i32(i8* %dst, i8 0, i32 12, i32 1, i1 false) 512 ret void 513} 514; CHECK-LABEL: test_memset_zero_const_len_small 515; CHECK: pxor [[ZERO:xmm[0-9]+]],[[ZERO]] 516; CHECK-NEXT: movq QWORD PTR [{{.*}}],[[ZERO]] 517; CHECK-NEXT: mov DWORD PTR [{{.*}}+0x8],0x0 518; CHECK-NOT: mov 519; OM1-LABEL: test_memset_zero_const_len_small 520; OM1: call {{.*}} R_{{.*}} memset 521; ARM32-LABEL: test_memset_zero_const_len_small 522; ARM32: uxtb 523; ARM32: bl {{.*}} memset 524; MIPS32-LABEL: test_memset_zero_const_len_small 525; MIPS32: jal {{.*}} memset 526 527define internal void @test_memset_zero_const_len_small_overlap(i32 %iptr_dst) { 528entry: 529 %dst = inttoptr i32 %iptr_dst to i8* 530 call void @llvm.memset.p0i8.i32(i8* %dst, i8 0, i32 15, i32 1, i1 false) 531 ret void 532} 533; CHECK-LABEL: test_memset_zero_const_len_small_overlap 534; CHECK: pxor [[ZERO:xmm[0-9]+]],[[ZERO]] 535; CHECK-NEXT: movq QWORD PTR [{{.*}}],[[ZERO]] 536; CHECK-NEXT: movq QWORD PTR [{{.*}}+0x7],[[ZERO]] 537; CHECK-NOT: mov 538; OM1-LABEL: test_memset_zero_const_len_small_overlap 539; OM1: call {{.*}} R_{{.*}} memset 540; ARM32-LABEL: test_memset_zero_const_len_small_overlap 541; ARM32: uxtb 542; ARM32: bl {{.*}} memset 543; MIPS32-LABEL: test_memset_zero_const_len_small_overlap 544; MIPS32: jal {{.*}} memset 545 546define internal void @test_memset_zero_const_len_big_overlap(i32 %iptr_dst) { 547entry: 548 %dst = inttoptr i32 %iptr_dst to i8* 549 call void @llvm.memset.p0i8.i32(i8* %dst, i8 0, i32 30, i32 1, i1 false) 550 ret void 551} 552; CHECK-LABEL: test_memset_zero_const_len_big_overlap 553; CHECK: pxor [[ZERO:xmm[0-9]+]],[[ZERO]] 554; CHECK-NEXT: movups XMMWORD PTR [{{.*}}],[[ZERO]] 555; CHECK-NEXT: movups XMMWORD PTR [{{.*}}+0xe],[[ZERO]] 556; CHECK-NOT: mov 557; OM1-LABEL: test_memset_zero_const_len_big_overlap 558; OM1: call {{.*}} R_{{.*}} memset 559; ARM32-LABEL: test_memset_zero_const_len_big_overlap 560; ARM32: uxtb 561; ARM32: bl {{.*}} memset 562; MIPS32-LABEL: test_memset_zero_const_len_big_overlap 563; MIPS32: jal {{.*}} memset 564 565define internal void @test_memset_zero_const_len_large(i32 %iptr_dst) { 566entry: 567 %dst = inttoptr i32 %iptr_dst to i8* 568 call void @llvm.memset.p0i8.i32(i8* %dst, i8 0, i32 33, i32 1, i1 false) 569 ret void 570} 571; CHECK-LABEL: test_memset_zero_const_len_large 572; CHECK: pxor [[ZERO:xmm[0-9]+]],[[ZERO]] 573; CHECK-NEXT: movups XMMWORD PTR [{{.*}}+0x10],[[ZERO]] 574; CHECK-NEXT: movups XMMWORD PTR [{{.*}}],[[ZERO]] 575; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x20],0x0 576; CHECK-NOT: mov 577; OM1-LABEL: test_memset_zero_const_len_large 578; OM1: call {{.*}} R_{{.*}} memset 579; ARM32-LABEL: test_memset_zero_const_len_large 580; ARM32: uxtb 581; ARM32: bl {{.*}} memset 582; MIPS32-LABEL: test_memset_zero_const_len_large 583; MIPS32: jal {{.*}} memset 584