1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512vp2intersect -verify-machineinstrs | FileCheck %s --check-prefix=X86 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vp2intersect -verify-machineinstrs | FileCheck %s --check-prefix=X64 4 5; Test with more than four live mask pairs 6 7define void @test(<16 x i32> %a0, <16 x i32> %b0, <16 x i32> %a1, <16 x i32> %b1, <16 x i32> %a2, <16 x i32> %b2, <16 x i32> %a3, <16 x i32> %b3, <16 x i32> %a4, <16 x i32> %b4, ptr nocapture %m0, ptr nocapture %m1) nounwind { 8; X86-LABEL: test: 9; X86: # %bb.0: # %entry 10; X86-NEXT: pushl %ebp 11; X86-NEXT: movl %esp, %ebp 12; X86-NEXT: pushl %edi 13; X86-NEXT: pushl %esi 14; X86-NEXT: andl $-64, %esp 15; X86-NEXT: subl $64, %esp 16; X86-NEXT: movl 456(%ebp), %esi 17; X86-NEXT: vmovaps 328(%ebp), %zmm3 18; X86-NEXT: vmovaps 200(%ebp), %zmm4 19; X86-NEXT: vmovaps 72(%ebp), %zmm5 20; X86-NEXT: vp2intersectd %zmm1, %zmm0, %k0 21; X86-NEXT: kmovw %k0, {{[-0-9]+}}(%e{{[sb]}}p) # 2-byte Spill 22; X86-NEXT: kmovw %k1, {{[-0-9]+}}(%e{{[sb]}}p) # 2-byte Spill 23; X86-NEXT: vp2intersectd 8(%ebp), %zmm2, %k0 24; X86-NEXT: kmovw %k0, {{[-0-9]+}}(%e{{[sb]}}p) # 2-byte Spill 25; X86-NEXT: kmovw %k1, {{[-0-9]+}}(%e{{[sb]}}p) # 2-byte Spill 26; X86-NEXT: vp2intersectd 136(%ebp), %zmm5, %k0 27; X86-NEXT: kmovw %k0, {{[-0-9]+}}(%e{{[sb]}}p) # 2-byte Spill 28; X86-NEXT: kmovw %k1, {{[-0-9]+}}(%e{{[sb]}}p) # 2-byte Spill 29; X86-NEXT: vp2intersectd 264(%ebp), %zmm4, %k0 30; X86-NEXT: kmovw %k0, {{[-0-9]+}}(%e{{[sb]}}p) # 2-byte Spill 31; X86-NEXT: kmovw %k1, {{[-0-9]+}}(%e{{[sb]}}p) # 2-byte Spill 32; X86-NEXT: vp2intersectd 392(%ebp), %zmm3, %k0 33; X86-NEXT: kmovw %k0, {{[-0-9]+}}(%e{{[sb]}}p) # 2-byte Spill 34; X86-NEXT: kmovw %k1, {{[-0-9]+}}(%e{{[sb]}}p) # 2-byte Spill 35; X86-NEXT: vzeroupper 36; X86-NEXT: calll dummy@PLT 37; X86-NEXT: kmovw {{[-0-9]+}}(%e{{[sb]}}p), %k0 # 2-byte Reload 38; X86-NEXT: kmovw {{[-0-9]+}}(%e{{[sb]}}p), %k1 # 2-byte Reload 39; X86-NEXT: kmovw %k0, %eax 40; X86-NEXT: kmovw {{[-0-9]+}}(%e{{[sb]}}p), %k0 # 2-byte Reload 41; X86-NEXT: kmovw {{[-0-9]+}}(%e{{[sb]}}p), %k1 # 2-byte Reload 42; X86-NEXT: kmovw %k0, %ecx 43; X86-NEXT: kmovw {{[-0-9]+}}(%e{{[sb]}}p), %k0 # 2-byte Reload 44; X86-NEXT: kmovw {{[-0-9]+}}(%e{{[sb]}}p), %k1 # 2-byte Reload 45; X86-NEXT: kmovw %k0, %edx 46; X86-NEXT: kmovw {{[-0-9]+}}(%e{{[sb]}}p), %k0 # 2-byte Reload 47; X86-NEXT: kmovw {{[-0-9]+}}(%e{{[sb]}}p), %k1 # 2-byte Reload 48; X86-NEXT: kmovw %k0, %edi 49; X86-NEXT: addl %edi, %eax 50; X86-NEXT: kmovw {{[-0-9]+}}(%e{{[sb]}}p), %k2 # 2-byte Reload 51; X86-NEXT: kmovw {{[-0-9]+}}(%e{{[sb]}}p), %k3 # 2-byte Reload 52; X86-NEXT: kmovw %k2, %edi 53; X86-NEXT: addl %ecx, %edx 54; X86-NEXT: kmovw %k1, %ecx 55; X86-NEXT: addl %edi, %ecx 56; X86-NEXT: addl %ecx, %eax 57; X86-NEXT: addl %edx, %eax 58; X86-NEXT: movw %ax, (%esi) 59; X86-NEXT: leal -8(%ebp), %esp 60; X86-NEXT: popl %esi 61; X86-NEXT: popl %edi 62; X86-NEXT: popl %ebp 63; X86-NEXT: retl 64; 65; X64-LABEL: test: 66; X64: # %bb.0: # %entry 67; X64-NEXT: pushq %rbp 68; X64-NEXT: movq %rsp, %rbp 69; X64-NEXT: pushq %r14 70; X64-NEXT: pushq %rbx 71; X64-NEXT: andq $-64, %rsp 72; X64-NEXT: subq $64, %rsp 73; X64-NEXT: movq %rdi, %r14 74; X64-NEXT: vmovaps 16(%rbp), %zmm8 75; X64-NEXT: vp2intersectd %zmm1, %zmm0, %k0 76; X64-NEXT: kmovw %k0, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill 77; X64-NEXT: kmovw %k1, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill 78; X64-NEXT: vp2intersectd %zmm3, %zmm2, %k0 79; X64-NEXT: kmovw %k0, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill 80; X64-NEXT: kmovw %k1, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill 81; X64-NEXT: vp2intersectd %zmm5, %zmm4, %k0 82; X64-NEXT: kmovw %k0, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill 83; X64-NEXT: kmovw %k1, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill 84; X64-NEXT: vp2intersectd %zmm7, %zmm6, %k0 85; X64-NEXT: kmovw %k0, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill 86; X64-NEXT: kmovw %k1, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill 87; X64-NEXT: vp2intersectd 80(%rbp), %zmm8, %k0 88; X64-NEXT: kmovw %k0, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill 89; X64-NEXT: kmovw %k1, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill 90; X64-NEXT: vzeroupper 91; X64-NEXT: callq dummy@PLT 92; X64-NEXT: kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 # 2-byte Reload 93; X64-NEXT: kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 # 2-byte Reload 94; X64-NEXT: kmovw %k0, %eax 95; X64-NEXT: kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 # 2-byte Reload 96; X64-NEXT: kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 # 2-byte Reload 97; X64-NEXT: kmovw %k0, %ecx 98; X64-NEXT: kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 # 2-byte Reload 99; X64-NEXT: kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 # 2-byte Reload 100; X64-NEXT: kmovw %k0, %edx 101; X64-NEXT: kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 # 2-byte Reload 102; X64-NEXT: kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 # 2-byte Reload 103; X64-NEXT: kmovw %k0, %esi 104; X64-NEXT: kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 # 2-byte Reload 105; X64-NEXT: kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 # 2-byte Reload 106; X64-NEXT: kmovw %k0, %edi 107; X64-NEXT: kmovw %k1, %ebx 108; X64-NEXT: addl %edi, %eax 109; X64-NEXT: addl %ecx, %edx 110; X64-NEXT: addl %ebx, %eax 111; X64-NEXT: addl %esi, %eax 112; X64-NEXT: addl %edx, %eax 113; X64-NEXT: movw %ax, (%r14) 114; X64-NEXT: leaq -16(%rbp), %rsp 115; X64-NEXT: popq %rbx 116; X64-NEXT: popq %r14 117; X64-NEXT: popq %rbp 118; X64-NEXT: retq 119entry: 120 %0 = call { <16 x i1>, <16 x i1> } @llvm.x86.avx512.vp2intersect.d.512(<16 x i32> %a0, <16 x i32> %b0) 121 %1 = call { <16 x i1>, <16 x i1> } @llvm.x86.avx512.vp2intersect.d.512(<16 x i32> %a1, <16 x i32> %b1) 122 %2 = call { <16 x i1>, <16 x i1> } @llvm.x86.avx512.vp2intersect.d.512(<16 x i32> %a2, <16 x i32> %b2) 123 %3 = call { <16 x i1>, <16 x i1> } @llvm.x86.avx512.vp2intersect.d.512(<16 x i32> %a3, <16 x i32> %b3) 124 %4 = call { <16 x i1>, <16 x i1> } @llvm.x86.avx512.vp2intersect.d.512(<16 x i32> %a4, <16 x i32> %b4) 125 126 %5 = extractvalue { <16 x i1>, <16 x i1> } %0, 0 127 %6 = extractvalue { <16 x i1>, <16 x i1> } %1, 0 128 %7 = extractvalue { <16 x i1>, <16 x i1> } %2, 0 129 %8 = extractvalue { <16 x i1>, <16 x i1> } %3, 0 130 %9 = extractvalue { <16 x i1>, <16 x i1> } %4, 0 131 %10 = extractvalue { <16 x i1>, <16 x i1> } %0, 1 132 %11 = extractvalue { <16 x i1>, <16 x i1> } %1, 1 133 134 call void @dummy() 135 136 %12 = bitcast <16 x i1> %5 to i16 137 %13 = bitcast <16 x i1> %6 to i16 138 %14 = bitcast <16 x i1> %7 to i16 139 %15 = bitcast <16 x i1> %8 to i16 140 %16 = bitcast <16 x i1> %9 to i16 141 %17 = bitcast <16 x i1> %10 to i16 142 %18 = bitcast <16 x i1> %11 to i16 143 144 %19 = add i16 %12, %13 145 %20 = add i16 %14, %15 146 %21 = add i16 %16, %17 147 %22 = add i16 %19, %21 148 %23 = add i16 %22, %20 149 150 store i16 %23, ptr %m0, align 16 151 ret void 152} 153 154declare { <16 x i1>, <16 x i1> } @llvm.x86.avx512.vp2intersect.d.512(<16 x i32>, <16 x i32>) 155declare void @dummy() 156