brintos

brintos / llvm-project-archived public Read only

0
0
Text · 36.9 KiB · 162f5ef Raw
979 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i386-pc-win32       -mattr=+avx512bw  | FileCheck %s --check-prefix=X323; RUN: llc < %s -mtriple=x86_64-win32        -mattr=+avx512bw  | FileCheck %s --check-prefix=CHECK64 --check-prefix=WIN644; RUN: llc < %s -mtriple=x86_64-linux-gnu    -mattr=+avx512bw  | FileCheck %s --check-prefix=CHECK64 --check-prefix=LINUXOSX645 6; Test regcall when receiving arguments of v64i1 type7define dso_local x86_regcallcc i64 @test_argv64i1(<64 x i1> %x0, <64 x i1> %x1, <64 x i1> %x2, <64 x i1> %x3, <64 x i1> %x4, <64 x i1> %x5, <64 x i1> %x6, <64 x i1> %x7, <64 x i1> %x8, <64 x i1> %x9, <64 x i1> %x10, <64 x i1> %x11, <64 x i1> %x12)  {8; X32-LABEL: test_argv64i1:9; X32:       # %bb.0:10; X32-NEXT:    addl %edx, %eax11; X32-NEXT:    adcl %edi, %ecx12; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax13; X32-NEXT:    adcl {{[0-9]+}}(%esp), %ecx14; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax15; X32-NEXT:    adcl {{[0-9]+}}(%esp), %ecx16; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax17; X32-NEXT:    adcl {{[0-9]+}}(%esp), %ecx18; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax19; X32-NEXT:    adcl {{[0-9]+}}(%esp), %ecx20; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax21; X32-NEXT:    adcl {{[0-9]+}}(%esp), %ecx22; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax23; X32-NEXT:    adcl {{[0-9]+}}(%esp), %ecx24; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax25; X32-NEXT:    adcl {{[0-9]+}}(%esp), %ecx26; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax27; X32-NEXT:    adcl {{[0-9]+}}(%esp), %ecx28; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax29; X32-NEXT:    adcl {{[0-9]+}}(%esp), %ecx30; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax31; X32-NEXT:    adcl {{[0-9]+}}(%esp), %ecx32; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax33; X32-NEXT:    adcl {{[0-9]+}}(%esp), %ecx34; X32-NEXT:    retl35;36; WIN64-LABEL: test_argv64i1:37; WIN64:       # %bb.0:38; WIN64-NEXT:    addq %rcx, %rax39; WIN64-NEXT:    addq %rdx, %rax40; WIN64-NEXT:    addq %rdi, %rax41; WIN64-NEXT:    leaq (%rsi,%r8), %rcx42; WIN64-NEXT:    addq %r9, %rcx43; WIN64-NEXT:    addq %rcx, %rax44; WIN64-NEXT:    leaq (%r10,%r11), %rcx45; WIN64-NEXT:    addq %r12, %rcx46; WIN64-NEXT:    addq %r14, %rcx47; WIN64-NEXT:    addq %rcx, %rax48; WIN64-NEXT:    addq %r15, %rax49; WIN64-NEXT:    addq {{[0-9]+}}(%rsp), %rax50; WIN64-NEXT:    retq51;52; LINUXOSX64-LABEL: test_argv64i1:53; LINUXOSX64:       # %bb.0:54; LINUXOSX64-NEXT:    addq %rcx, %rax55; LINUXOSX64-NEXT:    addq %rdx, %rax56; LINUXOSX64-NEXT:    addq %rdi, %rax57; LINUXOSX64-NEXT:    leaq (%rsi,%r8), %rcx58; LINUXOSX64-NEXT:    addq %r9, %rcx59; LINUXOSX64-NEXT:    addq %rcx, %rax60; LINUXOSX64-NEXT:    leaq (%r12,%r13), %rcx61; LINUXOSX64-NEXT:    addq %r14, %rcx62; LINUXOSX64-NEXT:    addq %r15, %rcx63; LINUXOSX64-NEXT:    addq %rcx, %rax64; LINUXOSX64-NEXT:    addq {{[0-9]+}}(%rsp), %rax65; LINUXOSX64-NEXT:    addq {{[0-9]+}}(%rsp), %rax66; LINUXOSX64-NEXT:    retq67  %y0 = bitcast <64 x i1> %x0 to i6468  %y1 = bitcast <64 x i1> %x1 to i6469  %y2 = bitcast <64 x i1> %x2 to i6470  %y3 = bitcast <64 x i1> %x3 to i6471  %y4 = bitcast <64 x i1> %x4 to i6472  %y5 = bitcast <64 x i1> %x5 to i6473  %y6 = bitcast <64 x i1> %x6 to i6474  %y7 = bitcast <64 x i1> %x7 to i6475  %y8 = bitcast <64 x i1> %x8 to i6476  %y9 = bitcast <64 x i1> %x9 to i6477  %y10 = bitcast <64 x i1> %x10 to i6478  %y11 = bitcast <64 x i1> %x11 to i6479  %y12 = bitcast <64 x i1> %x12 to i6480  %add1 = add i64 %y0, %y181  %add2 = add i64 %add1, %y282  %add3 = add i64 %add2, %y383  %add4 = add i64 %add3, %y484  %add5 = add i64 %add4, %y585  %add6 = add i64 %add5, %y686  %add7 = add i64 %add6, %y787  %add8 = add i64 %add7, %y888  %add9 = add i64 %add8, %y989  %add10 = add i64 %add9, %y1090  %add11 = add i64 %add10, %y1191  %add12 = add i64 %add11, %y1292  ret i64 %add1293}94 95; Test regcall when passing arguments of v64i1 type96define dso_local i64 @caller_argv64i1() #0 {97; X32-LABEL: caller_argv64i1:98; X32:       # %bb.0: # %entry99; X32-NEXT:    pushl %edi100; X32-NEXT:    subl $88, %esp101; X32-NEXT:    vbroadcastsd {{.*#+}} zmm0 = [2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1]102; X32-NEXT:    vmovups %xmm0, {{[0-9]+}}(%esp)103; X32-NEXT:    vmovups %zmm0, (%esp)104; X32-NEXT:    movl $1, {{[0-9]+}}(%esp)105; X32-NEXT:    movl $2, {{[0-9]+}}(%esp)106; X32-NEXT:    movl $2, %eax107; X32-NEXT:    movl $1, %ecx108; X32-NEXT:    movl $2, %edx109; X32-NEXT:    movl $1, %edi110; X32-NEXT:    vzeroupper111; X32-NEXT:    calll _test_argv64i1112; X32-NEXT:    movl %ecx, %edx113; X32-NEXT:    addl $88, %esp114; X32-NEXT:    popl %edi115; X32-NEXT:    retl116;117; WIN64-LABEL: caller_argv64i1:118; WIN64:       # %bb.0: # %entry119; WIN64-NEXT:    pushq %r15120; WIN64-NEXT:    .seh_pushreg %r15121; WIN64-NEXT:    pushq %r14122; WIN64-NEXT:    .seh_pushreg %r14123; WIN64-NEXT:    pushq %r12124; WIN64-NEXT:    .seh_pushreg %r12125; WIN64-NEXT:    pushq %rsi126; WIN64-NEXT:    .seh_pushreg %rsi127; WIN64-NEXT:    pushq %rdi128; WIN64-NEXT:    .seh_pushreg %rdi129; WIN64-NEXT:    subq $48, %rsp130; WIN64-NEXT:    .seh_stackalloc 48131; WIN64-NEXT:    vmovaps %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill132; WIN64-NEXT:    .seh_savexmm %xmm7, 32133; WIN64-NEXT:    vmovaps %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill134; WIN64-NEXT:    .seh_savexmm %xmm6, 16135; WIN64-NEXT:    .seh_endprologue136; WIN64-NEXT:    movabsq $4294967298, %rax # imm = 0x100000002137; WIN64-NEXT:    movq %rax, (%rsp)138; WIN64-NEXT:    movq %rax, %rcx139; WIN64-NEXT:    movq %rax, %rdx140; WIN64-NEXT:    movq %rax, %rdi141; WIN64-NEXT:    movq %rax, %r8142; WIN64-NEXT:    movq %rax, %r9143; WIN64-NEXT:    movq %rax, %r10144; WIN64-NEXT:    movq %rax, %r11145; WIN64-NEXT:    movq %rax, %r12146; WIN64-NEXT:    movq %rax, %r14147; WIN64-NEXT:    movq %rax, %r15148; WIN64-NEXT:    movq %rax, %rsi149; WIN64-NEXT:    callq test_argv64i1150; WIN64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm6 # 16-byte Reload151; WIN64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload152; WIN64-NEXT:    .seh_startepilogue153; WIN64-NEXT:    addq $48, %rsp154; WIN64-NEXT:    popq %rdi155; WIN64-NEXT:    popq %rsi156; WIN64-NEXT:    popq %r12157; WIN64-NEXT:    popq %r14158; WIN64-NEXT:    popq %r15159; WIN64-NEXT:    .seh_endepilogue160; WIN64-NEXT:    retq161; WIN64-NEXT:    .seh_endproc162;163; LINUXOSX64-LABEL: caller_argv64i1:164; LINUXOSX64:       # %bb.0: # %entry165; LINUXOSX64-NEXT:    pushq %r15166; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16167; LINUXOSX64-NEXT:    pushq %r14168; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 24169; LINUXOSX64-NEXT:    pushq %r13170; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 32171; LINUXOSX64-NEXT:    pushq %r12172; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 40173; LINUXOSX64-NEXT:    pushq %rax174; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 48175; LINUXOSX64-NEXT:    .cfi_offset %r12, -40176; LINUXOSX64-NEXT:    .cfi_offset %r13, -32177; LINUXOSX64-NEXT:    .cfi_offset %r14, -24178; LINUXOSX64-NEXT:    .cfi_offset %r15, -16179; LINUXOSX64-NEXT:    movabsq $4294967298, %rax # imm = 0x100000002180; LINUXOSX64-NEXT:    movq %rax, %rcx181; LINUXOSX64-NEXT:    movq %rax, %rdx182; LINUXOSX64-NEXT:    movq %rax, %rdi183; LINUXOSX64-NEXT:    movq %rax, %r8184; LINUXOSX64-NEXT:    movq %rax, %r9185; LINUXOSX64-NEXT:    movq %rax, %r12186; LINUXOSX64-NEXT:    movq %rax, %r13187; LINUXOSX64-NEXT:    movq %rax, %r14188; LINUXOSX64-NEXT:    movq %rax, %r15189; LINUXOSX64-NEXT:    movq %rax, %rsi190; LINUXOSX64-NEXT:    pushq %rax191; LINUXOSX64-NEXT:    .cfi_adjust_cfa_offset 8192; LINUXOSX64-NEXT:    pushq %rax193; LINUXOSX64-NEXT:    .cfi_adjust_cfa_offset 8194; LINUXOSX64-NEXT:    callq test_argv64i1195; LINUXOSX64-NEXT:    addq $24, %rsp196; LINUXOSX64-NEXT:    .cfi_adjust_cfa_offset -24197; LINUXOSX64-NEXT:    popq %r12198; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 32199; LINUXOSX64-NEXT:    popq %r13200; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 24201; LINUXOSX64-NEXT:    popq %r14202; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16203; LINUXOSX64-NEXT:    popq %r15204; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8205; LINUXOSX64-NEXT:    retq206entry:207  %v0 = bitcast i64 4294967298 to <64 x i1>208  %call = call x86_regcallcc i64 @test_argv64i1(<64 x i1> %v0, <64 x i1> %v0, <64 x i1> %v0,209                                                <64 x i1> %v0, <64 x i1> %v0, <64 x i1> %v0,210                                                <64 x i1> %v0, <64 x i1> %v0, <64 x i1> %v0,211                                                <64 x i1> %v0, <64 x i1> %v0, <64 x i1> %v0,212                                                <64 x i1> %v0)213  ret i64 %call214}215 216; Test regcall when returning v64i1 type217define dso_local x86_regcallcc <64 x i1> @test_retv64i1()  {218; X32-LABEL: test_retv64i1:219; X32:       # %bb.0:220; X32-NEXT:    movl $2, %eax221; X32-NEXT:    movl $1, %ecx222; X32-NEXT:    retl223;224; CHECK64-LABEL: test_retv64i1:225; CHECK64:       # %bb.0:226; CHECK64-NEXT:    movabsq $4294967298, %rax # imm = 0x100000002227; CHECK64-NEXT:    retq228  %a = bitcast i64 4294967298 to <64 x i1>229 ret <64 x i1> %a230}231 232; Test regcall when processing result of v64i1 type233define dso_local <64 x i1> @caller_retv64i1() #0 {234; X32-LABEL: caller_retv64i1:235; X32:       # %bb.0: # %entry236; X32-NEXT:    calll _test_retv64i1237; X32-NEXT:    kmovd %eax, %k0238; X32-NEXT:    kmovd %ecx, %k1239; X32-NEXT:    kunpckdq %k0, %k1, %k0240; X32-NEXT:    vpmovm2b %k0, %zmm0241; X32-NEXT:    retl242;243; WIN64-LABEL: caller_retv64i1:244; WIN64:       # %bb.0: # %entry245; WIN64-NEXT:    pushq %rsi246; WIN64-NEXT:    .seh_pushreg %rsi247; WIN64-NEXT:    pushq %rdi248; WIN64-NEXT:    .seh_pushreg %rdi249; WIN64-NEXT:    subq $40, %rsp250; WIN64-NEXT:    .seh_stackalloc 40251; WIN64-NEXT:    vmovaps %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill252; WIN64-NEXT:    .seh_savexmm %xmm7, 16253; WIN64-NEXT:    vmovaps %xmm6, (%rsp) # 16-byte Spill254; WIN64-NEXT:    .seh_savexmm %xmm6, 0255; WIN64-NEXT:    .seh_endprologue256; WIN64-NEXT:    callq test_retv64i1257; WIN64-NEXT:    kmovq %rax, %k0258; WIN64-NEXT:    vpmovm2b %k0, %zmm0259; WIN64-NEXT:    vmovaps (%rsp), %xmm6 # 16-byte Reload260; WIN64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload261; WIN64-NEXT:    .seh_startepilogue262; WIN64-NEXT:    addq $40, %rsp263; WIN64-NEXT:    popq %rdi264; WIN64-NEXT:    popq %rsi265; WIN64-NEXT:    .seh_endepilogue266; WIN64-NEXT:    retq267; WIN64-NEXT:    .seh_endproc268;269; LINUXOSX64-LABEL: caller_retv64i1:270; LINUXOSX64:       # %bb.0: # %entry271; LINUXOSX64-NEXT:    pushq %rax272; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16273; LINUXOSX64-NEXT:    callq test_retv64i1274; LINUXOSX64-NEXT:    kmovq %rax, %k0275; LINUXOSX64-NEXT:    vpmovm2b %k0, %zmm0276; LINUXOSX64-NEXT:    popq %rax277; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8278; LINUXOSX64-NEXT:    retq279entry:280  %call = call x86_regcallcc <64 x i1> @test_retv64i1()281  ret <64 x i1> %call282}283 284; Test regcall when receiving arguments of v32i1 type285declare i32 @test_argv32i1helper(<32 x i1> %x0, <32 x i1> %x1, <32 x i1> %x2)286define dso_local x86_regcallcc i32 @test_argv32i1(<32 x i1> %x0, <32 x i1> %x1, <32 x i1> %x2)  {287; X32-LABEL: test_argv32i1:288; X32:       # %bb.0: # %entry289; X32-NEXT:    subl $76, %esp290; X32-NEXT:    vmovups %xmm7, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill291; X32-NEXT:    vmovups %xmm6, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill292; X32-NEXT:    vmovups %xmm5, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill293; X32-NEXT:    vmovups %xmm4, (%esp) # 16-byte Spill294; X32-NEXT:    kmovd %edx, %k0295; X32-NEXT:    kmovd %ecx, %k1296; X32-NEXT:    kmovd %eax, %k2297; X32-NEXT:    vpmovm2b %k2, %zmm0298; X32-NEXT:    vpmovm2b %k1, %zmm1299; X32-NEXT:    vpmovm2b %k0, %zmm2300; X32-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0301; X32-NEXT:    # kill: def $ymm1 killed $ymm1 killed $zmm1302; X32-NEXT:    # kill: def $ymm2 killed $ymm2 killed $zmm2303; X32-NEXT:    calll _test_argv32i1helper304; X32-NEXT:    vmovups (%esp), %xmm4 # 16-byte Reload305; X32-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm5 # 16-byte Reload306; X32-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm6 # 16-byte Reload307; X32-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm7 # 16-byte Reload308; X32-NEXT:    addl $76, %esp309; X32-NEXT:    vzeroupper310; X32-NEXT:    retl311;312; WIN64-LABEL: test_argv32i1:313; WIN64:       # %bb.0: # %entry314; WIN64-NEXT:    pushq %rbp315; WIN64-NEXT:    .seh_pushreg %rbp316; WIN64-NEXT:    pushq %r11317; WIN64-NEXT:    .seh_pushreg %r11318; WIN64-NEXT:    pushq %r10319; WIN64-NEXT:    .seh_pushreg %r10320; WIN64-NEXT:    subq $128, %rsp321; WIN64-NEXT:    .seh_stackalloc 128322; WIN64-NEXT:    leaq {{[0-9]+}}(%rsp), %rbp323; WIN64-NEXT:    .seh_setframe %rbp, 128324; WIN64-NEXT:    .seh_endprologue325; WIN64-NEXT:    andq $-32, %rsp326; WIN64-NEXT:    kmovd %edx, %k0327; WIN64-NEXT:    kmovd %eax, %k1328; WIN64-NEXT:    kmovd %ecx, %k2329; WIN64-NEXT:    vpmovm2b %k2, %zmm0330; WIN64-NEXT:    vmovdqa %ymm0, {{[0-9]+}}(%rsp)331; WIN64-NEXT:    vpmovm2b %k1, %zmm0332; WIN64-NEXT:    vmovdqa %ymm0, {{[0-9]+}}(%rsp)333; WIN64-NEXT:    vpmovm2b %k0, %zmm0334; WIN64-NEXT:    vmovdqa %ymm0, {{[0-9]+}}(%rsp)335; WIN64-NEXT:    leaq {{[0-9]+}}(%rsp), %rcx336; WIN64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdx337; WIN64-NEXT:    leaq {{[0-9]+}}(%rsp), %r8338; WIN64-NEXT:    vzeroupper339; WIN64-NEXT:    callq test_argv32i1helper340; WIN64-NEXT:    nop341; WIN64-NEXT:    .seh_startepilogue342; WIN64-NEXT:    movq %rbp, %rsp343; WIN64-NEXT:    popq %r10344; WIN64-NEXT:    popq %r11345; WIN64-NEXT:    popq %rbp346; WIN64-NEXT:    .seh_endepilogue347; WIN64-NEXT:    retq348; WIN64-NEXT:    .seh_endproc349;350; LINUXOSX64-LABEL: test_argv32i1:351; LINUXOSX64:       # %bb.0: # %entry352; LINUXOSX64-NEXT:    subq $136, %rsp353; LINUXOSX64-NEXT:    vmovaps %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill354; LINUXOSX64-NEXT:    vmovaps %xmm14, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill355; LINUXOSX64-NEXT:    vmovaps %xmm13, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill356; LINUXOSX64-NEXT:    vmovaps %xmm12, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill357; LINUXOSX64-NEXT:    vmovaps %xmm11, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill358; LINUXOSX64-NEXT:    vmovaps %xmm10, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill359; LINUXOSX64-NEXT:    vmovaps %xmm9, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill360; LINUXOSX64-NEXT:    vmovaps %xmm8, (%rsp) # 16-byte Spill361; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 144362; LINUXOSX64-NEXT:    .cfi_offset %xmm8, -144363; LINUXOSX64-NEXT:    .cfi_offset %xmm9, -128364; LINUXOSX64-NEXT:    .cfi_offset %xmm10, -112365; LINUXOSX64-NEXT:    .cfi_offset %xmm11, -96366; LINUXOSX64-NEXT:    .cfi_offset %xmm12, -80367; LINUXOSX64-NEXT:    .cfi_offset %xmm13, -64368; LINUXOSX64-NEXT:    .cfi_offset %xmm14, -48369; LINUXOSX64-NEXT:    .cfi_offset %xmm15, -32370; LINUXOSX64-NEXT:    kmovd %edx, %k0371; LINUXOSX64-NEXT:    kmovd %ecx, %k1372; LINUXOSX64-NEXT:    kmovd %eax, %k2373; LINUXOSX64-NEXT:    vpmovm2b %k2, %zmm0374; LINUXOSX64-NEXT:    vpmovm2b %k1, %zmm1375; LINUXOSX64-NEXT:    vpmovm2b %k0, %zmm2376; LINUXOSX64-NEXT:    # kill: def $ymm0 killed $ymm0 killed $zmm0377; LINUXOSX64-NEXT:    # kill: def $ymm1 killed $ymm1 killed $zmm1378; LINUXOSX64-NEXT:    # kill: def $ymm2 killed $ymm2 killed $zmm2379; LINUXOSX64-NEXT:    callq test_argv32i1helper@PLT380; LINUXOSX64-NEXT:    vmovaps (%rsp), %xmm8 # 16-byte Reload381; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm9 # 16-byte Reload382; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm10 # 16-byte Reload383; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm11 # 16-byte Reload384; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm12 # 16-byte Reload385; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm13 # 16-byte Reload386; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm14 # 16-byte Reload387; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload388; LINUXOSX64-NEXT:    addq $136, %rsp389; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8390; LINUXOSX64-NEXT:    vzeroupper391; LINUXOSX64-NEXT:    retq392entry:393  %res = call i32 @test_argv32i1helper(<32 x i1> %x0, <32 x i1> %x1, <32 x i1> %x2)394  ret i32 %res395}396 397; Test regcall when passing arguments of v32i1 type398define dso_local i32 @caller_argv32i1() #0 {399; X32-LABEL: caller_argv32i1:400; X32:       # %bb.0: # %entry401; X32-NEXT:    movl $1, %eax402; X32-NEXT:    movl $1, %ecx403; X32-NEXT:    movl $1, %edx404; X32-NEXT:    calll _test_argv32i1405; X32-NEXT:    retl406;407; WIN64-LABEL: caller_argv32i1:408; WIN64:       # %bb.0: # %entry409; WIN64-NEXT:    pushq %rsi410; WIN64-NEXT:    .seh_pushreg %rsi411; WIN64-NEXT:    pushq %rdi412; WIN64-NEXT:    .seh_pushreg %rdi413; WIN64-NEXT:    subq $40, %rsp414; WIN64-NEXT:    .seh_stackalloc 40415; WIN64-NEXT:    vmovaps %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill416; WIN64-NEXT:    .seh_savexmm %xmm7, 16417; WIN64-NEXT:    vmovaps %xmm6, (%rsp) # 16-byte Spill418; WIN64-NEXT:    .seh_savexmm %xmm6, 0419; WIN64-NEXT:    .seh_endprologue420; WIN64-NEXT:    movl $1, %eax421; WIN64-NEXT:    movl $1, %ecx422; WIN64-NEXT:    movl $1, %edx423; WIN64-NEXT:    callq test_argv32i1424; WIN64-NEXT:    vmovaps (%rsp), %xmm6 # 16-byte Reload425; WIN64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload426; WIN64-NEXT:    .seh_startepilogue427; WIN64-NEXT:    addq $40, %rsp428; WIN64-NEXT:    popq %rdi429; WIN64-NEXT:    popq %rsi430; WIN64-NEXT:    .seh_endepilogue431; WIN64-NEXT:    retq432; WIN64-NEXT:    .seh_endproc433;434; LINUXOSX64-LABEL: caller_argv32i1:435; LINUXOSX64:       # %bb.0: # %entry436; LINUXOSX64-NEXT:    pushq %rax437; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16438; LINUXOSX64-NEXT:    movl $1, %eax439; LINUXOSX64-NEXT:    movl $1, %ecx440; LINUXOSX64-NEXT:    movl $1, %edx441; LINUXOSX64-NEXT:    callq test_argv32i1442; LINUXOSX64-NEXT:    popq %rcx443; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8444; LINUXOSX64-NEXT:    retq445entry:446  %v0 = bitcast i32 1 to <32 x i1>447  %call = call x86_regcallcc i32 @test_argv32i1(<32 x i1> %v0, <32 x i1> %v0, <32 x i1> %v0)448  ret i32 %call449}450 451; Test regcall when returning v32i1 type452define dso_local x86_regcallcc <32 x i1> @test_retv32i1()  {453; X32-LABEL: test_retv32i1:454; X32:       # %bb.0:455; X32-NEXT:    movl $1, %eax456; X32-NEXT:    retl457;458; CHECK64-LABEL: test_retv32i1:459; CHECK64:       # %bb.0:460; CHECK64-NEXT:    movl $1, %eax461; CHECK64-NEXT:    retq462  %a = bitcast i32 1 to <32 x i1>463  ret <32 x i1> %a464}465 466; Test regcall when processing result of v32i1 type467define dso_local i32 @caller_retv32i1() #0 {468; X32-LABEL: caller_retv32i1:469; X32:       # %bb.0: # %entry470; X32-NEXT:    calll _test_retv32i1471; X32-NEXT:    incl %eax472; X32-NEXT:    retl473;474; WIN64-LABEL: caller_retv32i1:475; WIN64:       # %bb.0: # %entry476; WIN64-NEXT:    pushq %rsi477; WIN64-NEXT:    .seh_pushreg %rsi478; WIN64-NEXT:    pushq %rdi479; WIN64-NEXT:    .seh_pushreg %rdi480; WIN64-NEXT:    subq $40, %rsp481; WIN64-NEXT:    .seh_stackalloc 40482; WIN64-NEXT:    vmovaps %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill483; WIN64-NEXT:    .seh_savexmm %xmm7, 16484; WIN64-NEXT:    vmovaps %xmm6, (%rsp) # 16-byte Spill485; WIN64-NEXT:    .seh_savexmm %xmm6, 0486; WIN64-NEXT:    .seh_endprologue487; WIN64-NEXT:    callq test_retv32i1488; WIN64-NEXT:    incl %eax489; WIN64-NEXT:    vmovaps (%rsp), %xmm6 # 16-byte Reload490; WIN64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload491; WIN64-NEXT:    .seh_startepilogue492; WIN64-NEXT:    addq $40, %rsp493; WIN64-NEXT:    popq %rdi494; WIN64-NEXT:    popq %rsi495; WIN64-NEXT:    .seh_endepilogue496; WIN64-NEXT:    retq497; WIN64-NEXT:    .seh_endproc498;499; LINUXOSX64-LABEL: caller_retv32i1:500; LINUXOSX64:       # %bb.0: # %entry501; LINUXOSX64-NEXT:    pushq %rax502; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16503; LINUXOSX64-NEXT:    callq test_retv32i1504; LINUXOSX64-NEXT:    incl %eax505; LINUXOSX64-NEXT:    popq %rcx506; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8507; LINUXOSX64-NEXT:    retq508entry:509  %call = call x86_regcallcc <32 x i1> @test_retv32i1()510  %c = bitcast <32 x i1> %call to i32511  %add = add i32 %c, 1512  ret i32 %add513}514 515; Test regcall when receiving arguments of v16i1 type516declare i16 @test_argv16i1helper(<16 x i1> %x0, <16 x i1> %x1, <16 x i1> %x2)517define dso_local x86_regcallcc i16 @test_argv16i1(<16 x i1> %x0, <16 x i1> %x1, <16 x i1> %x2)  {518; X32-LABEL: test_argv16i1:519; X32:       # %bb.0:520; X32-NEXT:    subl $76, %esp521; X32-NEXT:    vmovups %xmm7, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill522; X32-NEXT:    vmovups %xmm6, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill523; X32-NEXT:    vmovups %xmm5, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill524; X32-NEXT:    vmovups %xmm4, (%esp) # 16-byte Spill525; X32-NEXT:    kmovd %edx, %k0526; X32-NEXT:    kmovd %ecx, %k1527; X32-NEXT:    kmovd %eax, %k2528; X32-NEXT:    vpmovm2b %k2, %zmm0529; X32-NEXT:    vpmovm2b %k1, %zmm1530; X32-NEXT:    vpmovm2b %k0, %zmm2531; X32-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0532; X32-NEXT:    # kill: def $xmm1 killed $xmm1 killed $zmm1533; X32-NEXT:    # kill: def $xmm2 killed $xmm2 killed $zmm2534; X32-NEXT:    vzeroupper535; X32-NEXT:    calll _test_argv16i1helper536; X32-NEXT:    vmovups (%esp), %xmm4 # 16-byte Reload537; X32-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm5 # 16-byte Reload538; X32-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm6 # 16-byte Reload539; X32-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm7 # 16-byte Reload540; X32-NEXT:    addl $76, %esp541; X32-NEXT:    retl542;543; WIN64-LABEL: test_argv16i1:544; WIN64:       # %bb.0:545; WIN64-NEXT:    pushq %r11546; WIN64-NEXT:    .seh_pushreg %r11547; WIN64-NEXT:    pushq %r10548; WIN64-NEXT:    .seh_pushreg %r10549; WIN64-NEXT:    subq $88, %rsp550; WIN64-NEXT:    .seh_stackalloc 88551; WIN64-NEXT:    .seh_endprologue552; WIN64-NEXT:    kmovd %edx, %k0553; WIN64-NEXT:    kmovd %eax, %k1554; WIN64-NEXT:    kmovd %ecx, %k2555; WIN64-NEXT:    vpmovm2b %k2, %zmm0556; WIN64-NEXT:    vmovdqa %xmm0, {{[0-9]+}}(%rsp)557; WIN64-NEXT:    vpmovm2b %k1, %zmm0558; WIN64-NEXT:    vmovdqa %xmm0, {{[0-9]+}}(%rsp)559; WIN64-NEXT:    vpmovm2b %k0, %zmm0560; WIN64-NEXT:    vmovdqa %xmm0, {{[0-9]+}}(%rsp)561; WIN64-NEXT:    leaq {{[0-9]+}}(%rsp), %rcx562; WIN64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdx563; WIN64-NEXT:    leaq {{[0-9]+}}(%rsp), %r8564; WIN64-NEXT:    vzeroupper565; WIN64-NEXT:    callq test_argv16i1helper566; WIN64-NEXT:    nop567; WIN64-NEXT:    .seh_startepilogue568; WIN64-NEXT:    addq $88, %rsp569; WIN64-NEXT:    popq %r10570; WIN64-NEXT:    popq %r11571; WIN64-NEXT:    .seh_endepilogue572; WIN64-NEXT:    retq573; WIN64-NEXT:    .seh_endproc574;575; LINUXOSX64-LABEL: test_argv16i1:576; LINUXOSX64:       # %bb.0:577; LINUXOSX64-NEXT:    subq $136, %rsp578; LINUXOSX64-NEXT:    vmovaps %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill579; LINUXOSX64-NEXT:    vmovaps %xmm14, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill580; LINUXOSX64-NEXT:    vmovaps %xmm13, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill581; LINUXOSX64-NEXT:    vmovaps %xmm12, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill582; LINUXOSX64-NEXT:    vmovaps %xmm11, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill583; LINUXOSX64-NEXT:    vmovaps %xmm10, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill584; LINUXOSX64-NEXT:    vmovaps %xmm9, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill585; LINUXOSX64-NEXT:    vmovaps %xmm8, (%rsp) # 16-byte Spill586; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 144587; LINUXOSX64-NEXT:    .cfi_offset %xmm8, -144588; LINUXOSX64-NEXT:    .cfi_offset %xmm9, -128589; LINUXOSX64-NEXT:    .cfi_offset %xmm10, -112590; LINUXOSX64-NEXT:    .cfi_offset %xmm11, -96591; LINUXOSX64-NEXT:    .cfi_offset %xmm12, -80592; LINUXOSX64-NEXT:    .cfi_offset %xmm13, -64593; LINUXOSX64-NEXT:    .cfi_offset %xmm14, -48594; LINUXOSX64-NEXT:    .cfi_offset %xmm15, -32595; LINUXOSX64-NEXT:    kmovd %edx, %k0596; LINUXOSX64-NEXT:    kmovd %ecx, %k1597; LINUXOSX64-NEXT:    kmovd %eax, %k2598; LINUXOSX64-NEXT:    vpmovm2b %k2, %zmm0599; LINUXOSX64-NEXT:    vpmovm2b %k1, %zmm1600; LINUXOSX64-NEXT:    vpmovm2b %k0, %zmm2601; LINUXOSX64-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0602; LINUXOSX64-NEXT:    # kill: def $xmm1 killed $xmm1 killed $zmm1603; LINUXOSX64-NEXT:    # kill: def $xmm2 killed $xmm2 killed $zmm2604; LINUXOSX64-NEXT:    vzeroupper605; LINUXOSX64-NEXT:    callq test_argv16i1helper@PLT606; LINUXOSX64-NEXT:    vmovaps (%rsp), %xmm8 # 16-byte Reload607; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm9 # 16-byte Reload608; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm10 # 16-byte Reload609; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm11 # 16-byte Reload610; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm12 # 16-byte Reload611; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm13 # 16-byte Reload612; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm14 # 16-byte Reload613; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload614; LINUXOSX64-NEXT:    addq $136, %rsp615; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8616; LINUXOSX64-NEXT:    retq617  %res = call i16 @test_argv16i1helper(<16 x i1> %x0, <16 x i1> %x1, <16 x i1> %x2)618  ret i16 %res619}620 621; Test regcall when passing arguments of v16i1 type622define dso_local i16 @caller_argv16i1() #0 {623; X32-LABEL: caller_argv16i1:624; X32:       # %bb.0: # %entry625; X32-NEXT:    movl $1, %eax626; X32-NEXT:    movl $1, %ecx627; X32-NEXT:    movl $1, %edx628; X32-NEXT:    calll _test_argv16i1629; X32-NEXT:    retl630;631; WIN64-LABEL: caller_argv16i1:632; WIN64:       # %bb.0: # %entry633; WIN64-NEXT:    pushq %rsi634; WIN64-NEXT:    .seh_pushreg %rsi635; WIN64-NEXT:    pushq %rdi636; WIN64-NEXT:    .seh_pushreg %rdi637; WIN64-NEXT:    subq $40, %rsp638; WIN64-NEXT:    .seh_stackalloc 40639; WIN64-NEXT:    vmovaps %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill640; WIN64-NEXT:    .seh_savexmm %xmm7, 16641; WIN64-NEXT:    vmovaps %xmm6, (%rsp) # 16-byte Spill642; WIN64-NEXT:    .seh_savexmm %xmm6, 0643; WIN64-NEXT:    .seh_endprologue644; WIN64-NEXT:    movl $1, %eax645; WIN64-NEXT:    movl $1, %ecx646; WIN64-NEXT:    movl $1, %edx647; WIN64-NEXT:    callq test_argv16i1648; WIN64-NEXT:    vmovaps (%rsp), %xmm6 # 16-byte Reload649; WIN64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload650; WIN64-NEXT:    .seh_startepilogue651; WIN64-NEXT:    addq $40, %rsp652; WIN64-NEXT:    popq %rdi653; WIN64-NEXT:    popq %rsi654; WIN64-NEXT:    .seh_endepilogue655; WIN64-NEXT:    retq656; WIN64-NEXT:    .seh_endproc657;658; LINUXOSX64-LABEL: caller_argv16i1:659; LINUXOSX64:       # %bb.0: # %entry660; LINUXOSX64-NEXT:    pushq %rax661; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16662; LINUXOSX64-NEXT:    movl $1, %eax663; LINUXOSX64-NEXT:    movl $1, %ecx664; LINUXOSX64-NEXT:    movl $1, %edx665; LINUXOSX64-NEXT:    callq test_argv16i1666; LINUXOSX64-NEXT:    popq %rcx667; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8668; LINUXOSX64-NEXT:    retq669entry:670  %v0 = bitcast i16 1 to <16 x i1>671  %call = call x86_regcallcc i16 @test_argv16i1(<16 x i1> %v0, <16 x i1> %v0, <16 x i1> %v0)672  ret i16 %call673}674 675; Test regcall when returning v16i1 type676define dso_local x86_regcallcc <16 x i1> @test_retv16i1()  {677; X32-LABEL: test_retv16i1:678; X32:       # %bb.0:679; X32-NEXT:    movw $1, %ax680; X32-NEXT:    retl681;682; CHECK64-LABEL: test_retv16i1:683; CHECK64:       # %bb.0:684; CHECK64-NEXT:    movw $1, %ax685; CHECK64-NEXT:    retq686  %a = bitcast i16 1 to <16 x i1>687  ret <16 x i1> %a688}689 690; Test regcall when processing result of v16i1 type691define dso_local i16 @caller_retv16i1() #0 {692; X32-LABEL: caller_retv16i1:693; X32:       # %bb.0: # %entry694; X32-NEXT:    calll _test_retv16i1695; X32-NEXT:    # kill: def $ax killed $ax def $eax696; X32-NEXT:    incl %eax697; X32-NEXT:    # kill: def $ax killed $ax killed $eax698; X32-NEXT:    retl699;700; WIN64-LABEL: caller_retv16i1:701; WIN64:       # %bb.0: # %entry702; WIN64-NEXT:    pushq %rsi703; WIN64-NEXT:    .seh_pushreg %rsi704; WIN64-NEXT:    pushq %rdi705; WIN64-NEXT:    .seh_pushreg %rdi706; WIN64-NEXT:    subq $40, %rsp707; WIN64-NEXT:    .seh_stackalloc 40708; WIN64-NEXT:    vmovaps %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill709; WIN64-NEXT:    .seh_savexmm %xmm7, 16710; WIN64-NEXT:    vmovaps %xmm6, (%rsp) # 16-byte Spill711; WIN64-NEXT:    .seh_savexmm %xmm6, 0712; WIN64-NEXT:    .seh_endprologue713; WIN64-NEXT:    callq test_retv16i1714; WIN64-NEXT:    # kill: def $ax killed $ax def $eax715; WIN64-NEXT:    incl %eax716; WIN64-NEXT:    # kill: def $ax killed $ax killed $eax717; WIN64-NEXT:    vmovaps (%rsp), %xmm6 # 16-byte Reload718; WIN64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload719; WIN64-NEXT:    .seh_startepilogue720; WIN64-NEXT:    addq $40, %rsp721; WIN64-NEXT:    popq %rdi722; WIN64-NEXT:    popq %rsi723; WIN64-NEXT:    .seh_endepilogue724; WIN64-NEXT:    retq725; WIN64-NEXT:    .seh_endproc726;727; LINUXOSX64-LABEL: caller_retv16i1:728; LINUXOSX64:       # %bb.0: # %entry729; LINUXOSX64-NEXT:    pushq %rax730; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16731; LINUXOSX64-NEXT:    callq test_retv16i1732; LINUXOSX64-NEXT:    # kill: def $ax killed $ax def $eax733; LINUXOSX64-NEXT:    incl %eax734; LINUXOSX64-NEXT:    # kill: def $ax killed $ax killed $eax735; LINUXOSX64-NEXT:    popq %rcx736; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8737; LINUXOSX64-NEXT:    retq738entry:739  %call = call x86_regcallcc <16 x i1> @test_retv16i1()740  %c = bitcast <16 x i1> %call to i16741  %add = add i16 %c, 1742  ret i16 %add743}744 745; Test regcall when receiving arguments of v8i1 type746declare i8 @test_argv8i1helper(<8 x i1> %x0, <8 x i1> %x1, <8 x i1> %x2)747define dso_local x86_regcallcc i8 @test_argv8i1(<8 x i1> %x0, <8 x i1> %x1, <8 x i1> %x2)  {748; X32-LABEL: test_argv8i1:749; X32:       # %bb.0:750; X32-NEXT:    subl $76, %esp751; X32-NEXT:    vmovups %xmm7, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill752; X32-NEXT:    vmovups %xmm6, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill753; X32-NEXT:    vmovups %xmm5, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill754; X32-NEXT:    vmovups %xmm4, (%esp) # 16-byte Spill755; X32-NEXT:    kmovd %edx, %k0756; X32-NEXT:    kmovd %ecx, %k1757; X32-NEXT:    kmovd %eax, %k2758; X32-NEXT:    vpmovm2w %k2, %zmm0759; X32-NEXT:    vpmovm2w %k1, %zmm1760; X32-NEXT:    vpmovm2w %k0, %zmm2761; X32-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0762; X32-NEXT:    # kill: def $xmm1 killed $xmm1 killed $zmm1763; X32-NEXT:    # kill: def $xmm2 killed $xmm2 killed $zmm2764; X32-NEXT:    vzeroupper765; X32-NEXT:    calll _test_argv8i1helper766; X32-NEXT:    vmovups (%esp), %xmm4 # 16-byte Reload767; X32-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm5 # 16-byte Reload768; X32-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm6 # 16-byte Reload769; X32-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm7 # 16-byte Reload770; X32-NEXT:    addl $76, %esp771; X32-NEXT:    retl772;773; WIN64-LABEL: test_argv8i1:774; WIN64:       # %bb.0:775; WIN64-NEXT:    pushq %r11776; WIN64-NEXT:    .seh_pushreg %r11777; WIN64-NEXT:    pushq %r10778; WIN64-NEXT:    .seh_pushreg %r10779; WIN64-NEXT:    subq $88, %rsp780; WIN64-NEXT:    .seh_stackalloc 88781; WIN64-NEXT:    .seh_endprologue782; WIN64-NEXT:    kmovd %edx, %k0783; WIN64-NEXT:    kmovd %eax, %k1784; WIN64-NEXT:    kmovd %ecx, %k2785; WIN64-NEXT:    vpmovm2w %k2, %zmm0786; WIN64-NEXT:    vmovdqa %xmm0, {{[0-9]+}}(%rsp)787; WIN64-NEXT:    vpmovm2w %k1, %zmm0788; WIN64-NEXT:    vmovdqa %xmm0, {{[0-9]+}}(%rsp)789; WIN64-NEXT:    vpmovm2w %k0, %zmm0790; WIN64-NEXT:    vmovdqa %xmm0, {{[0-9]+}}(%rsp)791; WIN64-NEXT:    leaq {{[0-9]+}}(%rsp), %rcx792; WIN64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdx793; WIN64-NEXT:    leaq {{[0-9]+}}(%rsp), %r8794; WIN64-NEXT:    vzeroupper795; WIN64-NEXT:    callq test_argv8i1helper796; WIN64-NEXT:    nop797; WIN64-NEXT:    .seh_startepilogue798; WIN64-NEXT:    addq $88, %rsp799; WIN64-NEXT:    popq %r10800; WIN64-NEXT:    popq %r11801; WIN64-NEXT:    .seh_endepilogue802; WIN64-NEXT:    retq803; WIN64-NEXT:    .seh_endproc804;805; LINUXOSX64-LABEL: test_argv8i1:806; LINUXOSX64:       # %bb.0:807; LINUXOSX64-NEXT:    subq $136, %rsp808; LINUXOSX64-NEXT:    vmovaps %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill809; LINUXOSX64-NEXT:    vmovaps %xmm14, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill810; LINUXOSX64-NEXT:    vmovaps %xmm13, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill811; LINUXOSX64-NEXT:    vmovaps %xmm12, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill812; LINUXOSX64-NEXT:    vmovaps %xmm11, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill813; LINUXOSX64-NEXT:    vmovaps %xmm10, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill814; LINUXOSX64-NEXT:    vmovaps %xmm9, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill815; LINUXOSX64-NEXT:    vmovaps %xmm8, (%rsp) # 16-byte Spill816; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 144817; LINUXOSX64-NEXT:    .cfi_offset %xmm8, -144818; LINUXOSX64-NEXT:    .cfi_offset %xmm9, -128819; LINUXOSX64-NEXT:    .cfi_offset %xmm10, -112820; LINUXOSX64-NEXT:    .cfi_offset %xmm11, -96821; LINUXOSX64-NEXT:    .cfi_offset %xmm12, -80822; LINUXOSX64-NEXT:    .cfi_offset %xmm13, -64823; LINUXOSX64-NEXT:    .cfi_offset %xmm14, -48824; LINUXOSX64-NEXT:    .cfi_offset %xmm15, -32825; LINUXOSX64-NEXT:    kmovd %edx, %k0826; LINUXOSX64-NEXT:    kmovd %ecx, %k1827; LINUXOSX64-NEXT:    kmovd %eax, %k2828; LINUXOSX64-NEXT:    vpmovm2w %k2, %zmm0829; LINUXOSX64-NEXT:    vpmovm2w %k1, %zmm1830; LINUXOSX64-NEXT:    vpmovm2w %k0, %zmm2831; LINUXOSX64-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0832; LINUXOSX64-NEXT:    # kill: def $xmm1 killed $xmm1 killed $zmm1833; LINUXOSX64-NEXT:    # kill: def $xmm2 killed $xmm2 killed $zmm2834; LINUXOSX64-NEXT:    vzeroupper835; LINUXOSX64-NEXT:    callq test_argv8i1helper@PLT836; LINUXOSX64-NEXT:    vmovaps (%rsp), %xmm8 # 16-byte Reload837; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm9 # 16-byte Reload838; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm10 # 16-byte Reload839; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm11 # 16-byte Reload840; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm12 # 16-byte Reload841; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm13 # 16-byte Reload842; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm14 # 16-byte Reload843; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload844; LINUXOSX64-NEXT:    addq $136, %rsp845; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8846; LINUXOSX64-NEXT:    retq847  %res = call i8 @test_argv8i1helper(<8 x i1> %x0, <8 x i1> %x1, <8 x i1> %x2)848  ret i8 %res849}850 851; Test regcall when passing arguments of v8i1 type852define dso_local i8 @caller_argv8i1() #0 {853; X32-LABEL: caller_argv8i1:854; X32:       # %bb.0: # %entry855; X32-NEXT:    movl $1, %eax856; X32-NEXT:    movl $1, %ecx857; X32-NEXT:    movl $1, %edx858; X32-NEXT:    calll _test_argv8i1859; X32-NEXT:    retl860;861; WIN64-LABEL: caller_argv8i1:862; WIN64:       # %bb.0: # %entry863; WIN64-NEXT:    pushq %rsi864; WIN64-NEXT:    .seh_pushreg %rsi865; WIN64-NEXT:    pushq %rdi866; WIN64-NEXT:    .seh_pushreg %rdi867; WIN64-NEXT:    subq $40, %rsp868; WIN64-NEXT:    .seh_stackalloc 40869; WIN64-NEXT:    vmovaps %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill870; WIN64-NEXT:    .seh_savexmm %xmm7, 16871; WIN64-NEXT:    vmovaps %xmm6, (%rsp) # 16-byte Spill872; WIN64-NEXT:    .seh_savexmm %xmm6, 0873; WIN64-NEXT:    .seh_endprologue874; WIN64-NEXT:    movl $1, %eax875; WIN64-NEXT:    movl $1, %ecx876; WIN64-NEXT:    movl $1, %edx877; WIN64-NEXT:    callq test_argv8i1878; WIN64-NEXT:    vmovaps (%rsp), %xmm6 # 16-byte Reload879; WIN64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload880; WIN64-NEXT:    .seh_startepilogue881; WIN64-NEXT:    addq $40, %rsp882; WIN64-NEXT:    popq %rdi883; WIN64-NEXT:    popq %rsi884; WIN64-NEXT:    .seh_endepilogue885; WIN64-NEXT:    retq886; WIN64-NEXT:    .seh_endproc887;888; LINUXOSX64-LABEL: caller_argv8i1:889; LINUXOSX64:       # %bb.0: # %entry890; LINUXOSX64-NEXT:    pushq %rax891; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16892; LINUXOSX64-NEXT:    movl $1, %eax893; LINUXOSX64-NEXT:    movl $1, %ecx894; LINUXOSX64-NEXT:    movl $1, %edx895; LINUXOSX64-NEXT:    callq test_argv8i1896; LINUXOSX64-NEXT:    popq %rcx897; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8898; LINUXOSX64-NEXT:    retq899entry:900  %v0 = bitcast i8 1 to <8 x i1>901  %call = call x86_regcallcc i8 @test_argv8i1(<8 x i1> %v0, <8 x i1> %v0, <8 x i1> %v0)902  ret i8 %call903}904 905; Test regcall when returning v8i1 type906define dso_local x86_regcallcc <8 x i1> @test_retv8i1()  {907; X32-LABEL: test_retv8i1:908; X32:       # %bb.0:909; X32-NEXT:    movb $1, %al910; X32-NEXT:    retl911;912; CHECK64-LABEL: test_retv8i1:913; CHECK64:       # %bb.0:914; CHECK64-NEXT:    movb $1, %al915; CHECK64-NEXT:    retq916  %a = bitcast i8 1 to <8 x i1>917  ret <8 x i1> %a918}919 920; Test regcall when processing result of v8i1 type921define dso_local <8 x i1> @caller_retv8i1() #0 {922; X32-LABEL: caller_retv8i1:923; X32:       # %bb.0: # %entry924; X32-NEXT:    calll _test_retv8i1925; X32-NEXT:    # kill: def $al killed $al def $eax926; X32-NEXT:    kmovd %eax, %k0927; X32-NEXT:    vpmovm2w %k0, %zmm0928; X32-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0929; X32-NEXT:    vzeroupper930; X32-NEXT:    retl931;932; WIN64-LABEL: caller_retv8i1:933; WIN64:       # %bb.0: # %entry934; WIN64-NEXT:    pushq %rsi935; WIN64-NEXT:    .seh_pushreg %rsi936; WIN64-NEXT:    pushq %rdi937; WIN64-NEXT:    .seh_pushreg %rdi938; WIN64-NEXT:    subq $40, %rsp939; WIN64-NEXT:    .seh_stackalloc 40940; WIN64-NEXT:    vmovaps %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill941; WIN64-NEXT:    .seh_savexmm %xmm7, 16942; WIN64-NEXT:    vmovaps %xmm6, (%rsp) # 16-byte Spill943; WIN64-NEXT:    .seh_savexmm %xmm6, 0944; WIN64-NEXT:    .seh_endprologue945; WIN64-NEXT:    callq test_retv8i1946; WIN64-NEXT:    # kill: def $al killed $al def $eax947; WIN64-NEXT:    kmovd %eax, %k0948; WIN64-NEXT:    vpmovm2w %k0, %zmm0949; WIN64-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0950; WIN64-NEXT:    vmovaps (%rsp), %xmm6 # 16-byte Reload951; WIN64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload952; WIN64-NEXT:    .seh_startepilogue953; WIN64-NEXT:    addq $40, %rsp954; WIN64-NEXT:    popq %rdi955; WIN64-NEXT:    popq %rsi956; WIN64-NEXT:    .seh_endepilogue957; WIN64-NEXT:    vzeroupper958; WIN64-NEXT:    retq959; WIN64-NEXT:    .seh_endproc960;961; LINUXOSX64-LABEL: caller_retv8i1:962; LINUXOSX64:       # %bb.0: # %entry963; LINUXOSX64-NEXT:    pushq %rax964; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16965; LINUXOSX64-NEXT:    callq test_retv8i1966; LINUXOSX64-NEXT:    # kill: def $al killed $al def $eax967; LINUXOSX64-NEXT:    kmovd %eax, %k0968; LINUXOSX64-NEXT:    vpmovm2w %k0, %zmm0969; LINUXOSX64-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0970; LINUXOSX64-NEXT:    popq %rax971; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8972; LINUXOSX64-NEXT:    vzeroupper973; LINUXOSX64-NEXT:    retq974entry:975  %call = call x86_regcallcc <8 x i1> @test_retv8i1()976  ret <8 x i1> %call977}978 979