brintos

brintos / llvm-project-archived public Read only

0
0
Text · 40.9 KiB · 2174d50 Raw
1110 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --no_x86_scrub_sp2 3; Combined ABI tests for fp128 and i1284 5; RUN: sed 's/PrimTy/fp128/g' %s | sed 's/Prim0/0xL0/g' | llc -mtriple=x86_64-unknown-linux-gnu -verify-machineinstrs | FileCheck %s --check-prefix=CHECK-X64-F1286; RUN: sed 's/PrimTy/i128/g'  %s | sed 's/Prim0/0/g'    | llc -mtriple=x86_64-unknown-linux-gnu -verify-machineinstrs | FileCheck %s --check-prefix=CHECK-X64-I1287; RUN: sed 's/PrimTy/fp128/g' %s | sed 's/Prim0/0xL0/g' | llc -mtriple=x86_64-pc-windows-msvc -verify-machineinstrs   | FileCheck %s --check-prefix=CHECK-MSVC64-F1288; RUN: sed 's/PrimTy/i128/g'  %s | sed 's/Prim0/0/g'    | llc -mtriple=x86_64-pc-windows-msvc -verify-machineinstrs   | FileCheck %s --check-prefix=CHECK-MSVC64-I1289; RUN: sed 's/PrimTy/fp128/g' %s | sed 's/Prim0/0xL0/g' | llc -mtriple=x86_64-pc-windows-gnu -verify-machineinstrs    | FileCheck %s --check-prefix=CHECK-MINGW-F12810; RUN: sed 's/PrimTy/i128/g'  %s | sed 's/Prim0/0/g'    | llc -mtriple=x86_64-pc-windows-gnu -verify-machineinstrs    | FileCheck %s --check-prefix=CHECK-MINGW-I12811;12; Use the same directive for i128 and fp128 on x86-32 since both are passed and returned on the stack.13; RUN: sed 's/PrimTy/fp128/g' %s | sed 's/Prim0/0xL0/g' | llc -mtriple=i686-unknown-linux-gnu -verify-machineinstrs   | FileCheck %s --check-prefix=CHECK-X8614; RUN: sed 's/PrimTy/i128/g'  %s | sed 's/Prim0/0/g'    | llc -mtriple=i686-unknown-linux-gnu -verify-machineinstrs   | FileCheck %s --check-prefix=CHECK-X8615; RUN: sed 's/PrimTy/fp128/g' %s | sed 's/Prim0/0xL0/g' | llc -mtriple=i686-pc-windows-msvc -verify-machineinstrs     | FileCheck %s --check-prefix=CHECK-MSVC3216; RUN: sed 's/PrimTy/i128/g'  %s | sed 's/Prim0/0/g'    | llc -mtriple=i686-pc-windows-msvc -verify-machineinstrs     | FileCheck %s --check-prefix=CHECK-MSVC3217 18define void @store(PrimTy %x, ptr %p) nounwind {19; CHECK-X64-F128-LABEL: store:20; CHECK-X64-F128:       # %bb.0:21; CHECK-X64-F128-NEXT:    movaps %xmm0, (%rdi)22; CHECK-X64-F128-NEXT:    retq23;24; CHECK-X64-I128-LABEL: store:25; CHECK-X64-I128:       # %bb.0:26; CHECK-X64-I128-NEXT:    movq %rsi, 8(%rdx)27; CHECK-X64-I128-NEXT:    movq %rdi, (%rdx)28; CHECK-X64-I128-NEXT:    retq29;30; CHECK-MSVC64-F128-LABEL: store:31; CHECK-MSVC64-F128:       # %bb.0:32; CHECK-MSVC64-F128-NEXT:    movaps (%rcx), %xmm033; CHECK-MSVC64-F128-NEXT:    movaps %xmm0, (%rdx)34; CHECK-MSVC64-F128-NEXT:    retq35;36; CHECK-MSVC64-I128-LABEL: store:37; CHECK-MSVC64-I128:       # %bb.0:38; CHECK-MSVC64-I128-NEXT:    movq %rdx, 8(%r8)39; CHECK-MSVC64-I128-NEXT:    movq %rcx, (%r8)40; CHECK-MSVC64-I128-NEXT:    retq41;42; CHECK-MINGW-F128-LABEL: store:43; CHECK-MINGW-F128:       # %bb.0:44; CHECK-MINGW-F128-NEXT:    movaps (%rcx), %xmm045; CHECK-MINGW-F128-NEXT:    movaps %xmm0, (%rdx)46; CHECK-MINGW-F128-NEXT:    retq47;48; CHECK-MINGW-I128-LABEL: store:49; CHECK-MINGW-I128:       # %bb.0:50; CHECK-MINGW-I128-NEXT:    movq %rdx, 8(%r8)51; CHECK-MINGW-I128-NEXT:    movq %rcx, (%r8)52; CHECK-MINGW-I128-NEXT:    retq53;54; CHECK-X86-LABEL: store:55; CHECK-X86:       # %bb.0:56; CHECK-X86-NEXT:    pushl %edi57; CHECK-X86-NEXT:    pushl %esi58; CHECK-X86-NEXT:    pushl %eax59; CHECK-X86-NEXT:    movl 16(%esp), %eax60; CHECK-X86-NEXT:    movl 20(%esp), %ecx61; CHECK-X86-NEXT:    movl 24(%esp), %edx62; CHECK-X86-NEXT:    movl 28(%esp), %esi63; CHECK-X86-NEXT:    movl 32(%esp), %edi64; CHECK-X86-NEXT:    movl %esi, 12(%edi)65; CHECK-X86-NEXT:    movl %edx, 8(%edi)66; CHECK-X86-NEXT:    movl %ecx, 4(%edi)67; CHECK-X86-NEXT:    movl %eax, (%edi)68; CHECK-X86-NEXT:    addl $4, %esp69; CHECK-X86-NEXT:    popl %esi70; CHECK-X86-NEXT:    popl %edi71; CHECK-X86-NEXT:    retl72;73; CHECK-MSVC32-LABEL: store:74; CHECK-MSVC32:       # %bb.0:75; CHECK-MSVC32-NEXT:    pushl %ebp76; CHECK-MSVC32-NEXT:    movl %esp, %ebp77; CHECK-MSVC32-NEXT:    pushl %edi78; CHECK-MSVC32-NEXT:    pushl %esi79; CHECK-MSVC32-NEXT:    andl $-16, %esp80; CHECK-MSVC32-NEXT:    movl 8(%ebp), %eax81; CHECK-MSVC32-NEXT:    movl 12(%ebp), %ecx82; CHECK-MSVC32-NEXT:    movl 16(%ebp), %edx83; CHECK-MSVC32-NEXT:    movl 20(%ebp), %esi84; CHECK-MSVC32-NEXT:    movl 24(%ebp), %edi85; CHECK-MSVC32-NEXT:    movl %esi, 12(%edi)86; CHECK-MSVC32-NEXT:    movl %edx, 8(%edi)87; CHECK-MSVC32-NEXT:    movl %ecx, 4(%edi)88; CHECK-MSVC32-NEXT:    movl %eax, (%edi)89; CHECK-MSVC32-NEXT:    leal -8(%ebp), %esp90; CHECK-MSVC32-NEXT:    popl %esi91; CHECK-MSVC32-NEXT:    popl %edi92; CHECK-MSVC32-NEXT:    popl %ebp93; CHECK-MSVC32-NEXT:    retl94  store PrimTy %x, ptr %p95  ret void96}97 98; Illustrate stack alignment99define void @store_perturbed(i8 %_0, PrimTy %x, ptr %p) nounwind {100; CHECK-X64-F128-LABEL: store_perturbed:101; CHECK-X64-F128:       # %bb.0:102; CHECK-X64-F128-NEXT:    movaps %xmm0, (%rsi)103; CHECK-X64-F128-NEXT:    retq104;105; CHECK-X64-I128-LABEL: store_perturbed:106; CHECK-X64-I128:       # %bb.0:107; CHECK-X64-I128-NEXT:    movq %rdx, 8(%rcx)108; CHECK-X64-I128-NEXT:    movq %rsi, (%rcx)109; CHECK-X64-I128-NEXT:    retq110;111; CHECK-MSVC64-F128-LABEL: store_perturbed:112; CHECK-MSVC64-F128:       # %bb.0:113; CHECK-MSVC64-F128-NEXT:    movaps (%rdx), %xmm0114; CHECK-MSVC64-F128-NEXT:    movaps %xmm0, (%r8)115; CHECK-MSVC64-F128-NEXT:    retq116;117; CHECK-MSVC64-I128-LABEL: store_perturbed:118; CHECK-MSVC64-I128:       # %bb.0:119; CHECK-MSVC64-I128-NEXT:    movq %r8, 8(%r9)120; CHECK-MSVC64-I128-NEXT:    movq %rdx, (%r9)121; CHECK-MSVC64-I128-NEXT:    retq122;123; CHECK-MINGW-F128-LABEL: store_perturbed:124; CHECK-MINGW-F128:       # %bb.0:125; CHECK-MINGW-F128-NEXT:    movaps (%rdx), %xmm0126; CHECK-MINGW-F128-NEXT:    movaps %xmm0, (%r8)127; CHECK-MINGW-F128-NEXT:    retq128;129; CHECK-MINGW-I128-LABEL: store_perturbed:130; CHECK-MINGW-I128:       # %bb.0:131; CHECK-MINGW-I128-NEXT:    movq %r8, 8(%r9)132; CHECK-MINGW-I128-NEXT:    movq %rdx, (%r9)133; CHECK-MINGW-I128-NEXT:    retq134;135; CHECK-X86-LABEL: store_perturbed:136; CHECK-X86:       # %bb.0:137; CHECK-X86-NEXT:    pushl %edi138; CHECK-X86-NEXT:    pushl %esi139; CHECK-X86-NEXT:    pushl %eax140; CHECK-X86-NEXT:    movl 32(%esp), %eax141; CHECK-X86-NEXT:    movl 36(%esp), %ecx142; CHECK-X86-NEXT:    movl 40(%esp), %edx143; CHECK-X86-NEXT:    movl 44(%esp), %esi144; CHECK-X86-NEXT:    movl 48(%esp), %edi145; CHECK-X86-NEXT:    movl %esi, 12(%edi)146; CHECK-X86-NEXT:    movl %edx, 8(%edi)147; CHECK-X86-NEXT:    movl %ecx, 4(%edi)148; CHECK-X86-NEXT:    movl %eax, (%edi)149; CHECK-X86-NEXT:    addl $4, %esp150; CHECK-X86-NEXT:    popl %esi151; CHECK-X86-NEXT:    popl %edi152; CHECK-X86-NEXT:    retl153;154; CHECK-MSVC32-LABEL: store_perturbed:155; CHECK-MSVC32:       # %bb.0:156; CHECK-MSVC32-NEXT:    pushl %ebp157; CHECK-MSVC32-NEXT:    movl %esp, %ebp158; CHECK-MSVC32-NEXT:    pushl %edi159; CHECK-MSVC32-NEXT:    pushl %esi160; CHECK-MSVC32-NEXT:    andl $-16, %esp161; CHECK-MSVC32-NEXT:    movl 24(%ebp), %eax162; CHECK-MSVC32-NEXT:    movl 28(%ebp), %ecx163; CHECK-MSVC32-NEXT:    movl 32(%ebp), %edx164; CHECK-MSVC32-NEXT:    movl 36(%ebp), %esi165; CHECK-MSVC32-NEXT:    movl 40(%ebp), %edi166; CHECK-MSVC32-NEXT:    movl %esi, 12(%edi)167; CHECK-MSVC32-NEXT:    movl %edx, 8(%edi)168; CHECK-MSVC32-NEXT:    movl %ecx, 4(%edi)169; CHECK-MSVC32-NEXT:    movl %eax, (%edi)170; CHECK-MSVC32-NEXT:    leal -8(%ebp), %esp171; CHECK-MSVC32-NEXT:    popl %esi172; CHECK-MSVC32-NEXT:    popl %edi173; CHECK-MSVC32-NEXT:    popl %ebp174; CHECK-MSVC32-NEXT:    retl175  store PrimTy %x, ptr %p176  ret void177}178 179define PrimTy @return(ptr %p) nounwind {180; CHECK-X64-F128-LABEL: return:181; CHECK-X64-F128:       # %bb.0:182; CHECK-X64-F128-NEXT:    movaps (%rdi), %xmm0183; CHECK-X64-F128-NEXT:    retq184;185; CHECK-X64-I128-LABEL: return:186; CHECK-X64-I128:       # %bb.0:187; CHECK-X64-I128-NEXT:    movq (%rdi), %rax188; CHECK-X64-I128-NEXT:    movq 8(%rdi), %rdx189; CHECK-X64-I128-NEXT:    retq190;191; CHECK-MSVC64-F128-LABEL: return:192; CHECK-MSVC64-F128:       # %bb.0:193; CHECK-MSVC64-F128-NEXT:    movaps (%rcx), %xmm0194; CHECK-MSVC64-F128-NEXT:    retq195;196; CHECK-MSVC64-I128-LABEL: return:197; CHECK-MSVC64-I128:       # %bb.0:198; CHECK-MSVC64-I128-NEXT:    movq (%rcx), %rax199; CHECK-MSVC64-I128-NEXT:    movq 8(%rcx), %rdx200; CHECK-MSVC64-I128-NEXT:    retq201;202; CHECK-MINGW-F128-LABEL: return:203; CHECK-MINGW-F128:       # %bb.0:204; CHECK-MINGW-F128-NEXT:    movaps (%rcx), %xmm0205; CHECK-MINGW-F128-NEXT:    retq206;207; CHECK-MINGW-I128-LABEL: return:208; CHECK-MINGW-I128:       # %bb.0:209; CHECK-MINGW-I128-NEXT:    movq (%rcx), %rax210; CHECK-MINGW-I128-NEXT:    movq 8(%rcx), %rdx211; CHECK-MINGW-I128-NEXT:    retq212;213; CHECK-X86-LABEL: return:214; CHECK-X86:       # %bb.0:215; CHECK-X86-NEXT:    pushl %edi216; CHECK-X86-NEXT:    pushl %esi217; CHECK-X86-NEXT:    movl 12(%esp), %eax218; CHECK-X86-NEXT:    movl 16(%esp), %ecx219; CHECK-X86-NEXT:    movl (%ecx), %edx220; CHECK-X86-NEXT:    movl 4(%ecx), %esi221; CHECK-X86-NEXT:    movl 8(%ecx), %edi222; CHECK-X86-NEXT:    movl 12(%ecx), %ecx223; CHECK-X86-NEXT:    movl %ecx, 12(%eax)224; CHECK-X86-NEXT:    movl %edi, 8(%eax)225; CHECK-X86-NEXT:    movl %esi, 4(%eax)226; CHECK-X86-NEXT:    movl %edx, (%eax)227; CHECK-X86-NEXT:    popl %esi228; CHECK-X86-NEXT:    popl %edi229; CHECK-X86-NEXT:    retl $4230;231; CHECK-MSVC32-LABEL: return:232; CHECK-MSVC32:       # %bb.0:233; CHECK-MSVC32-NEXT:    pushl %edi234; CHECK-MSVC32-NEXT:    pushl %esi235; CHECK-MSVC32-NEXT:    movl 12(%esp), %eax236; CHECK-MSVC32-NEXT:    movl 16(%esp), %ecx237; CHECK-MSVC32-NEXT:    movl (%ecx), %edx238; CHECK-MSVC32-NEXT:    movl 4(%ecx), %esi239; CHECK-MSVC32-NEXT:    movl 8(%ecx), %edi240; CHECK-MSVC32-NEXT:    movl 12(%ecx), %ecx241; CHECK-MSVC32-NEXT:    movl %ecx, 12(%eax)242; CHECK-MSVC32-NEXT:    movl %edi, 8(%eax)243; CHECK-MSVC32-NEXT:    movl %esi, 4(%eax)244; CHECK-MSVC32-NEXT:    movl %edx, (%eax)245; CHECK-MSVC32-NEXT:    popl %esi246; CHECK-MSVC32-NEXT:    popl %edi247; CHECK-MSVC32-NEXT:    retl248  %r = load PrimTy, ptr %p, align 16249  ret PrimTy %r250}251 252define PrimTy @first_arg(PrimTy %x) nounwind {253; CHECK-X64-F128-LABEL: first_arg:254; CHECK-X64-F128:       # %bb.0:255; CHECK-X64-F128-NEXT:    retq256;257; CHECK-X64-I128-LABEL: first_arg:258; CHECK-X64-I128:       # %bb.0:259; CHECK-X64-I128-NEXT:    movq %rsi, %rdx260; CHECK-X64-I128-NEXT:    movq %rdi, %rax261; CHECK-X64-I128-NEXT:    retq262;263; CHECK-MSVC64-F128-LABEL: first_arg:264; CHECK-MSVC64-F128:       # %bb.0:265; CHECK-MSVC64-F128-NEXT:    movaps (%rcx), %xmm0266; CHECK-MSVC64-F128-NEXT:    retq267;268; CHECK-MSVC64-I128-LABEL: first_arg:269; CHECK-MSVC64-I128:       # %bb.0:270; CHECK-MSVC64-I128-NEXT:    movq %rcx, %rax271; CHECK-MSVC64-I128-NEXT:    retq272;273; CHECK-MINGW-F128-LABEL: first_arg:274; CHECK-MINGW-F128:       # %bb.0:275; CHECK-MINGW-F128-NEXT:    movaps (%rcx), %xmm0276; CHECK-MINGW-F128-NEXT:    retq277;278; CHECK-MINGW-I128-LABEL: first_arg:279; CHECK-MINGW-I128:       # %bb.0:280; CHECK-MINGW-I128-NEXT:    movq %rcx, %rax281; CHECK-MINGW-I128-NEXT:    retq282;283; CHECK-X86-LABEL: first_arg:284; CHECK-X86:       # %bb.0:285; CHECK-X86-NEXT:    pushl %edi286; CHECK-X86-NEXT:    pushl %esi287; CHECK-X86-NEXT:    pushl %eax288; CHECK-X86-NEXT:    movl 16(%esp), %eax289; CHECK-X86-NEXT:    movl 32(%esp), %ecx290; CHECK-X86-NEXT:    movl 36(%esp), %edx291; CHECK-X86-NEXT:    movl 40(%esp), %esi292; CHECK-X86-NEXT:    movl 44(%esp), %edi293; CHECK-X86-NEXT:    movl %edi, 12(%eax)294; CHECK-X86-NEXT:    movl %esi, 8(%eax)295; CHECK-X86-NEXT:    movl %edx, 4(%eax)296; CHECK-X86-NEXT:    movl %ecx, (%eax)297; CHECK-X86-NEXT:    addl $4, %esp298; CHECK-X86-NEXT:    popl %esi299; CHECK-X86-NEXT:    popl %edi300; CHECK-X86-NEXT:    retl $4301;302; CHECK-MSVC32-LABEL: first_arg:303; CHECK-MSVC32:       # %bb.0:304; CHECK-MSVC32-NEXT:    pushl %ebp305; CHECK-MSVC32-NEXT:    movl %esp, %ebp306; CHECK-MSVC32-NEXT:    pushl %edi307; CHECK-MSVC32-NEXT:    pushl %esi308; CHECK-MSVC32-NEXT:    andl $-16, %esp309; CHECK-MSVC32-NEXT:    movl 8(%ebp), %eax310; CHECK-MSVC32-NEXT:    movl 24(%ebp), %ecx311; CHECK-MSVC32-NEXT:    movl 28(%ebp), %edx312; CHECK-MSVC32-NEXT:    movl 32(%ebp), %esi313; CHECK-MSVC32-NEXT:    movl 36(%ebp), %edi314; CHECK-MSVC32-NEXT:    movl %edi, 12(%eax)315; CHECK-MSVC32-NEXT:    movl %esi, 8(%eax)316; CHECK-MSVC32-NEXT:    movl %edx, 4(%eax)317; CHECK-MSVC32-NEXT:    movl %ecx, (%eax)318; CHECK-MSVC32-NEXT:    leal -8(%ebp), %esp319; CHECK-MSVC32-NEXT:    popl %esi320; CHECK-MSVC32-NEXT:    popl %edi321; CHECK-MSVC32-NEXT:    popl %ebp322; CHECK-MSVC32-NEXT:    retl323  ret PrimTy %x324}325 326; Leading args such that i128 is the last possible position where it still327; gets passed in registers.328define PrimTy @leading_args(i64 %_0, i64 %_1, i64 %_2, i64 %_3, PrimTy %x) nounwind {329; CHECK-X64-F128-LABEL: leading_args:330; CHECK-X64-F128:       # %bb.0:331; CHECK-X64-F128-NEXT:    retq332;333; CHECK-X64-I128-LABEL: leading_args:334; CHECK-X64-I128:       # %bb.0:335; CHECK-X64-I128-NEXT:    movq %r9, %rdx336; CHECK-X64-I128-NEXT:    movq %r8, %rax337; CHECK-X64-I128-NEXT:    retq338;339; CHECK-MSVC64-F128-LABEL: leading_args:340; CHECK-MSVC64-F128:       # %bb.0:341; CHECK-MSVC64-F128-NEXT:    movq 40(%rsp), %rax342; CHECK-MSVC64-F128-NEXT:    movaps (%rax), %xmm0343; CHECK-MSVC64-F128-NEXT:    retq344;345; CHECK-MSVC64-I128-LABEL: leading_args:346; CHECK-MSVC64-I128:       # %bb.0:347; CHECK-MSVC64-I128-NEXT:    movq 40(%rsp), %rax348; CHECK-MSVC64-I128-NEXT:    movq 48(%rsp), %rdx349; CHECK-MSVC64-I128-NEXT:    retq350;351; CHECK-MINGW-F128-LABEL: leading_args:352; CHECK-MINGW-F128:       # %bb.0:353; CHECK-MINGW-F128-NEXT:    movq 40(%rsp), %rax354; CHECK-MINGW-F128-NEXT:    movaps (%rax), %xmm0355; CHECK-MINGW-F128-NEXT:    retq356;357; CHECK-MINGW-I128-LABEL: leading_args:358; CHECK-MINGW-I128:       # %bb.0:359; CHECK-MINGW-I128-NEXT:    movq 40(%rsp), %rax360; CHECK-MINGW-I128-NEXT:    movq 48(%rsp), %rdx361; CHECK-MINGW-I128-NEXT:    retq362;363; CHECK-X86-LABEL: leading_args:364; CHECK-X86:       # %bb.0:365; CHECK-X86-NEXT:    pushl %edi366; CHECK-X86-NEXT:    pushl %esi367; CHECK-X86-NEXT:    pushl %eax368; CHECK-X86-NEXT:    movl 16(%esp), %eax369; CHECK-X86-NEXT:    movl 64(%esp), %ecx370; CHECK-X86-NEXT:    movl 68(%esp), %edx371; CHECK-X86-NEXT:    movl 72(%esp), %esi372; CHECK-X86-NEXT:    movl 76(%esp), %edi373; CHECK-X86-NEXT:    movl %edi, 12(%eax)374; CHECK-X86-NEXT:    movl %esi, 8(%eax)375; CHECK-X86-NEXT:    movl %edx, 4(%eax)376; CHECK-X86-NEXT:    movl %ecx, (%eax)377; CHECK-X86-NEXT:    addl $4, %esp378; CHECK-X86-NEXT:    popl %esi379; CHECK-X86-NEXT:    popl %edi380; CHECK-X86-NEXT:    retl $4381;382; CHECK-MSVC32-LABEL: leading_args:383; CHECK-MSVC32:       # %bb.0:384; CHECK-MSVC32-NEXT:    pushl %ebp385; CHECK-MSVC32-NEXT:    movl %esp, %ebp386; CHECK-MSVC32-NEXT:    pushl %edi387; CHECK-MSVC32-NEXT:    pushl %esi388; CHECK-MSVC32-NEXT:    andl $-16, %esp389; CHECK-MSVC32-NEXT:    movl 8(%ebp), %eax390; CHECK-MSVC32-NEXT:    movl 56(%ebp), %ecx391; CHECK-MSVC32-NEXT:    movl 60(%ebp), %edx392; CHECK-MSVC32-NEXT:    movl 64(%ebp), %esi393; CHECK-MSVC32-NEXT:    movl 68(%ebp), %edi394; CHECK-MSVC32-NEXT:    movl %edi, 12(%eax)395; CHECK-MSVC32-NEXT:    movl %esi, 8(%eax)396; CHECK-MSVC32-NEXT:    movl %edx, 4(%eax)397; CHECK-MSVC32-NEXT:    movl %ecx, (%eax)398; CHECK-MSVC32-NEXT:    leal -8(%ebp), %esp399; CHECK-MSVC32-NEXT:    popl %esi400; CHECK-MSVC32-NEXT:    popl %edi401; CHECK-MSVC32-NEXT:    popl %ebp402; CHECK-MSVC32-NEXT:    retl403  ret PrimTy %x404}405 406; The i128 of interest must be in memory.407define PrimTy @many_leading_args(i64 %_0, i64 %_1, i64 %_2, i64 %_3, i64 %_4, PrimTy %_5, PrimTy %x) nounwind {408; CHECK-X64-F128-LABEL: many_leading_args:409; CHECK-X64-F128:       # %bb.0:410; CHECK-X64-F128-NEXT:    movaps %xmm1, %xmm0411; CHECK-X64-F128-NEXT:    retq412;413; CHECK-X64-I128-LABEL: many_leading_args:414; CHECK-X64-I128:       # %bb.0:415; CHECK-X64-I128-NEXT:    movq 24(%rsp), %rax416; CHECK-X64-I128-NEXT:    movq 32(%rsp), %rdx417; CHECK-X64-I128-NEXT:    retq418;419; CHECK-MSVC64-F128-LABEL: many_leading_args:420; CHECK-MSVC64-F128:       # %bb.0:421; CHECK-MSVC64-F128-NEXT:    movq 56(%rsp), %rax422; CHECK-MSVC64-F128-NEXT:    movaps (%rax), %xmm0423; CHECK-MSVC64-F128-NEXT:    retq424;425; CHECK-MSVC64-I128-LABEL: many_leading_args:426; CHECK-MSVC64-I128:       # %bb.0:427; CHECK-MSVC64-I128-NEXT:    movq 64(%rsp), %rax428; CHECK-MSVC64-I128-NEXT:    movq 72(%rsp), %rdx429; CHECK-MSVC64-I128-NEXT:    retq430;431; CHECK-MINGW-F128-LABEL: many_leading_args:432; CHECK-MINGW-F128:       # %bb.0:433; CHECK-MINGW-F128-NEXT:    movq 56(%rsp), %rax434; CHECK-MINGW-F128-NEXT:    movaps (%rax), %xmm0435; CHECK-MINGW-F128-NEXT:    retq436;437; CHECK-MINGW-I128-LABEL: many_leading_args:438; CHECK-MINGW-I128:       # %bb.0:439; CHECK-MINGW-I128-NEXT:    movq 64(%rsp), %rax440; CHECK-MINGW-I128-NEXT:    movq 72(%rsp), %rdx441; CHECK-MINGW-I128-NEXT:    retq442;443; CHECK-X86-LABEL: many_leading_args:444; CHECK-X86:       # %bb.0:445; CHECK-X86-NEXT:    pushl %edi446; CHECK-X86-NEXT:    pushl %esi447; CHECK-X86-NEXT:    pushl %eax448; CHECK-X86-NEXT:    movl 16(%esp), %eax449; CHECK-X86-NEXT:    movl 80(%esp), %ecx450; CHECK-X86-NEXT:    movl 84(%esp), %edx451; CHECK-X86-NEXT:    movl 88(%esp), %esi452; CHECK-X86-NEXT:    movl 92(%esp), %edi453; CHECK-X86-NEXT:    movl %edi, 12(%eax)454; CHECK-X86-NEXT:    movl %esi, 8(%eax)455; CHECK-X86-NEXT:    movl %edx, 4(%eax)456; CHECK-X86-NEXT:    movl %ecx, (%eax)457; CHECK-X86-NEXT:    addl $4, %esp458; CHECK-X86-NEXT:    popl %esi459; CHECK-X86-NEXT:    popl %edi460; CHECK-X86-NEXT:    retl $4461;462; CHECK-MSVC32-LABEL: many_leading_args:463; CHECK-MSVC32:       # %bb.0:464; CHECK-MSVC32-NEXT:    pushl %ebp465; CHECK-MSVC32-NEXT:    movl %esp, %ebp466; CHECK-MSVC32-NEXT:    pushl %edi467; CHECK-MSVC32-NEXT:    pushl %esi468; CHECK-MSVC32-NEXT:    andl $-16, %esp469; CHECK-MSVC32-NEXT:    movl 8(%ebp), %eax470; CHECK-MSVC32-NEXT:    movl 72(%ebp), %ecx471; CHECK-MSVC32-NEXT:    movl 76(%ebp), %edx472; CHECK-MSVC32-NEXT:    movl 80(%ebp), %esi473; CHECK-MSVC32-NEXT:    movl 84(%ebp), %edi474; CHECK-MSVC32-NEXT:    movl %edi, 12(%eax)475; CHECK-MSVC32-NEXT:    movl %esi, 8(%eax)476; CHECK-MSVC32-NEXT:    movl %edx, 4(%eax)477; CHECK-MSVC32-NEXT:    movl %ecx, (%eax)478; CHECK-MSVC32-NEXT:    leal -8(%ebp), %esp479; CHECK-MSVC32-NEXT:    popl %esi480; CHECK-MSVC32-NEXT:    popl %edi481; CHECK-MSVC32-NEXT:    popl %ebp482; CHECK-MSVC32-NEXT:    retl483  ret PrimTy %x484}485 486define PrimTy @trailing_arg(i64 %_0, i64 %_1, i64 %_2, i64 %_3, i64 %_4, PrimTy %x, i64 %_5) nounwind {487; CHECK-X64-F128-LABEL: trailing_arg:488; CHECK-X64-F128:       # %bb.0:489; CHECK-X64-F128-NEXT:    retq490;491; CHECK-X64-I128-LABEL: trailing_arg:492; CHECK-X64-I128:       # %bb.0:493; CHECK-X64-I128-NEXT:    movq 8(%rsp), %rax494; CHECK-X64-I128-NEXT:    movq 16(%rsp), %rdx495; CHECK-X64-I128-NEXT:    retq496;497; CHECK-MSVC64-F128-LABEL: trailing_arg:498; CHECK-MSVC64-F128:       # %bb.0:499; CHECK-MSVC64-F128-NEXT:    movq 48(%rsp), %rax500; CHECK-MSVC64-F128-NEXT:    movaps (%rax), %xmm0501; CHECK-MSVC64-F128-NEXT:    retq502;503; CHECK-MSVC64-I128-LABEL: trailing_arg:504; CHECK-MSVC64-I128:       # %bb.0:505; CHECK-MSVC64-I128-NEXT:    movq 48(%rsp), %rax506; CHECK-MSVC64-I128-NEXT:    movq 56(%rsp), %rdx507; CHECK-MSVC64-I128-NEXT:    retq508;509; CHECK-MINGW-F128-LABEL: trailing_arg:510; CHECK-MINGW-F128:       # %bb.0:511; CHECK-MINGW-F128-NEXT:    movq 48(%rsp), %rax512; CHECK-MINGW-F128-NEXT:    movaps (%rax), %xmm0513; CHECK-MINGW-F128-NEXT:    retq514;515; CHECK-MINGW-I128-LABEL: trailing_arg:516; CHECK-MINGW-I128:       # %bb.0:517; CHECK-MINGW-I128-NEXT:    movq 48(%rsp), %rax518; CHECK-MINGW-I128-NEXT:    movq 56(%rsp), %rdx519; CHECK-MINGW-I128-NEXT:    retq520;521; CHECK-X86-LABEL: trailing_arg:522; CHECK-X86:       # %bb.0:523; CHECK-X86-NEXT:    pushl %edi524; CHECK-X86-NEXT:    pushl %esi525; CHECK-X86-NEXT:    pushl %eax526; CHECK-X86-NEXT:    movl 16(%esp), %eax527; CHECK-X86-NEXT:    movl 64(%esp), %ecx528; CHECK-X86-NEXT:    movl 68(%esp), %edx529; CHECK-X86-NEXT:    movl 72(%esp), %esi530; CHECK-X86-NEXT:    movl 76(%esp), %edi531; CHECK-X86-NEXT:    movl %edi, 12(%eax)532; CHECK-X86-NEXT:    movl %esi, 8(%eax)533; CHECK-X86-NEXT:    movl %edx, 4(%eax)534; CHECK-X86-NEXT:    movl %ecx, (%eax)535; CHECK-X86-NEXT:    addl $4, %esp536; CHECK-X86-NEXT:    popl %esi537; CHECK-X86-NEXT:    popl %edi538; CHECK-X86-NEXT:    retl $4539;540; CHECK-MSVC32-LABEL: trailing_arg:541; CHECK-MSVC32:       # %bb.0:542; CHECK-MSVC32-NEXT:    pushl %ebp543; CHECK-MSVC32-NEXT:    movl %esp, %ebp544; CHECK-MSVC32-NEXT:    pushl %edi545; CHECK-MSVC32-NEXT:    pushl %esi546; CHECK-MSVC32-NEXT:    andl $-16, %esp547; CHECK-MSVC32-NEXT:    movl 8(%ebp), %eax548; CHECK-MSVC32-NEXT:    movl 56(%ebp), %ecx549; CHECK-MSVC32-NEXT:    movl 60(%ebp), %edx550; CHECK-MSVC32-NEXT:    movl 64(%ebp), %esi551; CHECK-MSVC32-NEXT:    movl 68(%ebp), %edi552; CHECK-MSVC32-NEXT:    movl %edi, 12(%eax)553; CHECK-MSVC32-NEXT:    movl %esi, 8(%eax)554; CHECK-MSVC32-NEXT:    movl %edx, 4(%eax)555; CHECK-MSVC32-NEXT:    movl %ecx, (%eax)556; CHECK-MSVC32-NEXT:    leal -8(%ebp), %esp557; CHECK-MSVC32-NEXT:    popl %esi558; CHECK-MSVC32-NEXT:    popl %edi559; CHECK-MSVC32-NEXT:    popl %ebp560; CHECK-MSVC32-NEXT:    retl561  ret PrimTy %x562}563 564define void @call_first_arg(PrimTy %x) nounwind {565; CHECK-X64-F128-LABEL: call_first_arg:566; CHECK-X64-F128:       # %bb.0:567; CHECK-X64-F128-NEXT:    pushq %rax568; CHECK-X64-F128-NEXT:    callq first_arg@PLT569; CHECK-X64-F128-NEXT:    popq %rax570; CHECK-X64-F128-NEXT:    retq571;572; CHECK-X64-I128-LABEL: call_first_arg:573; CHECK-X64-I128:       # %bb.0:574; CHECK-X64-I128-NEXT:    pushq %rax575; CHECK-X64-I128-NEXT:    callq first_arg@PLT576; CHECK-X64-I128-NEXT:    popq %rax577; CHECK-X64-I128-NEXT:    retq578;579; CHECK-MSVC64-F128-LABEL: call_first_arg:580; CHECK-MSVC64-F128:       # %bb.0:581; CHECK-MSVC64-F128-NEXT:    subq $56, %rsp582; CHECK-MSVC64-F128-NEXT:    movaps (%rcx), %xmm0583; CHECK-MSVC64-F128-NEXT:    movaps %xmm0, 32(%rsp)584; CHECK-MSVC64-F128-NEXT:    leaq 32(%rsp), %rcx585; CHECK-MSVC64-F128-NEXT:    callq first_arg586; CHECK-MSVC64-F128-NEXT:    addq $56, %rsp587; CHECK-MSVC64-F128-NEXT:    retq588;589; CHECK-MSVC64-I128-LABEL: call_first_arg:590; CHECK-MSVC64-I128:       # %bb.0:591; CHECK-MSVC64-I128-NEXT:    subq $40, %rsp592; CHECK-MSVC64-I128-NEXT:    callq first_arg593; CHECK-MSVC64-I128-NEXT:    addq $40, %rsp594; CHECK-MSVC64-I128-NEXT:    retq595;596; CHECK-MINGW-F128-LABEL: call_first_arg:597; CHECK-MINGW-F128:       # %bb.0:598; CHECK-MINGW-F128-NEXT:    subq $56, %rsp599; CHECK-MINGW-F128-NEXT:    movaps (%rcx), %xmm0600; CHECK-MINGW-F128-NEXT:    movaps %xmm0, 32(%rsp)601; CHECK-MINGW-F128-NEXT:    leaq 32(%rsp), %rcx602; CHECK-MINGW-F128-NEXT:    callq first_arg603; CHECK-MINGW-F128-NEXT:    addq $56, %rsp604; CHECK-MINGW-F128-NEXT:    retq605;606; CHECK-MINGW-I128-LABEL: call_first_arg:607; CHECK-MINGW-I128:       # %bb.0:608; CHECK-MINGW-I128-NEXT:    subq $40, %rsp609; CHECK-MINGW-I128-NEXT:    callq first_arg610; CHECK-MINGW-I128-NEXT:    addq $40, %rsp611; CHECK-MINGW-I128-NEXT:    retq612;613; CHECK-X86-LABEL: call_first_arg:614; CHECK-X86:       # %bb.0:615; CHECK-X86-NEXT:    pushl %esi616; CHECK-X86-NEXT:    subl $56, %esp617; CHECK-X86-NEXT:    movl 64(%esp), %eax618; CHECK-X86-NEXT:    movl 68(%esp), %ecx619; CHECK-X86-NEXT:    movl 72(%esp), %edx620; CHECK-X86-NEXT:    movl 76(%esp), %esi621; CHECK-X86-NEXT:    movl %esi, 28(%esp)622; CHECK-X86-NEXT:    movl %edx, 24(%esp)623; CHECK-X86-NEXT:    movl %ecx, 20(%esp)624; CHECK-X86-NEXT:    movl %eax, 16(%esp)625; CHECK-X86-NEXT:    leal 32(%esp), %eax626; CHECK-X86-NEXT:    movl %eax, (%esp)627; CHECK-X86-NEXT:    calll first_arg@PLT628; CHECK-X86-NEXT:    addl $52, %esp629; CHECK-X86-NEXT:    popl %esi630; CHECK-X86-NEXT:    retl631;632; CHECK-MSVC32-LABEL: call_first_arg:633; CHECK-MSVC32:       # %bb.0:634; CHECK-MSVC32-NEXT:    pushl %ebp635; CHECK-MSVC32-NEXT:    movl %esp, %ebp636; CHECK-MSVC32-NEXT:    pushl %esi637; CHECK-MSVC32-NEXT:    andl $-16, %esp638; CHECK-MSVC32-NEXT:    subl $64, %esp639; CHECK-MSVC32-NEXT:    movl 8(%ebp), %eax640; CHECK-MSVC32-NEXT:    movl 12(%ebp), %ecx641; CHECK-MSVC32-NEXT:    movl 16(%ebp), %edx642; CHECK-MSVC32-NEXT:    movl 20(%ebp), %esi643; CHECK-MSVC32-NEXT:    movl %esi, 28(%esp)644; CHECK-MSVC32-NEXT:    movl %edx, 24(%esp)645; CHECK-MSVC32-NEXT:    movl %ecx, 20(%esp)646; CHECK-MSVC32-NEXT:    movl %eax, 16(%esp)647; CHECK-MSVC32-NEXT:    leal 32(%esp), %eax648; CHECK-MSVC32-NEXT:    movl %eax, (%esp)649; CHECK-MSVC32-NEXT:    calll _first_arg650; CHECK-MSVC32-NEXT:    leal -4(%ebp), %esp651; CHECK-MSVC32-NEXT:    popl %esi652; CHECK-MSVC32-NEXT:    popl %ebp653; CHECK-MSVC32-NEXT:    retl654  call PrimTy @first_arg(PrimTy %x)655  ret void656}657 658define void @call_leading_args(PrimTy %x) nounwind {659; CHECK-X64-F128-LABEL: call_leading_args:660; CHECK-X64-F128:       # %bb.0:661; CHECK-X64-F128-NEXT:    pushq %rax662; CHECK-X64-F128-NEXT:    xorl %edi, %edi663; CHECK-X64-F128-NEXT:    xorl %esi, %esi664; CHECK-X64-F128-NEXT:    xorl %edx, %edx665; CHECK-X64-F128-NEXT:    xorl %ecx, %ecx666; CHECK-X64-F128-NEXT:    callq leading_args@PLT667; CHECK-X64-F128-NEXT:    popq %rax668; CHECK-X64-F128-NEXT:    retq669;670; CHECK-X64-I128-LABEL: call_leading_args:671; CHECK-X64-I128:       # %bb.0:672; CHECK-X64-I128-NEXT:    pushq %rax673; CHECK-X64-I128-NEXT:    movq %rsi, %r9674; CHECK-X64-I128-NEXT:    movq %rdi, %r8675; CHECK-X64-I128-NEXT:    xorl %edi, %edi676; CHECK-X64-I128-NEXT:    xorl %esi, %esi677; CHECK-X64-I128-NEXT:    xorl %edx, %edx678; CHECK-X64-I128-NEXT:    xorl %ecx, %ecx679; CHECK-X64-I128-NEXT:    callq leading_args@PLT680; CHECK-X64-I128-NEXT:    popq %rax681; CHECK-X64-I128-NEXT:    retq682;683; CHECK-MSVC64-F128-LABEL: call_leading_args:684; CHECK-MSVC64-F128:       # %bb.0:685; CHECK-MSVC64-F128-NEXT:    subq $72, %rsp686; CHECK-MSVC64-F128-NEXT:    movaps (%rcx), %xmm0687; CHECK-MSVC64-F128-NEXT:    movaps %xmm0, 48(%rsp)688; CHECK-MSVC64-F128-NEXT:    leaq 48(%rsp), %rax689; CHECK-MSVC64-F128-NEXT:    movq %rax, 32(%rsp)690; CHECK-MSVC64-F128-NEXT:    xorl %ecx, %ecx691; CHECK-MSVC64-F128-NEXT:    xorl %edx, %edx692; CHECK-MSVC64-F128-NEXT:    xorl %r8d, %r8d693; CHECK-MSVC64-F128-NEXT:    xorl %r9d, %r9d694; CHECK-MSVC64-F128-NEXT:    callq leading_args695; CHECK-MSVC64-F128-NEXT:    addq $72, %rsp696; CHECK-MSVC64-F128-NEXT:    retq697;698; CHECK-MSVC64-I128-LABEL: call_leading_args:699; CHECK-MSVC64-I128:       # %bb.0:700; CHECK-MSVC64-I128-NEXT:    subq $56, %rsp701; CHECK-MSVC64-I128-NEXT:    movq %rdx, 40(%rsp)702; CHECK-MSVC64-I128-NEXT:    movq %rcx, 32(%rsp)703; CHECK-MSVC64-I128-NEXT:    xorl %ecx, %ecx704; CHECK-MSVC64-I128-NEXT:    xorl %edx, %edx705; CHECK-MSVC64-I128-NEXT:    xorl %r8d, %r8d706; CHECK-MSVC64-I128-NEXT:    xorl %r9d, %r9d707; CHECK-MSVC64-I128-NEXT:    callq leading_args708; CHECK-MSVC64-I128-NEXT:    addq $56, %rsp709; CHECK-MSVC64-I128-NEXT:    retq710;711; CHECK-MINGW-F128-LABEL: call_leading_args:712; CHECK-MINGW-F128:       # %bb.0:713; CHECK-MINGW-F128-NEXT:    subq $72, %rsp714; CHECK-MINGW-F128-NEXT:    movaps (%rcx), %xmm0715; CHECK-MINGW-F128-NEXT:    movaps %xmm0, 48(%rsp)716; CHECK-MINGW-F128-NEXT:    leaq 48(%rsp), %rax717; CHECK-MINGW-F128-NEXT:    movq %rax, 32(%rsp)718; CHECK-MINGW-F128-NEXT:    xorl %ecx, %ecx719; CHECK-MINGW-F128-NEXT:    xorl %edx, %edx720; CHECK-MINGW-F128-NEXT:    xorl %r8d, %r8d721; CHECK-MINGW-F128-NEXT:    xorl %r9d, %r9d722; CHECK-MINGW-F128-NEXT:    callq leading_args723; CHECK-MINGW-F128-NEXT:    addq $72, %rsp724; CHECK-MINGW-F128-NEXT:    retq725;726; CHECK-MINGW-I128-LABEL: call_leading_args:727; CHECK-MINGW-I128:       # %bb.0:728; CHECK-MINGW-I128-NEXT:    subq $56, %rsp729; CHECK-MINGW-I128-NEXT:    movq %rdx, 40(%rsp)730; CHECK-MINGW-I128-NEXT:    movq %rcx, 32(%rsp)731; CHECK-MINGW-I128-NEXT:    xorl %ecx, %ecx732; CHECK-MINGW-I128-NEXT:    xorl %edx, %edx733; CHECK-MINGW-I128-NEXT:    xorl %r8d, %r8d734; CHECK-MINGW-I128-NEXT:    xorl %r9d, %r9d735; CHECK-MINGW-I128-NEXT:    callq leading_args736; CHECK-MINGW-I128-NEXT:    addq $56, %rsp737; CHECK-MINGW-I128-NEXT:    retq738;739; CHECK-X86-LABEL: call_leading_args:740; CHECK-X86:       # %bb.0:741; CHECK-X86-NEXT:    pushl %esi742; CHECK-X86-NEXT:    subl $88, %esp743; CHECK-X86-NEXT:    movl 96(%esp), %eax744; CHECK-X86-NEXT:    movl 100(%esp), %ecx745; CHECK-X86-NEXT:    movl 104(%esp), %edx746; CHECK-X86-NEXT:    movl 108(%esp), %esi747; CHECK-X86-NEXT:    movl %esi, 60(%esp)748; CHECK-X86-NEXT:    movl %edx, 56(%esp)749; CHECK-X86-NEXT:    movl %ecx, 52(%esp)750; CHECK-X86-NEXT:    movl %eax, 48(%esp)751; CHECK-X86-NEXT:    leal 64(%esp), %eax752; CHECK-X86-NEXT:    movl %eax, (%esp)753; CHECK-X86-NEXT:    movl $0, 32(%esp)754; CHECK-X86-NEXT:    movl $0, 28(%esp)755; CHECK-X86-NEXT:    movl $0, 24(%esp)756; CHECK-X86-NEXT:    movl $0, 20(%esp)757; CHECK-X86-NEXT:    movl $0, 16(%esp)758; CHECK-X86-NEXT:    movl $0, 12(%esp)759; CHECK-X86-NEXT:    movl $0, 8(%esp)760; CHECK-X86-NEXT:    movl $0, 4(%esp)761; CHECK-X86-NEXT:    calll leading_args@PLT762; CHECK-X86-NEXT:    addl $84, %esp763; CHECK-X86-NEXT:    popl %esi764; CHECK-X86-NEXT:    retl765;766; CHECK-MSVC32-LABEL: call_leading_args:767; CHECK-MSVC32:       # %bb.0:768; CHECK-MSVC32-NEXT:    pushl %ebp769; CHECK-MSVC32-NEXT:    movl %esp, %ebp770; CHECK-MSVC32-NEXT:    pushl %esi771; CHECK-MSVC32-NEXT:    andl $-16, %esp772; CHECK-MSVC32-NEXT:    subl $96, %esp773; CHECK-MSVC32-NEXT:    movl 8(%ebp), %eax774; CHECK-MSVC32-NEXT:    movl 12(%ebp), %ecx775; CHECK-MSVC32-NEXT:    movl 16(%ebp), %edx776; CHECK-MSVC32-NEXT:    movl 20(%ebp), %esi777; CHECK-MSVC32-NEXT:    movl %esi, 60(%esp)778; CHECK-MSVC32-NEXT:    movl %edx, 56(%esp)779; CHECK-MSVC32-NEXT:    movl %ecx, 52(%esp)780; CHECK-MSVC32-NEXT:    movl %eax, 48(%esp)781; CHECK-MSVC32-NEXT:    leal 64(%esp), %eax782; CHECK-MSVC32-NEXT:    movl %eax, (%esp)783; CHECK-MSVC32-NEXT:    movl $0, 32(%esp)784; CHECK-MSVC32-NEXT:    movl $0, 28(%esp)785; CHECK-MSVC32-NEXT:    movl $0, 24(%esp)786; CHECK-MSVC32-NEXT:    movl $0, 20(%esp)787; CHECK-MSVC32-NEXT:    movl $0, 16(%esp)788; CHECK-MSVC32-NEXT:    movl $0, 12(%esp)789; CHECK-MSVC32-NEXT:    movl $0, 8(%esp)790; CHECK-MSVC32-NEXT:    movl $0, 4(%esp)791; CHECK-MSVC32-NEXT:    calll _leading_args792; CHECK-MSVC32-NEXT:    leal -4(%ebp), %esp793; CHECK-MSVC32-NEXT:    popl %esi794; CHECK-MSVC32-NEXT:    popl %ebp795; CHECK-MSVC32-NEXT:    retl796  call PrimTy @leading_args(i64 0, i64 0, i64 0, i64 0, PrimTy %x)797  ret void798}799 800define void @call_many_leading_args(PrimTy %x) nounwind {801; CHECK-X64-F128-LABEL: call_many_leading_args:802; CHECK-X64-F128:       # %bb.0:803; CHECK-X64-F128-NEXT:    pushq %rax804; CHECK-X64-F128-NEXT:    movaps %xmm0, %xmm1805; CHECK-X64-F128-NEXT:    xorps %xmm0, %xmm0806; CHECK-X64-F128-NEXT:    xorl %edi, %edi807; CHECK-X64-F128-NEXT:    xorl %esi, %esi808; CHECK-X64-F128-NEXT:    xorl %edx, %edx809; CHECK-X64-F128-NEXT:    xorl %ecx, %ecx810; CHECK-X64-F128-NEXT:    callq many_leading_args@PLT811; CHECK-X64-F128-NEXT:    popq %rax812; CHECK-X64-F128-NEXT:    retq813;814; CHECK-X64-I128-LABEL: call_many_leading_args:815; CHECK-X64-I128:       # %bb.0:816; CHECK-X64-I128-NEXT:    pushq %rax817; CHECK-X64-I128-NEXT:    movq %rsi, %rax818; CHECK-X64-I128-NEXT:    movq %rdi, %r10819; CHECK-X64-I128-NEXT:    xorl %edi, %edi820; CHECK-X64-I128-NEXT:    xorl %esi, %esi821; CHECK-X64-I128-NEXT:    xorl %edx, %edx822; CHECK-X64-I128-NEXT:    xorl %ecx, %ecx823; CHECK-X64-I128-NEXT:    xorl %r8d, %r8d824; CHECK-X64-I128-NEXT:    xorl %r9d, %r9d825; CHECK-X64-I128-NEXT:    pushq %rax826; CHECK-X64-I128-NEXT:    pushq %r10827; CHECK-X64-I128-NEXT:    callq many_leading_args@PLT828; CHECK-X64-I128-NEXT:    addq $16, %rsp829; CHECK-X64-I128-NEXT:    popq %rax830; CHECK-X64-I128-NEXT:    retq831;832; CHECK-MSVC64-F128-LABEL: call_many_leading_args:833; CHECK-MSVC64-F128:       # %bb.0:834; CHECK-MSVC64-F128-NEXT:    subq $88, %rsp835; CHECK-MSVC64-F128-NEXT:    movaps (%rcx), %xmm0836; CHECK-MSVC64-F128-NEXT:    xorps %xmm1, %xmm1837; CHECK-MSVC64-F128-NEXT:    movaps %xmm1, 64(%rsp)838; CHECK-MSVC64-F128-NEXT:    movaps %xmm0, 48(%rsp)839; CHECK-MSVC64-F128-NEXT:    leaq 48(%rsp), %rax840; CHECK-MSVC64-F128-NEXT:    movq %rax, 40(%rsp)841; CHECK-MSVC64-F128-NEXT:    leaq 64(%rsp), %rax842; CHECK-MSVC64-F128-NEXT:    movq %rax, 32(%rsp)843; CHECK-MSVC64-F128-NEXT:    xorl %ecx, %ecx844; CHECK-MSVC64-F128-NEXT:    xorl %edx, %edx845; CHECK-MSVC64-F128-NEXT:    xorl %r8d, %r8d846; CHECK-MSVC64-F128-NEXT:    xorl %r9d, %r9d847; CHECK-MSVC64-F128-NEXT:    callq many_leading_args848; CHECK-MSVC64-F128-NEXT:    addq $88, %rsp849; CHECK-MSVC64-F128-NEXT:    retq850;851; CHECK-MSVC64-I128-LABEL: call_many_leading_args:852; CHECK-MSVC64-I128:       # %bb.0:853; CHECK-MSVC64-I128-NEXT:    subq $72, %rsp854; CHECK-MSVC64-I128-NEXT:    movq %rdx, 56(%rsp)855; CHECK-MSVC64-I128-NEXT:    movq %rcx, 48(%rsp)856; CHECK-MSVC64-I128-NEXT:    movq $0, 40(%rsp)857; CHECK-MSVC64-I128-NEXT:    movq $0, 32(%rsp)858; CHECK-MSVC64-I128-NEXT:    xorl %ecx, %ecx859; CHECK-MSVC64-I128-NEXT:    xorl %edx, %edx860; CHECK-MSVC64-I128-NEXT:    xorl %r8d, %r8d861; CHECK-MSVC64-I128-NEXT:    xorl %r9d, %r9d862; CHECK-MSVC64-I128-NEXT:    callq many_leading_args863; CHECK-MSVC64-I128-NEXT:    addq $72, %rsp864; CHECK-MSVC64-I128-NEXT:    retq865;866; CHECK-MINGW-F128-LABEL: call_many_leading_args:867; CHECK-MINGW-F128:       # %bb.0:868; CHECK-MINGW-F128-NEXT:    subq $88, %rsp869; CHECK-MINGW-F128-NEXT:    movaps (%rcx), %xmm0870; CHECK-MINGW-F128-NEXT:    xorps %xmm1, %xmm1871; CHECK-MINGW-F128-NEXT:    movaps %xmm1, 64(%rsp)872; CHECK-MINGW-F128-NEXT:    movaps %xmm0, 48(%rsp)873; CHECK-MINGW-F128-NEXT:    leaq 48(%rsp), %rax874; CHECK-MINGW-F128-NEXT:    movq %rax, 40(%rsp)875; CHECK-MINGW-F128-NEXT:    leaq 64(%rsp), %rax876; CHECK-MINGW-F128-NEXT:    movq %rax, 32(%rsp)877; CHECK-MINGW-F128-NEXT:    xorl %ecx, %ecx878; CHECK-MINGW-F128-NEXT:    xorl %edx, %edx879; CHECK-MINGW-F128-NEXT:    xorl %r8d, %r8d880; CHECK-MINGW-F128-NEXT:    xorl %r9d, %r9d881; CHECK-MINGW-F128-NEXT:    callq many_leading_args882; CHECK-MINGW-F128-NEXT:    addq $88, %rsp883; CHECK-MINGW-F128-NEXT:    retq884;885; CHECK-MINGW-I128-LABEL: call_many_leading_args:886; CHECK-MINGW-I128:       # %bb.0:887; CHECK-MINGW-I128-NEXT:    subq $72, %rsp888; CHECK-MINGW-I128-NEXT:    movq %rdx, 56(%rsp)889; CHECK-MINGW-I128-NEXT:    movq %rcx, 48(%rsp)890; CHECK-MINGW-I128-NEXT:    movq $0, 40(%rsp)891; CHECK-MINGW-I128-NEXT:    movq $0, 32(%rsp)892; CHECK-MINGW-I128-NEXT:    xorl %ecx, %ecx893; CHECK-MINGW-I128-NEXT:    xorl %edx, %edx894; CHECK-MINGW-I128-NEXT:    xorl %r8d, %r8d895; CHECK-MINGW-I128-NEXT:    xorl %r9d, %r9d896; CHECK-MINGW-I128-NEXT:    callq many_leading_args897; CHECK-MINGW-I128-NEXT:    addq $72, %rsp898; CHECK-MINGW-I128-NEXT:    retq899;900; CHECK-X86-LABEL: call_many_leading_args:901; CHECK-X86:       # %bb.0:902; CHECK-X86-NEXT:    pushl %esi903; CHECK-X86-NEXT:    subl $104, %esp904; CHECK-X86-NEXT:    movl 112(%esp), %eax905; CHECK-X86-NEXT:    movl 116(%esp), %ecx906; CHECK-X86-NEXT:    movl 120(%esp), %edx907; CHECK-X86-NEXT:    movl 124(%esp), %esi908; CHECK-X86-NEXT:    movl %esi, 76(%esp)909; CHECK-X86-NEXT:    movl %edx, 72(%esp)910; CHECK-X86-NEXT:    movl %ecx, 68(%esp)911; CHECK-X86-NEXT:    movl %eax, 64(%esp)912; CHECK-X86-NEXT:    leal 80(%esp), %eax913; CHECK-X86-NEXT:    movl %eax, (%esp)914; CHECK-X86-NEXT:    movl $0, 60(%esp)915; CHECK-X86-NEXT:    movl $0, 56(%esp)916; CHECK-X86-NEXT:    movl $0, 52(%esp)917; CHECK-X86-NEXT:    movl $0, 48(%esp)918; CHECK-X86-NEXT:    movl $0, 32(%esp)919; CHECK-X86-NEXT:    movl $0, 28(%esp)920; CHECK-X86-NEXT:    movl $0, 24(%esp)921; CHECK-X86-NEXT:    movl $0, 20(%esp)922; CHECK-X86-NEXT:    movl $0, 16(%esp)923; CHECK-X86-NEXT:    movl $0, 12(%esp)924; CHECK-X86-NEXT:    movl $0, 8(%esp)925; CHECK-X86-NEXT:    movl $0, 4(%esp)926; CHECK-X86-NEXT:    calll many_leading_args@PLT927; CHECK-X86-NEXT:    addl $100, %esp928; CHECK-X86-NEXT:    popl %esi929; CHECK-X86-NEXT:    retl930;931; CHECK-MSVC32-LABEL: call_many_leading_args:932; CHECK-MSVC32:       # %bb.0:933; CHECK-MSVC32-NEXT:    pushl %ebp934; CHECK-MSVC32-NEXT:    movl %esp, %ebp935; CHECK-MSVC32-NEXT:    pushl %esi936; CHECK-MSVC32-NEXT:    andl $-16, %esp937; CHECK-MSVC32-NEXT:    subl $112, %esp938; CHECK-MSVC32-NEXT:    movl 8(%ebp), %eax939; CHECK-MSVC32-NEXT:    movl 12(%ebp), %ecx940; CHECK-MSVC32-NEXT:    movl 16(%ebp), %edx941; CHECK-MSVC32-NEXT:    movl 20(%ebp), %esi942; CHECK-MSVC32-NEXT:    movl %esi, 76(%esp)943; CHECK-MSVC32-NEXT:    movl %edx, 72(%esp)944; CHECK-MSVC32-NEXT:    movl %ecx, 68(%esp)945; CHECK-MSVC32-NEXT:    movl %eax, 64(%esp)946; CHECK-MSVC32-NEXT:    leal 80(%esp), %eax947; CHECK-MSVC32-NEXT:    movl %eax, (%esp)948; CHECK-MSVC32-NEXT:    movl $0, 60(%esp)949; CHECK-MSVC32-NEXT:    movl $0, 56(%esp)950; CHECK-MSVC32-NEXT:    movl $0, 52(%esp)951; CHECK-MSVC32-NEXT:    movl $0, 48(%esp)952; CHECK-MSVC32-NEXT:    movl $0, 32(%esp)953; CHECK-MSVC32-NEXT:    movl $0, 28(%esp)954; CHECK-MSVC32-NEXT:    movl $0, 24(%esp)955; CHECK-MSVC32-NEXT:    movl $0, 20(%esp)956; CHECK-MSVC32-NEXT:    movl $0, 16(%esp)957; CHECK-MSVC32-NEXT:    movl $0, 12(%esp)958; CHECK-MSVC32-NEXT:    movl $0, 8(%esp)959; CHECK-MSVC32-NEXT:    movl $0, 4(%esp)960; CHECK-MSVC32-NEXT:    calll _many_leading_args961; CHECK-MSVC32-NEXT:    leal -4(%ebp), %esp962; CHECK-MSVC32-NEXT:    popl %esi963; CHECK-MSVC32-NEXT:    popl %ebp964; CHECK-MSVC32-NEXT:    retl965  call PrimTy @many_leading_args(i64 0, i64 0, i64 0, i64 0, PrimTy Prim0, PrimTy %x)966  ret void967}968 969define void @call_trailing_arg(PrimTy %x) nounwind {970; CHECK-X64-F128-LABEL: call_trailing_arg:971; CHECK-X64-F128:       # %bb.0:972; CHECK-X64-F128-NEXT:    pushq %rax973; CHECK-X64-F128-NEXT:    xorl %edi, %edi974; CHECK-X64-F128-NEXT:    xorl %esi, %esi975; CHECK-X64-F128-NEXT:    xorl %edx, %edx976; CHECK-X64-F128-NEXT:    xorl %ecx, %ecx977; CHECK-X64-F128-NEXT:    callq trailing_arg@PLT978; CHECK-X64-F128-NEXT:    popq %rax979; CHECK-X64-F128-NEXT:    retq980;981; CHECK-X64-I128-LABEL: call_trailing_arg:982; CHECK-X64-I128:       # %bb.0:983; CHECK-X64-I128-NEXT:    pushq %rax984; CHECK-X64-I128-NEXT:    movq %rsi, %r9985; CHECK-X64-I128-NEXT:    movq %rdi, %r8986; CHECK-X64-I128-NEXT:    xorl %edi, %edi987; CHECK-X64-I128-NEXT:    xorl %esi, %esi988; CHECK-X64-I128-NEXT:    xorl %edx, %edx989; CHECK-X64-I128-NEXT:    xorl %ecx, %ecx990; CHECK-X64-I128-NEXT:    callq trailing_arg@PLT991; CHECK-X64-I128-NEXT:    popq %rax992; CHECK-X64-I128-NEXT:    retq993;994; CHECK-MSVC64-F128-LABEL: call_trailing_arg:995; CHECK-MSVC64-F128:       # %bb.0:996; CHECK-MSVC64-F128-NEXT:    subq $72, %rsp997; CHECK-MSVC64-F128-NEXT:    movaps (%rcx), %xmm0998; CHECK-MSVC64-F128-NEXT:    movaps %xmm0, 48(%rsp)999; CHECK-MSVC64-F128-NEXT:    leaq 48(%rsp), %rax1000; CHECK-MSVC64-F128-NEXT:    movq %rax, 32(%rsp)1001; CHECK-MSVC64-F128-NEXT:    xorl %ecx, %ecx1002; CHECK-MSVC64-F128-NEXT:    xorl %edx, %edx1003; CHECK-MSVC64-F128-NEXT:    xorl %r8d, %r8d1004; CHECK-MSVC64-F128-NEXT:    xorl %r9d, %r9d1005; CHECK-MSVC64-F128-NEXT:    callq trailing_arg1006; CHECK-MSVC64-F128-NEXT:    addq $72, %rsp1007; CHECK-MSVC64-F128-NEXT:    retq1008;1009; CHECK-MSVC64-I128-LABEL: call_trailing_arg:1010; CHECK-MSVC64-I128:       # %bb.0:1011; CHECK-MSVC64-I128-NEXT:    subq $56, %rsp1012; CHECK-MSVC64-I128-NEXT:    movq %rdx, 40(%rsp)1013; CHECK-MSVC64-I128-NEXT:    movq %rcx, 32(%rsp)1014; CHECK-MSVC64-I128-NEXT:    xorl %ecx, %ecx1015; CHECK-MSVC64-I128-NEXT:    xorl %edx, %edx1016; CHECK-MSVC64-I128-NEXT:    xorl %r8d, %r8d1017; CHECK-MSVC64-I128-NEXT:    xorl %r9d, %r9d1018; CHECK-MSVC64-I128-NEXT:    callq trailing_arg1019; CHECK-MSVC64-I128-NEXT:    addq $56, %rsp1020; CHECK-MSVC64-I128-NEXT:    retq1021;1022; CHECK-MINGW-F128-LABEL: call_trailing_arg:1023; CHECK-MINGW-F128:       # %bb.0:1024; CHECK-MINGW-F128-NEXT:    subq $72, %rsp1025; CHECK-MINGW-F128-NEXT:    movaps (%rcx), %xmm01026; CHECK-MINGW-F128-NEXT:    movaps %xmm0, 48(%rsp)1027; CHECK-MINGW-F128-NEXT:    leaq 48(%rsp), %rax1028; CHECK-MINGW-F128-NEXT:    movq %rax, 32(%rsp)1029; CHECK-MINGW-F128-NEXT:    xorl %ecx, %ecx1030; CHECK-MINGW-F128-NEXT:    xorl %edx, %edx1031; CHECK-MINGW-F128-NEXT:    xorl %r8d, %r8d1032; CHECK-MINGW-F128-NEXT:    xorl %r9d, %r9d1033; CHECK-MINGW-F128-NEXT:    callq trailing_arg1034; CHECK-MINGW-F128-NEXT:    addq $72, %rsp1035; CHECK-MINGW-F128-NEXT:    retq1036;1037; CHECK-MINGW-I128-LABEL: call_trailing_arg:1038; CHECK-MINGW-I128:       # %bb.0:1039; CHECK-MINGW-I128-NEXT:    subq $56, %rsp1040; CHECK-MINGW-I128-NEXT:    movq %rdx, 40(%rsp)1041; CHECK-MINGW-I128-NEXT:    movq %rcx, 32(%rsp)1042; CHECK-MINGW-I128-NEXT:    xorl %ecx, %ecx1043; CHECK-MINGW-I128-NEXT:    xorl %edx, %edx1044; CHECK-MINGW-I128-NEXT:    xorl %r8d, %r8d1045; CHECK-MINGW-I128-NEXT:    xorl %r9d, %r9d1046; CHECK-MINGW-I128-NEXT:    callq trailing_arg1047; CHECK-MINGW-I128-NEXT:    addq $56, %rsp1048; CHECK-MINGW-I128-NEXT:    retq1049;1050; CHECK-X86-LABEL: call_trailing_arg:1051; CHECK-X86:       # %bb.0:1052; CHECK-X86-NEXT:    pushl %esi1053; CHECK-X86-NEXT:    subl $88, %esp1054; CHECK-X86-NEXT:    movl 96(%esp), %eax1055; CHECK-X86-NEXT:    movl 100(%esp), %ecx1056; CHECK-X86-NEXT:    movl 104(%esp), %edx1057; CHECK-X86-NEXT:    movl 108(%esp), %esi1058; CHECK-X86-NEXT:    movl %esi, 60(%esp)1059; CHECK-X86-NEXT:    movl %edx, 56(%esp)1060; CHECK-X86-NEXT:    movl %ecx, 52(%esp)1061; CHECK-X86-NEXT:    movl %eax, 48(%esp)1062; CHECK-X86-NEXT:    leal 64(%esp), %eax1063; CHECK-X86-NEXT:    movl %eax, (%esp)1064; CHECK-X86-NEXT:    movl $0, 32(%esp)1065; CHECK-X86-NEXT:    movl $0, 28(%esp)1066; CHECK-X86-NEXT:    movl $0, 24(%esp)1067; CHECK-X86-NEXT:    movl $0, 20(%esp)1068; CHECK-X86-NEXT:    movl $0, 16(%esp)1069; CHECK-X86-NEXT:    movl $0, 12(%esp)1070; CHECK-X86-NEXT:    movl $0, 8(%esp)1071; CHECK-X86-NEXT:    movl $0, 4(%esp)1072; CHECK-X86-NEXT:    calll trailing_arg@PLT1073; CHECK-X86-NEXT:    addl $84, %esp1074; CHECK-X86-NEXT:    popl %esi1075; CHECK-X86-NEXT:    retl1076;1077; CHECK-MSVC32-LABEL: call_trailing_arg:1078; CHECK-MSVC32:       # %bb.0:1079; CHECK-MSVC32-NEXT:    pushl %ebp1080; CHECK-MSVC32-NEXT:    movl %esp, %ebp1081; CHECK-MSVC32-NEXT:    pushl %esi1082; CHECK-MSVC32-NEXT:    andl $-16, %esp1083; CHECK-MSVC32-NEXT:    subl $96, %esp1084; CHECK-MSVC32-NEXT:    movl 8(%ebp), %eax1085; CHECK-MSVC32-NEXT:    movl 12(%ebp), %ecx1086; CHECK-MSVC32-NEXT:    movl 16(%ebp), %edx1087; CHECK-MSVC32-NEXT:    movl 20(%ebp), %esi1088; CHECK-MSVC32-NEXT:    movl %esi, 60(%esp)1089; CHECK-MSVC32-NEXT:    movl %edx, 56(%esp)1090; CHECK-MSVC32-NEXT:    movl %ecx, 52(%esp)1091; CHECK-MSVC32-NEXT:    movl %eax, 48(%esp)1092; CHECK-MSVC32-NEXT:    leal 64(%esp), %eax1093; CHECK-MSVC32-NEXT:    movl %eax, (%esp)1094; CHECK-MSVC32-NEXT:    movl $0, 32(%esp)1095; CHECK-MSVC32-NEXT:    movl $0, 28(%esp)1096; CHECK-MSVC32-NEXT:    movl $0, 24(%esp)1097; CHECK-MSVC32-NEXT:    movl $0, 20(%esp)1098; CHECK-MSVC32-NEXT:    movl $0, 16(%esp)1099; CHECK-MSVC32-NEXT:    movl $0, 12(%esp)1100; CHECK-MSVC32-NEXT:    movl $0, 8(%esp)1101; CHECK-MSVC32-NEXT:    movl $0, 4(%esp)1102; CHECK-MSVC32-NEXT:    calll _trailing_arg1103; CHECK-MSVC32-NEXT:    leal -4(%ebp), %esp1104; CHECK-MSVC32-NEXT:    popl %esi1105; CHECK-MSVC32-NEXT:    popl %ebp1106; CHECK-MSVC32-NEXT:    retl1107  call PrimTy @trailing_arg(i64 0, i64 0, i64 0, i64 0, PrimTy %x)1108  ret void1109}1110