1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=x86_64-unknown-unknown < %s -mattr=sse | FileCheck %s --check-prefix=SSE 3; RUN: llc -mtriple=x86_64-unknown-unknown < %s -mattr=sse2 | FileCheck %s --check-prefix=SSE 4; RUN: llc -mtriple=x86_64-unknown-unknown < %s -mattr=sse2,-slow-unaligned-mem-16 | FileCheck %s --check-prefix=SSE2FAST 5; RUN: llc -mtriple=x86_64-unknown-unknown < %s -mattr=avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1 6; RUN: llc -mtriple=x86_64-unknown-unknown < %s -mattr=avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 7 8; https://llvm.org/bugs/show_bug.cgi?id=27100 9 10define void @memset_16_nonzero_bytes(i8* %x) { 11; SSE-LABEL: memset_16_nonzero_bytes: 12; SSE: # %bb.0: 13; SSE-NEXT: movabsq $3038287259199220266, %rax # imm = 0x2A2A2A2A2A2A2A2A 14; SSE-NEXT: movq %rax, 8(%rdi) 15; SSE-NEXT: movq %rax, (%rdi) 16; SSE-NEXT: retq 17; 18; SSE2FAST-LABEL: memset_16_nonzero_bytes: 19; SSE2FAST: # %bb.0: 20; SSE2FAST-NEXT: movaps {{.*#+}} xmm0 = [42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42] 21; SSE2FAST-NEXT: movups %xmm0, (%rdi) 22; SSE2FAST-NEXT: retq 23; 24; AVX-LABEL: memset_16_nonzero_bytes: 25; AVX: # %bb.0: 26; AVX-NEXT: vmovaps {{.*#+}} xmm0 = [42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42] 27; AVX-NEXT: vmovups %xmm0, (%rdi) 28; AVX-NEXT: retq 29 %call = tail call i8* @__memset_chk(i8* %x, i32 42, i64 16, i64 -1) 30 ret void 31} 32 33define void @memset_32_nonzero_bytes(i8* %x) { 34; SSE-LABEL: memset_32_nonzero_bytes: 35; SSE: # %bb.0: 36; SSE-NEXT: movabsq $3038287259199220266, %rax # imm = 0x2A2A2A2A2A2A2A2A 37; SSE-NEXT: movq %rax, 24(%rdi) 38; SSE-NEXT: movq %rax, 16(%rdi) 39; SSE-NEXT: movq %rax, 8(%rdi) 40; SSE-NEXT: movq %rax, (%rdi) 41; SSE-NEXT: retq 42; 43; SSE2FAST-LABEL: memset_32_nonzero_bytes: 44; SSE2FAST: # %bb.0: 45; SSE2FAST-NEXT: movaps {{.*#+}} xmm0 = [42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42] 46; SSE2FAST-NEXT: movups %xmm0, 16(%rdi) 47; SSE2FAST-NEXT: movups %xmm0, (%rdi) 48; SSE2FAST-NEXT: retq 49; 50; AVX-LABEL: memset_32_nonzero_bytes: 51; AVX: # %bb.0: 52; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42] 53; AVX-NEXT: vmovups %ymm0, (%rdi) 54; AVX-NEXT: vzeroupper 55; AVX-NEXT: retq 56 %call = tail call i8* @__memset_chk(i8* %x, i32 42, i64 32, i64 -1) 57 ret void 58} 59 60define void @memset_64_nonzero_bytes(i8* %x) { 61; SSE-LABEL: memset_64_nonzero_bytes: 62; SSE: # %bb.0: 63; SSE-NEXT: movabsq $3038287259199220266, %rax # imm = 0x2A2A2A2A2A2A2A2A 64; SSE-NEXT: movq %rax, 56(%rdi) 65; SSE-NEXT: movq %rax, 48(%rdi) 66; SSE-NEXT: movq %rax, 40(%rdi) 67; SSE-NEXT: movq %rax, 32(%rdi) 68; SSE-NEXT: movq %rax, 24(%rdi) 69; SSE-NEXT: movq %rax, 16(%rdi) 70; SSE-NEXT: movq %rax, 8(%rdi) 71; SSE-NEXT: movq %rax, (%rdi) 72; SSE-NEXT: retq 73; 74; SSE2FAST-LABEL: memset_64_nonzero_bytes: 75; SSE2FAST: # %bb.0: 76; SSE2FAST-NEXT: movaps {{.*#+}} xmm0 = [42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42] 77; SSE2FAST-NEXT: movups %xmm0, 48(%rdi) 78; SSE2FAST-NEXT: movups %xmm0, 32(%rdi) 79; SSE2FAST-NEXT: movups %xmm0, 16(%rdi) 80; SSE2FAST-NEXT: movups %xmm0, (%rdi) 81; SSE2FAST-NEXT: retq 82; 83; AVX-LABEL: memset_64_nonzero_bytes: 84; AVX: # %bb.0: 85; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42] 86; AVX-NEXT: vmovups %ymm0, 32(%rdi) 87; AVX-NEXT: vmovups %ymm0, (%rdi) 88; AVX-NEXT: vzeroupper 89; AVX-NEXT: retq 90 %call = tail call i8* @__memset_chk(i8* %x, i32 42, i64 64, i64 -1) 91 ret void 92} 93 94define void @memset_128_nonzero_bytes(i8* %x) { 95; SSE-LABEL: memset_128_nonzero_bytes: 96; SSE: # %bb.0: 97; SSE-NEXT: movabsq $3038287259199220266, %rax # imm = 0x2A2A2A2A2A2A2A2A 98; SSE-NEXT: movq %rax, 120(%rdi) 99; SSE-NEXT: movq %rax, 112(%rdi) 100; SSE-NEXT: movq %rax, 104(%rdi) 101; SSE-NEXT: movq %rax, 96(%rdi) 102; SSE-NEXT: movq %rax, 88(%rdi) 103; SSE-NEXT: movq %rax, 80(%rdi) 104; SSE-NEXT: movq %rax, 72(%rdi) 105; SSE-NEXT: movq %rax, 64(%rdi) 106; SSE-NEXT: movq %rax, 56(%rdi) 107; SSE-NEXT: movq %rax, 48(%rdi) 108; SSE-NEXT: movq %rax, 40(%rdi) 109; SSE-NEXT: movq %rax, 32(%rdi) 110; SSE-NEXT: movq %rax, 24(%rdi) 111; SSE-NEXT: movq %rax, 16(%rdi) 112; SSE-NEXT: movq %rax, 8(%rdi) 113; SSE-NEXT: movq %rax, (%rdi) 114; SSE-NEXT: retq 115; 116; SSE2FAST-LABEL: memset_128_nonzero_bytes: 117; SSE2FAST: # %bb.0: 118; SSE2FAST-NEXT: movaps {{.*#+}} xmm0 = [42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42] 119; SSE2FAST-NEXT: movups %xmm0, 112(%rdi) 120; SSE2FAST-NEXT: movups %xmm0, 96(%rdi) 121; SSE2FAST-NEXT: movups %xmm0, 80(%rdi) 122; SSE2FAST-NEXT: movups %xmm0, 64(%rdi) 123; SSE2FAST-NEXT: movups %xmm0, 48(%rdi) 124; SSE2FAST-NEXT: movups %xmm0, 32(%rdi) 125; SSE2FAST-NEXT: movups %xmm0, 16(%rdi) 126; SSE2FAST-NEXT: movups %xmm0, (%rdi) 127; SSE2FAST-NEXT: retq 128; 129; AVX-LABEL: memset_128_nonzero_bytes: 130; AVX: # %bb.0: 131; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42] 132; AVX-NEXT: vmovups %ymm0, 96(%rdi) 133; AVX-NEXT: vmovups %ymm0, 64(%rdi) 134; AVX-NEXT: vmovups %ymm0, 32(%rdi) 135; AVX-NEXT: vmovups %ymm0, (%rdi) 136; AVX-NEXT: vzeroupper 137; AVX-NEXT: retq 138 %call = tail call i8* @__memset_chk(i8* %x, i32 42, i64 128, i64 -1) 139 ret void 140} 141 142define void @memset_256_nonzero_bytes(i8* %x) { 143; SSE-LABEL: memset_256_nonzero_bytes: 144; SSE: # %bb.0: 145; SSE-NEXT: pushq %rax 146; SSE-NEXT: .cfi_def_cfa_offset 16 147; SSE-NEXT: movl $256, %edx # imm = 0x100 148; SSE-NEXT: movl $42, %esi 149; SSE-NEXT: callq memset 150; SSE-NEXT: popq %rax 151; SSE-NEXT: .cfi_def_cfa_offset 8 152; SSE-NEXT: retq 153; 154; SSE2FAST-LABEL: memset_256_nonzero_bytes: 155; SSE2FAST: # %bb.0: 156; SSE2FAST-NEXT: movaps {{.*#+}} xmm0 = [42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42] 157; SSE2FAST-NEXT: movups %xmm0, 240(%rdi) 158; SSE2FAST-NEXT: movups %xmm0, 224(%rdi) 159; SSE2FAST-NEXT: movups %xmm0, 208(%rdi) 160; SSE2FAST-NEXT: movups %xmm0, 192(%rdi) 161; SSE2FAST-NEXT: movups %xmm0, 176(%rdi) 162; SSE2FAST-NEXT: movups %xmm0, 160(%rdi) 163; SSE2FAST-NEXT: movups %xmm0, 144(%rdi) 164; SSE2FAST-NEXT: movups %xmm0, 128(%rdi) 165; SSE2FAST-NEXT: movups %xmm0, 112(%rdi) 166; SSE2FAST-NEXT: movups %xmm0, 96(%rdi) 167; SSE2FAST-NEXT: movups %xmm0, 80(%rdi) 168; SSE2FAST-NEXT: movups %xmm0, 64(%rdi) 169; SSE2FAST-NEXT: movups %xmm0, 48(%rdi) 170; SSE2FAST-NEXT: movups %xmm0, 32(%rdi) 171; SSE2FAST-NEXT: movups %xmm0, 16(%rdi) 172; SSE2FAST-NEXT: movups %xmm0, (%rdi) 173; SSE2FAST-NEXT: retq 174; 175; AVX-LABEL: memset_256_nonzero_bytes: 176; AVX: # %bb.0: 177; AVX-NEXT: vmovaps {{.*#+}} ymm0 = [42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42] 178; AVX-NEXT: vmovups %ymm0, 224(%rdi) 179; AVX-NEXT: vmovups %ymm0, 192(%rdi) 180; AVX-NEXT: vmovups %ymm0, 160(%rdi) 181; AVX-NEXT: vmovups %ymm0, 128(%rdi) 182; AVX-NEXT: vmovups %ymm0, 96(%rdi) 183; AVX-NEXT: vmovups %ymm0, 64(%rdi) 184; AVX-NEXT: vmovups %ymm0, 32(%rdi) 185; AVX-NEXT: vmovups %ymm0, (%rdi) 186; AVX-NEXT: vzeroupper 187; AVX-NEXT: retq 188 %call = tail call i8* @__memset_chk(i8* %x, i32 42, i64 256, i64 -1) 189 ret void 190} 191 192declare i8* @__memset_chk(i8*, i32, i64, i64) 193 194; Repeat with a non-constant value for the stores. 195 196define void @memset_16_nonconst_bytes(i8* %x, i8 %c) { 197; SSE-LABEL: memset_16_nonconst_bytes: 198; SSE: # %bb.0: 199; SSE-NEXT: # kill: def $esi killed $esi def $rsi 200; SSE-NEXT: movzbl %sil, %eax 201; SSE-NEXT: movabsq $72340172838076673, %rcx # imm = 0x101010101010101 202; SSE-NEXT: imulq %rax, %rcx 203; SSE-NEXT: movq %rcx, 8(%rdi) 204; SSE-NEXT: movq %rcx, (%rdi) 205; SSE-NEXT: retq 206; 207; SSE2FAST-LABEL: memset_16_nonconst_bytes: 208; SSE2FAST: # %bb.0: 209; SSE2FAST-NEXT: movd %esi, %xmm0 210; SSE2FAST-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 211; SSE2FAST-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7] 212; SSE2FAST-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0] 213; SSE2FAST-NEXT: movdqu %xmm0, (%rdi) 214; SSE2FAST-NEXT: retq 215; 216; AVX1-LABEL: memset_16_nonconst_bytes: 217; AVX1: # %bb.0: 218; AVX1-NEXT: vmovd %esi, %xmm0 219; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 220; AVX1-NEXT: vpshufb %xmm1, %xmm0, %xmm0 221; AVX1-NEXT: vmovdqu %xmm0, (%rdi) 222; AVX1-NEXT: retq 223; 224; AVX2-LABEL: memset_16_nonconst_bytes: 225; AVX2: # %bb.0: 226; AVX2-NEXT: vmovd %esi, %xmm0 227; AVX2-NEXT: vpbroadcastb %xmm0, %xmm0 228; AVX2-NEXT: vmovdqu %xmm0, (%rdi) 229; AVX2-NEXT: retq 230 tail call void @llvm.memset.p0i8.i64(i8* %x, i8 %c, i64 16, i1 false) 231 ret void 232} 233 234define void @memset_32_nonconst_bytes(i8* %x, i8 %c) { 235; SSE-LABEL: memset_32_nonconst_bytes: 236; SSE: # %bb.0: 237; SSE-NEXT: # kill: def $esi killed $esi def $rsi 238; SSE-NEXT: movzbl %sil, %eax 239; SSE-NEXT: movabsq $72340172838076673, %rcx # imm = 0x101010101010101 240; SSE-NEXT: imulq %rax, %rcx 241; SSE-NEXT: movq %rcx, 24(%rdi) 242; SSE-NEXT: movq %rcx, 16(%rdi) 243; SSE-NEXT: movq %rcx, 8(%rdi) 244; SSE-NEXT: movq %rcx, (%rdi) 245; SSE-NEXT: retq 246; 247; SSE2FAST-LABEL: memset_32_nonconst_bytes: 248; SSE2FAST: # %bb.0: 249; SSE2FAST-NEXT: movd %esi, %xmm0 250; SSE2FAST-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 251; SSE2FAST-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7] 252; SSE2FAST-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0] 253; SSE2FAST-NEXT: movdqu %xmm0, 16(%rdi) 254; SSE2FAST-NEXT: movdqu %xmm0, (%rdi) 255; SSE2FAST-NEXT: retq 256; 257; AVX1-LABEL: memset_32_nonconst_bytes: 258; AVX1: # %bb.0: 259; AVX1-NEXT: vmovd %esi, %xmm0 260; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 261; AVX1-NEXT: vpshufb %xmm1, %xmm0, %xmm0 262; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 263; AVX1-NEXT: vmovups %ymm0, (%rdi) 264; AVX1-NEXT: vzeroupper 265; AVX1-NEXT: retq 266; 267; AVX2-LABEL: memset_32_nonconst_bytes: 268; AVX2: # %bb.0: 269; AVX2-NEXT: vmovd %esi, %xmm0 270; AVX2-NEXT: vpbroadcastb %xmm0, %ymm0 271; AVX2-NEXT: vmovdqu %ymm0, (%rdi) 272; AVX2-NEXT: vzeroupper 273; AVX2-NEXT: retq 274 tail call void @llvm.memset.p0i8.i64(i8* %x, i8 %c, i64 32, i1 false) 275 ret void 276} 277 278define void @memset_64_nonconst_bytes(i8* %x, i8 %c) { 279; SSE-LABEL: memset_64_nonconst_bytes: 280; SSE: # %bb.0: 281; SSE-NEXT: # kill: def $esi killed $esi def $rsi 282; SSE-NEXT: movzbl %sil, %eax 283; SSE-NEXT: movabsq $72340172838076673, %rcx # imm = 0x101010101010101 284; SSE-NEXT: imulq %rax, %rcx 285; SSE-NEXT: movq %rcx, 56(%rdi) 286; SSE-NEXT: movq %rcx, 48(%rdi) 287; SSE-NEXT: movq %rcx, 40(%rdi) 288; SSE-NEXT: movq %rcx, 32(%rdi) 289; SSE-NEXT: movq %rcx, 24(%rdi) 290; SSE-NEXT: movq %rcx, 16(%rdi) 291; SSE-NEXT: movq %rcx, 8(%rdi) 292; SSE-NEXT: movq %rcx, (%rdi) 293; SSE-NEXT: retq 294; 295; SSE2FAST-LABEL: memset_64_nonconst_bytes: 296; SSE2FAST: # %bb.0: 297; SSE2FAST-NEXT: movd %esi, %xmm0 298; SSE2FAST-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 299; SSE2FAST-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7] 300; SSE2FAST-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0] 301; SSE2FAST-NEXT: movdqu %xmm0, 48(%rdi) 302; SSE2FAST-NEXT: movdqu %xmm0, 32(%rdi) 303; SSE2FAST-NEXT: movdqu %xmm0, 16(%rdi) 304; SSE2FAST-NEXT: movdqu %xmm0, (%rdi) 305; SSE2FAST-NEXT: retq 306; 307; AVX1-LABEL: memset_64_nonconst_bytes: 308; AVX1: # %bb.0: 309; AVX1-NEXT: vmovd %esi, %xmm0 310; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 311; AVX1-NEXT: vpshufb %xmm1, %xmm0, %xmm0 312; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 313; AVX1-NEXT: vmovups %ymm0, 32(%rdi) 314; AVX1-NEXT: vmovups %ymm0, (%rdi) 315; AVX1-NEXT: vzeroupper 316; AVX1-NEXT: retq 317; 318; AVX2-LABEL: memset_64_nonconst_bytes: 319; AVX2: # %bb.0: 320; AVX2-NEXT: vmovd %esi, %xmm0 321; AVX2-NEXT: vpbroadcastb %xmm0, %ymm0 322; AVX2-NEXT: vmovdqu %ymm0, 32(%rdi) 323; AVX2-NEXT: vmovdqu %ymm0, (%rdi) 324; AVX2-NEXT: vzeroupper 325; AVX2-NEXT: retq 326 tail call void @llvm.memset.p0i8.i64(i8* %x, i8 %c, i64 64, i1 false) 327 ret void 328} 329 330define void @memset_128_nonconst_bytes(i8* %x, i8 %c) { 331; SSE-LABEL: memset_128_nonconst_bytes: 332; SSE: # %bb.0: 333; SSE-NEXT: # kill: def $esi killed $esi def $rsi 334; SSE-NEXT: movzbl %sil, %eax 335; SSE-NEXT: movabsq $72340172838076673, %rcx # imm = 0x101010101010101 336; SSE-NEXT: imulq %rax, %rcx 337; SSE-NEXT: movq %rcx, 120(%rdi) 338; SSE-NEXT: movq %rcx, 112(%rdi) 339; SSE-NEXT: movq %rcx, 104(%rdi) 340; SSE-NEXT: movq %rcx, 96(%rdi) 341; SSE-NEXT: movq %rcx, 88(%rdi) 342; SSE-NEXT: movq %rcx, 80(%rdi) 343; SSE-NEXT: movq %rcx, 72(%rdi) 344; SSE-NEXT: movq %rcx, 64(%rdi) 345; SSE-NEXT: movq %rcx, 56(%rdi) 346; SSE-NEXT: movq %rcx, 48(%rdi) 347; SSE-NEXT: movq %rcx, 40(%rdi) 348; SSE-NEXT: movq %rcx, 32(%rdi) 349; SSE-NEXT: movq %rcx, 24(%rdi) 350; SSE-NEXT: movq %rcx, 16(%rdi) 351; SSE-NEXT: movq %rcx, 8(%rdi) 352; SSE-NEXT: movq %rcx, (%rdi) 353; SSE-NEXT: retq 354; 355; SSE2FAST-LABEL: memset_128_nonconst_bytes: 356; SSE2FAST: # %bb.0: 357; SSE2FAST-NEXT: movd %esi, %xmm0 358; SSE2FAST-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 359; SSE2FAST-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7] 360; SSE2FAST-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0] 361; SSE2FAST-NEXT: movdqu %xmm0, 112(%rdi) 362; SSE2FAST-NEXT: movdqu %xmm0, 96(%rdi) 363; SSE2FAST-NEXT: movdqu %xmm0, 80(%rdi) 364; SSE2FAST-NEXT: movdqu %xmm0, 64(%rdi) 365; SSE2FAST-NEXT: movdqu %xmm0, 48(%rdi) 366; SSE2FAST-NEXT: movdqu %xmm0, 32(%rdi) 367; SSE2FAST-NEXT: movdqu %xmm0, 16(%rdi) 368; SSE2FAST-NEXT: movdqu %xmm0, (%rdi) 369; SSE2FAST-NEXT: retq 370; 371; AVX1-LABEL: memset_128_nonconst_bytes: 372; AVX1: # %bb.0: 373; AVX1-NEXT: vmovd %esi, %xmm0 374; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 375; AVX1-NEXT: vpshufb %xmm1, %xmm0, %xmm0 376; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 377; AVX1-NEXT: vmovups %ymm0, 96(%rdi) 378; AVX1-NEXT: vmovups %ymm0, 64(%rdi) 379; AVX1-NEXT: vmovups %ymm0, 32(%rdi) 380; AVX1-NEXT: vmovups %ymm0, (%rdi) 381; AVX1-NEXT: vzeroupper 382; AVX1-NEXT: retq 383; 384; AVX2-LABEL: memset_128_nonconst_bytes: 385; AVX2: # %bb.0: 386; AVX2-NEXT: vmovd %esi, %xmm0 387; AVX2-NEXT: vpbroadcastb %xmm0, %ymm0 388; AVX2-NEXT: vmovdqu %ymm0, 96(%rdi) 389; AVX2-NEXT: vmovdqu %ymm0, 64(%rdi) 390; AVX2-NEXT: vmovdqu %ymm0, 32(%rdi) 391; AVX2-NEXT: vmovdqu %ymm0, (%rdi) 392; AVX2-NEXT: vzeroupper 393; AVX2-NEXT: retq 394 tail call void @llvm.memset.p0i8.i64(i8* %x, i8 %c, i64 128, i1 false) 395 ret void 396} 397 398define void @memset_256_nonconst_bytes(i8* %x, i8 %c) { 399; SSE-LABEL: memset_256_nonconst_bytes: 400; SSE: # %bb.0: 401; SSE-NEXT: movl $256, %edx # imm = 0x100 402; SSE-NEXT: jmp memset # TAILCALL 403; 404; SSE2FAST-LABEL: memset_256_nonconst_bytes: 405; SSE2FAST: # %bb.0: 406; SSE2FAST-NEXT: movd %esi, %xmm0 407; SSE2FAST-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 408; SSE2FAST-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7] 409; SSE2FAST-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0] 410; SSE2FAST-NEXT: movdqu %xmm0, 240(%rdi) 411; SSE2FAST-NEXT: movdqu %xmm0, 224(%rdi) 412; SSE2FAST-NEXT: movdqu %xmm0, 208(%rdi) 413; SSE2FAST-NEXT: movdqu %xmm0, 192(%rdi) 414; SSE2FAST-NEXT: movdqu %xmm0, 176(%rdi) 415; SSE2FAST-NEXT: movdqu %xmm0, 160(%rdi) 416; SSE2FAST-NEXT: movdqu %xmm0, 144(%rdi) 417; SSE2FAST-NEXT: movdqu %xmm0, 128(%rdi) 418; SSE2FAST-NEXT: movdqu %xmm0, 112(%rdi) 419; SSE2FAST-NEXT: movdqu %xmm0, 96(%rdi) 420; SSE2FAST-NEXT: movdqu %xmm0, 80(%rdi) 421; SSE2FAST-NEXT: movdqu %xmm0, 64(%rdi) 422; SSE2FAST-NEXT: movdqu %xmm0, 48(%rdi) 423; SSE2FAST-NEXT: movdqu %xmm0, 32(%rdi) 424; SSE2FAST-NEXT: movdqu %xmm0, 16(%rdi) 425; SSE2FAST-NEXT: movdqu %xmm0, (%rdi) 426; SSE2FAST-NEXT: retq 427; 428; AVX1-LABEL: memset_256_nonconst_bytes: 429; AVX1: # %bb.0: 430; AVX1-NEXT: vmovd %esi, %xmm0 431; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 432; AVX1-NEXT: vpshufb %xmm1, %xmm0, %xmm0 433; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 434; AVX1-NEXT: vmovups %ymm0, 224(%rdi) 435; AVX1-NEXT: vmovups %ymm0, 192(%rdi) 436; AVX1-NEXT: vmovups %ymm0, 160(%rdi) 437; AVX1-NEXT: vmovups %ymm0, 128(%rdi) 438; AVX1-NEXT: vmovups %ymm0, 96(%rdi) 439; AVX1-NEXT: vmovups %ymm0, 64(%rdi) 440; AVX1-NEXT: vmovups %ymm0, 32(%rdi) 441; AVX1-NEXT: vmovups %ymm0, (%rdi) 442; AVX1-NEXT: vzeroupper 443; AVX1-NEXT: retq 444; 445; AVX2-LABEL: memset_256_nonconst_bytes: 446; AVX2: # %bb.0: 447; AVX2-NEXT: vmovd %esi, %xmm0 448; AVX2-NEXT: vpbroadcastb %xmm0, %ymm0 449; AVX2-NEXT: vmovdqu %ymm0, 224(%rdi) 450; AVX2-NEXT: vmovdqu %ymm0, 192(%rdi) 451; AVX2-NEXT: vmovdqu %ymm0, 160(%rdi) 452; AVX2-NEXT: vmovdqu %ymm0, 128(%rdi) 453; AVX2-NEXT: vmovdqu %ymm0, 96(%rdi) 454; AVX2-NEXT: vmovdqu %ymm0, 64(%rdi) 455; AVX2-NEXT: vmovdqu %ymm0, 32(%rdi) 456; AVX2-NEXT: vmovdqu %ymm0, (%rdi) 457; AVX2-NEXT: vzeroupper 458; AVX2-NEXT: retq 459 tail call void @llvm.memset.p0i8.i64(i8* %x, i8 %c, i64 256, i1 false) 460 ret void 461} 462 463declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) #1 464 465