diff --git a/llvm/lib/Target/X86/X86CallingConv.td b/llvm/lib/Target/X86/X86CallingConv.td index f020e0b55141c..bad0a698dd8de 100644 --- a/llvm/lib/Target/X86/X86CallingConv.td +++ b/llvm/lib/Target/X86/X86CallingConv.td @@ -687,6 +687,38 @@ def CC_X86_Win64_VectorCall : CallingConv<[ CCDelegateTo ]>; +def CC_X86_64_Fast : CallingConv<[ + // Handles byval parameters. Note that we can't rely on the delegation + // to CC_X86_64_C for this because that happens after code that puts arguments + // in registers. + CCIfByVal>, + + // Promote i1/i8/i16/v1i1 arguments to i32. + CCIfType<[i1, i8, i16, v1i1], CCPromoteToType>, + + // Pointers are always passed in full 64-bit registers. + CCIfPtr>, + + // The first 22 integer arguments are passed in integer registers. + CCIfType<[i32], CCAssignToReg<[EDI, ESI, EDX, ECX, R8D, R9D, R16D, R17D, + R18D, R19D, R20D, R21D, R22D, R23D, R24D, + R25D, R26D, R27D, R28D, R29D, R30D, R31D]>>, + + // i128 can be either passed in two i64 registers, or on the stack, but + // not split across register and stack. Handle this with a custom function. + CCIfType<[i64], + CCIfConsecutiveRegs>>, + + CCIfType<[i64], CCAssignToReg<[RDI, RSI, RDX, RCX, R8, R9, R16, R17, R18, + R19, R20, R21, R22, R23, R24, R25, R26, R27, + R28, R29, R30, R31]>>, + + + + // Otherwise, drop to normal X86-64 CC. + CCDelegateTo +]>; + def CC_X86_64_GHC : CallingConv<[ // Promote i8/i16/i32 arguments to i64. @@ -1079,6 +1111,8 @@ def CC_X86_32 : CallingConv<[ // This is the root argument convention for the X86-64 backend. def CC_X86_64 : CallingConv<[ + CCIfCC<"CallingConv::Fast", + CCIfSubtarget<"hasEGPR()", CCDelegateTo>>, CCIfCC<"CallingConv::GHC", CCDelegateTo>, CCIfCC<"CallingConv::HiPE", CCDelegateTo>, CCIfCC<"CallingConv::AnyReg", CCDelegateTo>, diff --git a/llvm/test/CodeGen/X86/apx/fastcc.ll b/llvm/test/CodeGen/X86/apx/fastcc.ll new file mode 100644 index 0000000000000..984a4f640e379 --- /dev/null +++ b/llvm/test/CodeGen/X86/apx/fastcc.ll @@ -0,0 +1,1374 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 +; RUN: llc < %s -mtriple=x86_64 | FileCheck %s --check-prefixes=CHECK,X64 +; RUN: llc < %s -mtriple=x86_64 -mattr=+egpr | FileCheck %s --check-prefixes=CHECK,EGPR + +define fastcc i8 @arg6_i8(i8 %a, i8 %b, i8 %c, i8 %d, i8 %e, i8 %f) nounwind { +; CHECK-LABEL: arg6_i8: +; CHECK: # %bb.0: +; CHECK-NEXT: # kill: def $r9d killed $r9d def $r9 +; CHECK-NEXT: # kill: def $r8d killed $r8d def $r8 +; CHECK-NEXT: # kill: def $ecx killed $ecx def $rcx +; CHECK-NEXT: # kill: def $edx killed $edx def $rdx +; CHECK-NEXT: # kill: def $esi killed $esi def $rsi +; CHECK-NEXT: # kill: def $edi killed $edi def $rdi +; CHECK-NEXT: leal (%rdi,%rsi), %eax +; CHECK-NEXT: addl %edx, %ecx +; CHECK-NEXT: addb %al, %cl +; CHECK-NEXT: leal (%r8,%r9), %eax +; CHECK-NEXT: addb %cl, %al +; CHECK-NEXT: # kill: def $al killed $al killed $eax +; CHECK-NEXT: retq + %a1 = add i8 %a, %b + %a2 = add i8 %c, %d + %a3 = add i8 %e, %f + %b1 = add i8 %a1, %a2 + %b2 = add i8 %b1, %a3 + ret i8 %b2 +} + +define fastcc i16 @arg7_i16(i16 %a, i16 %b, i16 %c, i16 %d, i16 %e, i16 %f, i16 %g) nounwind { +; X64-LABEL: arg7_i16: +; X64: # %bb.0: +; X64-NEXT: # kill: def $r9d killed $r9d def $r9 +; X64-NEXT: # kill: def $r8d killed $r8d def $r8 +; X64-NEXT: # kill: def $ecx killed $ecx def $rcx +; X64-NEXT: # kill: def $edx killed $edx def $rdx +; X64-NEXT: # kill: def $esi killed $esi def $rsi +; X64-NEXT: # kill: def $edi killed $edi def $rdi +; X64-NEXT: leal (%rdx,%rcx), %ecx +; X64-NEXT: addl %edi, %ecx +; X64-NEXT: addl %esi, %ecx +; X64-NEXT: leal (%r8,%r9), %eax +; X64-NEXT: addw {{[0-9]+}}(%rsp), %ax +; X64-NEXT: addl %ecx, %eax +; X64-NEXT: # kill: def $ax killed $ax killed $eax +; X64-NEXT: retq +; +; EGPR-LABEL: arg7_i16: +; EGPR: # %bb.0: +; EGPR-NEXT: # kill: def $r9d killed $r9d def $r9 +; EGPR-NEXT: # kill: def $r8d killed $r8d def $r8 +; EGPR-NEXT: # kill: def $ecx killed $ecx def $rcx +; EGPR-NEXT: # kill: def $edx killed $edx def $rdx +; EGPR-NEXT: # kill: def $esi killed $esi def $rsi +; EGPR-NEXT: # kill: def $edi killed $edi def $rdi +; EGPR-NEXT: leal (%rdx,%rcx), %ecx +; EGPR-NEXT: addl %edi, %ecx +; EGPR-NEXT: addl %esi, %ecx +; EGPR-NEXT: leal (%r8,%r9), %eax +; EGPR-NEXT: addl %r16d, %eax +; EGPR-NEXT: addl %ecx, %eax +; EGPR-NEXT: # kill: def $ax killed $ax killed $eax +; EGPR-NEXT: retq + %a1 = add i16 %a, %b + %a2 = add i16 %c, %d + %a3 = add i16 %e, %f + %b1 = add i16 %a1, %a2 + %b2 = add i16 %a3, %g + %c1 = add i16 %b1, %b2 + ret i16 %c1 +} + +define fastcc i32 @arg8_i32(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h) nounwind { +; X64-LABEL: arg8_i32: +; X64: # %bb.0: +; X64-NEXT: # kill: def $r9d killed $r9d def $r9 +; X64-NEXT: # kill: def $r8d killed $r8d def $r8 +; X64-NEXT: # kill: def $ecx killed $ecx def $rcx +; X64-NEXT: # kill: def $edx killed $edx def $rdx +; X64-NEXT: # kill: def $esi killed $esi def $rsi +; X64-NEXT: # kill: def $edi killed $edi def $rdi +; X64-NEXT: movl {{[0-9]+}}(%rsp), %eax +; X64-NEXT: addl %edi, %esi +; X64-NEXT: addl %edx, %ecx +; X64-NEXT: addl %esi, %ecx +; X64-NEXT: addl {{[0-9]+}}(%rsp), %eax +; X64-NEXT: addl %r8d, %eax +; X64-NEXT: addl %r9d, %eax +; X64-NEXT: addl %ecx, %eax +; X64-NEXT: retq +; +; EGPR-LABEL: arg8_i32: +; EGPR: # %bb.0: +; EGPR-NEXT: # kill: def $r17d killed $r17d def $r17 +; EGPR-NEXT: # kill: def $r16d killed $r16d def $r16 +; EGPR-NEXT: # kill: def $r9d killed $r9d def $r9 +; EGPR-NEXT: # kill: def $r8d killed $r8d def $r8 +; EGPR-NEXT: # kill: def $ecx killed $ecx def $rcx +; EGPR-NEXT: # kill: def $edx killed $edx def $rdx +; EGPR-NEXT: # kill: def $esi killed $esi def $rsi +; EGPR-NEXT: # kill: def $edi killed $edi def $rdi +; EGPR-NEXT: leal (%rdx,%rcx), %ecx +; EGPR-NEXT: addl %edi, %ecx +; EGPR-NEXT: addl %esi, %ecx +; EGPR-NEXT: leal (%r16,%r17), %eax +; EGPR-NEXT: addl %r8d, %eax +; EGPR-NEXT: addl %r9d, %eax +; EGPR-NEXT: addl %ecx, %eax +; EGPR-NEXT: retq + %a1 = add i32 %a, %b + %a2 = add i32 %c, %d + %a3 = add i32 %e, %f + %a4 = add i32 %g, %h + %b1 = add i32 %a1, %a2 + %b2 = add i32 %a3, %a4 + %c1 = add i32 %b1, %b2 + ret i32 %c1 +} + +define fastcc i64 @arg9_i64(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f, i64 %g, i64 %h, i64 %i) nounwind { +; X64-LABEL: arg9_i64: +; X64: # %bb.0: +; X64-NEXT: movq {{[0-9]+}}(%rsp), %rax +; X64-NEXT: addq %rdi, %rsi +; X64-NEXT: addq %rdx, %rcx +; X64-NEXT: addq %rsi, %rcx +; X64-NEXT: addq {{[0-9]+}}(%rsp), %rax +; X64-NEXT: addq %r8, %rax +; X64-NEXT: addq %r9, %rax +; X64-NEXT: addq %rcx, %rax +; X64-NEXT: addq {{[0-9]+}}(%rsp), %rax +; X64-NEXT: retq +; +; EGPR-LABEL: arg9_i64: +; EGPR: # %bb.0: +; EGPR-NEXT: leaq (%rdx,%rcx), %rcx +; EGPR-NEXT: addq %rdi, %rcx +; EGPR-NEXT: addq %rsi, %rcx +; EGPR-NEXT: leaq (%r16,%r17), %rax +; EGPR-NEXT: addq %r8, %rax +; EGPR-NEXT: addq %r9, %rax +; EGPR-NEXT: addq %rcx, %rax +; EGPR-NEXT: addq %r18, %rax +; EGPR-NEXT: retq + %a1 = add i64 %a, %b + %a2 = add i64 %c, %d + %a3 = add i64 %e, %f + %a4 = add i64 %g, %h + %b1 = add i64 %a1, %a2 + %b2 = add i64 %a3, %a4 + %c1 = add i64 %b1, %b2 + %c2 = add i64 %c1, %i + ret i64 %c2 +} + +define fastcc i32 @arg10_i32(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i32 %j) nounwind { +; X64-LABEL: arg10_i32: +; X64: # %bb.0: +; X64-NEXT: # kill: def $r9d killed $r9d def $r9 +; X64-NEXT: # kill: def $r8d killed $r8d def $r8 +; X64-NEXT: # kill: def $ecx killed $ecx def $rcx +; X64-NEXT: # kill: def $edx killed $edx def $rdx +; X64-NEXT: # kill: def $esi killed $esi def $rsi +; X64-NEXT: # kill: def $edi killed $edi def $rdi +; X64-NEXT: movl {{[0-9]+}}(%rsp), %eax +; X64-NEXT: movl {{[0-9]+}}(%rsp), %r10d +; X64-NEXT: addl %edi, %esi +; X64-NEXT: addl %edx, %ecx +; X64-NEXT: addl %esi, %ecx +; X64-NEXT: addl {{[0-9]+}}(%rsp), %r10d +; X64-NEXT: addl %r8d, %r10d +; X64-NEXT: addl %r9d, %r10d +; X64-NEXT: addl {{[0-9]+}}(%rsp), %eax +; X64-NEXT: addl %ecx, %eax +; X64-NEXT: addl %r10d, %eax +; X64-NEXT: retq +; +; EGPR-LABEL: arg10_i32: +; EGPR: # %bb.0: +; EGPR-NEXT: # kill: def $r19d killed $r19d def $r19 +; EGPR-NEXT: # kill: def $r18d killed $r18d def $r18 +; EGPR-NEXT: # kill: def $r17d killed $r17d def $r17 +; EGPR-NEXT: # kill: def $r16d killed $r16d def $r16 +; EGPR-NEXT: # kill: def $r9d killed $r9d def $r9 +; EGPR-NEXT: # kill: def $r8d killed $r8d def $r8 +; EGPR-NEXT: # kill: def $ecx killed $ecx def $rcx +; EGPR-NEXT: # kill: def $edx killed $edx def $rdx +; EGPR-NEXT: # kill: def $esi killed $esi def $rsi +; EGPR-NEXT: # kill: def $edi killed $edi def $rdi +; EGPR-NEXT: leal (%rdx,%rcx), %ecx +; EGPR-NEXT: addl %edi, %ecx +; EGPR-NEXT: addl %esi, %ecx +; EGPR-NEXT: leal (%r16,%r17), %eax +; EGPR-NEXT: addl %r8d, %eax +; EGPR-NEXT: addl %r9d, %eax +; EGPR-NEXT: addl %ecx, %eax +; EGPR-NEXT: addl %r18d, %eax +; EGPR-NEXT: addl %r19d, %eax +; EGPR-NEXT: retq + %a1 = add i32 %a, %b + %a2 = add i32 %c, %d + %a3 = add i32 %e, %f + %a4 = add i32 %g, %h + %a5 = add i32 %i, %j + %b1 = add i32 %a1, %a2 + %b2 = add i32 %a3, %a4 + %c1 = add i32 %b1, %b2 + %c2 = add i32 %c1, %a5 + ret i32 %c2 +} + +define fastcc i16 @arg11_i16(i16 %a, i16 %b, i16 %c, i16 %d, i16 %e, i16 %f, i16 %g, i16 %h, i16 %i, i16 %j, i16 %k) nounwind { +; X64-LABEL: arg11_i16: +; X64: # %bb.0: +; X64-NEXT: # kill: def $r9d killed $r9d def $r9 +; X64-NEXT: # kill: def $r8d killed $r8d def $r8 +; X64-NEXT: # kill: def $ecx killed $ecx def $rcx +; X64-NEXT: # kill: def $edx killed $edx def $rdx +; X64-NEXT: # kill: def $esi killed $esi def $rsi +; X64-NEXT: # kill: def $edi killed $edi def $rdi +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %eax +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %r10d +; X64-NEXT: addl %edi, %esi +; X64-NEXT: addl %edx, %ecx +; X64-NEXT: addl %esi, %ecx +; X64-NEXT: addw {{[0-9]+}}(%rsp), %r10w +; X64-NEXT: addl %r8d, %r10d +; X64-NEXT: addl %r9d, %r10d +; X64-NEXT: addw {{[0-9]+}}(%rsp), %ax +; X64-NEXT: addl %ecx, %eax +; X64-NEXT: addl %r10d, %eax +; X64-NEXT: addw {{[0-9]+}}(%rsp), %ax +; X64-NEXT: # kill: def $ax killed $ax killed $eax +; X64-NEXT: retq +; +; EGPR-LABEL: arg11_i16: +; EGPR: # %bb.0: +; EGPR-NEXT: # kill: def $r19d killed $r19d def $r19 +; EGPR-NEXT: # kill: def $r18d killed $r18d def $r18 +; EGPR-NEXT: # kill: def $r17d killed $r17d def $r17 +; EGPR-NEXT: # kill: def $r16d killed $r16d def $r16 +; EGPR-NEXT: # kill: def $r9d killed $r9d def $r9 +; EGPR-NEXT: # kill: def $r8d killed $r8d def $r8 +; EGPR-NEXT: # kill: def $ecx killed $ecx def $rcx +; EGPR-NEXT: # kill: def $edx killed $edx def $rdx +; EGPR-NEXT: # kill: def $esi killed $esi def $rsi +; EGPR-NEXT: # kill: def $edi killed $edi def $rdi +; EGPR-NEXT: leal (%rdx,%rcx), %ecx +; EGPR-NEXT: addl %edi, %ecx +; EGPR-NEXT: addl %esi, %ecx +; EGPR-NEXT: leal (%r16,%r17), %edx +; EGPR-NEXT: addl %r8d, %edx +; EGPR-NEXT: addl %r9d, %edx +; EGPR-NEXT: addl %ecx, %edx +; EGPR-NEXT: leal (%r18,%r19), %eax +; EGPR-NEXT: addl %r20d, %eax +; EGPR-NEXT: addl %edx, %eax +; EGPR-NEXT: # kill: def $ax killed $ax killed $eax +; EGPR-NEXT: retq + %a1 = add i16 %a, %b + %a2 = add i16 %c, %d + %a3 = add i16 %e, %f + %a4 = add i16 %g, %h + %a5 = add i16 %i, %j + %b1 = add i16 %a1, %a2 + %b2 = add i16 %a3, %a4 + %c1 = add i16 %b1, %b2 + %c2 = add i16 %c1, %a5 + %c3 = add i16 %c2, %k + ret i16 %c3 +} + +define fastcc i8 @arg12_i8(i8 %a, i8 %b, i8 %c, i8 %d, i8 %e, i8 %f, i8 %g, i8 %h, i8 %i, i8 %j, i8 %k, i8 %l) nounwind { +; X64-LABEL: arg12_i8: +; X64: # %bb.0: +; X64-NEXT: # kill: def $r9d killed $r9d def $r9 +; X64-NEXT: # kill: def $r8d killed $r8d def $r8 +; X64-NEXT: # kill: def $ecx killed $ecx def $rcx +; X64-NEXT: # kill: def $edx killed $edx def $rdx +; X64-NEXT: # kill: def $esi killed $esi def $rsi +; X64-NEXT: # kill: def $edi killed $edi def $rdi +; X64-NEXT: movzbl {{[0-9]+}}(%rsp), %eax +; X64-NEXT: movzbl {{[0-9]+}}(%rsp), %r11d +; X64-NEXT: movzbl {{[0-9]+}}(%rsp), %r10d +; X64-NEXT: addl %edi, %esi +; X64-NEXT: addl %edx, %ecx +; X64-NEXT: addb %sil, %cl +; X64-NEXT: leal (%r8,%r9), %edx +; X64-NEXT: addb {{[0-9]+}}(%rsp), %r10b +; X64-NEXT: addb %dl, %r10b +; X64-NEXT: addb %cl, %r10b +; X64-NEXT: addb {{[0-9]+}}(%rsp), %r11b +; X64-NEXT: addb {{[0-9]+}}(%rsp), %al +; X64-NEXT: addb %r11b, %al +; X64-NEXT: addb %r10b, %al +; X64-NEXT: retq +; +; EGPR-LABEL: arg12_i8: +; EGPR: # %bb.0: +; EGPR-NEXT: # kill: def $r21d killed $r21d def $r21 +; EGPR-NEXT: # kill: def $r20d killed $r20d def $r20 +; EGPR-NEXT: # kill: def $r19d killed $r19d def $r19 +; EGPR-NEXT: # kill: def $r18d killed $r18d def $r18 +; EGPR-NEXT: # kill: def $r17d killed $r17d def $r17 +; EGPR-NEXT: # kill: def $r16d killed $r16d def $r16 +; EGPR-NEXT: # kill: def $r9d killed $r9d def $r9 +; EGPR-NEXT: # kill: def $r8d killed $r8d def $r8 +; EGPR-NEXT: # kill: def $ecx killed $ecx def $rcx +; EGPR-NEXT: # kill: def $edx killed $edx def $rdx +; EGPR-NEXT: # kill: def $esi killed $esi def $rsi +; EGPR-NEXT: # kill: def $edi killed $edi def $rdi +; EGPR-NEXT: leal (%rdi,%rsi), %eax +; EGPR-NEXT: addl %edx, %ecx +; EGPR-NEXT: addb %al, %cl +; EGPR-NEXT: leal (%r8,%r9), %eax +; EGPR-NEXT: leal (%r16,%r17), %edx +; EGPR-NEXT: addb %al, %dl +; EGPR-NEXT: addb %cl, %dl +; EGPR-NEXT: leal (%r18,%r19), %ecx +; EGPR-NEXT: leal (%r20,%r21), %eax +; EGPR-NEXT: addb %cl, %al +; EGPR-NEXT: addb %dl, %al +; EGPR-NEXT: # kill: def $al killed $al killed $eax +; EGPR-NEXT: retq + %a1 = add i8 %a, %b + %a2 = add i8 %c, %d + %a3 = add i8 %e, %f + %a4 = add i8 %g, %h + %a5 = add i8 %i, %j + %a6 = add i8 %k, %l + %b1 = add i8 %a1, %a2 + %b2 = add i8 %a3, %a4 + %b3 = add i8 %a5, %a6 + %c1 = add i8 %b1, %b2 + %c2 = add i8 %c1, %b3 + ret i8 %c2 +} + +define fastcc i16 @arg13_i16(i16 %a, i16 %b, i16 %c, i16 %d, i16 %e, i16 %f, i16 %g, i16 %h, i16 %i, i16 %j, i16 %k, i16 %l, i16 %m) nounwind { +; X64-LABEL: arg13_i16: +; X64: # %bb.0: +; X64-NEXT: # kill: def $r9d killed $r9d def $r9 +; X64-NEXT: # kill: def $r8d killed $r8d def $r8 +; X64-NEXT: # kill: def $ecx killed $ecx def $rcx +; X64-NEXT: # kill: def $edx killed $edx def $rdx +; X64-NEXT: # kill: def $esi killed $esi def $rsi +; X64-NEXT: # kill: def $edi killed $edi def $rdi +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %eax +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %r10d +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %r11d +; X64-NEXT: addl %edi, %esi +; X64-NEXT: addl %edx, %ecx +; X64-NEXT: addl %esi, %ecx +; X64-NEXT: addw {{[0-9]+}}(%rsp), %r11w +; X64-NEXT: addl %r8d, %r11d +; X64-NEXT: addl %r9d, %r11d +; X64-NEXT: addl %ecx, %r11d +; X64-NEXT: addw {{[0-9]+}}(%rsp), %r10w +; X64-NEXT: addw {{[0-9]+}}(%rsp), %ax +; X64-NEXT: addl %r10d, %eax +; X64-NEXT: addl %r11d, %eax +; X64-NEXT: addw {{[0-9]+}}(%rsp), %ax +; X64-NEXT: # kill: def $ax killed $ax killed $eax +; X64-NEXT: retq +; +; EGPR-LABEL: arg13_i16: +; EGPR: # %bb.0: +; EGPR-NEXT: # kill: def $r21d killed $r21d def $r21 +; EGPR-NEXT: # kill: def $r20d killed $r20d def $r20 +; EGPR-NEXT: # kill: def $r19d killed $r19d def $r19 +; EGPR-NEXT: # kill: def $r18d killed $r18d def $r18 +; EGPR-NEXT: # kill: def $r17d killed $r17d def $r17 +; EGPR-NEXT: # kill: def $r16d killed $r16d def $r16 +; EGPR-NEXT: # kill: def $r9d killed $r9d def $r9 +; EGPR-NEXT: # kill: def $r8d killed $r8d def $r8 +; EGPR-NEXT: # kill: def $ecx killed $ecx def $rcx +; EGPR-NEXT: # kill: def $edx killed $edx def $rdx +; EGPR-NEXT: # kill: def $esi killed $esi def $rsi +; EGPR-NEXT: # kill: def $edi killed $edi def $rdi +; EGPR-NEXT: leal (%rdx,%rcx), %ecx +; EGPR-NEXT: addl %edi, %ecx +; EGPR-NEXT: addl %esi, %ecx +; EGPR-NEXT: leal (%r16,%r17), %edx +; EGPR-NEXT: addl %r8d, %edx +; EGPR-NEXT: addl %r9d, %edx +; EGPR-NEXT: addl %ecx, %edx +; EGPR-NEXT: leal (%r20,%r21), %eax +; EGPR-NEXT: addl %r18d, %eax +; EGPR-NEXT: addl %r19d, %eax +; EGPR-NEXT: addl %r22d, %eax +; EGPR-NEXT: addl %edx, %eax +; EGPR-NEXT: # kill: def $ax killed $ax killed $eax +; EGPR-NEXT: retq + %a1 = add i16 %a, %b + %a2 = add i16 %c, %d + %a3 = add i16 %e, %f + %a4 = add i16 %g, %h + %a5 = add i16 %i, %j + %a6 = add i16 %k, %l + %b1 = add i16 %a1, %a2 + %b2 = add i16 %a3, %a4 + %b3 = add i16 %a5, %a6 + %c1 = add i16 %b1, %b2 + %c2 = add i16 %c1, %b3 + %c3 = add i16 %c2, %m + ret i16 %c3 +} + +define fastcc i32 @arg14_i32(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i32 %j, i32 %k, i32 %l, i32 %m, i32 %n) nounwind { +; X64-LABEL: arg14_i32: +; X64: # %bb.0: +; X64-NEXT: pushq %rbx +; X64-NEXT: # kill: def $r9d killed $r9d def $r9 +; X64-NEXT: # kill: def $r8d killed $r8d def $r8 +; X64-NEXT: # kill: def $ecx killed $ecx def $rcx +; X64-NEXT: # kill: def $edx killed $edx def $rdx +; X64-NEXT: # kill: def $esi killed $esi def $rsi +; X64-NEXT: # kill: def $edi killed $edi def $rdi +; X64-NEXT: movl {{[0-9]+}}(%rsp), %eax +; X64-NEXT: movl {{[0-9]+}}(%rsp), %r10d +; X64-NEXT: movl {{[0-9]+}}(%rsp), %r11d +; X64-NEXT: movl {{[0-9]+}}(%rsp), %ebx +; X64-NEXT: addl %edi, %esi +; X64-NEXT: addl %edx, %ecx +; X64-NEXT: addl %esi, %ecx +; X64-NEXT: addl {{[0-9]+}}(%rsp), %ebx +; X64-NEXT: addl %r8d, %ebx +; X64-NEXT: addl %r9d, %ebx +; X64-NEXT: addl %ecx, %ebx +; X64-NEXT: addl {{[0-9]+}}(%rsp), %r11d +; X64-NEXT: addl {{[0-9]+}}(%rsp), %r10d +; X64-NEXT: addl %r11d, %r10d +; X64-NEXT: addl {{[0-9]+}}(%rsp), %eax +; X64-NEXT: addl %r10d, %eax +; X64-NEXT: addl %ebx, %eax +; X64-NEXT: popq %rbx +; X64-NEXT: retq +; +; EGPR-LABEL: arg14_i32: +; EGPR: # %bb.0: +; EGPR-NEXT: # kill: def $r23d killed $r23d def $r23 +; EGPR-NEXT: # kill: def $r22d killed $r22d def $r22 +; EGPR-NEXT: # kill: def $r21d killed $r21d def $r21 +; EGPR-NEXT: # kill: def $r20d killed $r20d def $r20 +; EGPR-NEXT: # kill: def $r19d killed $r19d def $r19 +; EGPR-NEXT: # kill: def $r18d killed $r18d def $r18 +; EGPR-NEXT: # kill: def $r17d killed $r17d def $r17 +; EGPR-NEXT: # kill: def $r16d killed $r16d def $r16 +; EGPR-NEXT: # kill: def $r9d killed $r9d def $r9 +; EGPR-NEXT: # kill: def $r8d killed $r8d def $r8 +; EGPR-NEXT: # kill: def $ecx killed $ecx def $rcx +; EGPR-NEXT: # kill: def $edx killed $edx def $rdx +; EGPR-NEXT: # kill: def $esi killed $esi def $rsi +; EGPR-NEXT: # kill: def $edi killed $edi def $rdi +; EGPR-NEXT: leal (%rdx,%rcx), %ecx +; EGPR-NEXT: addl %edi, %ecx +; EGPR-NEXT: addl %esi, %ecx +; EGPR-NEXT: leal (%r16,%r17), %edx +; EGPR-NEXT: addl %r8d, %edx +; EGPR-NEXT: addl %r9d, %edx +; EGPR-NEXT: addl %ecx, %edx +; EGPR-NEXT: leal (%r20,%r21), %eax +; EGPR-NEXT: addl %r18d, %eax +; EGPR-NEXT: addl %r19d, %eax +; EGPR-NEXT: addl %r22d, %eax +; EGPR-NEXT: addl %r23d, %eax +; EGPR-NEXT: addl %edx, %eax +; EGPR-NEXT: retq + %a1 = add i32 %a, %b + %a2 = add i32 %c, %d + %a3 = add i32 %e, %f + %a4 = add i32 %g, %h + %a5 = add i32 %i, %j + %a6 = add i32 %k, %l + %a7 = add i32 %m, %n + %b1 = add i32 %a1, %a2 + %b2 = add i32 %a3, %a4 + %b3 = add i32 %a5, %a6 + %c1 = add i32 %b1, %b2 + %c2 = add i32 %c1, %b3 + %c3 = add i32 %c2, %a7 + ret i32 %c3 +} + +define fastcc i64 @arg15_i64(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f, i64 %g, i64 %h, i64 %i, i64 %j, i64 %k, i64 %l, i64 %m, i64 %n, i64 %o) nounwind { +; X64-LABEL: arg15_i64: +; X64: # %bb.0: +; X64-NEXT: pushq %rbx +; X64-NEXT: movq {{[0-9]+}}(%rsp), %rax +; X64-NEXT: movq {{[0-9]+}}(%rsp), %r10 +; X64-NEXT: movq {{[0-9]+}}(%rsp), %r11 +; X64-NEXT: movq {{[0-9]+}}(%rsp), %rbx +; X64-NEXT: addq %rdi, %rsi +; X64-NEXT: addq %rdx, %rcx +; X64-NEXT: addq %rsi, %rcx +; X64-NEXT: addq {{[0-9]+}}(%rsp), %rbx +; X64-NEXT: addq %r8, %rbx +; X64-NEXT: addq %r9, %rbx +; X64-NEXT: addq %rcx, %rbx +; X64-NEXT: addq {{[0-9]+}}(%rsp), %r11 +; X64-NEXT: addq {{[0-9]+}}(%rsp), %r10 +; X64-NEXT: addq %r11, %r10 +; X64-NEXT: addq {{[0-9]+}}(%rsp), %rax +; X64-NEXT: addq %r10, %rax +; X64-NEXT: addq %rbx, %rax +; X64-NEXT: addq {{[0-9]+}}(%rsp), %rax +; X64-NEXT: popq %rbx +; X64-NEXT: retq +; +; EGPR-LABEL: arg15_i64: +; EGPR: # %bb.0: +; EGPR-NEXT: leaq (%rdx,%rcx), %rcx +; EGPR-NEXT: addq %rdi, %rcx +; EGPR-NEXT: addq %rsi, %rcx +; EGPR-NEXT: leaq (%r16,%r17), %rdx +; EGPR-NEXT: addq %r8, %rdx +; EGPR-NEXT: addq %r9, %rdx +; EGPR-NEXT: addq %rcx, %rdx +; EGPR-NEXT: leaq (%r20,%r21), %rax +; EGPR-NEXT: addq %r18, %rax +; EGPR-NEXT: addq %r19, %rax +; EGPR-NEXT: addq %r22, %rax +; EGPR-NEXT: addq %r23, %rax +; EGPR-NEXT: addq %rdx, %rax +; EGPR-NEXT: addq %r24, %rax +; EGPR-NEXT: retq + %a1 = add i64 %a, %b + %a2 = add i64 %c, %d + %a3 = add i64 %e, %f + %a4 = add i64 %g, %h + %a5 = add i64 %i, %j + %a6 = add i64 %k, %l + %a7 = add i64 %m, %n + %b1 = add i64 %a1, %a2 + %b2 = add i64 %a3, %a4 + %b3 = add i64 %a5, %a6 + %c1 = add i64 %b1, %b2 + %c2 = add i64 %c1, %b3 + %c3 = add i64 %c2, %a7 + %c4 = add i64 %c3, %o + ret i64 %c4 +} + +define fastcc i32 @arg16_i32(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i32 %j, i32 %k, i32 %l, i32 %m, i32 %n, i32 %o, i32 %p) nounwind { +; X64-LABEL: arg16_i32: +; X64: # %bb.0: +; X64-NEXT: pushq %rbp +; X64-NEXT: pushq %rbx +; X64-NEXT: # kill: def $r9d killed $r9d def $r9 +; X64-NEXT: # kill: def $r8d killed $r8d def $r8 +; X64-NEXT: # kill: def $ecx killed $ecx def $rcx +; X64-NEXT: # kill: def $edx killed $edx def $rdx +; X64-NEXT: # kill: def $esi killed $esi def $rsi +; X64-NEXT: # kill: def $edi killed $edi def $rdi +; X64-NEXT: movl {{[0-9]+}}(%rsp), %eax +; X64-NEXT: movl {{[0-9]+}}(%rsp), %ebx +; X64-NEXT: movl {{[0-9]+}}(%rsp), %r11d +; X64-NEXT: movl {{[0-9]+}}(%rsp), %ebp +; X64-NEXT: movl {{[0-9]+}}(%rsp), %r10d +; X64-NEXT: addl %edi, %esi +; X64-NEXT: addl %edx, %ecx +; X64-NEXT: addl %esi, %ecx +; X64-NEXT: addl {{[0-9]+}}(%rsp), %r10d +; X64-NEXT: addl %r8d, %r10d +; X64-NEXT: addl %r9d, %r10d +; X64-NEXT: addl %ecx, %r10d +; X64-NEXT: addl {{[0-9]+}}(%rsp), %ebp +; X64-NEXT: addl {{[0-9]+}}(%rsp), %r11d +; X64-NEXT: addl %ebp, %r11d +; X64-NEXT: addl {{[0-9]+}}(%rsp), %ebx +; X64-NEXT: addl {{[0-9]+}}(%rsp), %eax +; X64-NEXT: addl %ebx, %eax +; X64-NEXT: addl %r11d, %eax +; X64-NEXT: addl %r10d, %eax +; X64-NEXT: popq %rbx +; X64-NEXT: popq %rbp +; X64-NEXT: retq +; +; EGPR-LABEL: arg16_i32: +; EGPR: # %bb.0: +; EGPR-NEXT: # kill: def $r25d killed $r25d def $r25 +; EGPR-NEXT: # kill: def $r24d killed $r24d def $r24 +; EGPR-NEXT: # kill: def $r23d killed $r23d def $r23 +; EGPR-NEXT: # kill: def $r22d killed $r22d def $r22 +; EGPR-NEXT: # kill: def $r21d killed $r21d def $r21 +; EGPR-NEXT: # kill: def $r20d killed $r20d def $r20 +; EGPR-NEXT: # kill: def $r19d killed $r19d def $r19 +; EGPR-NEXT: # kill: def $r18d killed $r18d def $r18 +; EGPR-NEXT: # kill: def $r17d killed $r17d def $r17 +; EGPR-NEXT: # kill: def $r16d killed $r16d def $r16 +; EGPR-NEXT: # kill: def $r9d killed $r9d def $r9 +; EGPR-NEXT: # kill: def $r8d killed $r8d def $r8 +; EGPR-NEXT: # kill: def $ecx killed $ecx def $rcx +; EGPR-NEXT: # kill: def $edx killed $edx def $rdx +; EGPR-NEXT: # kill: def $esi killed $esi def $rsi +; EGPR-NEXT: # kill: def $edi killed $edi def $rdi +; EGPR-NEXT: leal (%rdx,%rcx), %ecx +; EGPR-NEXT: addl %edi, %ecx +; EGPR-NEXT: addl %esi, %ecx +; EGPR-NEXT: leal (%r16,%r17), %edx +; EGPR-NEXT: addl %r8d, %edx +; EGPR-NEXT: addl %r9d, %edx +; EGPR-NEXT: addl %ecx, %edx +; EGPR-NEXT: leal (%r20,%r21), %ecx +; EGPR-NEXT: addl %r18d, %ecx +; EGPR-NEXT: addl %r19d, %ecx +; EGPR-NEXT: leal (%r24,%r25), %eax +; EGPR-NEXT: addl %r22d, %eax +; EGPR-NEXT: addl %r23d, %eax +; EGPR-NEXT: addl %ecx, %eax +; EGPR-NEXT: addl %edx, %eax +; EGPR-NEXT: retq + %a1 = add i32 %a, %b + %a2 = add i32 %c, %d + %a3 = add i32 %e, %f + %a4 = add i32 %g, %h + %a5 = add i32 %i, %j + %a6 = add i32 %k, %l + %a7 = add i32 %m, %n + %a8 = add i32 %o, %p + %b1 = add i32 %a1, %a2 + %b2 = add i32 %a3, %a4 + %b3 = add i32 %a5, %a6 + %b4 = add i32 %a7, %a8 + %c1 = add i32 %b1, %b2 + %c2 = add i32 %b3, %b4 + %d1 = add i32 %c1, %c2 + ret i32 %d1 +} + +define fastcc i16 @arg17_i16(i16 %a, i16 %b, i16 %c, i16 %d, i16 %e, i16 %f, i16 %g, i16 %h, i16 %i, i16 %j, i16 %k, i16 %l, i16 %m, i16 %n, i16 %o, i16 %p, i16 %q) nounwind { +; X64-LABEL: arg17_i16: +; X64: # %bb.0: +; X64-NEXT: pushq %rbp +; X64-NEXT: pushq %rbx +; X64-NEXT: # kill: def $r9d killed $r9d def $r9 +; X64-NEXT: # kill: def $r8d killed $r8d def $r8 +; X64-NEXT: # kill: def $ecx killed $ecx def $rcx +; X64-NEXT: # kill: def $edx killed $edx def $rdx +; X64-NEXT: # kill: def $esi killed $esi def $rsi +; X64-NEXT: # kill: def $edi killed $edi def $rdi +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %eax +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %ebx +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %r11d +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %ebp +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %r10d +; X64-NEXT: addl %edi, %esi +; X64-NEXT: addl %edx, %ecx +; X64-NEXT: addl %esi, %ecx +; X64-NEXT: addw {{[0-9]+}}(%rsp), %r10w +; X64-NEXT: addl %r8d, %r10d +; X64-NEXT: addl %r9d, %r10d +; X64-NEXT: addl %ecx, %r10d +; X64-NEXT: addw {{[0-9]+}}(%rsp), %bp +; X64-NEXT: addw {{[0-9]+}}(%rsp), %r11w +; X64-NEXT: addl %ebp, %r11d +; X64-NEXT: addw {{[0-9]+}}(%rsp), %bx +; X64-NEXT: addw {{[0-9]+}}(%rsp), %ax +; X64-NEXT: addl %ebx, %eax +; X64-NEXT: addl %r11d, %eax +; X64-NEXT: addl %r10d, %eax +; X64-NEXT: addw {{[0-9]+}}(%rsp), %ax +; X64-NEXT: # kill: def $ax killed $ax killed $eax +; X64-NEXT: popq %rbx +; X64-NEXT: popq %rbp +; X64-NEXT: retq +; +; EGPR-LABEL: arg17_i16: +; EGPR: # %bb.0: +; EGPR-NEXT: # kill: def $r25d killed $r25d def $r25 +; EGPR-NEXT: # kill: def $r24d killed $r24d def $r24 +; EGPR-NEXT: # kill: def $r23d killed $r23d def $r23 +; EGPR-NEXT: # kill: def $r22d killed $r22d def $r22 +; EGPR-NEXT: # kill: def $r21d killed $r21d def $r21 +; EGPR-NEXT: # kill: def $r20d killed $r20d def $r20 +; EGPR-NEXT: # kill: def $r19d killed $r19d def $r19 +; EGPR-NEXT: # kill: def $r18d killed $r18d def $r18 +; EGPR-NEXT: # kill: def $r17d killed $r17d def $r17 +; EGPR-NEXT: # kill: def $r16d killed $r16d def $r16 +; EGPR-NEXT: # kill: def $r9d killed $r9d def $r9 +; EGPR-NEXT: # kill: def $r8d killed $r8d def $r8 +; EGPR-NEXT: # kill: def $ecx killed $ecx def $rcx +; EGPR-NEXT: # kill: def $edx killed $edx def $rdx +; EGPR-NEXT: # kill: def $esi killed $esi def $rsi +; EGPR-NEXT: # kill: def $edi killed $edi def $rdi +; EGPR-NEXT: leal (%rdx,%rcx), %ecx +; EGPR-NEXT: addl %edi, %ecx +; EGPR-NEXT: addl %esi, %ecx +; EGPR-NEXT: leal (%r16,%r17), %edx +; EGPR-NEXT: addl %r8d, %edx +; EGPR-NEXT: addl %r9d, %edx +; EGPR-NEXT: addl %ecx, %edx +; EGPR-NEXT: leal (%r20,%r21), %ecx +; EGPR-NEXT: addl %r18d, %ecx +; EGPR-NEXT: addl %r19d, %ecx +; EGPR-NEXT: leal (%r24,%r25), %eax +; EGPR-NEXT: addl %r22d, %eax +; EGPR-NEXT: addl %r23d, %eax +; EGPR-NEXT: addl %ecx, %eax +; EGPR-NEXT: addl %edx, %eax +; EGPR-NEXT: addl %r26d, %eax +; EGPR-NEXT: # kill: def $ax killed $ax killed $eax +; EGPR-NEXT: retq + %a1 = add i16 %a, %b + %a2 = add i16 %c, %d + %a3 = add i16 %e, %f + %a4 = add i16 %g, %h + %a5 = add i16 %i, %j + %a6 = add i16 %k, %l + %a7 = add i16 %m, %n + %a8 = add i16 %o, %p + %b1 = add i16 %a1, %a2 + %b2 = add i16 %a3, %a4 + %b3 = add i16 %a5, %a6 + %b4 = add i16 %a7, %a8 + %c1 = add i16 %b1, %b2 + %c2 = add i16 %b3, %b4 + %d1 = add i16 %c1, %c2 + %d2 = add i16 %d1, %q + ret i16 %d2 +} + +define fastcc i8 @arg18_i8(i8 %a, i8 %b, i8 %c, i8 %d, i8 %e, i8 %f, i8 %g, i8 %h, i8 %i, i8 %j, i8 %k, i8 %l, i8 %m, i8 %n, i8 %o, i8 %p, i8 %q, i8 %r) nounwind { +; X64-LABEL: arg18_i8: +; X64: # %bb.0: +; X64-NEXT: pushq %rbp +; X64-NEXT: pushq %r14 +; X64-NEXT: pushq %rbx +; X64-NEXT: # kill: def $r9d killed $r9d def $r9 +; X64-NEXT: # kill: def $r8d killed $r8d def $r8 +; X64-NEXT: # kill: def $ecx killed $ecx def $rcx +; X64-NEXT: # kill: def $edx killed $edx def $rdx +; X64-NEXT: # kill: def $esi killed $esi def $rsi +; X64-NEXT: # kill: def $edi killed $edi def $rdi +; X64-NEXT: movzbl {{[0-9]+}}(%rsp), %eax +; X64-NEXT: movzbl {{[0-9]+}}(%rsp), %r10d +; X64-NEXT: movzbl {{[0-9]+}}(%rsp), %ebp +; X64-NEXT: movzbl {{[0-9]+}}(%rsp), %ebx +; X64-NEXT: movzbl {{[0-9]+}}(%rsp), %r14d +; X64-NEXT: movzbl {{[0-9]+}}(%rsp), %r11d +; X64-NEXT: addl %edi, %esi +; X64-NEXT: addl %edx, %ecx +; X64-NEXT: addb %sil, %cl +; X64-NEXT: leal (%r8,%r9), %edx +; X64-NEXT: addb {{[0-9]+}}(%rsp), %r11b +; X64-NEXT: addb %dl, %r11b +; X64-NEXT: addb %cl, %r11b +; X64-NEXT: addb {{[0-9]+}}(%rsp), %r14b +; X64-NEXT: addb {{[0-9]+}}(%rsp), %bl +; X64-NEXT: addb %r14b, %bl +; X64-NEXT: addb {{[0-9]+}}(%rsp), %bpl +; X64-NEXT: addb {{[0-9]+}}(%rsp), %r10b +; X64-NEXT: addb %bpl, %r10b +; X64-NEXT: addb %bl, %r10b +; X64-NEXT: addb %r11b, %r10b +; X64-NEXT: addb {{[0-9]+}}(%rsp), %al +; X64-NEXT: addb %r10b, %al +; X64-NEXT: popq %rbx +; X64-NEXT: popq %r14 +; X64-NEXT: popq %rbp +; X64-NEXT: retq +; +; EGPR-LABEL: arg18_i8: +; EGPR: # %bb.0: +; EGPR-NEXT: # kill: def $r27d killed $r27d def $r27 +; EGPR-NEXT: # kill: def $r26d killed $r26d def $r26 +; EGPR-NEXT: # kill: def $r25d killed $r25d def $r25 +; EGPR-NEXT: # kill: def $r24d killed $r24d def $r24 +; EGPR-NEXT: # kill: def $r23d killed $r23d def $r23 +; EGPR-NEXT: # kill: def $r22d killed $r22d def $r22 +; EGPR-NEXT: # kill: def $r21d killed $r21d def $r21 +; EGPR-NEXT: # kill: def $r20d killed $r20d def $r20 +; EGPR-NEXT: # kill: def $r19d killed $r19d def $r19 +; EGPR-NEXT: # kill: def $r18d killed $r18d def $r18 +; EGPR-NEXT: # kill: def $r17d killed $r17d def $r17 +; EGPR-NEXT: # kill: def $r16d killed $r16d def $r16 +; EGPR-NEXT: # kill: def $r9d killed $r9d def $r9 +; EGPR-NEXT: # kill: def $r8d killed $r8d def $r8 +; EGPR-NEXT: # kill: def $ecx killed $ecx def $rcx +; EGPR-NEXT: # kill: def $edx killed $edx def $rdx +; EGPR-NEXT: # kill: def $esi killed $esi def $rsi +; EGPR-NEXT: # kill: def $edi killed $edi def $rdi +; EGPR-NEXT: leal (%rdi,%rsi), %eax +; EGPR-NEXT: addl %edx, %ecx +; EGPR-NEXT: addb %al, %cl +; EGPR-NEXT: leal (%r8,%r9), %eax +; EGPR-NEXT: leal (%r16,%r17), %edx +; EGPR-NEXT: addb %al, %dl +; EGPR-NEXT: addb %cl, %dl +; EGPR-NEXT: leal (%r18,%r19), %eax +; EGPR-NEXT: leal (%r20,%r21), %ecx +; EGPR-NEXT: addb %al, %cl +; EGPR-NEXT: leal (%r22,%r23), %eax +; EGPR-NEXT: leal (%r24,%r25), %esi +; EGPR-NEXT: addb %al, %sil +; EGPR-NEXT: addb %cl, %sil +; EGPR-NEXT: addb %dl, %sil +; EGPR-NEXT: leal (%r26,%r27), %eax +; EGPR-NEXT: addb %sil, %al +; EGPR-NEXT: # kill: def $al killed $al killed $eax +; EGPR-NEXT: retq + %a1 = add i8 %a, %b + %a2 = add i8 %c, %d + %a3 = add i8 %e, %f + %a4 = add i8 %g, %h + %a5 = add i8 %i, %j + %a6 = add i8 %k, %l + %a7 = add i8 %m, %n + %a8 = add i8 %o, %p + %a9 = add i8 %q, %r + %b1 = add i8 %a1, %a2 + %b2 = add i8 %a3, %a4 + %b3 = add i8 %a5, %a6 + %b4 = add i8 %a7, %a8 + %c1 = add i8 %b1, %b2 + %c2 = add i8 %b3, %b4 + %d1 = add i8 %c1, %c2 + %d2 = add i8 %d1, %a9 + ret i8 %d2 +} + +define fastcc i16 @arg19_i16(i16 %a, i16 %b, i16 %c, i16 %d, i16 %e, i16 %f, i16 %g, i16 %h, i16 %i, i16 %j, i16 %k, i16 %l, i16 %m, i16 %n, i16 %o, i16 %p, i16 %q, i16 %r, i16 %s) nounwind { +; X64-LABEL: arg19_i16: +; X64: # %bb.0: +; X64-NEXT: pushq %rbp +; X64-NEXT: pushq %r14 +; X64-NEXT: pushq %rbx +; X64-NEXT: # kill: def $r9d killed $r9d def $r9 +; X64-NEXT: # kill: def $r8d killed $r8d def $r8 +; X64-NEXT: # kill: def $ecx killed $ecx def $rcx +; X64-NEXT: # kill: def $edx killed $edx def $rdx +; X64-NEXT: # kill: def $esi killed $esi def $rsi +; X64-NEXT: # kill: def $edi killed $edi def $rdi +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %eax +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %r10d +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %ebp +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %ebx +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %r14d +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %r11d +; X64-NEXT: addl %edi, %esi +; X64-NEXT: addl %edx, %ecx +; X64-NEXT: addl %esi, %ecx +; X64-NEXT: addw {{[0-9]+}}(%rsp), %r11w +; X64-NEXT: addl %r8d, %r11d +; X64-NEXT: addl %r9d, %r11d +; X64-NEXT: addl %ecx, %r11d +; X64-NEXT: addw {{[0-9]+}}(%rsp), %r14w +; X64-NEXT: addw {{[0-9]+}}(%rsp), %bx +; X64-NEXT: addl %r14d, %ebx +; X64-NEXT: addw {{[0-9]+}}(%rsp), %bp +; X64-NEXT: addw {{[0-9]+}}(%rsp), %r10w +; X64-NEXT: addl %ebp, %r10d +; X64-NEXT: addl %ebx, %r10d +; X64-NEXT: addl %r11d, %r10d +; X64-NEXT: addw {{[0-9]+}}(%rsp), %ax +; X64-NEXT: addl %r10d, %eax +; X64-NEXT: addw {{[0-9]+}}(%rsp), %ax +; X64-NEXT: # kill: def $ax killed $ax killed $eax +; X64-NEXT: popq %rbx +; X64-NEXT: popq %r14 +; X64-NEXT: popq %rbp +; X64-NEXT: retq +; +; EGPR-LABEL: arg19_i16: +; EGPR: # %bb.0: +; EGPR-NEXT: # kill: def $r27d killed $r27d def $r27 +; EGPR-NEXT: # kill: def $r26d killed $r26d def $r26 +; EGPR-NEXT: # kill: def $r25d killed $r25d def $r25 +; EGPR-NEXT: # kill: def $r24d killed $r24d def $r24 +; EGPR-NEXT: # kill: def $r23d killed $r23d def $r23 +; EGPR-NEXT: # kill: def $r22d killed $r22d def $r22 +; EGPR-NEXT: # kill: def $r21d killed $r21d def $r21 +; EGPR-NEXT: # kill: def $r20d killed $r20d def $r20 +; EGPR-NEXT: # kill: def $r19d killed $r19d def $r19 +; EGPR-NEXT: # kill: def $r18d killed $r18d def $r18 +; EGPR-NEXT: # kill: def $r17d killed $r17d def $r17 +; EGPR-NEXT: # kill: def $r16d killed $r16d def $r16 +; EGPR-NEXT: # kill: def $r9d killed $r9d def $r9 +; EGPR-NEXT: # kill: def $r8d killed $r8d def $r8 +; EGPR-NEXT: # kill: def $ecx killed $ecx def $rcx +; EGPR-NEXT: # kill: def $edx killed $edx def $rdx +; EGPR-NEXT: # kill: def $esi killed $esi def $rsi +; EGPR-NEXT: # kill: def $edi killed $edi def $rdi +; EGPR-NEXT: leal (%rdx,%rcx), %ecx +; EGPR-NEXT: addl %edi, %ecx +; EGPR-NEXT: addl %esi, %ecx +; EGPR-NEXT: leal (%r16,%r17), %edx +; EGPR-NEXT: addl %r8d, %edx +; EGPR-NEXT: addl %r9d, %edx +; EGPR-NEXT: addl %ecx, %edx +; EGPR-NEXT: leal (%r20,%r21), %ecx +; EGPR-NEXT: addl %r18d, %ecx +; EGPR-NEXT: addl %r19d, %ecx +; EGPR-NEXT: leal (%r24,%r25), %esi +; EGPR-NEXT: addl %r22d, %esi +; EGPR-NEXT: addl %r23d, %esi +; EGPR-NEXT: addl %ecx, %esi +; EGPR-NEXT: addl %edx, %esi +; EGPR-NEXT: leal (%r26,%r27), %eax +; EGPR-NEXT: addl %r28d, %eax +; EGPR-NEXT: addl %esi, %eax +; EGPR-NEXT: # kill: def $ax killed $ax killed $eax +; EGPR-NEXT: retq + %a1 = add i16 %a, %b + %a2 = add i16 %c, %d + %a3 = add i16 %e, %f + %a4 = add i16 %g, %h + %a5 = add i16 %i, %j + %a6 = add i16 %k, %l + %a7 = add i16 %m, %n + %a8 = add i16 %o, %p + %a9 = add i16 %q, %r + %b1 = add i16 %a1, %a2 + %b2 = add i16 %a3, %a4 + %b3 = add i16 %a5, %a6 + %b4 = add i16 %a7, %a8 + %c1 = add i16 %b1, %b2 + %c2 = add i16 %b3, %b4 + %d1 = add i16 %c1, %c2 + %d2 = add i16 %d1, %a9 + %d3 = add i16 %d2, %s + ret i16 %d3 +} + +define fastcc i32 @arg20_i32(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i32 %j, i32 %k, i32 %l, i32 %m, i32 %n, i32 %o, i32 %p, i32 %q, i32 %r, i32 %s, i32 %t) nounwind { +; X64-LABEL: arg20_i32: +; X64: # %bb.0: +; X64-NEXT: pushq %rbp +; X64-NEXT: pushq %r15 +; X64-NEXT: pushq %r14 +; X64-NEXT: pushq %rbx +; X64-NEXT: # kill: def $r9d killed $r9d def $r9 +; X64-NEXT: # kill: def $r8d killed $r8d def $r8 +; X64-NEXT: # kill: def $ecx killed $ecx def $rcx +; X64-NEXT: # kill: def $edx killed $edx def $rdx +; X64-NEXT: # kill: def $esi killed $esi def $rsi +; X64-NEXT: # kill: def $edi killed $edi def $rdi +; X64-NEXT: movl {{[0-9]+}}(%rsp), %r10d +; X64-NEXT: movl {{[0-9]+}}(%rsp), %r11d +; X64-NEXT: movl {{[0-9]+}}(%rsp), %eax +; X64-NEXT: movl {{[0-9]+}}(%rsp), %r14d +; X64-NEXT: movl {{[0-9]+}}(%rsp), %ebp +; X64-NEXT: movl {{[0-9]+}}(%rsp), %r15d +; X64-NEXT: movl {{[0-9]+}}(%rsp), %ebx +; X64-NEXT: addl %edi, %esi +; X64-NEXT: addl %edx, %ecx +; X64-NEXT: addl %esi, %ecx +; X64-NEXT: addl {{[0-9]+}}(%rsp), %ebx +; X64-NEXT: addl %r8d, %ebx +; X64-NEXT: addl %r9d, %ebx +; X64-NEXT: addl %ecx, %ebx +; X64-NEXT: addl {{[0-9]+}}(%rsp), %r15d +; X64-NEXT: addl {{[0-9]+}}(%rsp), %ebp +; X64-NEXT: addl %r15d, %ebp +; X64-NEXT: addl {{[0-9]+}}(%rsp), %r14d +; X64-NEXT: addl {{[0-9]+}}(%rsp), %eax +; X64-NEXT: addl %r14d, %eax +; X64-NEXT: addl %ebp, %eax +; X64-NEXT: addl {{[0-9]+}}(%rsp), %r11d +; X64-NEXT: addl {{[0-9]+}}(%rsp), %r10d +; X64-NEXT: addl %r11d, %r10d +; X64-NEXT: addl %eax, %r10d +; X64-NEXT: addl %ebx, %eax +; X64-NEXT: addl %r10d, %eax +; X64-NEXT: popq %rbx +; X64-NEXT: popq %r14 +; X64-NEXT: popq %r15 +; X64-NEXT: popq %rbp +; X64-NEXT: retq +; +; EGPR-LABEL: arg20_i32: +; EGPR: # %bb.0: +; EGPR-NEXT: # kill: def $r29d killed $r29d def $r29 +; EGPR-NEXT: # kill: def $r28d killed $r28d def $r28 +; EGPR-NEXT: # kill: def $r27d killed $r27d def $r27 +; EGPR-NEXT: # kill: def $r26d killed $r26d def $r26 +; EGPR-NEXT: # kill: def $r25d killed $r25d def $r25 +; EGPR-NEXT: # kill: def $r24d killed $r24d def $r24 +; EGPR-NEXT: # kill: def $r23d killed $r23d def $r23 +; EGPR-NEXT: # kill: def $r22d killed $r22d def $r22 +; EGPR-NEXT: # kill: def $r21d killed $r21d def $r21 +; EGPR-NEXT: # kill: def $r20d killed $r20d def $r20 +; EGPR-NEXT: # kill: def $r19d killed $r19d def $r19 +; EGPR-NEXT: # kill: def $r18d killed $r18d def $r18 +; EGPR-NEXT: # kill: def $r17d killed $r17d def $r17 +; EGPR-NEXT: # kill: def $r16d killed $r16d def $r16 +; EGPR-NEXT: # kill: def $r9d killed $r9d def $r9 +; EGPR-NEXT: # kill: def $r8d killed $r8d def $r8 +; EGPR-NEXT: # kill: def $ecx killed $ecx def $rcx +; EGPR-NEXT: # kill: def $edx killed $edx def $rdx +; EGPR-NEXT: # kill: def $esi killed $esi def $rsi +; EGPR-NEXT: # kill: def $edi killed $edi def $rdi +; EGPR-NEXT: leal (%rdx,%rcx), %ecx +; EGPR-NEXT: addl %edi, %ecx +; EGPR-NEXT: addl %esi, %ecx +; EGPR-NEXT: leal (%r16,%r17), %edx +; EGPR-NEXT: addl %r8d, %edx +; EGPR-NEXT: addl %r9d, %edx +; EGPR-NEXT: addl %ecx, %edx +; EGPR-NEXT: leal (%r20,%r21), %ecx +; EGPR-NEXT: addl %r18d, %ecx +; EGPR-NEXT: addl %r19d, %ecx +; EGPR-NEXT: leal (%r24,%r25), %eax +; EGPR-NEXT: addl %r22d, %eax +; EGPR-NEXT: addl %r23d, %eax +; EGPR-NEXT: addl %ecx, %eax +; EGPR-NEXT: leal (%r28,%r29), %esi +; EGPR-NEXT: addl %r26d, %esi +; EGPR-NEXT: addl %r27d, %esi +; EGPR-NEXT: addl %eax, %esi +; EGPR-NEXT: addl %edx, %eax +; EGPR-NEXT: addl %esi, %eax +; EGPR-NEXT: retq + %a1 = add i32 %a, %b + %a2 = add i32 %c, %d + %a3 = add i32 %e, %f + %a4 = add i32 %g, %h + %a5 = add i32 %i, %j + %a6 = add i32 %k, %l + %a7 = add i32 %m, %n + %a8 = add i32 %o, %p + %a9 = add i32 %q, %r + %a10 = add i32 %s, %t + %b1 = add i32 %a1, %a2 + %b2 = add i32 %a3, %a4 + %b3 = add i32 %a5, %a6 + %b4 = add i32 %a7, %a8 + %b5 = add i32 %a9, %a10 + %c1 = add i32 %b1, %b2 + %c2 = add i32 %b3, %b4 + %c3 = add i32 %c2, %b5 + %d1 = add i32 %c1, %c2 + %d2 = add i32 %d1, %c3 + ret i32 %d2 +} + +define fastcc i64 @arg21_i64(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f, i64 %g, i64 %h, i64 %i, i64 %j, i64 %k, i64 %l, i64 %m, i64 %n, i64 %o, i64 %p, i64 %q, i64 %r, i64 %s, i64 %t, i64 %u) nounwind { +; X64-LABEL: arg21_i64: +; X64: # %bb.0: +; X64-NEXT: pushq %r15 +; X64-NEXT: pushq %r14 +; X64-NEXT: pushq %r12 +; X64-NEXT: pushq %rbx +; X64-NEXT: movq {{[0-9]+}}(%rsp), %r10 +; X64-NEXT: movq {{[0-9]+}}(%rsp), %r11 +; X64-NEXT: movq {{[0-9]+}}(%rsp), %rax +; X64-NEXT: movq {{[0-9]+}}(%rsp), %r14 +; X64-NEXT: movq {{[0-9]+}}(%rsp), %r15 +; X64-NEXT: movq {{[0-9]+}}(%rsp), %r12 +; X64-NEXT: movq {{[0-9]+}}(%rsp), %rbx +; X64-NEXT: addq %rdi, %rsi +; X64-NEXT: addq %rdx, %rcx +; X64-NEXT: addq %rsi, %rcx +; X64-NEXT: addq {{[0-9]+}}(%rsp), %rbx +; X64-NEXT: addq %r8, %rbx +; X64-NEXT: addq %r9, %rbx +; X64-NEXT: addq %rcx, %rbx +; X64-NEXT: addq {{[0-9]+}}(%rsp), %r12 +; X64-NEXT: addq {{[0-9]+}}(%rsp), %r15 +; X64-NEXT: addq %r12, %r15 +; X64-NEXT: addq {{[0-9]+}}(%rsp), %r14 +; X64-NEXT: addq {{[0-9]+}}(%rsp), %rax +; X64-NEXT: addq %r14, %rax +; X64-NEXT: addq %r15, %rax +; X64-NEXT: addq {{[0-9]+}}(%rsp), %r11 +; X64-NEXT: addq {{[0-9]+}}(%rsp), %r10 +; X64-NEXT: addq %r11, %r10 +; X64-NEXT: addq %rax, %r10 +; X64-NEXT: addq %rbx, %rax +; X64-NEXT: addq %r10, %rax +; X64-NEXT: addq {{[0-9]+}}(%rsp), %rax +; X64-NEXT: popq %rbx +; X64-NEXT: popq %r12 +; X64-NEXT: popq %r14 +; X64-NEXT: popq %r15 +; X64-NEXT: retq +; +; EGPR-LABEL: arg21_i64: +; EGPR: # %bb.0: +; EGPR-NEXT: leaq (%rdx,%rcx), %rcx +; EGPR-NEXT: addq %rdi, %rcx +; EGPR-NEXT: addq %rsi, %rcx +; EGPR-NEXT: leaq (%r16,%r17), %rdx +; EGPR-NEXT: addq %r8, %rdx +; EGPR-NEXT: addq %r9, %rdx +; EGPR-NEXT: addq %rcx, %rdx +; EGPR-NEXT: leaq (%r20,%r21), %rcx +; EGPR-NEXT: addq %r18, %rcx +; EGPR-NEXT: addq %r19, %rcx +; EGPR-NEXT: leaq (%r24,%r25), %rax +; EGPR-NEXT: addq %r22, %rax +; EGPR-NEXT: addq %r23, %rax +; EGPR-NEXT: addq %rcx, %rax +; EGPR-NEXT: leaq (%r28,%r29), %rsi +; EGPR-NEXT: addq %r26, %rsi +; EGPR-NEXT: addq %r27, %rsi +; EGPR-NEXT: addq %rax, %rsi +; EGPR-NEXT: addq %rdx, %rax +; EGPR-NEXT: addq %rsi, %rax +; EGPR-NEXT: addq %r30, %rax +; EGPR-NEXT: retq + %a1 = add i64 %a, %b + %a2 = add i64 %c, %d + %a3 = add i64 %e, %f + %a4 = add i64 %g, %h + %a5 = add i64 %i, %j + %a6 = add i64 %k, %l + %a7 = add i64 %m, %n + %a8 = add i64 %o, %p + %a9 = add i64 %q, %r + %a10 = add i64 %s, %t + %b1 = add i64 %a1, %a2 + %b2 = add i64 %a3, %a4 + %b3 = add i64 %a5, %a6 + %b4 = add i64 %a7, %a8 + %b5 = add i64 %a9, %a10 + %c1 = add i64 %b1, %b2 + %c2 = add i64 %b3, %b4 + %c3 = add i64 %c2, %b5 + %d1 = add i64 %c1, %c2 + %d2 = add i64 %d1, %c3 + %d3 = add i64 %d2, %u + ret i64 %d3 +} + +define fastcc i32 @arg22_i32(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i32 %j, i32 %k, i32 %l, i32 %m, i32 %n, i32 %o, i32 %p, i32 %q, i32 %r, i32 %s, i32 %t, i32 %u, i32 %v) nounwind { +; X64-LABEL: arg22_i32: +; X64: # %bb.0: +; X64-NEXT: pushq %rbp +; X64-NEXT: pushq %r15 +; X64-NEXT: pushq %r14 +; X64-NEXT: pushq %r12 +; X64-NEXT: pushq %rbx +; X64-NEXT: # kill: def $r9d killed $r9d def $r9 +; X64-NEXT: # kill: def $r8d killed $r8d def $r8 +; X64-NEXT: # kill: def $ecx killed $ecx def $rcx +; X64-NEXT: # kill: def $edx killed $edx def $rdx +; X64-NEXT: # kill: def $esi killed $esi def $rsi +; X64-NEXT: # kill: def $edi killed $edi def $rdi +; X64-NEXT: movl {{[0-9]+}}(%rsp), %r10d +; X64-NEXT: movl {{[0-9]+}}(%rsp), %r11d +; X64-NEXT: movl {{[0-9]+}}(%rsp), %ebp +; X64-NEXT: movl {{[0-9]+}}(%rsp), %eax +; X64-NEXT: movl {{[0-9]+}}(%rsp), %r15d +; X64-NEXT: movl {{[0-9]+}}(%rsp), %r14d +; X64-NEXT: movl {{[0-9]+}}(%rsp), %r12d +; X64-NEXT: movl {{[0-9]+}}(%rsp), %ebx +; X64-NEXT: addl %edi, %esi +; X64-NEXT: addl %edx, %ecx +; X64-NEXT: addl %esi, %ecx +; X64-NEXT: addl {{[0-9]+}}(%rsp), %ebx +; X64-NEXT: addl %r8d, %ebx +; X64-NEXT: addl %r9d, %ebx +; X64-NEXT: addl %ecx, %ebx +; X64-NEXT: addl {{[0-9]+}}(%rsp), %r12d +; X64-NEXT: addl {{[0-9]+}}(%rsp), %r14d +; X64-NEXT: addl %r12d, %r14d +; X64-NEXT: addl {{[0-9]+}}(%rsp), %r15d +; X64-NEXT: addl {{[0-9]+}}(%rsp), %eax +; X64-NEXT: addl %r15d, %eax +; X64-NEXT: addl %r14d, %eax +; X64-NEXT: addl {{[0-9]+}}(%rsp), %ebp +; X64-NEXT: addl {{[0-9]+}}(%rsp), %r11d +; X64-NEXT: addl %ebp, %r11d +; X64-NEXT: addl {{[0-9]+}}(%rsp), %r10d +; X64-NEXT: addl %eax, %r11d +; X64-NEXT: addl %ebx, %eax +; X64-NEXT: addl %r11d, %eax +; X64-NEXT: addl %r10d, %eax +; X64-NEXT: popq %rbx +; X64-NEXT: popq %r12 +; X64-NEXT: popq %r14 +; X64-NEXT: popq %r15 +; X64-NEXT: popq %rbp +; X64-NEXT: retq +; +; EGPR-LABEL: arg22_i32: +; EGPR: # %bb.0: +; EGPR-NEXT: # kill: def $r31d killed $r31d def $r31 +; EGPR-NEXT: # kill: def $r30d killed $r30d def $r30 +; EGPR-NEXT: # kill: def $r29d killed $r29d def $r29 +; EGPR-NEXT: # kill: def $r28d killed $r28d def $r28 +; EGPR-NEXT: # kill: def $r27d killed $r27d def $r27 +; EGPR-NEXT: # kill: def $r26d killed $r26d def $r26 +; EGPR-NEXT: # kill: def $r25d killed $r25d def $r25 +; EGPR-NEXT: # kill: def $r24d killed $r24d def $r24 +; EGPR-NEXT: # kill: def $r23d killed $r23d def $r23 +; EGPR-NEXT: # kill: def $r22d killed $r22d def $r22 +; EGPR-NEXT: # kill: def $r21d killed $r21d def $r21 +; EGPR-NEXT: # kill: def $r20d killed $r20d def $r20 +; EGPR-NEXT: # kill: def $r19d killed $r19d def $r19 +; EGPR-NEXT: # kill: def $r18d killed $r18d def $r18 +; EGPR-NEXT: # kill: def $r17d killed $r17d def $r17 +; EGPR-NEXT: # kill: def $r16d killed $r16d def $r16 +; EGPR-NEXT: # kill: def $r9d killed $r9d def $r9 +; EGPR-NEXT: # kill: def $r8d killed $r8d def $r8 +; EGPR-NEXT: # kill: def $ecx killed $ecx def $rcx +; EGPR-NEXT: # kill: def $edx killed $edx def $rdx +; EGPR-NEXT: # kill: def $esi killed $esi def $rsi +; EGPR-NEXT: # kill: def $edi killed $edi def $rdi +; EGPR-NEXT: leal (%rdx,%rcx), %ecx +; EGPR-NEXT: addl %edi, %ecx +; EGPR-NEXT: addl %esi, %ecx +; EGPR-NEXT: leal (%r16,%r17), %edx +; EGPR-NEXT: addl %r8d, %edx +; EGPR-NEXT: addl %r9d, %edx +; EGPR-NEXT: addl %ecx, %edx +; EGPR-NEXT: leal (%r20,%r21), %ecx +; EGPR-NEXT: addl %r18d, %ecx +; EGPR-NEXT: addl %r19d, %ecx +; EGPR-NEXT: leal (%r24,%r25), %eax +; EGPR-NEXT: addl %r22d, %eax +; EGPR-NEXT: addl %r23d, %eax +; EGPR-NEXT: addl %ecx, %eax +; EGPR-NEXT: leal (%r28,%r29), %esi +; EGPR-NEXT: addl %r26d, %esi +; EGPR-NEXT: addl %r27d, %esi +; EGPR-NEXT: addl %eax, %esi +; EGPR-NEXT: addl %edx, %eax +; EGPR-NEXT: addl %esi, %eax +; EGPR-NEXT: addl %r30d, %eax +; EGPR-NEXT: addl %r31d, %eax +; EGPR-NEXT: retq + %a1 = add i32 %a, %b + %a2 = add i32 %c, %d + %a3 = add i32 %e, %f + %a4 = add i32 %g, %h + %a5 = add i32 %i, %j + %a6 = add i32 %k, %l + %a7 = add i32 %m, %n + %a8 = add i32 %o, %p + %a9 = add i32 %q, %r + %a10 = add i32 %s, %t + %a11 = add i32 %u, %v + %b1 = add i32 %a1, %a2 + %b2 = add i32 %a3, %a4 + %b3 = add i32 %a5, %a6 + %b4 = add i32 %a7, %a8 + %b5 = add i32 %a9, %a10 + %c1 = add i32 %b1, %b2 + %c2 = add i32 %b3, %b4 + %c3 = add i32 %c2, %b5 + %d1 = add i32 %c1, %c2 + %d2 = add i32 %d1, %c3 + %d3 = add i32 %d2, %a11 + ret i32 %d3 +} + +define fastcc i16 @arg23_i16(i16 %a, i16 %b, i16 %c, i16 %d, i16 %e, i16 %f, i16 %g, i16 %h, i16 %i, i16 %j, i16 %k, i16 %l, i16 %m, i16 %n, i16 %o, i16 %p, i16 %q, i16 %r, i16 %s, i16 %t, i16 %u, i16 %v, i16 %w) nounwind { +; X64-LABEL: arg23_i16: +; X64: # %bb.0: +; X64-NEXT: pushq %rbp +; X64-NEXT: pushq %r15 +; X64-NEXT: pushq %r14 +; X64-NEXT: pushq %r12 +; X64-NEXT: pushq %rbx +; X64-NEXT: # kill: def $r9d killed $r9d def $r9 +; X64-NEXT: # kill: def $r8d killed $r8d def $r8 +; X64-NEXT: # kill: def $ecx killed $ecx def $rcx +; X64-NEXT: # kill: def $edx killed $edx def $rdx +; X64-NEXT: # kill: def $esi killed $esi def $rsi +; X64-NEXT: # kill: def $edi killed $edi def $rdi +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %r10d +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %r11d +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %ebp +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %eax +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %r15d +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %r14d +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %r12d +; X64-NEXT: movzwl {{[0-9]+}}(%rsp), %ebx +; X64-NEXT: addl %edi, %esi +; X64-NEXT: addl %edx, %ecx +; X64-NEXT: addl %esi, %ecx +; X64-NEXT: addw {{[0-9]+}}(%rsp), %bx +; X64-NEXT: addl %r8d, %ebx +; X64-NEXT: addl %r9d, %ebx +; X64-NEXT: addl %ecx, %ebx +; X64-NEXT: addw {{[0-9]+}}(%rsp), %r12w +; X64-NEXT: addw {{[0-9]+}}(%rsp), %r14w +; X64-NEXT: addl %r12d, %r14d +; X64-NEXT: addw {{[0-9]+}}(%rsp), %r15w +; X64-NEXT: addw {{[0-9]+}}(%rsp), %ax +; X64-NEXT: addl %r15d, %eax +; X64-NEXT: addl %r14d, %eax +; X64-NEXT: addw {{[0-9]+}}(%rsp), %bp +; X64-NEXT: addw {{[0-9]+}}(%rsp), %r11w +; X64-NEXT: addl %ebp, %r11d +; X64-NEXT: addw {{[0-9]+}}(%rsp), %r10w +; X64-NEXT: addl %eax, %r11d +; X64-NEXT: addl %ebx, %eax +; X64-NEXT: addl %r11d, %eax +; X64-NEXT: addl %r10d, %eax +; X64-NEXT: addw {{[0-9]+}}(%rsp), %ax +; X64-NEXT: # kill: def $ax killed $ax killed $eax +; X64-NEXT: popq %rbx +; X64-NEXT: popq %r12 +; X64-NEXT: popq %r14 +; X64-NEXT: popq %r15 +; X64-NEXT: popq %rbp +; X64-NEXT: retq +; +; EGPR-LABEL: arg23_i16: +; EGPR: # %bb.0: +; EGPR-NEXT: # kill: def $r31d killed $r31d def $r31 +; EGPR-NEXT: # kill: def $r30d killed $r30d def $r30 +; EGPR-NEXT: # kill: def $r29d killed $r29d def $r29 +; EGPR-NEXT: # kill: def $r28d killed $r28d def $r28 +; EGPR-NEXT: # kill: def $r27d killed $r27d def $r27 +; EGPR-NEXT: # kill: def $r26d killed $r26d def $r26 +; EGPR-NEXT: # kill: def $r25d killed $r25d def $r25 +; EGPR-NEXT: # kill: def $r24d killed $r24d def $r24 +; EGPR-NEXT: # kill: def $r23d killed $r23d def $r23 +; EGPR-NEXT: # kill: def $r22d killed $r22d def $r22 +; EGPR-NEXT: # kill: def $r21d killed $r21d def $r21 +; EGPR-NEXT: # kill: def $r20d killed $r20d def $r20 +; EGPR-NEXT: # kill: def $r19d killed $r19d def $r19 +; EGPR-NEXT: # kill: def $r18d killed $r18d def $r18 +; EGPR-NEXT: # kill: def $r17d killed $r17d def $r17 +; EGPR-NEXT: # kill: def $r16d killed $r16d def $r16 +; EGPR-NEXT: # kill: def $r9d killed $r9d def $r9 +; EGPR-NEXT: # kill: def $r8d killed $r8d def $r8 +; EGPR-NEXT: # kill: def $ecx killed $ecx def $rcx +; EGPR-NEXT: # kill: def $edx killed $edx def $rdx +; EGPR-NEXT: # kill: def $esi killed $esi def $rsi +; EGPR-NEXT: # kill: def $edi killed $edi def $rdi +; EGPR-NEXT: leal (%rdx,%rcx), %ecx +; EGPR-NEXT: addl %edi, %ecx +; EGPR-NEXT: addl %esi, %ecx +; EGPR-NEXT: leal (%r16,%r17), %edx +; EGPR-NEXT: addl %r8d, %edx +; EGPR-NEXT: addl %r9d, %edx +; EGPR-NEXT: addl %ecx, %edx +; EGPR-NEXT: leal (%r20,%r21), %ecx +; EGPR-NEXT: addl %r18d, %ecx +; EGPR-NEXT: addl %r19d, %ecx +; EGPR-NEXT: leal (%r24,%r25), %eax +; EGPR-NEXT: addl %r22d, %eax +; EGPR-NEXT: addl %r23d, %eax +; EGPR-NEXT: addl %ecx, %eax +; EGPR-NEXT: leal (%r28,%r29), %esi +; EGPR-NEXT: addl %r26d, %esi +; EGPR-NEXT: addl %r27d, %esi +; EGPR-NEXT: addl %eax, %esi +; EGPR-NEXT: addl %edx, %eax +; EGPR-NEXT: addl %esi, %eax +; EGPR-NEXT: addl %r30d, %eax +; EGPR-NEXT: addl %r31d, %eax +; EGPR-NEXT: addw {{[0-9]+}}(%rsp), %ax +; EGPR-NEXT: # kill: def $ax killed $ax killed $eax +; EGPR-NEXT: retq + %a1 = add i16 %a, %b + %a2 = add i16 %c, %d + %a3 = add i16 %e, %f + %a4 = add i16 %g, %h + %a5 = add i16 %i, %j + %a6 = add i16 %k, %l + %a7 = add i16 %m, %n + %a8 = add i16 %o, %p + %a9 = add i16 %q, %r + %a10 = add i16 %s, %t + %a11 = add i16 %u, %v + %b1 = add i16 %a1, %a2 + %b2 = add i16 %a3, %a4 + %b3 = add i16 %a5, %a6 + %b4 = add i16 %a7, %a8 + %b5 = add i16 %a9, %a10 + %c1 = add i16 %b1, %b2 + %c2 = add i16 %b3, %b4 + %c3 = add i16 %c2, %b5 + %d1 = add i16 %c1, %c2 + %d2 = add i16 %d1, %c3 + %d3 = add i16 %d2, %a11 + %d4 = add i16 %d3, %w + ret i16 %d4 +}