1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=i686-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=X86 3; RUN: llc -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=X64 4; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+sse2 < %s | FileCheck %s --check-prefixes=X64,SSE2 5; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+sse4.1 < %s | FileCheck %s --check-prefixes=X64,SSE41 6; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx < %s | FileCheck %s --check-prefixes=X64,AVX1 7; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx2 < %s | FileCheck %s --check-prefixes=X64,AVX2 8; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+avx512f,+avx512vl < %s | FileCheck %s --check-prefixes=X64,AVX512VL 9 10define i1 @test_srem_odd(i29 %X) nounwind { 11; X86-LABEL: test_srem_odd: 12; X86: # %bb.0: 13; X86-NEXT: imull $526025035, {{[0-9]+}}(%esp), %eax # imm = 0x1F5A814B 14; X86-NEXT: addl $2711469, %eax # imm = 0x295FAD 15; X86-NEXT: andl $536870911, %eax # imm = 0x1FFFFFFF 16; X86-NEXT: cmpl $5422939, %eax # imm = 0x52BF5B 17; X86-NEXT: setb %al 18; X86-NEXT: retl 19; 20; X64-LABEL: test_srem_odd: 21; X64: # %bb.0: 22; X64-NEXT: imull $526025035, %edi, %eax # imm = 0x1F5A814B 23; X64-NEXT: addl $2711469, %eax # imm = 0x295FAD 24; X64-NEXT: andl $536870911, %eax # imm = 0x1FFFFFFF 25; X64-NEXT: cmpl $5422939, %eax # imm = 0x52BF5B 26; X64-NEXT: setb %al 27; X64-NEXT: retq 28 %srem = srem i29 %X, 99 29 %cmp = icmp eq i29 %srem, 0 30 ret i1 %cmp 31} 32 33define i1 @test_srem_even(i4 %X) nounwind { 34; X86-LABEL: test_srem_even: 35; X86: # %bb.0: 36; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 37; X86-NEXT: movl %eax, %ecx 38; X86-NEXT: shlb $4, %cl 39; X86-NEXT: sarb $4, %cl 40; X86-NEXT: movzbl %cl, %ecx 41; X86-NEXT: leal (%ecx,%ecx,2), %ecx 42; X86-NEXT: movl %ecx, %edx 43; X86-NEXT: shrb $7, %dl 44; X86-NEXT: shrb $4, %cl 45; X86-NEXT: addb %dl, %cl 46; X86-NEXT: movzbl %cl, %ecx 47; X86-NEXT: addl %ecx, %ecx 48; X86-NEXT: leal (%ecx,%ecx,2), %ecx 49; X86-NEXT: subb %cl, %al 50; X86-NEXT: andb $15, %al 51; X86-NEXT: cmpb $1, %al 52; X86-NEXT: sete %al 53; X86-NEXT: retl 54; 55; X64-LABEL: test_srem_even: 56; X64: # %bb.0: 57; X64-NEXT: movl %edi, %eax 58; X64-NEXT: shlb $4, %al 59; X64-NEXT: sarb $4, %al 60; X64-NEXT: movzbl %al, %eax 61; X64-NEXT: leal (%rax,%rax,2), %eax 62; X64-NEXT: movl %eax, %ecx 63; X64-NEXT: shrb $7, %cl 64; X64-NEXT: shrb $4, %al 65; X64-NEXT: addb %cl, %al 66; X64-NEXT: movzbl %al, %eax 67; X64-NEXT: addl %eax, %eax 68; X64-NEXT: leal (%rax,%rax,2), %eax 69; X64-NEXT: subb %al, %dil 70; X64-NEXT: andb $15, %dil 71; X64-NEXT: cmpb $1, %dil 72; X64-NEXT: sete %al 73; X64-NEXT: retq 74 %srem = srem i4 %X, 6 75 %cmp = icmp eq i4 %srem, 1 76 ret i1 %cmp 77} 78 79define i1 @test_srem_pow2_setne(i6 %X) nounwind { 80; X86-LABEL: test_srem_pow2_setne: 81; X86: # %bb.0: 82; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 83; X86-NEXT: movl %eax, %ecx 84; X86-NEXT: shlb $2, %cl 85; X86-NEXT: sarb $7, %cl 86; X86-NEXT: andb $3, %cl 87; X86-NEXT: addb %al, %cl 88; X86-NEXT: andb $60, %cl 89; X86-NEXT: subb %cl, %al 90; X86-NEXT: testb $63, %al 91; X86-NEXT: setne %al 92; X86-NEXT: retl 93; 94; X64-LABEL: test_srem_pow2_setne: 95; X64: # %bb.0: 96; X64-NEXT: # kill: def $edi killed $edi def $rdi 97; X64-NEXT: leal (,%rdi,4), %eax 98; X64-NEXT: sarb $7, %al 99; X64-NEXT: andb $3, %al 100; X64-NEXT: addb %dil, %al 101; X64-NEXT: andb $60, %al 102; X64-NEXT: subb %al, %dil 103; X64-NEXT: testb $63, %dil 104; X64-NEXT: setne %al 105; X64-NEXT: retq 106 %srem = srem i6 %X, 4 107 %cmp = icmp ne i6 %srem, 0 108 ret i1 %cmp 109} 110 111define <3 x i1> @test_srem_vec(<3 x i33> %X) nounwind { 112; X86-LABEL: test_srem_vec: 113; X86: # %bb.0: 114; X86-NEXT: pushl %ebp 115; X86-NEXT: pushl %ebx 116; X86-NEXT: pushl %edi 117; X86-NEXT: pushl %esi 118; X86-NEXT: subl $12, %esp 119; X86-NEXT: movl {{[0-9]+}}(%esp), %edi 120; X86-NEXT: andl $1, %edi 121; X86-NEXT: negl %edi 122; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx 123; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp 124; X86-NEXT: andl $1, %ebp 125; X86-NEXT: negl %ebp 126; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 127; X86-NEXT: andl $1, %eax 128; X86-NEXT: negl %eax 129; X86-NEXT: pushl $-1 130; X86-NEXT: pushl $-9 131; X86-NEXT: pushl %eax 132; X86-NEXT: pushl {{[0-9]+}}(%esp) 133; X86-NEXT: calll __moddi3 134; X86-NEXT: addl $16, %esp 135; X86-NEXT: movl %eax, %esi 136; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 137; X86-NEXT: pushl $0 138; X86-NEXT: pushl $9 139; X86-NEXT: pushl %ebp 140; X86-NEXT: pushl %ebx 141; X86-NEXT: calll __moddi3 142; X86-NEXT: addl $16, %esp 143; X86-NEXT: movl %eax, %ebx 144; X86-NEXT: movl %edx, %ebp 145; X86-NEXT: notl %ebp 146; X86-NEXT: pushl $0 147; X86-NEXT: pushl $9 148; X86-NEXT: pushl %edi 149; X86-NEXT: pushl {{[0-9]+}}(%esp) 150; X86-NEXT: calll __moddi3 151; X86-NEXT: addl $16, %esp 152; X86-NEXT: xorl $3, %eax 153; X86-NEXT: orl %edx, %eax 154; X86-NEXT: setne %al 155; X86-NEXT: xorl $3, %esi 156; X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload 157; X86-NEXT: setne %cl 158; X86-NEXT: xorl $-3, %ebx 159; X86-NEXT: andl $1, %ebp 160; X86-NEXT: orl %ebx, %ebp 161; X86-NEXT: setne %dl 162; X86-NEXT: addl $12, %esp 163; X86-NEXT: popl %esi 164; X86-NEXT: popl %edi 165; X86-NEXT: popl %ebx 166; X86-NEXT: popl %ebp 167; X86-NEXT: retl 168; 169; SSE2-LABEL: test_srem_vec: 170; SSE2: # %bb.0: 171; SSE2-NEXT: movq %rdx, %rcx 172; SSE2-NEXT: shlq $31, %rcx 173; SSE2-NEXT: sarq $31, %rcx 174; SSE2-NEXT: shlq $31, %rdi 175; SSE2-NEXT: sarq $31, %rdi 176; SSE2-NEXT: shlq $31, %rsi 177; SSE2-NEXT: sarq $31, %rsi 178; SSE2-NEXT: movabsq $2049638230412172402, %r8 # imm = 0x1C71C71C71C71C72 179; SSE2-NEXT: movq %rsi, %rax 180; SSE2-NEXT: imulq %r8 181; SSE2-NEXT: movq %rdx, %rax 182; SSE2-NEXT: shrq $63, %rax 183; SSE2-NEXT: addq %rdx, %rax 184; SSE2-NEXT: leaq (%rax,%rax,8), %rax 185; SSE2-NEXT: subq %rax, %rsi 186; SSE2-NEXT: movq %rsi, %xmm1 187; SSE2-NEXT: movq %rdi, %rax 188; SSE2-NEXT: imulq %r8 189; SSE2-NEXT: movq %rdx, %rax 190; SSE2-NEXT: shrq $63, %rax 191; SSE2-NEXT: addq %rdx, %rax 192; SSE2-NEXT: leaq (%rax,%rax,8), %rax 193; SSE2-NEXT: subq %rax, %rdi 194; SSE2-NEXT: movq %rdi, %xmm0 195; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 196; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [8589934591,8589934591] 197; SSE2-NEXT: pand %xmm1, %xmm0 198; SSE2-NEXT: movabsq $2049638230412172401, %rdx # imm = 0x1C71C71C71C71C71 199; SSE2-NEXT: movq %rcx, %rax 200; SSE2-NEXT: imulq %rdx 201; SSE2-NEXT: subq %rcx, %rdx 202; SSE2-NEXT: movq %rdx, %rax 203; SSE2-NEXT: shrq $63, %rax 204; SSE2-NEXT: sarq $3, %rdx 205; SSE2-NEXT: addq %rax, %rdx 206; SSE2-NEXT: leaq (%rdx,%rdx,8), %rax 207; SSE2-NEXT: addq %rcx, %rax 208; SSE2-NEXT: movq %rax, %xmm2 209; SSE2-NEXT: pand %xmm1, %xmm2 210; SSE2-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 211; SSE2-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 212; SSE2-NEXT: movdqa %xmm0, %xmm1 213; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3],xmm2[1,2] 214; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,3] 215; SSE2-NEXT: andps %xmm1, %xmm0 216; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 217; SSE2-NEXT: pxor %xmm0, %xmm1 218; SSE2-NEXT: movdqa %xmm1, -{{[0-9]+}}(%rsp) 219; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax 220; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %edx 221; SSE2-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx 222; SSE2-NEXT: retq 223; 224; SSE41-LABEL: test_srem_vec: 225; SSE41: # %bb.0: 226; SSE41-NEXT: movq %rdx, %rcx 227; SSE41-NEXT: shlq $31, %rcx 228; SSE41-NEXT: sarq $31, %rcx 229; SSE41-NEXT: shlq $31, %rdi 230; SSE41-NEXT: sarq $31, %rdi 231; SSE41-NEXT: shlq $31, %rsi 232; SSE41-NEXT: sarq $31, %rsi 233; SSE41-NEXT: movabsq $2049638230412172402, %r8 # imm = 0x1C71C71C71C71C72 234; SSE41-NEXT: movq %rsi, %rax 235; SSE41-NEXT: imulq %r8 236; SSE41-NEXT: movq %rdx, %rax 237; SSE41-NEXT: shrq $63, %rax 238; SSE41-NEXT: addq %rdx, %rax 239; SSE41-NEXT: leaq (%rax,%rax,8), %rax 240; SSE41-NEXT: subq %rax, %rsi 241; SSE41-NEXT: movq %rsi, %xmm1 242; SSE41-NEXT: movq %rdi, %rax 243; SSE41-NEXT: imulq %r8 244; SSE41-NEXT: movq %rdx, %rax 245; SSE41-NEXT: shrq $63, %rax 246; SSE41-NEXT: addq %rdx, %rax 247; SSE41-NEXT: leaq (%rax,%rax,8), %rax 248; SSE41-NEXT: subq %rax, %rdi 249; SSE41-NEXT: movq %rdi, %xmm0 250; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 251; SSE41-NEXT: pmovsxbd {{.*#+}} xmm1 = [4294967295,1,4294967295,1] 252; SSE41-NEXT: pand %xmm1, %xmm0 253; SSE41-NEXT: movabsq $2049638230412172401, %rdx # imm = 0x1C71C71C71C71C71 254; SSE41-NEXT: movq %rcx, %rax 255; SSE41-NEXT: imulq %rdx 256; SSE41-NEXT: subq %rcx, %rdx 257; SSE41-NEXT: movq %rdx, %rax 258; SSE41-NEXT: shrq $63, %rax 259; SSE41-NEXT: sarq $3, %rdx 260; SSE41-NEXT: addq %rax, %rdx 261; SSE41-NEXT: leaq (%rdx,%rdx,8), %rax 262; SSE41-NEXT: addq %rcx, %rax 263; SSE41-NEXT: movq %rax, %xmm2 264; SSE41-NEXT: pand %xmm1, %xmm2 265; SSE41-NEXT: pcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 266; SSE41-NEXT: pcmpeqd %xmm1, %xmm1 267; SSE41-NEXT: pxor %xmm1, %xmm0 268; SSE41-NEXT: movl $3, %eax 269; SSE41-NEXT: movq %rax, %xmm3 270; SSE41-NEXT: pcmpeqq %xmm2, %xmm3 271; SSE41-NEXT: pxor %xmm1, %xmm3 272; SSE41-NEXT: movd %xmm0, %eax 273; SSE41-NEXT: pextrb $8, %xmm0, %edx 274; SSE41-NEXT: pextrb $0, %xmm3, %ecx 275; SSE41-NEXT: # kill: def $al killed $al killed $eax 276; SSE41-NEXT: # kill: def $dl killed $dl killed $edx 277; SSE41-NEXT: # kill: def $cl killed $cl killed $ecx 278; SSE41-NEXT: retq 279; 280; AVX1-LABEL: test_srem_vec: 281; AVX1: # %bb.0: 282; AVX1-NEXT: movq %rdx, %rcx 283; AVX1-NEXT: shlq $31, %rcx 284; AVX1-NEXT: sarq $31, %rcx 285; AVX1-NEXT: shlq $31, %rdi 286; AVX1-NEXT: sarq $31, %rdi 287; AVX1-NEXT: shlq $31, %rsi 288; AVX1-NEXT: sarq $31, %rsi 289; AVX1-NEXT: movabsq $2049638230412172402, %r8 # imm = 0x1C71C71C71C71C72 290; AVX1-NEXT: movq %rsi, %rax 291; AVX1-NEXT: imulq %r8 292; AVX1-NEXT: movq %rdx, %rax 293; AVX1-NEXT: shrq $63, %rax 294; AVX1-NEXT: addq %rdx, %rax 295; AVX1-NEXT: leaq (%rax,%rax,8), %rax 296; AVX1-NEXT: subq %rax, %rsi 297; AVX1-NEXT: vmovq %rsi, %xmm0 298; AVX1-NEXT: movq %rdi, %rax 299; AVX1-NEXT: imulq %r8 300; AVX1-NEXT: movq %rdx, %rax 301; AVX1-NEXT: shrq $63, %rax 302; AVX1-NEXT: addq %rdx, %rax 303; AVX1-NEXT: leaq (%rax,%rax,8), %rax 304; AVX1-NEXT: subq %rax, %rdi 305; AVX1-NEXT: vmovq %rdi, %xmm1 306; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 307; AVX1-NEXT: movabsq $2049638230412172401, %rdx # imm = 0x1C71C71C71C71C71 308; AVX1-NEXT: movq %rcx, %rax 309; AVX1-NEXT: imulq %rdx 310; AVX1-NEXT: subq %rcx, %rdx 311; AVX1-NEXT: movq %rdx, %rax 312; AVX1-NEXT: shrq $63, %rax 313; AVX1-NEXT: sarq $3, %rdx 314; AVX1-NEXT: addq %rax, %rdx 315; AVX1-NEXT: leaq (%rdx,%rdx,8), %rax 316; AVX1-NEXT: addq %rcx, %rax 317; AVX1-NEXT: vmovq %rax, %xmm1 318; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 319; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 320; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 321; AVX1-NEXT: movl $3, %eax 322; AVX1-NEXT: vmovq %rax, %xmm2 323; AVX1-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1 324; AVX1-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 325; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 326; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 327; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0 328; AVX1-NEXT: vmovd %xmm0, %eax 329; AVX1-NEXT: vpextrb $4, %xmm0, %edx 330; AVX1-NEXT: vpextrb $8, %xmm0, %ecx 331; AVX1-NEXT: # kill: def $al killed $al killed $eax 332; AVX1-NEXT: # kill: def $dl killed $dl killed $edx 333; AVX1-NEXT: # kill: def $cl killed $cl killed $ecx 334; AVX1-NEXT: vzeroupper 335; AVX1-NEXT: retq 336; 337; AVX2-LABEL: test_srem_vec: 338; AVX2: # %bb.0: 339; AVX2-NEXT: movq %rdx, %rcx 340; AVX2-NEXT: shlq $31, %rcx 341; AVX2-NEXT: sarq $31, %rcx 342; AVX2-NEXT: shlq $31, %rdi 343; AVX2-NEXT: sarq $31, %rdi 344; AVX2-NEXT: shlq $31, %rsi 345; AVX2-NEXT: sarq $31, %rsi 346; AVX2-NEXT: movabsq $2049638230412172402, %r8 # imm = 0x1C71C71C71C71C72 347; AVX2-NEXT: movq %rsi, %rax 348; AVX2-NEXT: imulq %r8 349; AVX2-NEXT: movq %rdx, %rax 350; AVX2-NEXT: shrq $63, %rax 351; AVX2-NEXT: addq %rdx, %rax 352; AVX2-NEXT: leaq (%rax,%rax,8), %rax 353; AVX2-NEXT: subq %rax, %rsi 354; AVX2-NEXT: vmovq %rsi, %xmm0 355; AVX2-NEXT: movq %rdi, %rax 356; AVX2-NEXT: imulq %r8 357; AVX2-NEXT: movq %rdx, %rax 358; AVX2-NEXT: shrq $63, %rax 359; AVX2-NEXT: addq %rdx, %rax 360; AVX2-NEXT: leaq (%rax,%rax,8), %rax 361; AVX2-NEXT: subq %rax, %rdi 362; AVX2-NEXT: vmovq %rdi, %xmm1 363; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 364; AVX2-NEXT: movabsq $2049638230412172401, %rdx # imm = 0x1C71C71C71C71C71 365; AVX2-NEXT: movq %rcx, %rax 366; AVX2-NEXT: imulq %rdx 367; AVX2-NEXT: subq %rcx, %rdx 368; AVX2-NEXT: movq %rdx, %rax 369; AVX2-NEXT: shrq $63, %rax 370; AVX2-NEXT: sarq $3, %rdx 371; AVX2-NEXT: addq %rax, %rdx 372; AVX2-NEXT: leaq (%rdx,%rdx,8), %rax 373; AVX2-NEXT: addq %rcx, %rax 374; AVX2-NEXT: vmovq %rax, %xmm1 375; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 376; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [8589934591,8589934591,8589934591,8589934591] 377; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0 378; AVX2-NEXT: vpcmpeqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 379; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 380; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1 381; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 382; AVX2-NEXT: vmovd %xmm0, %eax 383; AVX2-NEXT: notl %eax 384; AVX2-NEXT: vpextrb $8, %xmm1, %edx 385; AVX2-NEXT: vpextrb $0, %xmm2, %ecx 386; AVX2-NEXT: # kill: def $al killed $al killed $eax 387; AVX2-NEXT: # kill: def $dl killed $dl killed $edx 388; AVX2-NEXT: # kill: def $cl killed $cl killed $ecx 389; AVX2-NEXT: vzeroupper 390; AVX2-NEXT: retq 391; 392; AVX512VL-LABEL: test_srem_vec: 393; AVX512VL: # %bb.0: 394; AVX512VL-NEXT: movq %rdx, %rcx 395; AVX512VL-NEXT: shlq $31, %rcx 396; AVX512VL-NEXT: sarq $31, %rcx 397; AVX512VL-NEXT: shlq $31, %rdi 398; AVX512VL-NEXT: sarq $31, %rdi 399; AVX512VL-NEXT: shlq $31, %rsi 400; AVX512VL-NEXT: sarq $31, %rsi 401; AVX512VL-NEXT: movabsq $2049638230412172402, %r8 # imm = 0x1C71C71C71C71C72 402; AVX512VL-NEXT: movq %rsi, %rax 403; AVX512VL-NEXT: imulq %r8 404; AVX512VL-NEXT: movq %rdx, %rax 405; AVX512VL-NEXT: shrq $63, %rax 406; AVX512VL-NEXT: addq %rdx, %rax 407; AVX512VL-NEXT: leaq (%rax,%rax,8), %rax 408; AVX512VL-NEXT: subq %rax, %rsi 409; AVX512VL-NEXT: vmovq %rsi, %xmm0 410; AVX512VL-NEXT: movq %rdi, %rax 411; AVX512VL-NEXT: imulq %r8 412; AVX512VL-NEXT: movq %rdx, %rax 413; AVX512VL-NEXT: shrq $63, %rax 414; AVX512VL-NEXT: addq %rdx, %rax 415; AVX512VL-NEXT: leaq (%rax,%rax,8), %rax 416; AVX512VL-NEXT: subq %rax, %rdi 417; AVX512VL-NEXT: vmovq %rdi, %xmm1 418; AVX512VL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 419; AVX512VL-NEXT: movabsq $2049638230412172401, %rdx # imm = 0x1C71C71C71C71C71 420; AVX512VL-NEXT: movq %rcx, %rax 421; AVX512VL-NEXT: imulq %rdx 422; AVX512VL-NEXT: subq %rcx, %rdx 423; AVX512VL-NEXT: movq %rdx, %rax 424; AVX512VL-NEXT: shrq $63, %rax 425; AVX512VL-NEXT: sarq $3, %rdx 426; AVX512VL-NEXT: addq %rax, %rdx 427; AVX512VL-NEXT: leaq (%rdx,%rdx,8), %rax 428; AVX512VL-NEXT: addq %rcx, %rax 429; AVX512VL-NEXT: vmovq %rax, %xmm1 430; AVX512VL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 431; AVX512VL-NEXT: vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0 432; AVX512VL-NEXT: vpcmpneqq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %k0 433; AVX512VL-NEXT: kshiftrw $1, %k0, %k1 434; AVX512VL-NEXT: kmovw %k1, %edx 435; AVX512VL-NEXT: kshiftrw $2, %k0, %k1 436; AVX512VL-NEXT: kmovw %k1, %ecx 437; AVX512VL-NEXT: kmovw %k0, %eax 438; AVX512VL-NEXT: # kill: def $al killed $al killed $eax 439; AVX512VL-NEXT: # kill: def $dl killed $dl killed $edx 440; AVX512VL-NEXT: # kill: def $cl killed $cl killed $ecx 441; AVX512VL-NEXT: vzeroupper 442; AVX512VL-NEXT: retq 443 %srem = srem <3 x i33> %X, <i33 9, i33 9, i33 -9> 444 %cmp = icmp ne <3 x i33> %srem, <i33 3, i33 -3, i33 3> 445 ret <3 x i1> %cmp 446} 447