From b5662840abd4e7808cde3ba7370dd8fcccc93c1f Mon Sep 17 00:00:00 2001 From: Phoebe Wang Date: Wed, 22 Oct 2025 22:43:07 +0800 Subject: [PATCH] [RFC] Extend FASTCC to use up to 22 registers under APX FASTCC calling convention is used for internal functions for better performance. X64 doesn't define a different calling convention for FASTCC. I think the reason is we have balanced caller/callee save registers defined in X64. With APX feature, we have 16 more caller save registers. They can all be used for argument passing. So we extend FASTCC to use up to 22 registers in argument passing. FASTCC is not support in X64 in the C code, so we don't need to worry about compatibility issue, see https://godbolt.org/z/fq99T6h63 --- llvm/lib/Target/X86/X86CallingConv.td | 34 + llvm/test/CodeGen/X86/apx/fastcc.ll | 1374 +++++++++++++++++++++++++ 2 files changed, 1408 insertions(+) create mode 100644 llvm/test/CodeGen/X86/apx/fastcc.ll 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 +}