brintos

brintos / llvm-project-archived public Read only

0
0
Text · 46.0 KiB · a664cc7 Raw
1326 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i386-pc-win32       -mattr=+avx512f -mattr=+avx512vl -mattr=+avx512bw -mattr=+avx512dq -verify-machineinstrs  | FileCheck %s --check-prefix=X323; RUN: llc < %s -mtriple=x86_64-win32        -mattr=+avx512f -mattr=+avx512vl -mattr=+avx512bw -mattr=+avx512dq -verify-machineinstrs  | FileCheck %s --check-prefix=WIN644; RUN: llc < %s -mtriple=x86_64-linux-gnu    -mattr=+avx512f -mattr=+avx512vl -mattr=+avx512bw -mattr=+avx512dq -verify-machineinstrs  | FileCheck %s --check-prefix=LINUXOSX645 6; Test regcall when receiving/returning i17define dso_local x86_regcallcc i1 @test_argReti1(i1 %a)  {8; X32-LABEL: test_argReti1:9; X32:       # %bb.0:10; X32-NEXT:    xorb $1, %al11; X32-NEXT:    # kill: def $al killed $al killed $eax12; X32-NEXT:    retl13;14; WIN64-LABEL: test_argReti1:15; WIN64:       # %bb.0:16; WIN64-NEXT:    xorb $1, %al17; WIN64-NEXT:    # kill: def $al killed $al killed $eax18; WIN64-NEXT:    retq19;20; LINUXOSX64-LABEL: test_argReti1:21; LINUXOSX64:       # %bb.0:22; LINUXOSX64-NEXT:    xorb $1, %al23; LINUXOSX64-NEXT:    # kill: def $al killed $al killed $eax24; LINUXOSX64-NEXT:    retq25  %add = add i1 %a, 126  ret i1 %add27}28 29; Test regcall when passing/retrieving i130define dso_local x86_regcallcc i1 @test_CallargReti1(i1 %a)  {31; X32-LABEL: test_CallargReti1:32; X32:       # %bb.0:33; X32-NEXT:    xorb $1, %al34; X32-NEXT:    movzbl %al, %eax35; X32-NEXT:    calll _test_argReti136; X32-NEXT:    xorb $1, %al37; X32-NEXT:    retl38;39; WIN64-LABEL: test_CallargReti1:40; WIN64:       # %bb.0:41; WIN64-NEXT:    pushq %rax42; WIN64-NEXT:    .seh_stackalloc 843; WIN64-NEXT:    .seh_endprologue44; WIN64-NEXT:    xorb $1, %al45; WIN64-NEXT:    movzbl %al, %eax46; WIN64-NEXT:    callq test_argReti147; WIN64-NEXT:    xorb $1, %al48; WIN64-NEXT:    .seh_startepilogue49; WIN64-NEXT:    popq %rcx50; WIN64-NEXT:    .seh_endepilogue51; WIN64-NEXT:    retq52; WIN64-NEXT:    .seh_endproc53;54; LINUXOSX64-LABEL: test_CallargReti1:55; LINUXOSX64:       # %bb.0:56; LINUXOSX64-NEXT:    pushq %rax57; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 1658; LINUXOSX64-NEXT:    xorb $1, %al59; LINUXOSX64-NEXT:    movzbl %al, %eax60; LINUXOSX64-NEXT:    callq test_argReti161; LINUXOSX64-NEXT:    xorb $1, %al62; LINUXOSX64-NEXT:    popq %rcx63; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 864; LINUXOSX64-NEXT:    retq65  %b = add i1 %a, 166  %c = call x86_regcallcc i1 @test_argReti1(i1 %b)67  %d = add i1 %c, 168  ret i1 %d69}70 71; Test regcall when receiving/returning i872define dso_local x86_regcallcc i8 @test_argReti8(i8 %a)  {73; X32-LABEL: test_argReti8:74; X32:       # %bb.0:75; X32-NEXT:    incb %al76; X32-NEXT:    # kill: def $al killed $al killed $eax77; X32-NEXT:    retl78;79; WIN64-LABEL: test_argReti8:80; WIN64:       # %bb.0:81; WIN64-NEXT:    incb %al82; WIN64-NEXT:    # kill: def $al killed $al killed $eax83; WIN64-NEXT:    retq84;85; LINUXOSX64-LABEL: test_argReti8:86; LINUXOSX64:       # %bb.0:87; LINUXOSX64-NEXT:    incb %al88; LINUXOSX64-NEXT:    # kill: def $al killed $al killed $eax89; LINUXOSX64-NEXT:    retq90  %add = add i8 %a, 191  ret i8 %add92}93 94; Test regcall when passing/retrieving i895define dso_local x86_regcallcc i8 @test_CallargReti8(i8 %a)  {96; X32-LABEL: test_CallargReti8:97; X32:       # %bb.0:98; X32-NEXT:    incb %al99; X32-NEXT:    movzbl %al, %eax100; X32-NEXT:    calll _test_argReti8101; X32-NEXT:    incb %al102; X32-NEXT:    retl103;104; WIN64-LABEL: test_CallargReti8:105; WIN64:       # %bb.0:106; WIN64-NEXT:    pushq %rax107; WIN64-NEXT:    .seh_stackalloc 8108; WIN64-NEXT:    .seh_endprologue109; WIN64-NEXT:    incb %al110; WIN64-NEXT:    movzbl %al, %eax111; WIN64-NEXT:    callq test_argReti8112; WIN64-NEXT:    incb %al113; WIN64-NEXT:    .seh_startepilogue114; WIN64-NEXT:    popq %rcx115; WIN64-NEXT:    .seh_endepilogue116; WIN64-NEXT:    retq117; WIN64-NEXT:    .seh_endproc118;119; LINUXOSX64-LABEL: test_CallargReti8:120; LINUXOSX64:       # %bb.0:121; LINUXOSX64-NEXT:    pushq %rax122; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16123; LINUXOSX64-NEXT:    incb %al124; LINUXOSX64-NEXT:    movzbl %al, %eax125; LINUXOSX64-NEXT:    callq test_argReti8126; LINUXOSX64-NEXT:    incb %al127; LINUXOSX64-NEXT:    popq %rcx128; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8129; LINUXOSX64-NEXT:    retq130  %b = add i8 %a, 1131  %c = call x86_regcallcc i8 @test_argReti8(i8 %b)132  %d = add i8 %c, 1133  ret i8 %d134}135 136; Test regcall when receiving/returning i16137define dso_local x86_regcallcc i16 @test_argReti16(i16 %a)  {138; X32-LABEL: test_argReti16:139; X32:       # %bb.0:140; X32-NEXT:    incl %eax141; X32-NEXT:    # kill: def $ax killed $ax killed $eax142; X32-NEXT:    retl143;144; WIN64-LABEL: test_argReti16:145; WIN64:       # %bb.0:146; WIN64-NEXT:    incl %eax147; WIN64-NEXT:    # kill: def $ax killed $ax killed $eax148; WIN64-NEXT:    retq149;150; LINUXOSX64-LABEL: test_argReti16:151; LINUXOSX64:       # %bb.0:152; LINUXOSX64-NEXT:    incl %eax153; LINUXOSX64-NEXT:    # kill: def $ax killed $ax killed $eax154; LINUXOSX64-NEXT:    retq155  %add = add i16 %a, 1156  ret i16 %add157}158 159; Test regcall when passing/retrieving i16160define dso_local x86_regcallcc i16 @test_CallargReti16(i16 %a)  {161; X32-LABEL: test_CallargReti16:162; X32:       # %bb.0:163; X32-NEXT:    incl %eax164; X32-NEXT:    calll _test_argReti16165; X32-NEXT:    # kill: def $ax killed $ax def $eax166; X32-NEXT:    incl %eax167; X32-NEXT:    # kill: def $ax killed $ax killed $eax168; X32-NEXT:    retl169;170; WIN64-LABEL: test_CallargReti16:171; WIN64:       # %bb.0:172; WIN64-NEXT:    pushq %rax173; WIN64-NEXT:    .seh_stackalloc 8174; WIN64-NEXT:    .seh_endprologue175; WIN64-NEXT:    incl %eax176; WIN64-NEXT:    callq test_argReti16177; WIN64-NEXT:    # kill: def $ax killed $ax def $eax178; WIN64-NEXT:    incl %eax179; WIN64-NEXT:    # kill: def $ax killed $ax killed $eax180; WIN64-NEXT:    .seh_startepilogue181; WIN64-NEXT:    popq %rcx182; WIN64-NEXT:    .seh_endepilogue183; WIN64-NEXT:    retq184; WIN64-NEXT:    .seh_endproc185;186; LINUXOSX64-LABEL: test_CallargReti16:187; LINUXOSX64:       # %bb.0:188; LINUXOSX64-NEXT:    pushq %rax189; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16190; LINUXOSX64-NEXT:    incl %eax191; LINUXOSX64-NEXT:    callq test_argReti16192; LINUXOSX64-NEXT:    # kill: def $ax killed $ax def $eax193; LINUXOSX64-NEXT:    incl %eax194; LINUXOSX64-NEXT:    # kill: def $ax killed $ax killed $eax195; LINUXOSX64-NEXT:    popq %rcx196; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8197; LINUXOSX64-NEXT:    retq198  %b = add i16 %a, 1199  %c = call x86_regcallcc i16 @test_argReti16(i16 %b)200  %d = add i16 %c, 1201  ret i16 %d202}203 204; Test regcall when receiving/returning i32205define dso_local x86_regcallcc i32 @test_argReti32(i32 %a)  {206; X32-LABEL: test_argReti32:207; X32:       # %bb.0:208; X32-NEXT:    incl %eax209; X32-NEXT:    retl210;211; WIN64-LABEL: test_argReti32:212; WIN64:       # %bb.0:213; WIN64-NEXT:    incl %eax214; WIN64-NEXT:    retq215;216; LINUXOSX64-LABEL: test_argReti32:217; LINUXOSX64:       # %bb.0:218; LINUXOSX64-NEXT:    incl %eax219; LINUXOSX64-NEXT:    retq220  %add = add i32 %a, 1221  ret i32 %add222}223 224; Test regcall when passing/retrieving i32225define dso_local x86_regcallcc i32 @test_CallargReti32(i32 %a)  {226; X32-LABEL: test_CallargReti32:227; X32:       # %bb.0:228; X32-NEXT:    incl %eax229; X32-NEXT:    calll _test_argReti32230; X32-NEXT:    incl %eax231; X32-NEXT:    retl232;233; WIN64-LABEL: test_CallargReti32:234; WIN64:       # %bb.0:235; WIN64-NEXT:    pushq %rax236; WIN64-NEXT:    .seh_stackalloc 8237; WIN64-NEXT:    .seh_endprologue238; WIN64-NEXT:    incl %eax239; WIN64-NEXT:    callq test_argReti32240; WIN64-NEXT:    incl %eax241; WIN64-NEXT:    .seh_startepilogue242; WIN64-NEXT:    popq %rcx243; WIN64-NEXT:    .seh_endepilogue244; WIN64-NEXT:    retq245; WIN64-NEXT:    .seh_endproc246;247; LINUXOSX64-LABEL: test_CallargReti32:248; LINUXOSX64:       # %bb.0:249; LINUXOSX64-NEXT:    pushq %rax250; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16251; LINUXOSX64-NEXT:    incl %eax252; LINUXOSX64-NEXT:    callq test_argReti32253; LINUXOSX64-NEXT:    incl %eax254; LINUXOSX64-NEXT:    popq %rcx255; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8256; LINUXOSX64-NEXT:    retq257  %b = add i32 %a, 1258  %c = call x86_regcallcc i32 @test_argReti32(i32 %b)259  %d = add i32 %c, 1260  ret i32 %d261}262 263; Test regcall when receiving/returning i64264define dso_local x86_regcallcc i64 @test_argReti64(i64 %a)  {265; X32-LABEL: test_argReti64:266; X32:       # %bb.0:267; X32-NEXT:    addl $3, %eax268; X32-NEXT:    adcl $1, %ecx269; X32-NEXT:    retl270;271; WIN64-LABEL: test_argReti64:272; WIN64:       # %bb.0:273; WIN64-NEXT:    movabsq $4294967299, %rcx # imm = 0x100000003274; WIN64-NEXT:    addq %rcx, %rax275; WIN64-NEXT:    retq276;277; LINUXOSX64-LABEL: test_argReti64:278; LINUXOSX64:       # %bb.0:279; LINUXOSX64-NEXT:    movabsq $4294967299, %rcx # imm = 0x100000003280; LINUXOSX64-NEXT:    addq %rcx, %rax281; LINUXOSX64-NEXT:    retq282  %add = add i64 %a, 4294967299283  ret i64 %add284}285 286; Test regcall when passing/retrieving i64287define dso_local x86_regcallcc i64 @test_CallargReti64(i64 %a)  {288; X32-LABEL: test_CallargReti64:289; X32:       # %bb.0:290; X32-NEXT:    addl $1, %eax291; X32-NEXT:    adcl $0, %ecx292; X32-NEXT:    calll _test_argReti64293; X32-NEXT:    addl $1, %eax294; X32-NEXT:    adcl $0, %ecx295; X32-NEXT:    retl296;297; WIN64-LABEL: test_CallargReti64:298; WIN64:       # %bb.0:299; WIN64-NEXT:    pushq %rax300; WIN64-NEXT:    .seh_stackalloc 8301; WIN64-NEXT:    .seh_endprologue302; WIN64-NEXT:    incq %rax303; WIN64-NEXT:    callq test_argReti64304; WIN64-NEXT:    incq %rax305; WIN64-NEXT:    .seh_startepilogue306; WIN64-NEXT:    popq %rcx307; WIN64-NEXT:    .seh_endepilogue308; WIN64-NEXT:    retq309; WIN64-NEXT:    .seh_endproc310;311; LINUXOSX64-LABEL: test_CallargReti64:312; LINUXOSX64:       # %bb.0:313; LINUXOSX64-NEXT:    pushq %rax314; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16315; LINUXOSX64-NEXT:    incq %rax316; LINUXOSX64-NEXT:    callq test_argReti64317; LINUXOSX64-NEXT:    incq %rax318; LINUXOSX64-NEXT:    popq %rcx319; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8320; LINUXOSX64-NEXT:    retq321  %b = add i64 %a, 1322  %c = call x86_regcallcc i64 @test_argReti64(i64 %b)323  %d = add i64 %c, 1324  ret i64 %d325}326 327; Test regcall when receiving/returning float328define dso_local x86_regcallcc float @test_argRetFloat(float %a)  {329; X32-LABEL: test_argRetFloat:330; X32:       # %bb.0:331; X32-NEXT:    vaddss __real@3f800000, %xmm0, %xmm0332; X32-NEXT:    retl333;334; WIN64-LABEL: test_argRetFloat:335; WIN64:       # %bb.0:336; WIN64-NEXT:    vaddss __real@3f800000(%rip), %xmm0, %xmm0337; WIN64-NEXT:    retq338;339; LINUXOSX64-LABEL: test_argRetFloat:340; LINUXOSX64:       # %bb.0:341; LINUXOSX64-NEXT:    vaddss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0342; LINUXOSX64-NEXT:    retq343  %add = fadd float 1.0, %a344  ret float %add345}346 347; Test regcall when passing/retrieving float348define dso_local x86_regcallcc float @test_CallargRetFloat(float %a)  {349; X32-LABEL: test_CallargRetFloat:350; X32:       # %bb.0:351; X32-NEXT:    subl $28, %esp352; X32-NEXT:    vmovups %xmm4, (%esp) # 16-byte Spill353; X32-NEXT:    vmovss {{.*#+}} xmm4 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]354; X32-NEXT:    vaddss %xmm4, %xmm0, %xmm0355; X32-NEXT:    calll _test_argRetFloat356; X32-NEXT:    vaddss %xmm4, %xmm0, %xmm0357; X32-NEXT:    vmovups (%esp), %xmm4 # 16-byte Reload358; X32-NEXT:    addl $28, %esp359; X32-NEXT:    retl360;361; WIN64-LABEL: test_CallargRetFloat:362; WIN64:       # %bb.0:363; WIN64-NEXT:    subq $24, %rsp364; WIN64-NEXT:    .seh_stackalloc 24365; WIN64-NEXT:    vmovaps %xmm8, (%rsp) # 16-byte Spill366; WIN64-NEXT:    .seh_savexmm %xmm8, 0367; WIN64-NEXT:    .seh_endprologue368; WIN64-NEXT:    vmovss {{.*#+}} xmm8 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]369; WIN64-NEXT:    vaddss %xmm0, %xmm8, %xmm0370; WIN64-NEXT:    callq test_argRetFloat371; WIN64-NEXT:    vaddss %xmm0, %xmm8, %xmm0372; WIN64-NEXT:    vmovaps (%rsp), %xmm8 # 16-byte Reload373; WIN64-NEXT:    .seh_startepilogue374; WIN64-NEXT:    addq $24, %rsp375; WIN64-NEXT:    .seh_endepilogue376; WIN64-NEXT:    retq377; WIN64-NEXT:    .seh_endproc378;379; LINUXOSX64-LABEL: test_CallargRetFloat:380; LINUXOSX64:       # %bb.0:381; LINUXOSX64-NEXT:    subq $24, %rsp382; LINUXOSX64-NEXT:    vmovaps %xmm8, (%rsp) # 16-byte Spill383; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 32384; LINUXOSX64-NEXT:    .cfi_offset %xmm8, -32385; LINUXOSX64-NEXT:    vmovss {{.*#+}} xmm8 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]386; LINUXOSX64-NEXT:    vaddss %xmm0, %xmm8, %xmm0387; LINUXOSX64-NEXT:    callq test_argRetFloat388; LINUXOSX64-NEXT:    vaddss %xmm0, %xmm8, %xmm0389; LINUXOSX64-NEXT:    vmovaps (%rsp), %xmm8 # 16-byte Reload390; LINUXOSX64-NEXT:    addq $24, %rsp391; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8392; LINUXOSX64-NEXT:    retq393  %b = fadd float 1.0, %a394  %c = call x86_regcallcc float @test_argRetFloat(float %b)395  %d = fadd float 1.0, %c396  ret float %d397}398 399; Test regcall when receiving/returning double400define dso_local x86_regcallcc double @test_argRetDouble(double %a)  {401; X32-LABEL: test_argRetDouble:402; X32:       # %bb.0:403; X32-NEXT:    vaddsd __real@3ff0000000000000, %xmm0, %xmm0404; X32-NEXT:    retl405;406; WIN64-LABEL: test_argRetDouble:407; WIN64:       # %bb.0:408; WIN64-NEXT:    vaddsd __real@3ff0000000000000(%rip), %xmm0, %xmm0409; WIN64-NEXT:    retq410;411; LINUXOSX64-LABEL: test_argRetDouble:412; LINUXOSX64:       # %bb.0:413; LINUXOSX64-NEXT:    vaddsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0414; LINUXOSX64-NEXT:    retq415  %add = fadd double %a, 1.0416  ret double %add417}418 419; Test regcall when passing/retrieving double420define dso_local x86_regcallcc double @test_CallargRetDouble(double %a)  {421; X32-LABEL: test_CallargRetDouble:422; X32:       # %bb.0:423; X32-NEXT:    subl $28, %esp424; X32-NEXT:    vmovups %xmm4, (%esp) # 16-byte Spill425; X32-NEXT:    vmovsd {{.*#+}} xmm4 = [1.0E+0,0.0E+0]426; X32-NEXT:    vaddsd %xmm4, %xmm0, %xmm0427; X32-NEXT:    calll _test_argRetDouble428; X32-NEXT:    vaddsd %xmm4, %xmm0, %xmm0429; X32-NEXT:    vmovups (%esp), %xmm4 # 16-byte Reload430; X32-NEXT:    addl $28, %esp431; X32-NEXT:    retl432;433; WIN64-LABEL: test_CallargRetDouble:434; WIN64:       # %bb.0:435; WIN64-NEXT:    subq $24, %rsp436; WIN64-NEXT:    .seh_stackalloc 24437; WIN64-NEXT:    vmovaps %xmm8, (%rsp) # 16-byte Spill438; WIN64-NEXT:    .seh_savexmm %xmm8, 0439; WIN64-NEXT:    .seh_endprologue440; WIN64-NEXT:    vmovsd {{.*#+}} xmm8 = [1.0E+0,0.0E+0]441; WIN64-NEXT:    vaddsd %xmm0, %xmm8, %xmm0442; WIN64-NEXT:    callq test_argRetDouble443; WIN64-NEXT:    vaddsd %xmm0, %xmm8, %xmm0444; WIN64-NEXT:    vmovaps (%rsp), %xmm8 # 16-byte Reload445; WIN64-NEXT:    .seh_startepilogue446; WIN64-NEXT:    addq $24, %rsp447; WIN64-NEXT:    .seh_endepilogue448; WIN64-NEXT:    retq449; WIN64-NEXT:    .seh_endproc450;451; LINUXOSX64-LABEL: test_CallargRetDouble:452; LINUXOSX64:       # %bb.0:453; LINUXOSX64-NEXT:    subq $24, %rsp454; LINUXOSX64-NEXT:    vmovaps %xmm8, (%rsp) # 16-byte Spill455; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 32456; LINUXOSX64-NEXT:    .cfi_offset %xmm8, -32457; LINUXOSX64-NEXT:    vmovsd {{.*#+}} xmm8 = [1.0E+0,0.0E+0]458; LINUXOSX64-NEXT:    vaddsd %xmm0, %xmm8, %xmm0459; LINUXOSX64-NEXT:    callq test_argRetDouble460; LINUXOSX64-NEXT:    vaddsd %xmm0, %xmm8, %xmm0461; LINUXOSX64-NEXT:    vmovaps (%rsp), %xmm8 # 16-byte Reload462; LINUXOSX64-NEXT:    addq $24, %rsp463; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8464; LINUXOSX64-NEXT:    retq465  %b = fadd double 1.0, %a466  %c = call x86_regcallcc double @test_argRetDouble(double %b)467  %d = fadd double 1.0, %c468  ret double %d469}470 471; Test regcall when receiving/returning long double472define dso_local x86_regcallcc x86_fp80 @test_argRetf80(x86_fp80 %a0) nounwind {473; X32-LABEL: test_argRetf80:474; X32:       # %bb.0:475; X32-NEXT:    fadd %st, %st(0)476; X32-NEXT:    retl477;478; WIN64-LABEL: test_argRetf80:479; WIN64:       # %bb.0:480; WIN64-NEXT:    fadd %st, %st(0)481; WIN64-NEXT:    retq482;483; LINUXOSX64-LABEL: test_argRetf80:484; LINUXOSX64:       # %bb.0:485; LINUXOSX64-NEXT:    fadd %st, %st(0)486; LINUXOSX64-NEXT:    retq487  %r0 = fadd x86_fp80 %a0, %a0488  ret x86_fp80 %r0489}490 491; Test regcall when receiving/returning long double492define dso_local x86_regcallcc double @test_argParamf80(x86_fp80 %a0) nounwind {493; X32-LABEL: test_argParamf80:494; X32:       # %bb.0:495; X32-NEXT:    pushl %ebp496; X32-NEXT:    movl %esp, %ebp497; X32-NEXT:    andl $-8, %esp498; X32-NEXT:    subl $8, %esp499; X32-NEXT:    fstpl (%esp)500; X32-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero501; X32-NEXT:    movl %ebp, %esp502; X32-NEXT:    popl %ebp503; X32-NEXT:    retl504;505; WIN64-LABEL: test_argParamf80:506; WIN64:       # %bb.0:507; WIN64-NEXT:    pushq %rax508; WIN64-NEXT:    fstpl (%rsp)509; WIN64-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero510; WIN64-NEXT:    popq %rax511; WIN64-NEXT:    retq512;513; LINUXOSX64-LABEL: test_argParamf80:514; LINUXOSX64:       # %bb.0:515; LINUXOSX64-NEXT:    fstpl -{{[0-9]+}}(%rsp)516; LINUXOSX64-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero517; LINUXOSX64-NEXT:    retq518  %r0 = fptrunc x86_fp80 %a0 to double519  ret double %r0520}521 522; Test regcall when passing/retrieving long double523define x86_regcallcc x86_fp80 @test_CallargRetf80(x86_fp80 %a)  {524; X32-LABEL: test_CallargRetf80:525; X32:       # %bb.0:526; X32-NEXT:    fadd %st, %st(0)527; X32-NEXT:    calll _test_argRetf80528; X32-NEXT:    fadd %st, %st(0)529; X32-NEXT:    retl530;531; WIN64-LABEL: test_CallargRetf80:532; WIN64:       # %bb.0:533; WIN64-NEXT:    pushq %rax534; WIN64-NEXT:    .seh_stackalloc 8535; WIN64-NEXT:    .seh_endprologue536; WIN64-NEXT:    fadd %st, %st(0)537; WIN64-NEXT:    callq test_argRetf80538; WIN64-NEXT:    fadd %st, %st(0)539; WIN64-NEXT:    .seh_startepilogue540; WIN64-NEXT:    popq %rax541; WIN64-NEXT:    .seh_endepilogue542; WIN64-NEXT:    retq543; WIN64-NEXT:    .seh_endproc544;545; LINUXOSX64-LABEL: test_CallargRetf80:546; LINUXOSX64:       # %bb.0:547; LINUXOSX64-NEXT:    pushq %rax548; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16549; LINUXOSX64-NEXT:    fadd %st, %st(0)550; LINUXOSX64-NEXT:    callq test_argRetf80551; LINUXOSX64-NEXT:    fadd %st, %st(0)552; LINUXOSX64-NEXT:    popq %rax553; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8554; LINUXOSX64-NEXT:    retq555  %b = fadd x86_fp80 %a, %a556  %c = call x86_regcallcc x86_fp80 @test_argRetf80(x86_fp80 %b)557  %d = fadd x86_fp80 %c, %c558  ret x86_fp80 %d559}560 561define dso_local x86_regcallcc double @test_CallargParamf80(x86_fp80 %a)  {562; X32-LABEL: test_CallargParamf80:563; X32:       # %bb.0:564; X32-NEXT:    fadd %st, %st(0)565; X32-NEXT:    calll _test_argParamf80566; X32-NEXT:    vaddsd %xmm0, %xmm0, %xmm0567; X32-NEXT:    retl568;569; WIN64-LABEL: test_CallargParamf80:570; WIN64:       # %bb.0:571; WIN64-NEXT:    pushq %rax572; WIN64-NEXT:    .seh_stackalloc 8573; WIN64-NEXT:    .seh_endprologue574; WIN64-NEXT:    fadd %st, %st(0)575; WIN64-NEXT:    callq test_argParamf80576; WIN64-NEXT:    vaddsd %xmm0, %xmm0, %xmm0577; WIN64-NEXT:    .seh_startepilogue578; WIN64-NEXT:    popq %rax579; WIN64-NEXT:    .seh_endepilogue580; WIN64-NEXT:    retq581; WIN64-NEXT:    .seh_endproc582;583; LINUXOSX64-LABEL: test_CallargParamf80:584; LINUXOSX64:       # %bb.0:585; LINUXOSX64-NEXT:    pushq %rax586; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16587; LINUXOSX64-NEXT:    fadd %st, %st(0)588; LINUXOSX64-NEXT:    callq test_argParamf80589; LINUXOSX64-NEXT:    vaddsd %xmm0, %xmm0, %xmm0590; LINUXOSX64-NEXT:    popq %rax591; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8592; LINUXOSX64-NEXT:    retq593  %b = fadd x86_fp80 %a, %a594  %c = call x86_regcallcc double @test_argParamf80(x86_fp80 %b)595  %d = fadd double %c, %c596  ret double %d597}598 599; Test regcall when receiving/returning pointer600define dso_local x86_regcallcc ptr @test_argRetPointer(ptr %a)  {601; X32-LABEL: test_argRetPointer:602; X32:       # %bb.0:603; X32-NEXT:    incl %eax604; X32-NEXT:    retl605;606; WIN64-LABEL: test_argRetPointer:607; WIN64:       # %bb.0:608; WIN64-NEXT:    incl %eax609; WIN64-NEXT:    retq610;611; LINUXOSX64-LABEL: test_argRetPointer:612; LINUXOSX64:       # %bb.0:613; LINUXOSX64-NEXT:    incl %eax614; LINUXOSX64-NEXT:    retq615  %b = ptrtoint ptr %a to i32616  %c = add i32 %b, 1617  %d = inttoptr i32 %c to ptr618  ret ptr %d619}620 621; Test regcall when passing/retrieving pointer622define dso_local x86_regcallcc ptr @test_CallargRetPointer(ptr %a)  {623; X32-LABEL: test_CallargRetPointer:624; X32:       # %bb.0:625; X32-NEXT:    incl %eax626; X32-NEXT:    calll _test_argRetPointer627; X32-NEXT:    incl %eax628; X32-NEXT:    retl629;630; WIN64-LABEL: test_CallargRetPointer:631; WIN64:       # %bb.0:632; WIN64-NEXT:    pushq %rax633; WIN64-NEXT:    .seh_stackalloc 8634; WIN64-NEXT:    .seh_endprologue635; WIN64-NEXT:    incl %eax636; WIN64-NEXT:    callq test_argRetPointer637; WIN64-NEXT:    incl %eax638; WIN64-NEXT:    .seh_startepilogue639; WIN64-NEXT:    popq %rcx640; WIN64-NEXT:    .seh_endepilogue641; WIN64-NEXT:    retq642; WIN64-NEXT:    .seh_endproc643;644; LINUXOSX64-LABEL: test_CallargRetPointer:645; LINUXOSX64:       # %bb.0:646; LINUXOSX64-NEXT:    pushq %rax647; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 16648; LINUXOSX64-NEXT:    incl %eax649; LINUXOSX64-NEXT:    callq test_argRetPointer650; LINUXOSX64-NEXT:    incl %eax651; LINUXOSX64-NEXT:    popq %rcx652; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8653; LINUXOSX64-NEXT:    retq654  %b = ptrtoint ptr %a to i32655  %c = add i32 %b, 1656  %d = inttoptr i32 %c to ptr657  %e = call x86_regcallcc ptr @test_argRetPointer(ptr %d)658  %f = ptrtoint ptr %e to i32659  %g = add i32 %f, 1660  %h = inttoptr i32 %g to ptr661  ret ptr %h662}663 664; Test regcall when receiving/returning 128 bit vector665define dso_local x86_regcallcc <4 x i32> @test_argRet128Vector(<4 x i1> %x, <4 x i32> %a, <4 x i32> %b)  {666; X32-LABEL: test_argRet128Vector:667; X32:       # %bb.0:668; X32-NEXT:    vpslld $31, %xmm0, %xmm0669; X32-NEXT:    vpmovd2m %xmm0, %k1670; X32-NEXT:    vpblendmd %xmm1, %xmm2, %xmm0 {%k1}671; X32-NEXT:    retl672;673; WIN64-LABEL: test_argRet128Vector:674; WIN64:       # %bb.0:675; WIN64-NEXT:    vpslld $31, %xmm0, %xmm0676; WIN64-NEXT:    vpmovd2m %xmm0, %k1677; WIN64-NEXT:    vpblendmd %xmm1, %xmm2, %xmm0 {%k1}678; WIN64-NEXT:    retq679;680; LINUXOSX64-LABEL: test_argRet128Vector:681; LINUXOSX64:       # %bb.0:682; LINUXOSX64-NEXT:    vpslld $31, %xmm0, %xmm0683; LINUXOSX64-NEXT:    vpmovd2m %xmm0, %k1684; LINUXOSX64-NEXT:    vpblendmd %xmm1, %xmm2, %xmm0 {%k1}685; LINUXOSX64-NEXT:    retq686  %d = select <4 x i1> %x, <4 x i32> %a, <4 x i32> %b687  ret <4 x i32> %d688}689 690; Test regcall when passing/retrieving 128 bit vector691define dso_local x86_regcallcc <4 x i32> @test_CallargRet128Vector(<4 x i1> %x, <4 x i32> %a)  {692; X32-LABEL: test_CallargRet128Vector:693; X32:       # %bb.0:694; X32-NEXT:    subl $44, %esp695; X32-NEXT:    vmovups %xmm4, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill696; X32-NEXT:    vmovdqa %xmm1, %xmm4697; X32-NEXT:    vpslld $31, %xmm0, %xmm1698; X32-NEXT:    vpmovd2m %xmm1, %k1699; X32-NEXT:    kmovw %k1, {{[-0-9]+}}(%e{{[sb]}}p) # 2-byte Spill700; X32-NEXT:    vmovdqa %xmm4, %xmm1701; X32-NEXT:    vmovdqa %xmm4, %xmm2702; X32-NEXT:    calll _test_argRet128Vector703; X32-NEXT:    kmovw {{[-0-9]+}}(%e{{[sb]}}p), %k1 # 2-byte Reload704; X32-NEXT:    vmovdqa32 %xmm4, %xmm0 {%k1}705; X32-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm4 # 16-byte Reload706; X32-NEXT:    addl $44, %esp707; X32-NEXT:    retl708;709; WIN64-LABEL: test_CallargRet128Vector:710; WIN64:       # %bb.0:711; WIN64-NEXT:    subq $40, %rsp712; WIN64-NEXT:    .seh_stackalloc 40713; WIN64-NEXT:    vmovaps %xmm8, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill714; WIN64-NEXT:    .seh_savexmm %xmm8, 16715; WIN64-NEXT:    .seh_endprologue716; WIN64-NEXT:    vmovdqa %xmm1, %xmm8717; WIN64-NEXT:    vpslld $31, %xmm0, %xmm1718; WIN64-NEXT:    vpmovd2m %xmm1, %k1719; WIN64-NEXT:    kmovw %k1, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill720; WIN64-NEXT:    vmovdqa %xmm8, %xmm1721; WIN64-NEXT:    vmovdqa %xmm8, %xmm2722; WIN64-NEXT:    callq test_argRet128Vector723; WIN64-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 # 2-byte Reload724; WIN64-NEXT:    vmovdqa32 %xmm8, %xmm0 {%k1}725; WIN64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm8 # 16-byte Reload726; WIN64-NEXT:    .seh_startepilogue727; WIN64-NEXT:    addq $40, %rsp728; WIN64-NEXT:    .seh_endepilogue729; WIN64-NEXT:    retq730; WIN64-NEXT:    .seh_endproc731;732; LINUXOSX64-LABEL: test_CallargRet128Vector:733; LINUXOSX64:       # %bb.0:734; LINUXOSX64-NEXT:    subq $40, %rsp735; LINUXOSX64-NEXT:    vmovaps %xmm8, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill736; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 48737; LINUXOSX64-NEXT:    .cfi_offset %xmm8, -32738; LINUXOSX64-NEXT:    vmovdqa %xmm1, %xmm8739; LINUXOSX64-NEXT:    vpslld $31, %xmm0, %xmm1740; LINUXOSX64-NEXT:    vpmovd2m %xmm1, %k1741; LINUXOSX64-NEXT:    kmovw %k1, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill742; LINUXOSX64-NEXT:    vmovdqa %xmm8, %xmm1743; LINUXOSX64-NEXT:    vmovdqa %xmm8, %xmm2744; LINUXOSX64-NEXT:    callq test_argRet128Vector745; LINUXOSX64-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 # 2-byte Reload746; LINUXOSX64-NEXT:    vmovdqa32 %xmm8, %xmm0 {%k1}747; LINUXOSX64-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm8 # 16-byte Reload748; LINUXOSX64-NEXT:    addq $40, %rsp749; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8750; LINUXOSX64-NEXT:    retq751  %b = call x86_regcallcc <4 x i32> @test_argRet128Vector(<4 x i1> %x, <4 x i32> %a, <4 x i32> %a)752  %c = select <4 x i1> %x, <4 x i32> %a, <4 x i32> %b753  ret <4 x i32> %c754}755 756; Test regcall when receiving/returning 256 bit vector757define dso_local x86_regcallcc <8 x i32> @test_argRet256Vector(<8 x i1> %x, <8 x i32> %a, <8 x i32> %b)  {758; X32-LABEL: test_argRet256Vector:759; X32:       # %bb.0:760; X32-NEXT:    kmovd %eax, %k1761; X32-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}762; X32-NEXT:    retl763;764; WIN64-LABEL: test_argRet256Vector:765; WIN64:       # %bb.0:766; WIN64-NEXT:    kmovd %eax, %k1767; WIN64-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}768; WIN64-NEXT:    retq769;770; LINUXOSX64-LABEL: test_argRet256Vector:771; LINUXOSX64:       # %bb.0:772; LINUXOSX64-NEXT:    kmovd %eax, %k1773; LINUXOSX64-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1}774; LINUXOSX64-NEXT:    retq775  %d = select <8 x i1> %x, <8 x i32> %a, <8 x i32> %b776  ret <8 x i32> %d777}778 779; Test regcall when passing/retrieving 256 bit vector780define dso_local x86_regcallcc <8 x i32> @test_CallargRet256Vector(<8 x i1> %x, <8 x i32> %a)  {781; X32-LABEL: test_CallargRet256Vector:782; X32:       # %bb.0:783; X32-NEXT:    subl $36, %esp784; X32-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill785; X32-NEXT:    kmovd %eax, %k1786; X32-NEXT:    kmovw %k1, {{[-0-9]+}}(%e{{[sb]}}p) # 2-byte Spill787; X32-NEXT:    vmovdqa %ymm0, %ymm1788; X32-NEXT:    calll _test_argRet256Vector789; X32-NEXT:    kmovw {{[-0-9]+}}(%e{{[sb]}}p), %k1 # 2-byte Reload790; X32-NEXT:    vmovdqu {{[-0-9]+}}(%e{{[sb]}}p), %ymm1 # 32-byte Reload791; X32-NEXT:    vmovdqa32 %ymm1, %ymm0 {%k1}792; X32-NEXT:    addl $36, %esp793; X32-NEXT:    retl794;795; WIN64-LABEL: test_CallargRet256Vector:796; WIN64:       # %bb.0:797; WIN64-NEXT:    subq $56, %rsp798; WIN64-NEXT:    .seh_stackalloc 56799; WIN64-NEXT:    .seh_endprologue800; WIN64-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill801; WIN64-NEXT:    kmovd %eax, %k1802; WIN64-NEXT:    kmovw %k1, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill803; WIN64-NEXT:    vmovdqa %ymm0, %ymm1804; WIN64-NEXT:    callq test_argRet256Vector805; WIN64-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 # 2-byte Reload806; WIN64-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm1 # 32-byte Reload807; WIN64-NEXT:    vmovdqa32 %ymm1, %ymm0 {%k1}808; WIN64-NEXT:    .seh_startepilogue809; WIN64-NEXT:    addq $56, %rsp810; WIN64-NEXT:    .seh_endepilogue811; WIN64-NEXT:    retq812; WIN64-NEXT:    .seh_endproc813;814; LINUXOSX64-LABEL: test_CallargRet256Vector:815; LINUXOSX64:       # %bb.0:816; LINUXOSX64-NEXT:    subq $56, %rsp817; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 64818; LINUXOSX64-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill819; LINUXOSX64-NEXT:    kmovd %eax, %k1820; LINUXOSX64-NEXT:    kmovw %k1, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill821; LINUXOSX64-NEXT:    vmovdqa %ymm0, %ymm1822; LINUXOSX64-NEXT:    callq test_argRet256Vector823; LINUXOSX64-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 # 2-byte Reload824; LINUXOSX64-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm1 # 32-byte Reload825; LINUXOSX64-NEXT:    vmovdqa32 %ymm1, %ymm0 {%k1}826; LINUXOSX64-NEXT:    addq $56, %rsp827; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8828; LINUXOSX64-NEXT:    retq829  %b = call x86_regcallcc <8 x i32> @test_argRet256Vector(<8 x i1> %x, <8 x i32> %a, <8 x i32> %a)830  %c = select <8 x i1> %x, <8 x i32> %a, <8 x i32> %b831  ret <8 x i32> %c832}833 834; Test regcall when receiving/returning 512 bit vector835define dso_local x86_regcallcc <16 x i32> @test_argRet512Vector(<16 x i1> %x, <16 x i32> %a, <16 x i32> %b)  {836; X32-LABEL: test_argRet512Vector:837; X32:       # %bb.0:838; X32-NEXT:    kmovd %eax, %k1839; X32-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}840; X32-NEXT:    retl841;842; WIN64-LABEL: test_argRet512Vector:843; WIN64:       # %bb.0:844; WIN64-NEXT:    kmovd %eax, %k1845; WIN64-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}846; WIN64-NEXT:    retq847;848; LINUXOSX64-LABEL: test_argRet512Vector:849; LINUXOSX64:       # %bb.0:850; LINUXOSX64-NEXT:    kmovd %eax, %k1851; LINUXOSX64-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1}852; LINUXOSX64-NEXT:    retq853  %d = select <16 x i1> %x, <16 x i32> %a, <16 x i32> %b854  ret <16 x i32> %d855}856 857; Test regcall when passing/retrieving 512 bit vector858define dso_local x86_regcallcc <16 x i32> @test_CallargRet512Vector(<16 x i1> %x, <16 x i32> %a)  {859; X32-LABEL: test_CallargRet512Vector:860; X32:       # %bb.0:861; X32-NEXT:    subl $68, %esp862; X32-NEXT:    vmovdqu64 %zmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 64-byte Spill863; X32-NEXT:    kmovd %eax, %k1864; X32-NEXT:    kmovw %k1, {{[-0-9]+}}(%e{{[sb]}}p) # 2-byte Spill865; X32-NEXT:    vmovdqa64 %zmm0, %zmm1866; X32-NEXT:    calll _test_argRet512Vector867; X32-NEXT:    kmovw {{[-0-9]+}}(%e{{[sb]}}p), %k1 # 2-byte Reload868; X32-NEXT:    vmovdqu64 {{[-0-9]+}}(%e{{[sb]}}p), %zmm1 # 64-byte Reload869; X32-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1}870; X32-NEXT:    addl $68, %esp871; X32-NEXT:    retl872;873; WIN64-LABEL: test_CallargRet512Vector:874; WIN64:       # %bb.0:875; WIN64-NEXT:    subq $88, %rsp876; WIN64-NEXT:    .seh_stackalloc 88877; WIN64-NEXT:    .seh_endprologue878; WIN64-NEXT:    vmovdqu64 %zmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill879; WIN64-NEXT:    kmovd %eax, %k1880; WIN64-NEXT:    kmovw %k1, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill881; WIN64-NEXT:    vmovdqa64 %zmm0, %zmm1882; WIN64-NEXT:    callq test_argRet512Vector883; WIN64-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 # 2-byte Reload884; WIN64-NEXT:    vmovdqu64 {{[-0-9]+}}(%r{{[sb]}}p), %zmm1 # 64-byte Reload885; WIN64-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1}886; WIN64-NEXT:    .seh_startepilogue887; WIN64-NEXT:    addq $88, %rsp888; WIN64-NEXT:    .seh_endepilogue889; WIN64-NEXT:    retq890; WIN64-NEXT:    .seh_endproc891;892; LINUXOSX64-LABEL: test_CallargRet512Vector:893; LINUXOSX64:       # %bb.0:894; LINUXOSX64-NEXT:    subq $88, %rsp895; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 96896; LINUXOSX64-NEXT:    vmovdqu64 %zmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 64-byte Spill897; LINUXOSX64-NEXT:    kmovd %eax, %k1898; LINUXOSX64-NEXT:    kmovw %k1, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill899; LINUXOSX64-NEXT:    vmovdqa64 %zmm0, %zmm1900; LINUXOSX64-NEXT:    callq test_argRet512Vector901; LINUXOSX64-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 # 2-byte Reload902; LINUXOSX64-NEXT:    vmovdqu64 {{[-0-9]+}}(%r{{[sb]}}p), %zmm1 # 64-byte Reload903; LINUXOSX64-NEXT:    vmovdqa32 %zmm1, %zmm0 {%k1}904; LINUXOSX64-NEXT:    addq $88, %rsp905; LINUXOSX64-NEXT:    .cfi_def_cfa_offset 8906; LINUXOSX64-NEXT:    retq907  %b = call x86_regcallcc <16 x i32> @test_argRet512Vector(<16 x i1> %x, <16 x i32> %a, <16 x i32> %a)908  %c = select <16 x i1> %x, <16 x i32> %a, <16 x i32> %b909  ret <16 x i32> %c910}911 912; Test regcall when running multiple input parameters - callee saved xmms913define dso_local x86_regcallcc <32 x float> @testf32_inp(<32 x float> %a, <32 x float> %b, <32 x float> %c) nounwind {914; X32-LABEL: testf32_inp:915; X32:       # %bb.0:916; X32-NEXT:    subl $44, %esp917; X32-NEXT:    vmovups %xmm7, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill918; X32-NEXT:    vmovups %xmm6, (%esp) # 16-byte Spill919; X32-NEXT:    vaddps %zmm2, %zmm0, %zmm6920; X32-NEXT:    vaddps %zmm3, %zmm1, %zmm7921; X32-NEXT:    vmulps %zmm2, %zmm0, %zmm0922; X32-NEXT:    vsubps %zmm0, %zmm6, %zmm0923; X32-NEXT:    vmulps %zmm3, %zmm1, %zmm1924; X32-NEXT:    vsubps %zmm1, %zmm7, %zmm1925; X32-NEXT:    vaddps %zmm4, %zmm0, %zmm0926; X32-NEXT:    vaddps %zmm5, %zmm1, %zmm1927; X32-NEXT:    vmovups (%esp), %xmm6 # 16-byte Reload928; X32-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %xmm7 # 16-byte Reload929; X32-NEXT:    addl $44, %esp930; X32-NEXT:    retl931;932; WIN64-LABEL: testf32_inp:933; WIN64:       # %bb.0:934; WIN64-NEXT:    vaddps %zmm2, %zmm0, %zmm6935; WIN64-NEXT:    vaddps %zmm3, %zmm1, %zmm7936; WIN64-NEXT:    vmulps %zmm2, %zmm0, %zmm0937; WIN64-NEXT:    vsubps %zmm0, %zmm6, %zmm0938; WIN64-NEXT:    vmulps %zmm3, %zmm1, %zmm1939; WIN64-NEXT:    vsubps %zmm1, %zmm7, %zmm1940; WIN64-NEXT:    vaddps %zmm4, %zmm0, %zmm0941; WIN64-NEXT:    vaddps %zmm5, %zmm1, %zmm1942; WIN64-NEXT:    retq943;944; LINUXOSX64-LABEL: testf32_inp:945; LINUXOSX64:       # %bb.0:946; LINUXOSX64-NEXT:    vaddps %zmm2, %zmm0, %zmm6947; LINUXOSX64-NEXT:    vaddps %zmm3, %zmm1, %zmm7948; LINUXOSX64-NEXT:    vmulps %zmm2, %zmm0, %zmm0949; LINUXOSX64-NEXT:    vsubps %zmm0, %zmm6, %zmm0950; LINUXOSX64-NEXT:    vmulps %zmm3, %zmm1, %zmm1951; LINUXOSX64-NEXT:    vsubps %zmm1, %zmm7, %zmm1952; LINUXOSX64-NEXT:    vaddps %zmm4, %zmm0, %zmm0953; LINUXOSX64-NEXT:    vaddps %zmm5, %zmm1, %zmm1954; LINUXOSX64-NEXT:    retq955  %x1 = fadd <32 x float> %a, %b956  %x2 = fmul <32 x float> %a, %b957  %x3 = fsub <32 x float> %x1, %x2958  %x4 = fadd <32 x float> %x3, %c959  ret <32 x float> %x4960}961 962; Test regcall when running multiple input parameters - callee saved GPRs963define dso_local x86_regcallcc i32 @testi32_inp(i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %b1, i32 %b2, i32 %b3, i32 %b4, i32 %b5, i32 %b6) nounwind {964; X32-LABEL: testi32_inp:965; X32:       # %bb.0:966; X32-NEXT:    pushl %ebp967; X32-NEXT:    pushl %ebx968; X32-NEXT:    subl $12, %esp969; X32-NEXT:    movl %esi, (%esp) # 4-byte Spill970; X32-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill971; X32-NEXT:    movl %eax, %ebp972; X32-NEXT:    leal (%edx,%edi), %eax973; X32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill974; X32-NEXT:    movl %edx, %eax975; X32-NEXT:    subl %edi, %eax976; X32-NEXT:    movl %ebp, %edx977; X32-NEXT:    subl %ecx, %edx978; X32-NEXT:    movl {{[0-9]+}}(%esp), %ebx979; X32-NEXT:    subl {{[0-9]+}}(%esp), %ebx980; X32-NEXT:    imull %edx, %ebx981; X32-NEXT:    movl {{[0-9]+}}(%esp), %esi982; X32-NEXT:    movl %esi, %edx983; X32-NEXT:    subl {{[0-9]+}}(%esp), %edx984; X32-NEXT:    imull %eax, %edx985; X32-NEXT:    addl %ebx, %edx986; X32-NEXT:    movl {{[0-9]+}}(%esp), %ebx987; X32-NEXT:    movl (%esp), %edi # 4-byte Reload988; X32-NEXT:    subl %ebx, %edi989; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx990; X32-NEXT:    movl %ecx, %eax991; X32-NEXT:    subl {{[0-9]+}}(%esp), %eax992; X32-NEXT:    imull %edi, %eax993; X32-NEXT:    addl %edx, %eax994; X32-NEXT:    addl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Folded Reload995; X32-NEXT:    addl (%esp), %ebx # 4-byte Folded Reload996; X32-NEXT:    movl {{[0-9]+}}(%esp), %edx997; X32-NEXT:    addl {{[0-9]+}}(%esp), %edx998; X32-NEXT:    imull %edx, %ebp999; X32-NEXT:    addl {{[0-9]+}}(%esp), %esi1000; X32-NEXT:    imull {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload1001; X32-NEXT:    addl %esi, %ebp1002; X32-NEXT:    addl {{[0-9]+}}(%esp), %ecx1003; X32-NEXT:    imull %ebx, %ecx1004; X32-NEXT:    addl %ecx, %ebp1005; X32-NEXT:    addl %eax, %ebp1006; X32-NEXT:    movl %ebp, %eax1007; X32-NEXT:    addl $12, %esp1008; X32-NEXT:    popl %ebx1009; X32-NEXT:    popl %ebp1010; X32-NEXT:    retl1011;1012; WIN64-LABEL: testi32_inp:1013; WIN64:       # %bb.0:1014; WIN64-NEXT:    pushq %rbp1015; WIN64-NEXT:    pushq %rbx1016; WIN64-NEXT:    # kill: def $edx killed $edx def $rdx1017; WIN64-NEXT:    # kill: def $esi killed $esi def $rsi1018; WIN64-NEXT:    # kill: def $r15d killed $r15d def $r151019; WIN64-NEXT:    # kill: def $r14d killed $r14d def $r141020; WIN64-NEXT:    # kill: def $r12d killed $r12d def $r121021; WIN64-NEXT:    # kill: def $r11d killed $r11d def $r111022; WIN64-NEXT:    # kill: def $r10d killed $r10d def $r101023; WIN64-NEXT:    # kill: def $r9d killed $r9d def $r91024; WIN64-NEXT:    # kill: def $r8d killed $r8d def $r81025; WIN64-NEXT:    # kill: def $edi killed $edi def $rdi1026; WIN64-NEXT:    leal (%rdx,%rdi), %ebx1027; WIN64-NEXT:    movl %edx, %ebp1028; WIN64-NEXT:    subl %edi, %ebp1029; WIN64-NEXT:    leal (%rsi,%r8), %edx1030; WIN64-NEXT:    # kill: def $esi killed $esi killed $rsi1031; WIN64-NEXT:    subl %r8d, %esi1032; WIN64-NEXT:    leal (%r9,%r10), %edi1033; WIN64-NEXT:    movl %r9d, %r8d1034; WIN64-NEXT:    subl %r10d, %r8d1035; WIN64-NEXT:    movl %eax, %r9d1036; WIN64-NEXT:    subl %ecx, %r9d1037; WIN64-NEXT:    imull %r9d, %r8d1038; WIN64-NEXT:    leal (%r11,%r12), %r9d1039; WIN64-NEXT:    movl %r11d, %r10d1040; WIN64-NEXT:    subl %r12d, %r10d1041; WIN64-NEXT:    imull %ebp, %r10d1042; WIN64-NEXT:    addl %r8d, %r10d1043; WIN64-NEXT:    leal (%r14,%r15), %r8d1044; WIN64-NEXT:    movl %r14d, %r11d1045; WIN64-NEXT:    subl %r15d, %r11d1046; WIN64-NEXT:    imull %esi, %r11d1047; WIN64-NEXT:    addl %r10d, %r11d1048; WIN64-NEXT:    addl %ecx, %eax1049; WIN64-NEXT:    imull %edi, %eax1050; WIN64-NEXT:    imull %ebx, %r9d1051; WIN64-NEXT:    addl %r9d, %eax1052; WIN64-NEXT:    imull %edx, %r8d1053; WIN64-NEXT:    addl %r8d, %eax1054; WIN64-NEXT:    addl %r11d, %eax1055; WIN64-NEXT:    popq %rbx1056; WIN64-NEXT:    popq %rbp1057; WIN64-NEXT:    retq1058;1059; LINUXOSX64-LABEL: testi32_inp:1060; LINUXOSX64:       # %bb.0:1061; LINUXOSX64-NEXT:    # kill: def $edx killed $edx def $rdx1062; LINUXOSX64-NEXT:    # kill: def $esi killed $esi def $rsi1063; LINUXOSX64-NEXT:    # kill: def $r14d killed $r14d def $r141064; LINUXOSX64-NEXT:    # kill: def $r13d killed $r13d def $r131065; LINUXOSX64-NEXT:    # kill: def $r12d killed $r12d def $r121066; LINUXOSX64-NEXT:    # kill: def $r9d killed $r9d def $r91067; LINUXOSX64-NEXT:    # kill: def $r8d killed $r8d def $r81068; LINUXOSX64-NEXT:    # kill: def $edi killed $edi def $rdi1069; LINUXOSX64-NEXT:    leal (%rdx,%rdi), %r10d1070; LINUXOSX64-NEXT:    movl %edx, %r11d1071; LINUXOSX64-NEXT:    subl %edi, %r11d1072; LINUXOSX64-NEXT:    leal (%rsi,%r8), %edx1073; LINUXOSX64-NEXT:    # kill: def $esi killed $esi killed $rsi1074; LINUXOSX64-NEXT:    subl %r8d, %esi1075; LINUXOSX64-NEXT:    leal (%r9,%r12), %edi1076; LINUXOSX64-NEXT:    movl %r9d, %r8d1077; LINUXOSX64-NEXT:    subl %r12d, %r8d1078; LINUXOSX64-NEXT:    movl %eax, %r9d1079; LINUXOSX64-NEXT:    subl %ecx, %r9d1080; LINUXOSX64-NEXT:    imull %r9d, %r8d1081; LINUXOSX64-NEXT:    leal (%r13,%r14), %r9d1082; LINUXOSX64-NEXT:    movl %r13d, %r12d1083; LINUXOSX64-NEXT:    subl %r14d, %r12d1084; LINUXOSX64-NEXT:    imull %r11d, %r12d1085; LINUXOSX64-NEXT:    movl {{[0-9]+}}(%rsp), %r11d1086; LINUXOSX64-NEXT:    addl %r8d, %r12d1087; LINUXOSX64-NEXT:    movl %r15d, %r8d1088; LINUXOSX64-NEXT:    subl %r11d, %r8d1089; LINUXOSX64-NEXT:    imull %esi, %r8d1090; LINUXOSX64-NEXT:    addl %r12d, %r8d1091; LINUXOSX64-NEXT:    addl %ecx, %eax1092; LINUXOSX64-NEXT:    imull %edi, %eax1093; LINUXOSX64-NEXT:    imull %r10d, %r9d1094; LINUXOSX64-NEXT:    addl %r9d, %eax1095; LINUXOSX64-NEXT:    addl %r15d, %r11d1096; LINUXOSX64-NEXT:    imull %edx, %r11d1097; LINUXOSX64-NEXT:    addl %r11d, %eax1098; LINUXOSX64-NEXT:    addl %r8d, %eax1099; LINUXOSX64-NEXT:    retq1100  %x1 = sub i32 %a1, %a21101  %x2 = sub i32 %a3, %a41102  %x3 = sub i32 %a5, %a61103  %y1 = sub i32 %b1, %b21104  %y2 = sub i32 %b3, %b41105  %y3 = sub i32 %b5, %b61106  %v1 = add i32 %a1, %a21107  %v2 = add i32 %a3, %a41108  %v3 = add i32 %a5, %a61109  %w1 = add i32 %b1, %b21110  %w2 = add i32 %b3, %b41111  %w3 = add i32 %b5, %b61112  %s1 = mul i32 %x1, %y11113  %s2 = mul i32 %x2, %y21114  %s3 = mul i32 %x3, %y31115  %t1 = mul i32 %v1, %w11116  %t2 = mul i32 %v2, %w21117  %t3 = mul i32 %v3, %w31118  %m1 = add i32 %s1, %s21119  %m2 = add i32 %m1, %s31120  %n1 = add i32 %t1, %t21121  %n2 = add i32 %n1, %t31122  %r1 = add i32 %m2, %n21123  ret i32 %r11124}1125 1126; Test that parameters, overflowing register capacity, are passed through the stack1127define dso_local x86_regcallcc <32 x float> @testf32_stack(<32 x float> %a0, <32 x float> %b0, <32 x float> %c0, <32 x float> %a1, <32 x float> %b1, <32 x float> %c1, <32 x float> %a2, <32 x float> %b2, <32 x float> %c2) nounwind {1128; X32-LABEL: testf32_stack:1129; X32:       # %bb.0:1130; X32-NEXT:    pushl %ebp1131; X32-NEXT:    movl %esp, %ebp1132; X32-NEXT:    andl $-64, %esp1133; X32-NEXT:    subl $64, %esp1134; X32-NEXT:    vaddps %zmm3, %zmm1, %zmm11135; X32-NEXT:    vaddps %zmm2, %zmm0, %zmm01136; X32-NEXT:    vaddps %zmm0, %zmm4, %zmm01137; X32-NEXT:    vaddps %zmm1, %zmm5, %zmm11138; X32-NEXT:    vaddps %zmm1, %zmm7, %zmm11139; X32-NEXT:    vaddps %zmm0, %zmm6, %zmm01140; X32-NEXT:    vaddps 8(%ebp), %zmm0, %zmm01141; X32-NEXT:    vaddps 72(%ebp), %zmm1, %zmm11142; X32-NEXT:    vaddps 200(%ebp), %zmm1, %zmm11143; X32-NEXT:    vaddps 136(%ebp), %zmm0, %zmm01144; X32-NEXT:    vaddps 264(%ebp), %zmm0, %zmm01145; X32-NEXT:    vaddps 328(%ebp), %zmm1, %zmm11146; X32-NEXT:    vaddps 456(%ebp), %zmm1, %zmm11147; X32-NEXT:    vaddps 392(%ebp), %zmm0, %zmm01148; X32-NEXT:    vaddps 520(%ebp), %zmm0, %zmm01149; X32-NEXT:    vaddps 584(%ebp), %zmm1, %zmm11150; X32-NEXT:    movl %ebp, %esp1151; X32-NEXT:    popl %ebp1152; X32-NEXT:    retl1153;1154; WIN64-LABEL: testf32_stack:1155; WIN64:       # %bb.0:1156; WIN64-NEXT:    pushq %rbp1157; WIN64-NEXT:    subq $48, %rsp1158; WIN64-NEXT:    leaq {{[0-9]+}}(%rsp), %rbp1159; WIN64-NEXT:    andq $-64, %rsp1160; WIN64-NEXT:    vaddps %zmm3, %zmm1, %zmm11161; WIN64-NEXT:    vaddps %zmm2, %zmm0, %zmm01162; WIN64-NEXT:    vaddps %zmm0, %zmm4, %zmm01163; WIN64-NEXT:    vaddps %zmm1, %zmm5, %zmm11164; WIN64-NEXT:    vaddps %zmm1, %zmm7, %zmm11165; WIN64-NEXT:    vaddps %zmm0, %zmm6, %zmm01166; WIN64-NEXT:    vaddps %zmm0, %zmm8, %zmm01167; WIN64-NEXT:    vaddps %zmm1, %zmm9, %zmm11168; WIN64-NEXT:    vaddps %zmm1, %zmm11, %zmm11169; WIN64-NEXT:    vaddps %zmm0, %zmm10, %zmm01170; WIN64-NEXT:    vaddps %zmm0, %zmm12, %zmm01171; WIN64-NEXT:    vaddps %zmm1, %zmm13, %zmm11172; WIN64-NEXT:    vaddps %zmm1, %zmm15, %zmm11173; WIN64-NEXT:    vaddps %zmm0, %zmm14, %zmm01174; WIN64-NEXT:    vaddps 16(%rbp), %zmm0, %zmm01175; WIN64-NEXT:    vaddps 80(%rbp), %zmm1, %zmm11176; WIN64-NEXT:    movq %rbp, %rsp1177; WIN64-NEXT:    popq %rbp1178; WIN64-NEXT:    retq1179;1180; LINUXOSX64-LABEL: testf32_stack:1181; LINUXOSX64:       # %bb.0:1182; LINUXOSX64-NEXT:    pushq %rbp1183; LINUXOSX64-NEXT:    movq %rsp, %rbp1184; LINUXOSX64-NEXT:    andq $-64, %rsp1185; LINUXOSX64-NEXT:    subq $64, %rsp1186; LINUXOSX64-NEXT:    vaddps %zmm3, %zmm1, %zmm11187; LINUXOSX64-NEXT:    vaddps %zmm2, %zmm0, %zmm01188; LINUXOSX64-NEXT:    vaddps %zmm0, %zmm4, %zmm01189; LINUXOSX64-NEXT:    vaddps %zmm1, %zmm5, %zmm11190; LINUXOSX64-NEXT:    vaddps %zmm1, %zmm7, %zmm11191; LINUXOSX64-NEXT:    vaddps %zmm0, %zmm6, %zmm01192; LINUXOSX64-NEXT:    vaddps %zmm0, %zmm8, %zmm01193; LINUXOSX64-NEXT:    vaddps %zmm1, %zmm9, %zmm11194; LINUXOSX64-NEXT:    vaddps %zmm1, %zmm11, %zmm11195; LINUXOSX64-NEXT:    vaddps %zmm0, %zmm10, %zmm01196; LINUXOSX64-NEXT:    vaddps %zmm0, %zmm12, %zmm01197; LINUXOSX64-NEXT:    vaddps %zmm1, %zmm13, %zmm11198; LINUXOSX64-NEXT:    vaddps %zmm1, %zmm15, %zmm11199; LINUXOSX64-NEXT:    vaddps %zmm0, %zmm14, %zmm01200; LINUXOSX64-NEXT:    vaddps 16(%rbp), %zmm0, %zmm01201; LINUXOSX64-NEXT:    vaddps 80(%rbp), %zmm1, %zmm11202; LINUXOSX64-NEXT:    movq %rbp, %rsp1203; LINUXOSX64-NEXT:    popq %rbp1204; LINUXOSX64-NEXT:    retq1205  %x1 = fadd <32 x float> %a0, %b01206  %x2 = fadd <32 x float> %c0, %x11207  %x3 = fadd <32 x float> %a1, %x21208  %x4 = fadd <32 x float> %b1, %x31209  %x5 = fadd <32 x float> %c1, %x41210  %x6 = fadd <32 x float> %a2, %x51211  %x7 = fadd <32 x float> %b2, %x61212  %x8 = fadd <32 x float> %c2, %x71213  ret <32 x float> %x81214}1215 1216; Test regcall when passing/retrieving mixed types1217define dso_local x86_regcallcc i32 @test_argRetMixTypes(double, float, i8 signext, i32, i64, i16 signext, ptr) #0 {1218; X32-LABEL: test_argRetMixTypes:1219; X32:       # %bb.0:1220; X32-NEXT:    pushl %ebx1221; X32-NEXT:    movl {{[0-9]+}}(%esp), %ebx1222; X32-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm11223; X32-NEXT:    vaddsd %xmm0, %xmm1, %xmm01224; X32-NEXT:    vcvtsi2sd %eax, %xmm3, %xmm11225; X32-NEXT:    vaddsd %xmm1, %xmm0, %xmm01226; X32-NEXT:    vcvtsi2sd %ecx, %xmm3, %xmm11227; X32-NEXT:    vaddsd %xmm1, %xmm0, %xmm01228; X32-NEXT:    vmovd %edx, %xmm11229; X32-NEXT:    vpinsrd $1, %edi, %xmm1, %xmm11230; X32-NEXT:    vcvtqq2pd %ymm1, %ymm11231; X32-NEXT:    vaddsd %xmm1, %xmm0, %xmm01232; X32-NEXT:    vcvtsi2sd %esi, %xmm3, %xmm11233; X32-NEXT:    vaddsd %xmm1, %xmm0, %xmm01234; X32-NEXT:    vcvtsi2sdl (%ebx), %xmm3, %xmm11235; X32-NEXT:    vaddsd %xmm1, %xmm0, %xmm01236; X32-NEXT:    vcvttsd2si %xmm0, %eax1237; X32-NEXT:    popl %ebx1238; X32-NEXT:    vzeroupper1239; X32-NEXT:    retl1240;1241; WIN64-LABEL: test_argRetMixTypes:1242; WIN64:       # %bb.0:1243; WIN64-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm11244; WIN64-NEXT:    vaddsd %xmm0, %xmm1, %xmm01245; WIN64-NEXT:    vcvtsi2sd %eax, %xmm7, %xmm11246; WIN64-NEXT:    vaddsd %xmm1, %xmm0, %xmm01247; WIN64-NEXT:    vcvtsi2sd %ecx, %xmm7, %xmm11248; WIN64-NEXT:    vaddsd %xmm1, %xmm0, %xmm01249; WIN64-NEXT:    vcvtsi2sd %rdx, %xmm7, %xmm11250; WIN64-NEXT:    vaddsd %xmm1, %xmm0, %xmm01251; WIN64-NEXT:    vcvtsi2sd %edi, %xmm7, %xmm11252; WIN64-NEXT:    vaddsd %xmm1, %xmm0, %xmm01253; WIN64-NEXT:    vcvtsi2sdl (%rsi), %xmm7, %xmm11254; WIN64-NEXT:    vaddsd %xmm1, %xmm0, %xmm01255; WIN64-NEXT:    vcvttsd2si %xmm0, %eax1256; WIN64-NEXT:    retq1257;1258; LINUXOSX64-LABEL: test_argRetMixTypes:1259; LINUXOSX64:       # %bb.0:1260; LINUXOSX64-NEXT:    vcvtss2sd %xmm1, %xmm1, %xmm11261; LINUXOSX64-NEXT:    vaddsd %xmm0, %xmm1, %xmm01262; LINUXOSX64-NEXT:    vcvtsi2sd %eax, %xmm7, %xmm11263; LINUXOSX64-NEXT:    vaddsd %xmm1, %xmm0, %xmm01264; LINUXOSX64-NEXT:    vcvtsi2sd %ecx, %xmm7, %xmm11265; LINUXOSX64-NEXT:    vaddsd %xmm1, %xmm0, %xmm01266; LINUXOSX64-NEXT:    vcvtsi2sd %rdx, %xmm7, %xmm11267; LINUXOSX64-NEXT:    vaddsd %xmm1, %xmm0, %xmm01268; LINUXOSX64-NEXT:    vcvtsi2sd %edi, %xmm7, %xmm11269; LINUXOSX64-NEXT:    vaddsd %xmm1, %xmm0, %xmm01270; LINUXOSX64-NEXT:    vcvtsi2sdl (%rsi), %xmm7, %xmm11271; LINUXOSX64-NEXT:    vaddsd %xmm1, %xmm0, %xmm01272; LINUXOSX64-NEXT:    vcvttsd2si %xmm0, %eax1273; LINUXOSX64-NEXT:    retq1274  %8 = fpext float %1 to double1275  %9 = fadd double %8, %01276  %10 = sitofp i8 %2 to double1277  %11 = fadd double %9, %101278  %12 = sitofp i32 %3 to double1279  %13 = fadd double %11, %121280  %14 = sitofp i64 %4 to double1281  %15 = fadd double %13, %141282  %16 = sitofp i16 %5 to double1283  %17 = fadd double %15, %161284  %18 = load i32, ptr %6, align 41285  %19 = sitofp i32 %18 to double1286  %20 = fadd double %17, %191287  %21 = fptosi double %20 to i321288  ret i32 %211289}1290 1291%struct.complex = type { float, double, i32, i8, i64}1292 1293define x86_regcallcc %struct.complex @test_argMultiRet(float, double, i32, i8, i64) local_unnamed_addr #0 {1294; X32-LABEL: test_argMultiRet:1295; X32:       # %bb.0:1296; X32-NEXT:    vaddsd __real@4014000000000000, %xmm1, %xmm11297; X32-NEXT:    movl $4, %eax1298; X32-NEXT:    movb $7, %cl1299; X32-NEXT:    movl $999, %edx # imm = 0x3E71300; X32-NEXT:    xorl %edi, %edi1301; X32-NEXT:    retl1302;1303; WIN64-LABEL: test_argMultiRet:1304; WIN64:       # %bb.0:1305; WIN64-NEXT:    vaddsd __real@4014000000000000(%rip), %xmm1, %xmm11306; WIN64-NEXT:    movl $999, %edx # imm = 0x3E71307; WIN64-NEXT:    movl $4, %eax1308; WIN64-NEXT:    movb $7, %cl1309; WIN64-NEXT:    retq1310;1311; LINUXOSX64-LABEL: test_argMultiRet:1312; LINUXOSX64:       # %bb.0:1313; LINUXOSX64-NEXT:    vaddsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm11314; LINUXOSX64-NEXT:    movl $999, %edx # imm = 0x3E71315; LINUXOSX64-NEXT:    movl $4, %eax1316; LINUXOSX64-NEXT:    movb $7, %cl1317; LINUXOSX64-NEXT:    retq1318  %6 = fadd double %1, 5.000000e+001319  %7 = insertvalue %struct.complex undef, float %0, 01320  %8 = insertvalue %struct.complex %7, double %6, 11321  %9 = insertvalue %struct.complex %8, i32 4, 21322  %10 = insertvalue %struct.complex %9, i8 7, 31323  %11 = insertvalue %struct.complex %10, i64 999, 41324  ret %struct.complex %111325}1326