[llvm] [RFC] Extend FASTCC to use up to 22 registers under APX (PR #164638)

Phoebe Wang via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 6 01:03:16 PDT 2026


https://github.com/phoebewang updated https://github.com/llvm/llvm-project/pull/164638

>From b5662840abd4e7808cde3ba7370dd8fcccc93c1f Mon Sep 17 00:00:00 2001
From: Phoebe Wang <phoebe.wang at intel.com>
Date: Wed, 22 Oct 2025 22:43:07 +0800
Subject: [PATCH 1/3] [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<CC_X86_Win64_C>
 ]>;
 
+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<CCPassByVal<8, 8>>,
+
+  // Promote i1/i8/i16/v1i1 arguments to i32.
+  CCIfType<[i1, i8, i16, v1i1], CCPromoteToType<i32>>,
+
+  // Pointers are always passed in full 64-bit registers.
+  CCIfPtr<CCCustom<"CC_X86_64_Pointer">>,
+
+  // 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<CCCustom<"CC_X86_64_I128">>>,
+
+  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<CC_X86_64_C>
+]>;
+
 
 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<CC_X86_64_Fast>>>,
   CCIfCC<"CallingConv::GHC", CCDelegateTo<CC_X86_64_GHC>>,
   CCIfCC<"CallingConv::HiPE", CCDelegateTo<CC_X86_64_HiPE>>,
   CCIfCC<"CallingConv::AnyReg", CCDelegateTo<CC_X86_64_AnyReg>>,
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
+}

>From 6e795f583dcd49159f9b41ccd055de9c24ba3530 Mon Sep 17 00:00:00 2001
From: Phoebe Wang <phoebe.wang at intel.com>
Date: Fri, 27 Mar 2026 15:27:37 +0800
Subject: [PATCH 2/3] Add Windows handling

---
 llvm/lib/Target/X86/X86CallingConv.td |   34 +-
 llvm/test/CodeGen/X86/apx/fastcc.ll   | 1073 +++++++++++++++++++++++++
 2 files changed, 1104 insertions(+), 3 deletions(-)

diff --git a/llvm/lib/Target/X86/X86CallingConv.td b/llvm/lib/Target/X86/X86CallingConv.td
index bad0a698dd8de..8c9d8597e0b38 100644
--- a/llvm/lib/Target/X86/X86CallingConv.td
+++ b/llvm/lib/Target/X86/X86CallingConv.td
@@ -687,7 +687,7 @@ def CC_X86_Win64_VectorCall : CallingConv<[
   CCDelegateTo<CC_X86_Win64_C>
 ]>;
 
-def CC_X86_64_Fast : CallingConv<[
+def CC_X86_SysV64_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.
@@ -713,12 +713,40 @@ def CC_X86_64_Fast : CallingConv<[
                                  R19, R20, R21, R22, R23, R24, R25, R26, R27,
                                  R28, R29, R30, R31]>>,
 
-
-
   // Otherwise, drop to normal X86-64 CC.
   CCDelegateTo<CC_X86_64_C>
 ]>;
 
+def CC_X86_Win64_Fast : CallingConv<[
+  // Byval aggregates are passed by pointer
+  CCIfByVal<CCPassIndirect<i64>>,
+
+  // Promote i1/v1i1 arguments to i8.
+  CCIfType<[i1, v1i1], CCPromoteToType<i8>>,
+
+  // Pointers are always passed in full 64-bit registers.
+  CCIfPtr<CCCustom<"CC_X86_64_Pointer">>,
+
+  CCIfType<[i8], CCAssignToReg<[CL, DL, R8B, R9B, R16B, R17B, R18B, R19B, R20B,
+                                R21B, R22B, R23B, R24B, R25B, R26B, R27B]>>,
+
+  CCIfType<[i16], CCAssignToReg<[CX, DX, R8W, R9W, R16W, R17W, R18W, R19W, R20W,
+                                 R21W, R22W, R23W, R24W, R25W, R26W, R27W]>>,
+
+  CCIfType<[i32], CCAssignToReg<[ECX, EDX, R8D, R9D, R16D, R17D, R18D, R19D,
+                                 R20D, R21D, R22D, R23D, R24D, R25D, R26D, R27D]>>,
+
+  CCIfType<[i64], CCAssignToReg<[RCX, RDX, R8, R9, R16, R17, R18, R19, R20,
+                                 R21, R22, R23, R24, R25, R26, R27]>>,
+
+  // Otherwise, drop to normal X86-64-Win64 CC.
+  CCDelegateTo<CC_X86_Win64_C>
+]>;
+
+def CC_X86_64_Fast : CallingConv<[
+  CCIfSubtarget<"isTargetWin64()", CCDelegateTo<CC_X86_Win64_Fast>>,
+  CCDelegateTo<CC_X86_SysV64_Fast>
+]>;
 
 def CC_X86_64_GHC : CallingConv<[
   // Promote i8/i16/i32 arguments to i64.
diff --git a/llvm/test/CodeGen/X86/apx/fastcc.ll b/llvm/test/CodeGen/X86/apx/fastcc.ll
index 984a4f640e379..11f3ee9311ee4 100644
--- a/llvm/test/CodeGen/X86/apx/fastcc.ll
+++ b/llvm/test/CodeGen/X86/apx/fastcc.ll
@@ -1,6 +1,8 @@
 ; 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
+; RUN: llc < %s -mtriple=x86_64-windows-msvc | FileCheck %s --check-prefix=WIN64
+; RUN: llc < %s -mtriple=x86_64-windows-msvc -mattr=+egpr | FileCheck %s --check-prefix=WINEGPR
 
 define fastcc i8 @arg6_i8(i8 %a, i8 %b, i8 %c, i8 %d, i8 %e, i8 %f) nounwind {
 ; CHECK-LABEL: arg6_i8:
@@ -18,6 +20,36 @@ define fastcc i8 @arg6_i8(i8 %a, i8 %b, i8 %c, i8 %d, i8 %e, i8 %f) nounwind {
 ; CHECK-NEXT:    addb %cl, %al
 ; CHECK-NEXT:    # kill: def $al killed $al killed $eax
 ; CHECK-NEXT:    retq
+;
+; WIN64-LABEL: arg6_i8:
+; WIN64:       # %bb.0:
+; WIN64-NEXT:    # kill: def $r9b killed $r9b def $r9
+; WIN64-NEXT:    # kill: def $r8b killed $r8b def $r8
+; WIN64-NEXT:    # kill: def $dl killed $dl def $rdx
+; WIN64-NEXT:    # kill: def $cl killed $cl def $rcx
+; WIN64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
+; WIN64-NEXT:    addl %edx, %ecx
+; WIN64-NEXT:    leal (%r8,%r9), %edx
+; WIN64-NEXT:    addb %cl, %dl
+; WIN64-NEXT:    addb {{[0-9]+}}(%rsp), %al
+; WIN64-NEXT:    addb %dl, %al
+; WIN64-NEXT:    retq
+;
+; WINEGPR-LABEL: arg6_i8:
+; WINEGPR:       # %bb.0:
+; WINEGPR-NEXT:    # kill: def $r17b killed $r17b def $r17
+; WINEGPR-NEXT:    # kill: def $r16b killed $r16b def $r16
+; WINEGPR-NEXT:    # kill: def $r9b killed $r9b def $r9
+; WINEGPR-NEXT:    # kill: def $r8b killed $r8b def $r8
+; WINEGPR-NEXT:    # kill: def $dl killed $dl def $rdx
+; WINEGPR-NEXT:    # kill: def $cl killed $cl def $rcx
+; WINEGPR-NEXT:    leal (%rcx,%rdx), %eax
+; WINEGPR-NEXT:    leal (%r8,%r9), %ecx
+; WINEGPR-NEXT:    addb %al, %cl
+; WINEGPR-NEXT:    leal (%r16,%r17), %eax
+; WINEGPR-NEXT:    addb %cl, %al
+; WINEGPR-NEXT:    # kill: def $al killed $al killed $eax
+; WINEGPR-NEXT:    retq
   %a1 = add i8 %a, %b
   %a2 = add i8 %c, %d
   %a3 = add i8 %e, %f
@@ -60,6 +92,40 @@ define fastcc i16 @arg7_i16(i16 %a, i16 %b, i16 %c, i16 %d, i16 %e, i16 %f, i16
 ; EGPR-NEXT:    addl %ecx, %eax
 ; EGPR-NEXT:    # kill: def $ax killed $ax killed $eax
 ; EGPR-NEXT:    retq
+;
+; WIN64-LABEL: arg7_i16:
+; WIN64:       # %bb.0:
+; WIN64-NEXT:    # kill: def $r9w killed $r9w def $r9
+; WIN64-NEXT:    # kill: def $r8w killed $r8w def $r8
+; WIN64-NEXT:    # kill: def $dx killed $dx def $rdx
+; WIN64-NEXT:    # kill: def $cx killed $cx def $rcx
+; WIN64-NEXT:    addl %r9d, %r8d
+; WIN64-NEXT:    addl %ecx, %r8d
+; WIN64-NEXT:    addl %edx, %r8d
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %ax
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %ax
+; WIN64-NEXT:    addl %r8d, %eax
+; WIN64-NEXT:    # kill: def $ax killed $ax killed $eax
+; WIN64-NEXT:    retq
+;
+; WINEGPR-LABEL: arg7_i16:
+; WINEGPR:       # %bb.0:
+; WINEGPR-NEXT:    # kill: def $r18w killed $r18w def $r18d
+; WINEGPR-NEXT:    # kill: def $r17w killed $r17w def $r17
+; WINEGPR-NEXT:    # kill: def $r16w killed $r16w def $r16
+; WINEGPR-NEXT:    # kill: def $r9w killed $r9w def $r9
+; WINEGPR-NEXT:    # kill: def $r8w killed $r8w def $r8
+; WINEGPR-NEXT:    # kill: def $dx killed $dx def $rdx
+; WINEGPR-NEXT:    # kill: def $cx killed $cx def $rcx
+; WINEGPR-NEXT:    leal (%r16,%r17), %r10d
+; WINEGPR-NEXT:    addl %r18d, %r10d
+; WINEGPR-NEXT:    leal (%r8,%r9), %eax
+; WINEGPR-NEXT:    addl %edx, %ecx
+; WINEGPR-NEXT:    addl %ecx, %eax
+; WINEGPR-NEXT:    addl %r10d, %eax
+; WINEGPR-NEXT:    # kill: def $ax killed $ax killed $eax
+; WINEGPR-NEXT:    retq
   %a1 = add i16 %a, %b
   %a2 = add i16 %c, %d
   %a3 = add i16 %e, %f
@@ -106,6 +172,42 @@ define fastcc i32 @arg8_i32(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32
 ; EGPR-NEXT:    addl %r9d, %eax
 ; EGPR-NEXT:    addl %ecx, %eax
 ; EGPR-NEXT:    retq
+;
+; WIN64-LABEL: arg8_i32:
+; WIN64:       # %bb.0:
+; WIN64-NEXT:    # kill: def $r9d killed $r9d def $r9
+; WIN64-NEXT:    # kill: def $r8d killed $r8d def $r8
+; WIN64-NEXT:    # kill: def $edx killed $edx def $rdx
+; WIN64-NEXT:    # kill: def $ecx killed $ecx def $rcx
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %eax
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %r10d
+; WIN64-NEXT:    addl %edx, %ecx
+; WIN64-NEXT:    leal (%r8,%r9), %edx
+; WIN64-NEXT:    addl %ecx, %edx
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %r10d
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %eax
+; WIN64-NEXT:    addl %r10d, %eax
+; WIN64-NEXT:    addl %edx, %eax
+; WIN64-NEXT:    retq
+;
+; WINEGPR-LABEL: arg8_i32:
+; WINEGPR:       # %bb.0:
+; WINEGPR-NEXT:    # kill: def $r19d killed $r19d def $r19
+; WINEGPR-NEXT:    # kill: def $r18d killed $r18d def $r18
+; WINEGPR-NEXT:    # kill: def $r17d killed $r17d def $r17
+; WINEGPR-NEXT:    # kill: def $r16d killed $r16d def $r16
+; WINEGPR-NEXT:    # kill: def $r9d killed $r9d def $r9
+; WINEGPR-NEXT:    # kill: def $r8d killed $r8d def $r8
+; WINEGPR-NEXT:    # kill: def $edx killed $edx def $rdx
+; WINEGPR-NEXT:    # kill: def $ecx killed $ecx def $rcx
+; WINEGPR-NEXT:    leal (%rcx,%rdx), %eax
+; WINEGPR-NEXT:    leal (%r8,%r9), %ecx
+; WINEGPR-NEXT:    addl %eax, %ecx
+; WINEGPR-NEXT:    leal (%r18,%r19), %eax
+; WINEGPR-NEXT:    addl %r16d, %eax
+; WINEGPR-NEXT:    addl %r17d, %eax
+; WINEGPR-NEXT:    addl %ecx, %eax
+; WINEGPR-NEXT:    retq
   %a1 = add i32 %a, %b
   %a2 = add i32 %c, %d
   %a3 = add i32 %e, %f
@@ -141,6 +243,32 @@ define fastcc i64 @arg9_i64(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f, i64
 ; EGPR-NEXT:    addq %rcx, %rax
 ; EGPR-NEXT:    addq %r18, %rax
 ; EGPR-NEXT:    retq
+;
+; WIN64-LABEL: arg9_i64:
+; WIN64:       # %bb.0:
+; WIN64-NEXT:    movq {{[0-9]+}}(%rsp), %rax
+; WIN64-NEXT:    movq {{[0-9]+}}(%rsp), %r10
+; WIN64-NEXT:    addq %rdx, %rcx
+; WIN64-NEXT:    leaq (%r8,%r9), %rdx
+; WIN64-NEXT:    addq %rcx, %rdx
+; WIN64-NEXT:    addq {{[0-9]+}}(%rsp), %r10
+; WIN64-NEXT:    addq {{[0-9]+}}(%rsp), %rax
+; WIN64-NEXT:    addq %r10, %rax
+; WIN64-NEXT:    addq %rdx, %rax
+; WIN64-NEXT:    addq {{[0-9]+}}(%rsp), %rax
+; WIN64-NEXT:    retq
+;
+; WINEGPR-LABEL: arg9_i64:
+; WINEGPR:       # %bb.0:
+; WINEGPR-NEXT:    leaq (%rcx,%rdx), %rax
+; WINEGPR-NEXT:    leaq (%r8,%r9), %rcx
+; WINEGPR-NEXT:    addq %rax, %rcx
+; WINEGPR-NEXT:    leaq (%r18,%r19), %rax
+; WINEGPR-NEXT:    addq %r16, %rax
+; WINEGPR-NEXT:    addq %r17, %rax
+; WINEGPR-NEXT:    addq %rcx, %rax
+; WINEGPR-NEXT:    addq %r20, %rax
+; WINEGPR-NEXT:    retq
   %a1 = add i64 %a, %b
   %a2 = add i64 %c, %d
   %a3 = add i64 %e, %f
@@ -196,6 +324,49 @@ define fastcc i32 @arg10_i32(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32
 ; EGPR-NEXT:    addl %r18d, %eax
 ; EGPR-NEXT:    addl %r19d, %eax
 ; EGPR-NEXT:    retq
+;
+; WIN64-LABEL: arg10_i32:
+; WIN64:       # %bb.0:
+; WIN64-NEXT:    # kill: def $r9d killed $r9d def $r9
+; WIN64-NEXT:    # kill: def $r8d killed $r8d def $r8
+; WIN64-NEXT:    # kill: def $edx killed $edx def $rdx
+; WIN64-NEXT:    # kill: def $ecx killed $ecx def $rcx
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %eax
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %r10d
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %r11d
+; WIN64-NEXT:    addl %edx, %ecx
+; WIN64-NEXT:    leal (%r8,%r9), %edx
+; WIN64-NEXT:    addl %ecx, %edx
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %r11d
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %r10d
+; WIN64-NEXT:    addl %r11d, %r10d
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %eax
+; WIN64-NEXT:    addl %edx, %eax
+; WIN64-NEXT:    addl %r10d, %eax
+; WIN64-NEXT:    retq
+;
+; WINEGPR-LABEL: arg10_i32:
+; WINEGPR:       # %bb.0:
+; WINEGPR-NEXT:    # kill: def $r21d killed $r21d def $r21
+; WINEGPR-NEXT:    # kill: def $r20d killed $r20d def $r20
+; WINEGPR-NEXT:    # kill: def $r19d killed $r19d def $r19
+; WINEGPR-NEXT:    # kill: def $r18d killed $r18d def $r18
+; WINEGPR-NEXT:    # kill: def $r17d killed $r17d def $r17
+; WINEGPR-NEXT:    # kill: def $r16d killed $r16d def $r16
+; WINEGPR-NEXT:    # kill: def $r9d killed $r9d def $r9
+; WINEGPR-NEXT:    # kill: def $r8d killed $r8d def $r8
+; WINEGPR-NEXT:    # kill: def $edx killed $edx def $rdx
+; WINEGPR-NEXT:    # kill: def $ecx killed $ecx def $rcx
+; WINEGPR-NEXT:    leal (%rcx,%rdx), %eax
+; WINEGPR-NEXT:    leal (%r8,%r9), %ecx
+; WINEGPR-NEXT:    addl %eax, %ecx
+; WINEGPR-NEXT:    leal (%r18,%r19), %eax
+; WINEGPR-NEXT:    addl %r16d, %eax
+; WINEGPR-NEXT:    addl %r17d, %eax
+; WINEGPR-NEXT:    addl %ecx, %eax
+; WINEGPR-NEXT:    addl %r20d, %eax
+; WINEGPR-NEXT:    addl %r21d, %eax
+; WINEGPR-NEXT:    retq
   %a1 = add i32 %a, %b
   %a2 = add i32 %c, %d
   %a3 = add i32 %e, %f
@@ -256,6 +427,54 @@ define fastcc i16 @arg11_i16(i16 %a, i16 %b, i16 %c, i16 %d, i16 %e, i16 %f, i16
 ; EGPR-NEXT:    addl %edx, %eax
 ; EGPR-NEXT:    # kill: def $ax killed $ax killed $eax
 ; EGPR-NEXT:    retq
+;
+; WIN64-LABEL: arg11_i16:
+; WIN64:       # %bb.0:
+; WIN64-NEXT:    # kill: def $r9w killed $r9w def $r9
+; WIN64-NEXT:    # kill: def $r8w killed $r8w def $r8
+; WIN64-NEXT:    # kill: def $dx killed $dx def $rdx
+; WIN64-NEXT:    # kill: def $cx killed $cx def $rcx
+; WIN64-NEXT:    addl %r9d, %r8d
+; WIN64-NEXT:    addl %ecx, %r8d
+; WIN64-NEXT:    addl %edx, %r8d
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %ecx
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %edx
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %dx
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %cx
+; WIN64-NEXT:    addl %edx, %ecx
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %ax
+; WIN64-NEXT:    addl %r8d, %eax
+; WIN64-NEXT:    addl %ecx, %eax
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %ax
+; WIN64-NEXT:    # kill: def $ax killed $ax killed $eax
+; WIN64-NEXT:    retq
+;
+; WINEGPR-LABEL: arg11_i16:
+; WINEGPR:       # %bb.0:
+; WINEGPR-NEXT:    # kill: def $r22w killed $r22w def $r22d
+; WINEGPR-NEXT:    # kill: def $r21w killed $r21w def $r21
+; WINEGPR-NEXT:    # kill: def $r20w killed $r20w def $r20
+; WINEGPR-NEXT:    # kill: def $r19w killed $r19w def $r19
+; WINEGPR-NEXT:    # kill: def $r18w killed $r18w def $r18
+; WINEGPR-NEXT:    # kill: def $r17w killed $r17w def $r17
+; WINEGPR-NEXT:    # kill: def $r16w killed $r16w def $r16
+; WINEGPR-NEXT:    # kill: def $r9w killed $r9w def $r9
+; WINEGPR-NEXT:    # kill: def $r8w killed $r8w def $r8
+; WINEGPR-NEXT:    # kill: def $dx killed $dx def $rdx
+; WINEGPR-NEXT:    # kill: def $cx killed $cx def $rcx
+; WINEGPR-NEXT:    leal (%r20,%r21), %r10d
+; WINEGPR-NEXT:    addl %r22d, %r10d
+; WINEGPR-NEXT:    leal (%r18,%r19), %r11d
+; WINEGPR-NEXT:    addl %r16d, %r11d
+; WINEGPR-NEXT:    addl %r17d, %r11d
+; WINEGPR-NEXT:    leal (%r8,%r9), %eax
+; WINEGPR-NEXT:    addl %edx, %ecx
+; WINEGPR-NEXT:    addl %ecx, %eax
+; WINEGPR-NEXT:    addl %r11d, %eax
+; WINEGPR-NEXT:    addl %r10d, %eax
+; WINEGPR-NEXT:    # kill: def $ax killed $ax killed $eax
+; WINEGPR-NEXT:    retq
   %a1 = add i16 %a, %b
   %a2 = add i16 %c, %d
   %a3 = add i16 %e, %f
@@ -321,6 +540,59 @@ define fastcc i8 @arg12_i8(i8 %a, i8 %b, i8 %c, i8 %d, i8 %e, i8 %f, i8 %g, i8 %
 ; EGPR-NEXT:    addb %dl, %al
 ; EGPR-NEXT:    # kill: def $al killed $al killed $eax
 ; EGPR-NEXT:    retq
+;
+; WIN64-LABEL: arg12_i8:
+; WIN64:       # %bb.0:
+; WIN64-NEXT:    pushq %rbx
+; WIN64-NEXT:    # kill: def $r9b killed $r9b def $r9
+; WIN64-NEXT:    # kill: def $r8b killed $r8b def $r8
+; WIN64-NEXT:    # kill: def $dl killed $dl def $rdx
+; WIN64-NEXT:    # kill: def $cl killed $cl def $rcx
+; WIN64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
+; WIN64-NEXT:    movzbl {{[0-9]+}}(%rsp), %r11d
+; WIN64-NEXT:    movzbl {{[0-9]+}}(%rsp), %r10d
+; WIN64-NEXT:    movzbl {{[0-9]+}}(%rsp), %ebx
+; WIN64-NEXT:    addl %edx, %ecx
+; WIN64-NEXT:    leal (%r8,%r9), %edx
+; WIN64-NEXT:    addb %cl, %dl
+; WIN64-NEXT:    addb {{[0-9]+}}(%rsp), %bl
+; WIN64-NEXT:    addb {{[0-9]+}}(%rsp), %r10b
+; WIN64-NEXT:    addb %bl, %r10b
+; WIN64-NEXT:    addb %dl, %r10b
+; WIN64-NEXT:    addb {{[0-9]+}}(%rsp), %r11b
+; WIN64-NEXT:    addb {{[0-9]+}}(%rsp), %al
+; WIN64-NEXT:    addb %r11b, %al
+; WIN64-NEXT:    addb %r10b, %al
+; WIN64-NEXT:    popq %rbx
+; WIN64-NEXT:    retq
+;
+; WINEGPR-LABEL: arg12_i8:
+; WINEGPR:       # %bb.0:
+; WINEGPR-NEXT:    # kill: def $r23b killed $r23b def $r23
+; WINEGPR-NEXT:    # kill: def $r22b killed $r22b def $r22
+; WINEGPR-NEXT:    # kill: def $r21b killed $r21b def $r21
+; WINEGPR-NEXT:    # kill: def $r20b killed $r20b def $r20
+; WINEGPR-NEXT:    # kill: def $r19b killed $r19b def $r19
+; WINEGPR-NEXT:    # kill: def $r18b killed $r18b def $r18
+; WINEGPR-NEXT:    # kill: def $r17b killed $r17b def $r17
+; WINEGPR-NEXT:    # kill: def $r16b killed $r16b def $r16
+; WINEGPR-NEXT:    # kill: def $r9b killed $r9b def $r9
+; WINEGPR-NEXT:    # kill: def $r8b killed $r8b def $r8
+; WINEGPR-NEXT:    # kill: def $dl killed $dl def $rdx
+; WINEGPR-NEXT:    # kill: def $cl killed $cl def $rcx
+; WINEGPR-NEXT:    leal (%rcx,%rdx), %eax
+; WINEGPR-NEXT:    leal (%r8,%r9), %ecx
+; WINEGPR-NEXT:    addb %al, %cl
+; WINEGPR-NEXT:    leal (%r16,%r17), %eax
+; WINEGPR-NEXT:    leal (%r18,%r19), %edx
+; WINEGPR-NEXT:    addb %al, %dl
+; WINEGPR-NEXT:    addb %cl, %dl
+; WINEGPR-NEXT:    leal (%r20,%r21), %ecx
+; WINEGPR-NEXT:    leal (%r22,%r23), %eax
+; WINEGPR-NEXT:    addb %cl, %al
+; WINEGPR-NEXT:    addb %dl, %al
+; WINEGPR-NEXT:    # kill: def $al killed $al killed $eax
+; WINEGPR-NEXT:    retq
   %a1 = add i8 %a, %b
   %a2 = add i8 %c, %d
   %a3 = add i8 %e, %f
@@ -390,6 +662,61 @@ define fastcc i16 @arg13_i16(i16 %a, i16 %b, i16 %c, i16 %d, i16 %e, i16 %f, i16
 ; EGPR-NEXT:    addl %edx, %eax
 ; EGPR-NEXT:    # kill: def $ax killed $ax killed $eax
 ; EGPR-NEXT:    retq
+;
+; WIN64-LABEL: arg13_i16:
+; WIN64:       # %bb.0:
+; WIN64-NEXT:    # kill: def $r9w killed $r9w def $r9
+; WIN64-NEXT:    # kill: def $r8w killed $r8w def $r8
+; WIN64-NEXT:    # kill: def $dx killed $dx def $rdx
+; WIN64-NEXT:    # kill: def $cx killed $cx def $rcx
+; WIN64-NEXT:    addl %r9d, %r8d
+; WIN64-NEXT:    addl %ecx, %r8d
+; WIN64-NEXT:    addl %edx, %r8d
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %ecx
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %edx
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %r9d
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %r9w
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %dx
+; WIN64-NEXT:    addl %r9d, %edx
+; WIN64-NEXT:    addl %r8d, %edx
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %cx
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %ax
+; WIN64-NEXT:    addl %ecx, %eax
+; WIN64-NEXT:    addl %edx, %eax
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %ax
+; WIN64-NEXT:    # kill: def $ax killed $ax killed $eax
+; WIN64-NEXT:    retq
+;
+; WINEGPR-LABEL: arg13_i16:
+; WINEGPR:       # %bb.0:
+; WINEGPR-NEXT:    # kill: def $r24w killed $r24w def $r24d
+; WINEGPR-NEXT:    # kill: def $r23w killed $r23w def $r23
+; WINEGPR-NEXT:    # kill: def $r22w killed $r22w def $r22
+; WINEGPR-NEXT:    # kill: def $r21w killed $r21w def $r21
+; WINEGPR-NEXT:    # kill: def $r20w killed $r20w def $r20
+; WINEGPR-NEXT:    # kill: def $r19w killed $r19w def $r19
+; WINEGPR-NEXT:    # kill: def $r18w killed $r18w def $r18
+; WINEGPR-NEXT:    # kill: def $r17w killed $r17w def $r17
+; WINEGPR-NEXT:    # kill: def $r16w killed $r16w def $r16
+; WINEGPR-NEXT:    # kill: def $r9w killed $r9w def $r9
+; WINEGPR-NEXT:    # kill: def $r8w killed $r8w def $r8
+; WINEGPR-NEXT:    # kill: def $dx killed $dx def $rdx
+; WINEGPR-NEXT:    # kill: def $cx killed $cx def $rcx
+; WINEGPR-NEXT:    leal (%r22,%r23), %r10d
+; WINEGPR-NEXT:    addl %r20d, %r10d
+; WINEGPR-NEXT:    addl %r21d, %r10d
+; WINEGPR-NEXT:    addl %r24d, %r10d
+; WINEGPR-NEXT:    leal (%r18,%r19), %r11d
+; WINEGPR-NEXT:    addl %r16d, %r11d
+; WINEGPR-NEXT:    addl %r17d, %r11d
+; WINEGPR-NEXT:    leal (%r8,%r9), %eax
+; WINEGPR-NEXT:    addl %edx, %ecx
+; WINEGPR-NEXT:    addl %ecx, %eax
+; WINEGPR-NEXT:    addl %r11d, %eax
+; WINEGPR-NEXT:    addl %r10d, %eax
+; WINEGPR-NEXT:    # kill: def $ax killed $ax killed $eax
+; WINEGPR-NEXT:    retq
   %a1 = add i16 %a, %b
   %a2 = add i16 %c, %d
   %a3 = add i16 %e, %f
@@ -465,6 +792,67 @@ define fastcc i32 @arg14_i32(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32
 ; EGPR-NEXT:    addl %r23d, %eax
 ; EGPR-NEXT:    addl %edx, %eax
 ; EGPR-NEXT:    retq
+;
+; WIN64-LABEL: arg14_i32:
+; WIN64:       # %bb.0:
+; WIN64-NEXT:    pushq %rsi
+; WIN64-NEXT:    pushq %rdi
+; WIN64-NEXT:    # kill: def $r9d killed $r9d def $r9
+; WIN64-NEXT:    # kill: def $r8d killed $r8d def $r8
+; WIN64-NEXT:    # kill: def $edx killed $edx def $rdx
+; WIN64-NEXT:    # kill: def $ecx killed $ecx def $rcx
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %eax
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %r10d
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %r11d
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %esi
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %edi
+; WIN64-NEXT:    addl %edx, %ecx
+; WIN64-NEXT:    leal (%r8,%r9), %edx
+; WIN64-NEXT:    addl %ecx, %edx
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %edi
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %esi
+; WIN64-NEXT:    addl %edi, %esi
+; WIN64-NEXT:    addl %edx, %esi
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %r11d
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %r10d
+; WIN64-NEXT:    addl %r11d, %r10d
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %eax
+; WIN64-NEXT:    addl %r10d, %eax
+; WIN64-NEXT:    addl %esi, %eax
+; WIN64-NEXT:    popq %rdi
+; WIN64-NEXT:    popq %rsi
+; WIN64-NEXT:    retq
+;
+; WINEGPR-LABEL: arg14_i32:
+; WINEGPR:       # %bb.0:
+; WINEGPR-NEXT:    # kill: def $r25d killed $r25d def $r25
+; WINEGPR-NEXT:    # kill: def $r24d killed $r24d def $r24
+; WINEGPR-NEXT:    # kill: def $r23d killed $r23d def $r23
+; WINEGPR-NEXT:    # kill: def $r22d killed $r22d def $r22
+; WINEGPR-NEXT:    # kill: def $r21d killed $r21d def $r21
+; WINEGPR-NEXT:    # kill: def $r20d killed $r20d def $r20
+; WINEGPR-NEXT:    # kill: def $r19d killed $r19d def $r19
+; WINEGPR-NEXT:    # kill: def $r18d killed $r18d def $r18
+; WINEGPR-NEXT:    # kill: def $r17d killed $r17d def $r17
+; WINEGPR-NEXT:    # kill: def $r16d killed $r16d def $r16
+; WINEGPR-NEXT:    # kill: def $r9d killed $r9d def $r9
+; WINEGPR-NEXT:    # kill: def $r8d killed $r8d def $r8
+; WINEGPR-NEXT:    # kill: def $edx killed $edx def $rdx
+; WINEGPR-NEXT:    # kill: def $ecx killed $ecx def $rcx
+; WINEGPR-NEXT:    leal (%rcx,%rdx), %eax
+; WINEGPR-NEXT:    leal (%r8,%r9), %ecx
+; WINEGPR-NEXT:    addl %eax, %ecx
+; WINEGPR-NEXT:    leal (%r18,%r19), %edx
+; WINEGPR-NEXT:    addl %r16d, %edx
+; WINEGPR-NEXT:    addl %r17d, %edx
+; WINEGPR-NEXT:    addl %ecx, %edx
+; WINEGPR-NEXT:    leal (%r22,%r23), %eax
+; WINEGPR-NEXT:    addl %r20d, %eax
+; WINEGPR-NEXT:    addl %r21d, %eax
+; WINEGPR-NEXT:    addl %r24d, %eax
+; WINEGPR-NEXT:    addl %r25d, %eax
+; WINEGPR-NEXT:    addl %edx, %eax
+; WINEGPR-NEXT:    retq
   %a1 = add i32 %a, %b
   %a2 = add i32 %c, %d
   %a3 = add i32 %e, %f
@@ -523,6 +911,51 @@ define fastcc i64 @arg15_i64(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f, i64
 ; EGPR-NEXT:    addq %rdx, %rax
 ; EGPR-NEXT:    addq %r24, %rax
 ; EGPR-NEXT:    retq
+;
+; WIN64-LABEL: arg15_i64:
+; WIN64:       # %bb.0:
+; WIN64-NEXT:    pushq %rsi
+; WIN64-NEXT:    pushq %rdi
+; WIN64-NEXT:    movq {{[0-9]+}}(%rsp), %rax
+; WIN64-NEXT:    movq {{[0-9]+}}(%rsp), %r10
+; WIN64-NEXT:    movq {{[0-9]+}}(%rsp), %r11
+; WIN64-NEXT:    movq {{[0-9]+}}(%rsp), %rsi
+; WIN64-NEXT:    movq {{[0-9]+}}(%rsp), %rdi
+; WIN64-NEXT:    addq %rdx, %rcx
+; WIN64-NEXT:    leaq (%r8,%r9), %rdx
+; WIN64-NEXT:    addq %rcx, %rdx
+; WIN64-NEXT:    addq {{[0-9]+}}(%rsp), %rdi
+; WIN64-NEXT:    addq {{[0-9]+}}(%rsp), %rsi
+; WIN64-NEXT:    addq %rdi, %rsi
+; WIN64-NEXT:    addq %rdx, %rsi
+; WIN64-NEXT:    addq {{[0-9]+}}(%rsp), %r11
+; WIN64-NEXT:    addq {{[0-9]+}}(%rsp), %r10
+; WIN64-NEXT:    addq %r11, %r10
+; WIN64-NEXT:    addq {{[0-9]+}}(%rsp), %rax
+; WIN64-NEXT:    addq %r10, %rax
+; WIN64-NEXT:    addq %rsi, %rax
+; WIN64-NEXT:    addq {{[0-9]+}}(%rsp), %rax
+; WIN64-NEXT:    popq %rdi
+; WIN64-NEXT:    popq %rsi
+; WIN64-NEXT:    retq
+;
+; WINEGPR-LABEL: arg15_i64:
+; WINEGPR:       # %bb.0:
+; WINEGPR-NEXT:    leaq (%rcx,%rdx), %rax
+; WINEGPR-NEXT:    leaq (%r8,%r9), %rcx
+; WINEGPR-NEXT:    addq %rax, %rcx
+; WINEGPR-NEXT:    leaq (%r18,%r19), %rdx
+; WINEGPR-NEXT:    addq %r16, %rdx
+; WINEGPR-NEXT:    addq %r17, %rdx
+; WINEGPR-NEXT:    addq %rcx, %rdx
+; WINEGPR-NEXT:    leaq (%r22,%r23), %rax
+; WINEGPR-NEXT:    addq %r20, %rax
+; WINEGPR-NEXT:    addq %r21, %rax
+; WINEGPR-NEXT:    addq %r24, %rax
+; WINEGPR-NEXT:    addq %r25, %rax
+; WINEGPR-NEXT:    addq %rdx, %rax
+; WINEGPR-NEXT:    addq %r26, %rax
+; WINEGPR-NEXT:    retq
   %a1 = add i64 %a, %b
   %a2 = add i64 %c, %d
   %a3 = add i64 %e, %f
@@ -609,6 +1042,76 @@ define fastcc i32 @arg16_i32(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32
 ; EGPR-NEXT:    addl %ecx, %eax
 ; EGPR-NEXT:    addl %edx, %eax
 ; EGPR-NEXT:    retq
+;
+; WIN64-LABEL: arg16_i32:
+; WIN64:       # %bb.0:
+; WIN64-NEXT:    pushq %rsi
+; WIN64-NEXT:    pushq %rdi
+; WIN64-NEXT:    pushq %rbx
+; WIN64-NEXT:    # kill: def $r9d killed $r9d def $r9
+; WIN64-NEXT:    # kill: def $r8d killed $r8d def $r8
+; WIN64-NEXT:    # kill: def $edx killed $edx def $rdx
+; WIN64-NEXT:    # kill: def $ecx killed $ecx def $rcx
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %eax
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %esi
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %r11d
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %edi
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %r10d
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %ebx
+; WIN64-NEXT:    addl %edx, %ecx
+; WIN64-NEXT:    leal (%r8,%r9), %edx
+; WIN64-NEXT:    addl %ecx, %edx
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %ebx
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %r10d
+; WIN64-NEXT:    addl %ebx, %r10d
+; WIN64-NEXT:    addl %edx, %r10d
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %edi
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %r11d
+; WIN64-NEXT:    addl %edi, %r11d
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %esi
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %eax
+; WIN64-NEXT:    addl %esi, %eax
+; WIN64-NEXT:    addl %r11d, %eax
+; WIN64-NEXT:    addl %r10d, %eax
+; WIN64-NEXT:    popq %rbx
+; WIN64-NEXT:    popq %rdi
+; WIN64-NEXT:    popq %rsi
+; WIN64-NEXT:    retq
+;
+; WINEGPR-LABEL: arg16_i32:
+; WINEGPR:       # %bb.0:
+; WINEGPR-NEXT:    # kill: def $r27d killed $r27d def $r27
+; WINEGPR-NEXT:    # kill: def $r26d killed $r26d def $r26
+; WINEGPR-NEXT:    # kill: def $r25d killed $r25d def $r25
+; WINEGPR-NEXT:    # kill: def $r24d killed $r24d def $r24
+; WINEGPR-NEXT:    # kill: def $r23d killed $r23d def $r23
+; WINEGPR-NEXT:    # kill: def $r22d killed $r22d def $r22
+; WINEGPR-NEXT:    # kill: def $r21d killed $r21d def $r21
+; WINEGPR-NEXT:    # kill: def $r20d killed $r20d def $r20
+; WINEGPR-NEXT:    # kill: def $r19d killed $r19d def $r19
+; WINEGPR-NEXT:    # kill: def $r18d killed $r18d def $r18
+; WINEGPR-NEXT:    # kill: def $r17d killed $r17d def $r17
+; WINEGPR-NEXT:    # kill: def $r16d killed $r16d def $r16
+; WINEGPR-NEXT:    # kill: def $r9d killed $r9d def $r9
+; WINEGPR-NEXT:    # kill: def $r8d killed $r8d def $r8
+; WINEGPR-NEXT:    # kill: def $edx killed $edx def $rdx
+; WINEGPR-NEXT:    # kill: def $ecx killed $ecx def $rcx
+; WINEGPR-NEXT:    leal (%rcx,%rdx), %eax
+; WINEGPR-NEXT:    leal (%r8,%r9), %ecx
+; WINEGPR-NEXT:    addl %eax, %ecx
+; WINEGPR-NEXT:    leal (%r18,%r19), %edx
+; WINEGPR-NEXT:    addl %r16d, %edx
+; WINEGPR-NEXT:    addl %r17d, %edx
+; WINEGPR-NEXT:    addl %ecx, %edx
+; WINEGPR-NEXT:    leal (%r22,%r23), %ecx
+; WINEGPR-NEXT:    addl %r20d, %ecx
+; WINEGPR-NEXT:    addl %r21d, %ecx
+; WINEGPR-NEXT:    leal (%r26,%r27), %eax
+; WINEGPR-NEXT:    addl %r24d, %eax
+; WINEGPR-NEXT:    addl %r25d, %eax
+; WINEGPR-NEXT:    addl %ecx, %eax
+; WINEGPR-NEXT:    addl %edx, %eax
+; WINEGPR-NEXT:    retq
   %a1 = add i32 %a, %b
   %a2 = add i32 %c, %d
   %a3 = add i32 %e, %f
@@ -700,6 +1203,74 @@ define fastcc i16 @arg17_i16(i16 %a, i16 %b, i16 %c, i16 %d, i16 %e, i16 %f, i16
 ; EGPR-NEXT:    addl %r26d, %eax
 ; EGPR-NEXT:    # kill: def $ax killed $ax killed $eax
 ; EGPR-NEXT:    retq
+;
+; WIN64-LABEL: arg17_i16:
+; WIN64:       # %bb.0:
+; WIN64-NEXT:    # kill: def $r9w killed $r9w def $r9
+; WIN64-NEXT:    # kill: def $r8w killed $r8w def $r8
+; WIN64-NEXT:    # kill: def $dx killed $dx def $rdx
+; WIN64-NEXT:    # kill: def $cx killed $cx def $rcx
+; WIN64-NEXT:    addl %r9d, %r8d
+; WIN64-NEXT:    addl %ecx, %r8d
+; WIN64-NEXT:    addl %edx, %r8d
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %r9d
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %edx
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %r10d
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %ecx
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %r11d
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %r11w
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %cx
+; WIN64-NEXT:    addl %r11d, %ecx
+; WIN64-NEXT:    addl %r8d, %ecx
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %r10w
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %dx
+; WIN64-NEXT:    addl %r10d, %edx
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %r9w
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %ax
+; WIN64-NEXT:    addl %r9d, %eax
+; WIN64-NEXT:    addl %edx, %eax
+; WIN64-NEXT:    addl %ecx, %eax
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %ax
+; WIN64-NEXT:    # kill: def $ax killed $ax killed $eax
+; WIN64-NEXT:    retq
+;
+; WINEGPR-LABEL: arg17_i16:
+; WINEGPR:       # %bb.0:
+; WINEGPR-NEXT:    # kill: def $r27w killed $r27w def $r27
+; WINEGPR-NEXT:    # kill: def $r26w killed $r26w def $r26
+; WINEGPR-NEXT:    # kill: def $r25w killed $r25w def $r25
+; WINEGPR-NEXT:    # kill: def $r24w killed $r24w def $r24
+; WINEGPR-NEXT:    # kill: def $r23w killed $r23w def $r23
+; WINEGPR-NEXT:    # kill: def $r22w killed $r22w def $r22
+; WINEGPR-NEXT:    # kill: def $r21w killed $r21w def $r21
+; WINEGPR-NEXT:    # kill: def $r20w killed $r20w def $r20
+; WINEGPR-NEXT:    # kill: def $r19w killed $r19w def $r19
+; WINEGPR-NEXT:    # kill: def $r18w killed $r18w def $r18
+; WINEGPR-NEXT:    # kill: def $r17w killed $r17w def $r17
+; WINEGPR-NEXT:    # kill: def $r16w killed $r16w def $r16
+; WINEGPR-NEXT:    # kill: def $r9w killed $r9w def $r9
+; WINEGPR-NEXT:    # kill: def $r8w killed $r8w def $r8
+; WINEGPR-NEXT:    # kill: def $dx killed $dx def $rdx
+; WINEGPR-NEXT:    # kill: def $cx killed $cx def $rcx
+; WINEGPR-NEXT:    leal (%r26,%r27), %eax
+; WINEGPR-NEXT:    addl %r24d, %eax
+; WINEGPR-NEXT:    addl %r25d, %eax
+; WINEGPR-NEXT:    leal (%r22,%r23), %r10d
+; WINEGPR-NEXT:    addl %r20d, %r10d
+; WINEGPR-NEXT:    addl %r21d, %r10d
+; WINEGPR-NEXT:    addl %eax, %r10d
+; WINEGPR-NEXT:    leal (%r18,%r19), %r11d
+; WINEGPR-NEXT:    addl %r16d, %r11d
+; WINEGPR-NEXT:    addl %r17d, %r11d
+; WINEGPR-NEXT:    leal (%r8,%r9), %eax
+; WINEGPR-NEXT:    addl %edx, %ecx
+; WINEGPR-NEXT:    addl %ecx, %eax
+; WINEGPR-NEXT:    addl %r11d, %eax
+; WINEGPR-NEXT:    addl %r10d, %eax
+; WINEGPR-NEXT:    addw {{[0-9]+}}(%rsp), %ax
+; WINEGPR-NEXT:    # kill: def $ax killed $ax killed $eax
+; WINEGPR-NEXT:    retq
   %a1 = add i16 %a, %b
   %a2 = add i16 %c, %d
   %a3 = add i16 %e, %f
@@ -798,6 +1369,84 @@ define fastcc i8 @arg18_i8(i8 %a, i8 %b, i8 %c, i8 %d, i8 %e, i8 %f, i8 %g, i8 %
 ; EGPR-NEXT:    addb %sil, %al
 ; EGPR-NEXT:    # kill: def $al killed $al killed $eax
 ; EGPR-NEXT:    retq
+;
+; WIN64-LABEL: arg18_i8:
+; WIN64:       # %bb.0:
+; WIN64-NEXT:    pushq %rsi
+; WIN64-NEXT:    pushq %rdi
+; WIN64-NEXT:    pushq %rbp
+; WIN64-NEXT:    pushq %rbx
+; WIN64-NEXT:    # kill: def $r9b killed $r9b def $r9
+; WIN64-NEXT:    # kill: def $r8b killed $r8b def $r8
+; WIN64-NEXT:    # kill: def $dl killed $dl def $rdx
+; WIN64-NEXT:    # kill: def $cl killed $cl def $rcx
+; WIN64-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
+; WIN64-NEXT:    movzbl {{[0-9]+}}(%rsp), %r10d
+; WIN64-NEXT:    movzbl {{[0-9]+}}(%rsp), %esi
+; WIN64-NEXT:    movzbl {{[0-9]+}}(%rsp), %ebx
+; WIN64-NEXT:    movzbl {{[0-9]+}}(%rsp), %edi
+; WIN64-NEXT:    movzbl {{[0-9]+}}(%rsp), %r11d
+; WIN64-NEXT:    movzbl {{[0-9]+}}(%rsp), %ebp
+; WIN64-NEXT:    addl %edx, %ecx
+; WIN64-NEXT:    leal (%r8,%r9), %edx
+; WIN64-NEXT:    addb %cl, %dl
+; WIN64-NEXT:    addb {{[0-9]+}}(%rsp), %bpl
+; WIN64-NEXT:    addb {{[0-9]+}}(%rsp), %r11b
+; WIN64-NEXT:    addb %bpl, %r11b
+; WIN64-NEXT:    addb %dl, %r11b
+; WIN64-NEXT:    addb {{[0-9]+}}(%rsp), %dil
+; WIN64-NEXT:    addb {{[0-9]+}}(%rsp), %bl
+; WIN64-NEXT:    addb %dil, %bl
+; WIN64-NEXT:    addb {{[0-9]+}}(%rsp), %sil
+; WIN64-NEXT:    addb {{[0-9]+}}(%rsp), %r10b
+; WIN64-NEXT:    addb %sil, %r10b
+; WIN64-NEXT:    addb %bl, %r10b
+; WIN64-NEXT:    addb %r11b, %r10b
+; WIN64-NEXT:    addb {{[0-9]+}}(%rsp), %al
+; WIN64-NEXT:    addb %r10b, %al
+; WIN64-NEXT:    popq %rbx
+; WIN64-NEXT:    popq %rbp
+; WIN64-NEXT:    popq %rdi
+; WIN64-NEXT:    popq %rsi
+; WIN64-NEXT:    retq
+;
+; WINEGPR-LABEL: arg18_i8:
+; WINEGPR:       # %bb.0:
+; WINEGPR-NEXT:    # kill: def $r27b killed $r27b def $r27
+; WINEGPR-NEXT:    # kill: def $r26b killed $r26b def $r26
+; WINEGPR-NEXT:    # kill: def $r25b killed $r25b def $r25
+; WINEGPR-NEXT:    # kill: def $r24b killed $r24b def $r24
+; WINEGPR-NEXT:    # kill: def $r23b killed $r23b def $r23
+; WINEGPR-NEXT:    # kill: def $r22b killed $r22b def $r22
+; WINEGPR-NEXT:    # kill: def $r21b killed $r21b def $r21
+; WINEGPR-NEXT:    # kill: def $r20b killed $r20b def $r20
+; WINEGPR-NEXT:    # kill: def $r19b killed $r19b def $r19
+; WINEGPR-NEXT:    # kill: def $r18b killed $r18b def $r18
+; WINEGPR-NEXT:    # kill: def $r17b killed $r17b def $r17
+; WINEGPR-NEXT:    # kill: def $r16b killed $r16b def $r16
+; WINEGPR-NEXT:    # kill: def $r9b killed $r9b def $r9
+; WINEGPR-NEXT:    # kill: def $r8b killed $r8b def $r8
+; WINEGPR-NEXT:    # kill: def $dl killed $dl def $rdx
+; WINEGPR-NEXT:    # kill: def $cl killed $cl def $rcx
+; WINEGPR-NEXT:    movzbl {{[0-9]+}}(%rsp), %eax
+; WINEGPR-NEXT:    addl %edx, %ecx
+; WINEGPR-NEXT:    leal (%r8,%r9), %edx
+; WINEGPR-NEXT:    addb %cl, %dl
+; WINEGPR-NEXT:    leal (%r16,%r17), %ecx
+; WINEGPR-NEXT:    leal (%r18,%r19), %r8d
+; WINEGPR-NEXT:    addb %cl, %r8b
+; WINEGPR-NEXT:    addb %dl, %r8b
+; WINEGPR-NEXT:    leal (%r20,%r21), %ecx
+; WINEGPR-NEXT:    leal (%r22,%r23), %edx
+; WINEGPR-NEXT:    addb %cl, %dl
+; WINEGPR-NEXT:    leal (%r24,%r25), %ecx
+; WINEGPR-NEXT:    leal (%r26,%r27), %r9d
+; WINEGPR-NEXT:    addb %cl, %r9b
+; WINEGPR-NEXT:    addb %dl, %r9b
+; WINEGPR-NEXT:    addb %r8b, %r9b
+; WINEGPR-NEXT:    addb {{[0-9]+}}(%rsp), %al
+; WINEGPR-NEXT:    addb %r9b, %al
+; WINEGPR-NEXT:    retq
   %a1 = add i8 %a, %b
   %a2 = add i8 %c, %d
   %a3 = add i8 %e, %f
@@ -900,6 +1549,82 @@ define fastcc i16 @arg19_i16(i16 %a, i16 %b, i16 %c, i16 %d, i16 %e, i16 %f, i16
 ; EGPR-NEXT:    addl %esi, %eax
 ; EGPR-NEXT:    # kill: def $ax killed $ax killed $eax
 ; EGPR-NEXT:    retq
+;
+; WIN64-LABEL: arg19_i16:
+; WIN64:       # %bb.0:
+; WIN64-NEXT:    pushq %rsi
+; WIN64-NEXT:    # kill: def $r9w killed $r9w def $r9
+; WIN64-NEXT:    # kill: def $r8w killed $r8w def $r8
+; WIN64-NEXT:    # kill: def $dx killed $dx def $rdx
+; WIN64-NEXT:    # kill: def $cx killed $cx def $rcx
+; WIN64-NEXT:    addl %r8d, %r9d
+; WIN64-NEXT:    addl %ecx, %r9d
+; WIN64-NEXT:    addl %edx, %r9d
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %ecx
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %r10d
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %r8d
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %r11d
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %edx
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %esi
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %si
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %dx
+; WIN64-NEXT:    addl %esi, %edx
+; WIN64-NEXT:    addl %r9d, %edx
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %r11w
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %r8w
+; WIN64-NEXT:    addl %r11d, %r8d
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %r10w
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %cx
+; WIN64-NEXT:    addl %r10d, %ecx
+; WIN64-NEXT:    addl %r8d, %ecx
+; WIN64-NEXT:    addl %edx, %ecx
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %ax
+; WIN64-NEXT:    addl %ecx, %eax
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %ax
+; WIN64-NEXT:    # kill: def $ax killed $ax killed $eax
+; WIN64-NEXT:    popq %rsi
+; WIN64-NEXT:    retq
+;
+; WINEGPR-LABEL: arg19_i16:
+; WINEGPR:       # %bb.0:
+; WINEGPR-NEXT:    # kill: def $r27w killed $r27w def $r27
+; WINEGPR-NEXT:    # kill: def $r26w killed $r26w def $r26
+; WINEGPR-NEXT:    # kill: def $r25w killed $r25w def $r25
+; WINEGPR-NEXT:    # kill: def $r24w killed $r24w def $r24
+; WINEGPR-NEXT:    # kill: def $r23w killed $r23w def $r23
+; WINEGPR-NEXT:    # kill: def $r22w killed $r22w def $r22
+; WINEGPR-NEXT:    # kill: def $r21w killed $r21w def $r21
+; WINEGPR-NEXT:    # kill: def $r20w killed $r20w def $r20
+; WINEGPR-NEXT:    # kill: def $r19w killed $r19w def $r19
+; WINEGPR-NEXT:    # kill: def $r18w killed $r18w def $r18
+; WINEGPR-NEXT:    # kill: def $r17w killed $r17w def $r17
+; WINEGPR-NEXT:    # kill: def $r16w killed $r16w def $r16
+; WINEGPR-NEXT:    # kill: def $r9w killed $r9w def $r9
+; WINEGPR-NEXT:    # kill: def $r8w killed $r8w def $r8
+; WINEGPR-NEXT:    # kill: def $dx killed $dx def $rdx
+; WINEGPR-NEXT:    # kill: def $cx killed $cx def $rcx
+; WINEGPR-NEXT:    leal (%r26,%r27), %eax
+; WINEGPR-NEXT:    addl %r24d, %eax
+; WINEGPR-NEXT:    addl %r25d, %eax
+; WINEGPR-NEXT:    leal (%r22,%r23), %r10d
+; WINEGPR-NEXT:    addl %r20d, %r10d
+; WINEGPR-NEXT:    addl %r21d, %r10d
+; WINEGPR-NEXT:    addl %eax, %r10d
+; WINEGPR-NEXT:    leal (%r18,%r19), %eax
+; WINEGPR-NEXT:    addl %r16d, %eax
+; WINEGPR-NEXT:    addl %r17d, %eax
+; WINEGPR-NEXT:    addl %r9d, %r8d
+; WINEGPR-NEXT:    addl %edx, %ecx
+; WINEGPR-NEXT:    addl %ecx, %r8d
+; WINEGPR-NEXT:    addl %eax, %r8d
+; WINEGPR-NEXT:    addl %r10d, %r8d
+; WINEGPR-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax
+; WINEGPR-NEXT:    addw {{[0-9]+}}(%rsp), %ax
+; WINEGPR-NEXT:    addl %r8d, %eax
+; WINEGPR-NEXT:    addw {{[0-9]+}}(%rsp), %ax
+; WINEGPR-NEXT:    # kill: def $ax killed $ax killed $eax
+; WINEGPR-NEXT:    retq
   %a1 = add i16 %a, %b
   %a2 = add i16 %c, %d
   %a3 = add i16 %e, %f
@@ -1010,6 +1735,94 @@ define fastcc i32 @arg20_i32(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32
 ; EGPR-NEXT:    addl %edx, %eax
 ; EGPR-NEXT:    addl %esi, %eax
 ; EGPR-NEXT:    retq
+;
+; WIN64-LABEL: arg20_i32:
+; WIN64:       # %bb.0:
+; WIN64-NEXT:    pushq %r14
+; WIN64-NEXT:    pushq %rsi
+; WIN64-NEXT:    pushq %rdi
+; WIN64-NEXT:    pushq %rbp
+; WIN64-NEXT:    pushq %rbx
+; WIN64-NEXT:    # kill: def $r9d killed $r9d def $r9
+; WIN64-NEXT:    # kill: def $r8d killed $r8d def $r8
+; WIN64-NEXT:    # kill: def $edx killed $edx def $rdx
+; WIN64-NEXT:    # kill: def $ecx killed $ecx def $rcx
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %r10d
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %r11d
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %eax
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %ebx
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %edi
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %ebp
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %esi
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %r14d
+; WIN64-NEXT:    addl %edx, %ecx
+; WIN64-NEXT:    leal (%r8,%r9), %edx
+; WIN64-NEXT:    addl %ecx, %edx
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %r14d
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %esi
+; WIN64-NEXT:    addl %r14d, %esi
+; WIN64-NEXT:    addl %edx, %esi
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %ebp
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %edi
+; WIN64-NEXT:    addl %ebp, %edi
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %ebx
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %eax
+; WIN64-NEXT:    addl %ebx, %eax
+; WIN64-NEXT:    addl %edi, %eax
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %r11d
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %r10d
+; WIN64-NEXT:    addl %r11d, %r10d
+; WIN64-NEXT:    addl %eax, %r10d
+; WIN64-NEXT:    addl %esi, %eax
+; WIN64-NEXT:    addl %r10d, %eax
+; WIN64-NEXT:    popq %rbx
+; WIN64-NEXT:    popq %rbp
+; WIN64-NEXT:    popq %rdi
+; WIN64-NEXT:    popq %rsi
+; WIN64-NEXT:    popq %r14
+; WIN64-NEXT:    retq
+;
+; WINEGPR-LABEL: arg20_i32:
+; WINEGPR:       # %bb.0:
+; WINEGPR-NEXT:    # kill: def $r27d killed $r27d def $r27
+; WINEGPR-NEXT:    # kill: def $r26d killed $r26d def $r26
+; WINEGPR-NEXT:    # kill: def $r25d killed $r25d def $r25
+; WINEGPR-NEXT:    # kill: def $r24d killed $r24d def $r24
+; WINEGPR-NEXT:    # kill: def $r23d killed $r23d def $r23
+; WINEGPR-NEXT:    # kill: def $r22d killed $r22d def $r22
+; WINEGPR-NEXT:    # kill: def $r21d killed $r21d def $r21
+; WINEGPR-NEXT:    # kill: def $r20d killed $r20d def $r20
+; WINEGPR-NEXT:    # kill: def $r19d killed $r19d def $r19
+; WINEGPR-NEXT:    # kill: def $r18d killed $r18d def $r18
+; WINEGPR-NEXT:    # kill: def $r17d killed $r17d def $r17
+; WINEGPR-NEXT:    # kill: def $r16d killed $r16d def $r16
+; WINEGPR-NEXT:    # kill: def $r9d killed $r9d def $r9
+; WINEGPR-NEXT:    # kill: def $r8d killed $r8d def $r8
+; WINEGPR-NEXT:    # kill: def $edx killed $edx def $rdx
+; WINEGPR-NEXT:    # kill: def $ecx killed $ecx def $rcx
+; WINEGPR-NEXT:    movl {{[0-9]+}}(%rsp), %r10d
+; WINEGPR-NEXT:    movl {{[0-9]+}}(%rsp), %r11d
+; WINEGPR-NEXT:    leal (%rcx,%rdx), %eax
+; WINEGPR-NEXT:    leal (%r8,%r9), %ecx
+; WINEGPR-NEXT:    addl %eax, %ecx
+; WINEGPR-NEXT:    leal (%r18,%r19), %edx
+; WINEGPR-NEXT:    addl %r16d, %edx
+; WINEGPR-NEXT:    addl %r17d, %edx
+; WINEGPR-NEXT:    addl %ecx, %edx
+; WINEGPR-NEXT:    leal (%r22,%r23), %ecx
+; WINEGPR-NEXT:    addl %r20d, %ecx
+; WINEGPR-NEXT:    addl %r21d, %ecx
+; WINEGPR-NEXT:    leal (%r26,%r27), %eax
+; WINEGPR-NEXT:    addl %r24d, %eax
+; WINEGPR-NEXT:    addl %r25d, %eax
+; WINEGPR-NEXT:    addl %ecx, %eax
+; WINEGPR-NEXT:    addl {{[0-9]+}}(%rsp), %r11d
+; WINEGPR-NEXT:    addl {{[0-9]+}}(%rsp), %r10d
+; WINEGPR-NEXT:    addl %r11d, %r10d
+; WINEGPR-NEXT:    addl %eax, %r10d
+; WINEGPR-NEXT:    addl %edx, %eax
+; WINEGPR-NEXT:    addl %r10d, %eax
+; WINEGPR-NEXT:    retq
   %a1 = add i32 %a, %b
   %a2 = add i32 %c, %d
   %a3 = add i32 %e, %f
@@ -1098,6 +1911,76 @@ define fastcc i64 @arg21_i64(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f, i64
 ; EGPR-NEXT:    addq %rsi, %rax
 ; EGPR-NEXT:    addq %r30, %rax
 ; EGPR-NEXT:    retq
+;
+; WIN64-LABEL: arg21_i64:
+; WIN64:       # %bb.0:
+; WIN64-NEXT:    pushq %r15
+; WIN64-NEXT:    pushq %r14
+; WIN64-NEXT:    pushq %rsi
+; WIN64-NEXT:    pushq %rdi
+; WIN64-NEXT:    pushq %rbx
+; WIN64-NEXT:    movq {{[0-9]+}}(%rsp), %r10
+; WIN64-NEXT:    movq {{[0-9]+}}(%rsp), %r11
+; WIN64-NEXT:    movq {{[0-9]+}}(%rsp), %rax
+; WIN64-NEXT:    movq {{[0-9]+}}(%rsp), %rdi
+; WIN64-NEXT:    movq {{[0-9]+}}(%rsp), %rbx
+; WIN64-NEXT:    movq {{[0-9]+}}(%rsp), %r14
+; WIN64-NEXT:    movq {{[0-9]+}}(%rsp), %rsi
+; WIN64-NEXT:    movq {{[0-9]+}}(%rsp), %r15
+; WIN64-NEXT:    addq %rdx, %rcx
+; WIN64-NEXT:    leaq (%r8,%r9), %rdx
+; WIN64-NEXT:    addq %rcx, %rdx
+; WIN64-NEXT:    addq {{[0-9]+}}(%rsp), %r15
+; WIN64-NEXT:    addq {{[0-9]+}}(%rsp), %rsi
+; WIN64-NEXT:    addq %r15, %rsi
+; WIN64-NEXT:    addq %rdx, %rsi
+; WIN64-NEXT:    addq {{[0-9]+}}(%rsp), %r14
+; WIN64-NEXT:    addq {{[0-9]+}}(%rsp), %rbx
+; WIN64-NEXT:    addq %r14, %rbx
+; WIN64-NEXT:    addq {{[0-9]+}}(%rsp), %rdi
+; WIN64-NEXT:    addq {{[0-9]+}}(%rsp), %rax
+; WIN64-NEXT:    addq %rdi, %rax
+; WIN64-NEXT:    addq %rbx, %rax
+; WIN64-NEXT:    addq {{[0-9]+}}(%rsp), %r11
+; WIN64-NEXT:    addq {{[0-9]+}}(%rsp), %r10
+; WIN64-NEXT:    addq %r11, %r10
+; WIN64-NEXT:    addq %rax, %r10
+; WIN64-NEXT:    addq %rsi, %rax
+; WIN64-NEXT:    addq %r10, %rax
+; WIN64-NEXT:    addq {{[0-9]+}}(%rsp), %rax
+; WIN64-NEXT:    popq %rbx
+; WIN64-NEXT:    popq %rdi
+; WIN64-NEXT:    popq %rsi
+; WIN64-NEXT:    popq %r14
+; WIN64-NEXT:    popq %r15
+; WIN64-NEXT:    retq
+;
+; WINEGPR-LABEL: arg21_i64:
+; WINEGPR:       # %bb.0:
+; WINEGPR-NEXT:    movq {{[0-9]+}}(%rsp), %r10
+; WINEGPR-NEXT:    movq {{[0-9]+}}(%rsp), %r11
+; WINEGPR-NEXT:    leaq (%rcx,%rdx), %rax
+; WINEGPR-NEXT:    leaq (%r8,%r9), %rcx
+; WINEGPR-NEXT:    addq %rax, %rcx
+; WINEGPR-NEXT:    leaq (%r18,%r19), %rdx
+; WINEGPR-NEXT:    addq %r16, %rdx
+; WINEGPR-NEXT:    addq %r17, %rdx
+; WINEGPR-NEXT:    addq %rcx, %rdx
+; WINEGPR-NEXT:    leaq (%r22,%r23), %rcx
+; WINEGPR-NEXT:    addq %r20, %rcx
+; WINEGPR-NEXT:    addq %r21, %rcx
+; WINEGPR-NEXT:    leaq (%r26,%r27), %rax
+; WINEGPR-NEXT:    addq %r24, %rax
+; WINEGPR-NEXT:    addq %r25, %rax
+; WINEGPR-NEXT:    addq %rcx, %rax
+; WINEGPR-NEXT:    addq {{[0-9]+}}(%rsp), %r11
+; WINEGPR-NEXT:    addq {{[0-9]+}}(%rsp), %r10
+; WINEGPR-NEXT:    addq %r11, %r10
+; WINEGPR-NEXT:    addq %rax, %r10
+; WINEGPR-NEXT:    addq %rdx, %rax
+; WINEGPR-NEXT:    addq %r10, %rax
+; WINEGPR-NEXT:    addq {{[0-9]+}}(%rsp), %rax
+; WINEGPR-NEXT:    retq
   %a1 = add i64 %a, %b
   %a2 = add i64 %c, %d
   %a3 = add i64 %e, %f
@@ -1220,6 +2103,102 @@ define fastcc i32 @arg22_i32(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32
 ; EGPR-NEXT:    addl %r30d, %eax
 ; EGPR-NEXT:    addl %r31d, %eax
 ; EGPR-NEXT:    retq
+;
+; WIN64-LABEL: arg22_i32:
+; WIN64:       # %bb.0:
+; WIN64-NEXT:    pushq %r15
+; WIN64-NEXT:    pushq %r14
+; WIN64-NEXT:    pushq %rsi
+; WIN64-NEXT:    pushq %rdi
+; WIN64-NEXT:    pushq %rbp
+; WIN64-NEXT:    pushq %rbx
+; WIN64-NEXT:    # kill: def $r9d killed $r9d def $r9
+; WIN64-NEXT:    # kill: def $r8d killed $r8d def $r8
+; WIN64-NEXT:    # kill: def $edx killed $edx def $rdx
+; WIN64-NEXT:    # kill: def $ecx killed $ecx def $rcx
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %r10d
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %r11d
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %edi
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %eax
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %ebp
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %ebx
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %r14d
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %esi
+; WIN64-NEXT:    movl {{[0-9]+}}(%rsp), %r15d
+; WIN64-NEXT:    addl %edx, %ecx
+; WIN64-NEXT:    leal (%r8,%r9), %edx
+; WIN64-NEXT:    addl %ecx, %edx
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %r15d
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %esi
+; WIN64-NEXT:    addl %r15d, %esi
+; WIN64-NEXT:    addl %edx, %esi
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %r14d
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %ebx
+; WIN64-NEXT:    addl %r14d, %ebx
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %ebp
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %eax
+; WIN64-NEXT:    addl %ebp, %eax
+; WIN64-NEXT:    addl %ebx, %eax
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %edi
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %r11d
+; WIN64-NEXT:    addl %edi, %r11d
+; WIN64-NEXT:    addl {{[0-9]+}}(%rsp), %r10d
+; WIN64-NEXT:    addl %eax, %r11d
+; WIN64-NEXT:    addl %esi, %eax
+; WIN64-NEXT:    addl %r11d, %eax
+; WIN64-NEXT:    addl %r10d, %eax
+; WIN64-NEXT:    popq %rbx
+; WIN64-NEXT:    popq %rbp
+; WIN64-NEXT:    popq %rdi
+; WIN64-NEXT:    popq %rsi
+; WIN64-NEXT:    popq %r14
+; WIN64-NEXT:    popq %r15
+; WIN64-NEXT:    retq
+;
+; WINEGPR-LABEL: arg22_i32:
+; WINEGPR:       # %bb.0:
+; WINEGPR-NEXT:    # kill: def $r27d killed $r27d def $r27
+; WINEGPR-NEXT:    # kill: def $r26d killed $r26d def $r26
+; WINEGPR-NEXT:    # kill: def $r25d killed $r25d def $r25
+; WINEGPR-NEXT:    # kill: def $r24d killed $r24d def $r24
+; WINEGPR-NEXT:    # kill: def $r23d killed $r23d def $r23
+; WINEGPR-NEXT:    # kill: def $r22d killed $r22d def $r22
+; WINEGPR-NEXT:    # kill: def $r21d killed $r21d def $r21
+; WINEGPR-NEXT:    # kill: def $r20d killed $r20d def $r20
+; WINEGPR-NEXT:    # kill: def $r19d killed $r19d def $r19
+; WINEGPR-NEXT:    # kill: def $r18d killed $r18d def $r18
+; WINEGPR-NEXT:    # kill: def $r17d killed $r17d def $r17
+; WINEGPR-NEXT:    # kill: def $r16d killed $r16d def $r16
+; WINEGPR-NEXT:    # kill: def $r9d killed $r9d def $r9
+; WINEGPR-NEXT:    # kill: def $r8d killed $r8d def $r8
+; WINEGPR-NEXT:    # kill: def $edx killed $edx def $rdx
+; WINEGPR-NEXT:    # kill: def $ecx killed $ecx def $rcx
+; WINEGPR-NEXT:    movl {{[0-9]+}}(%rsp), %r10d
+; WINEGPR-NEXT:    movl {{[0-9]+}}(%rsp), %r11d
+; WINEGPR-NEXT:    movl {{[0-9]+}}(%rsp), %r30d
+; WINEGPR-NEXT:    leal (%rcx,%rdx), %eax
+; WINEGPR-NEXT:    leal (%r8,%r9), %ecx
+; WINEGPR-NEXT:    addl %eax, %ecx
+; WINEGPR-NEXT:    leal (%r18,%r19), %edx
+; WINEGPR-NEXT:    addl %r16d, %edx
+; WINEGPR-NEXT:    addl %r17d, %edx
+; WINEGPR-NEXT:    addl %ecx, %edx
+; WINEGPR-NEXT:    leal (%r22,%r23), %ecx
+; WINEGPR-NEXT:    addl %r20d, %ecx
+; WINEGPR-NEXT:    addl %r21d, %ecx
+; WINEGPR-NEXT:    leal (%r26,%r27), %eax
+; WINEGPR-NEXT:    addl %r24d, %eax
+; WINEGPR-NEXT:    addl %r25d, %eax
+; WINEGPR-NEXT:    addl %ecx, %eax
+; WINEGPR-NEXT:    addl {{[0-9]+}}(%rsp), %r30d
+; WINEGPR-NEXT:    addl {{[0-9]+}}(%rsp), %r11d
+; WINEGPR-NEXT:    addl %r30d, %r11d
+; WINEGPR-NEXT:    addl {{[0-9]+}}(%rsp), %r10d
+; WINEGPR-NEXT:    addl %eax, %r11d
+; WINEGPR-NEXT:    addl %edx, %eax
+; WINEGPR-NEXT:    addl %r10d, %eax
+; WINEGPR-NEXT:    addl %r11d, %eax
+; WINEGPR-NEXT:    retq
   %a1 = add i32 %a, %b
   %a2 = add i32 %c, %d
   %a3 = add i32 %e, %f
@@ -1347,6 +2326,100 @@ define fastcc i16 @arg23_i16(i16 %a, i16 %b, i16 %c, i16 %d, i16 %e, i16 %f, i16
 ; EGPR-NEXT:    addw {{[0-9]+}}(%rsp), %ax
 ; EGPR-NEXT:    # kill: def $ax killed $ax killed $eax
 ; EGPR-NEXT:    retq
+;
+; WIN64-LABEL: arg23_i16:
+; WIN64:       # %bb.0:
+; WIN64-NEXT:    pushq %rsi
+; WIN64-NEXT:    pushq %rdi
+; WIN64-NEXT:    pushq %rbx
+; WIN64-NEXT:    # kill: def $r9w killed $r9w def $r9
+; WIN64-NEXT:    # kill: def $r8w killed $r8w def $r8
+; WIN64-NEXT:    # kill: def $dx killed $dx def $rdx
+; WIN64-NEXT:    # kill: def $cx killed $cx def $rcx
+; WIN64-NEXT:    leal (%r8,%r9), %r11d
+; WIN64-NEXT:    addl %ecx, %r11d
+; WIN64-NEXT:    addl %edx, %r11d
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %ecx
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %edx
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %r9d
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %eax
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %esi
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %r10d
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %edi
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %r8d
+; WIN64-NEXT:    movzwl {{[0-9]+}}(%rsp), %ebx
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %bx
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %r8w
+; WIN64-NEXT:    addl %ebx, %r8d
+; WIN64-NEXT:    addl %r11d, %r8d
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %di
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %r10w
+; WIN64-NEXT:    addl %edi, %r10d
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %si
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %ax
+; WIN64-NEXT:    addl %esi, %eax
+; WIN64-NEXT:    addl %r10d, %eax
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %r9w
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %dx
+; WIN64-NEXT:    addl %r9d, %edx
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %cx
+; WIN64-NEXT:    addl %eax, %edx
+; WIN64-NEXT:    addl %r8d, %eax
+; WIN64-NEXT:    addl %edx, %eax
+; WIN64-NEXT:    addl %ecx, %eax
+; WIN64-NEXT:    addw {{[0-9]+}}(%rsp), %ax
+; WIN64-NEXT:    # kill: def $ax killed $ax killed $eax
+; WIN64-NEXT:    popq %rbx
+; WIN64-NEXT:    popq %rdi
+; WIN64-NEXT:    popq %rsi
+; WIN64-NEXT:    retq
+;
+; WINEGPR-LABEL: arg23_i16:
+; WINEGPR:       # %bb.0:
+; WINEGPR-NEXT:    # kill: def $r27w killed $r27w def $r27
+; WINEGPR-NEXT:    # kill: def $r26w killed $r26w def $r26
+; WINEGPR-NEXT:    # kill: def $r25w killed $r25w def $r25
+; WINEGPR-NEXT:    # kill: def $r24w killed $r24w def $r24
+; WINEGPR-NEXT:    # kill: def $r23w killed $r23w def $r23
+; WINEGPR-NEXT:    # kill: def $r22w killed $r22w def $r22
+; WINEGPR-NEXT:    # kill: def $r21w killed $r21w def $r21
+; WINEGPR-NEXT:    # kill: def $r20w killed $r20w def $r20
+; WINEGPR-NEXT:    # kill: def $r19w killed $r19w def $r19
+; WINEGPR-NEXT:    # kill: def $r18w killed $r18w def $r18
+; WINEGPR-NEXT:    # kill: def $r17w killed $r17w def $r17
+; WINEGPR-NEXT:    # kill: def $r16w killed $r16w def $r16
+; WINEGPR-NEXT:    # kill: def $r9w killed $r9w def $r9
+; WINEGPR-NEXT:    # kill: def $r8w killed $r8w def $r8
+; WINEGPR-NEXT:    # kill: def $dx killed $dx def $rdx
+; WINEGPR-NEXT:    # kill: def $cx killed $cx def $rcx
+; WINEGPR-NEXT:    leal (%r26,%r27), %eax
+; WINEGPR-NEXT:    addl %r24d, %eax
+; WINEGPR-NEXT:    addl %r25d, %eax
+; WINEGPR-NEXT:    leal (%r22,%r23), %r10d
+; WINEGPR-NEXT:    addl %r20d, %r10d
+; WINEGPR-NEXT:    addl %r21d, %r10d
+; WINEGPR-NEXT:    addl %eax, %r10d
+; WINEGPR-NEXT:    leal (%r18,%r19), %r11d
+; WINEGPR-NEXT:    addl %r16d, %r11d
+; WINEGPR-NEXT:    addl %r17d, %r11d
+; WINEGPR-NEXT:    leal (%r8,%r9), %eax
+; WINEGPR-NEXT:    addl %edx, %ecx
+; WINEGPR-NEXT:    addl %ecx, %eax
+; WINEGPR-NEXT:    addl %r11d, %eax
+; WINEGPR-NEXT:    movzwl {{[0-9]+}}(%rsp), %ecx
+; WINEGPR-NEXT:    movzwl {{[0-9]+}}(%rsp), %edx
+; WINEGPR-NEXT:    movzwl {{[0-9]+}}(%rsp), %r8d
+; WINEGPR-NEXT:    addw {{[0-9]+}}(%rsp), %r8w
+; WINEGPR-NEXT:    addw {{[0-9]+}}(%rsp), %dx
+; WINEGPR-NEXT:    addl %r8d, %edx
+; WINEGPR-NEXT:    addw {{[0-9]+}}(%rsp), %cx
+; WINEGPR-NEXT:    addl %r10d, %edx
+; WINEGPR-NEXT:    addl %r10d, %eax
+; WINEGPR-NEXT:    addl %ecx, %eax
+; WINEGPR-NEXT:    addl %edx, %eax
+; WINEGPR-NEXT:    addw {{[0-9]+}}(%rsp), %ax
+; WINEGPR-NEXT:    # kill: def $ax killed $ax killed $eax
+; WINEGPR-NEXT:    retq
   %a1 = add i16 %a, %b
   %a2 = add i16 %c, %d
   %a3 = add i16 %e, %f

>From ee746956b3b690b44ee8be0208aeecf89435919d Mon Sep 17 00:00:00 2001
From: Phoebe Wang <phoebe.wang at intel.com>
Date: Mon, 6 Jul 2026 16:02:51 +0800
Subject: [PATCH 3/3] Update test cases

---
 llvm/test/CodeGen/X86/apx/fastcc.ll           |   6 +-
 .../CodeGen/X86/apx/memfold-no-physreg.ll     | 133 +++++++++---------
 2 files changed, 69 insertions(+), 70 deletions(-)

diff --git a/llvm/test/CodeGen/X86/apx/fastcc.ll b/llvm/test/CodeGen/X86/apx/fastcc.ll
index 11f3ee9311ee4..53027dd38c3c3 100644
--- a/llvm/test/CodeGen/X86/apx/fastcc.ll
+++ b/llvm/test/CodeGen/X86/apx/fastcc.ll
@@ -2175,7 +2175,7 @@ define fastcc i32 @arg22_i32(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32
 ; WINEGPR-NEXT:    # kill: def $ecx killed $ecx def $rcx
 ; WINEGPR-NEXT:    movl {{[0-9]+}}(%rsp), %r10d
 ; WINEGPR-NEXT:    movl {{[0-9]+}}(%rsp), %r11d
-; WINEGPR-NEXT:    movl {{[0-9]+}}(%rsp), %r30d
+; WINEGPR-NEXT:    movl {{[0-9]+}}(%rsp), %r28d
 ; WINEGPR-NEXT:    leal (%rcx,%rdx), %eax
 ; WINEGPR-NEXT:    leal (%r8,%r9), %ecx
 ; WINEGPR-NEXT:    addl %eax, %ecx
@@ -2190,9 +2190,9 @@ define fastcc i32 @arg22_i32(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32
 ; WINEGPR-NEXT:    addl %r24d, %eax
 ; WINEGPR-NEXT:    addl %r25d, %eax
 ; WINEGPR-NEXT:    addl %ecx, %eax
-; WINEGPR-NEXT:    addl {{[0-9]+}}(%rsp), %r30d
+; WINEGPR-NEXT:    addl {{[0-9]+}}(%rsp), %r28d
 ; WINEGPR-NEXT:    addl {{[0-9]+}}(%rsp), %r11d
-; WINEGPR-NEXT:    addl %r30d, %r11d
+; WINEGPR-NEXT:    addl %r28d, %r11d
 ; WINEGPR-NEXT:    addl {{[0-9]+}}(%rsp), %r10d
 ; WINEGPR-NEXT:    addl %eax, %r11d
 ; WINEGPR-NEXT:    addl %edx, %eax
diff --git a/llvm/test/CodeGen/X86/apx/memfold-no-physreg.ll b/llvm/test/CodeGen/X86/apx/memfold-no-physreg.ll
index 5142a5ef0c9e8..1e762697ee3df 100644
--- a/llvm/test/CodeGen/X86/apx/memfold-no-physreg.ll
+++ b/llvm/test/CodeGen/X86/apx/memfold-no-physreg.ll
@@ -14,37 +14,34 @@ define fastcc i64 @foo(i32 %dim1, i32 %dim2, i32 %dim3, i32 %dim4, ptr %p1, ptr
 ; CHECK-NEXT:    pushq %rsi
 ; CHECK-NEXT:    pushq %rdi
 ; CHECK-NEXT:    pushq %rbx
-; CHECK-NEXT:    subq $40, %rsp
+; CHECK-NEXT:    subq $72, %rsp
 ; CHECK-NEXT:    leaq {{[0-9]+}}(%rsp), %rbp
 ; CHECK-NEXT:    andq $-32, %rsp
 ; CHECK-NEXT:    movq %rsp, %rbx
-; CHECK-NEXT:    movq 328(%rbp), %rax
+; CHECK-NEXT:    movq %r27, 16(%rbx) # 8-byte Spill
+; CHECK-NEXT:    movq %r22, %r12
+; CHECK-NEXT:    movq %r21, %r13
+; CHECK-NEXT:    movq %r20, %r30
+; CHECK-NEXT:    movq %r19, %r31
+; CHECK-NEXT:    movq %r18, %rsi
+; CHECK-NEXT:    movq %r17, %rdi
+; CHECK-NEXT:    movq %r16, %r14
+; CHECK-NEXT:    movq 232(%rbp), %rax
 ; CHECK-NEXT:    vpmovsxwd (%rax), %ymm0
 ; CHECK-NEXT:    vpslld $31, %ymm0, %ymm0
 ; CHECK-NEXT:    vptestmd %ymm0, %ymm0, %k2
-; CHECK-NEXT:    movq 320(%rbp), %r29
-; CHECK-NEXT:    movzbl 312(%rbp), %r24d
-; CHECK-NEXT:    movzbl 304(%rbp), %r26d
-; CHECK-NEXT:    movq 296(%rbp), %r27
-; CHECK-NEXT:    movq 288(%rbp), %r20
-; CHECK-NEXT:    movq 280(%rbp), %r21
-; CHECK-NEXT:    movq 256(%rbp), %r9
-; CHECK-NEXT:    movq 248(%rbp), %r10
-; CHECK-NEXT:    movq 240(%rbp), %r11
-; CHECK-NEXT:    movq 232(%rbp), %r16
-; CHECK-NEXT:    movq 224(%rbp), %r17
-; CHECK-NEXT:    movq 208(%rbp), %r18
+; CHECK-NEXT:    movq 224(%rbp), %r29
+; CHECK-NEXT:    movzbl 216(%rbp), %r18d
+; CHECK-NEXT:    movzbl 208(%rbp), %r27d
 ; CHECK-NEXT:    movq 200(%rbp), %r19
-; CHECK-NEXT:    movq 192(%rbp), %r22
-; CHECK-NEXT:    movq 184(%rbp), %r23
-; CHECK-NEXT:    movq 176(%rbp), %r12
-; CHECK-NEXT:    movq 168(%rbp), %r13
-; CHECK-NEXT:    movq 160(%rbp), %r30
-; CHECK-NEXT:    movq 152(%rbp), %r31
-; CHECK-NEXT:    movq 144(%rbp), %rsi
-; CHECK-NEXT:    movq 136(%rbp), %rdi
-; CHECK-NEXT:    movq 128(%rbp), %r14
-; CHECK-NEXT:    leaq 15(,%r21,4), %rdx
+; CHECK-NEXT:    movq 192(%rbp), %r21
+; CHECK-NEXT:    movq 184(%rbp), %r28
+; CHECK-NEXT:    movq 160(%rbp), %r9
+; CHECK-NEXT:    movq 152(%rbp), %r10
+; CHECK-NEXT:    movq 144(%rbp), %r11
+; CHECK-NEXT:    movq 136(%rbp), %r16
+; CHECK-NEXT:    movq 128(%rbp), %r17
+; CHECK-NEXT:    leaq 15(,%r28,4), %rdx
 ; CHECK-NEXT:    andq $-16, %rdx
 ; CHECK-NEXT:    movq %rdx, %rax
 ; CHECK-NEXT:    callq ___chkstk_ms
@@ -57,22 +54,26 @@ define fastcc i64 @foo(i32 %dim1, i32 %dim2, i32 %dim3, i32 %dim4, ptr %p1, ptr
 ; CHECK-NEXT:    movl %ecx, %r8d
 ; CHECK-NEXT:    xorl %r15d, %r15d
 ; CHECK-NEXT:    xorl %eax, %eax
-; CHECK-NEXT:    kmovw %k2, 14(%rbx) # 2-byte Spill
+; CHECK-NEXT:    movq %r26, 56(%rbx) # 8-byte Spill
+; CHECK-NEXT:    movq %r25, 48(%rbx) # 8-byte Spill
+; CHECK-NEXT:    movq %r24, 40(%rbx) # 8-byte Spill
+; CHECK-NEXT:    movq %r23, 32(%rbx) # 8-byte Spill
+; CHECK-NEXT:    kmovw %k2, 6(%rbx) # 2-byte Spill
 ; CHECK-NEXT:    movq %r8, 24(%rbx) # 8-byte Spill
 ; CHECK-NEXT:    jmp .LBB0_1
 ; CHECK-NEXT:    .p2align 4
 ; CHECK-NEXT:  .LBB0_6: # %loop_outer.backedge
 ; CHECK-NEXT:    # in Loop: Header=BB0_1 Depth=1
-; CHECK-NEXT:    subq %r21, %r15
+; CHECK-NEXT:    subq %r28, %r15
 ; CHECK-NEXT:  .LBB0_1: # %loop_outer
 ; CHECK-NEXT:    # =>This Loop Header: Depth=1
 ; CHECK-NEXT:    # Child Loop BB0_8 Depth 2
-; CHECK-NEXT:    testq %r27, %r27
-; CHECK-NEXT:    ctestgq {dfv=} %r20, %r20
+; CHECK-NEXT:    testq %r19, %r19
+; CHECK-NEXT:    ctestgq {dfv=} %r21, %r21
 ; CHECK-NEXT:    jns .LBB0_10
 ; CHECK-NEXT:  # %bb.2: # %then_branch
 ; CHECK-NEXT:    # in Loop: Header=BB0_1 Depth=1
-; CHECK-NEXT:    testb $1, %r26b
+; CHECK-NEXT:    testb $1, %r27b
 ; CHECK-NEXT:    je .LBB0_3
 ; CHECK-NEXT:  # %bb.5: # %early_exit
 ; CHECK-NEXT:    # in Loop: Header=BB0_1 Depth=1
@@ -81,9 +82,9 @@ define fastcc i64 @foo(i32 %dim1, i32 %dim2, i32 %dim3, i32 %dim4, ptr %p1, ptr
 ; CHECK-NEXT:    .p2align 4
 ; CHECK-NEXT:  .LBB0_10: # %else_branch
 ; CHECK-NEXT:    # in Loop: Header=BB0_1 Depth=1
-; CHECK-NEXT:    decq %rax, %r25
-; CHECK-NEXT:    testb $1, %r24b
-; CHECK-NEXT:    movq %r25, 16(%rbx) # 8-byte Spill
+; CHECK-NEXT:    decq %rax, %r22
+; CHECK-NEXT:    testb $1, %r18b
+; CHECK-NEXT:    movq %r22, 8(%rbx) # 8-byte Spill
 ; CHECK-NEXT:    je .LBB0_11
 ; CHECK-NEXT:  # %bb.7: # %memset_path
 ; CHECK-NEXT:    # in Loop: Header=BB0_1 Depth=1
@@ -92,58 +93,56 @@ define fastcc i64 @foo(i32 %dim1, i32 %dim2, i32 %dim3, i32 %dim4, ptr %p1, ptr
 ; CHECK-NEXT:    xorl %edx, %edx
 ; CHECK-NEXT:    vzeroupper
 ; CHECK-NEXT:    callq memset
-; CHECK-NEXT:    movzbl 304(%rbp), %r26d
+; CHECK-NEXT:    movzbl 208(%rbp), %r27d
 ; CHECK-NEXT:    addq $32, %rsp
 ; CHECK-NEXT:    .p2align 4
 ; CHECK-NEXT:  .LBB0_8: # %inner_loop
 ; CHECK-NEXT:    # Parent Loop BB0_1 Depth=1
 ; CHECK-NEXT:    # => This Inner Loop Header: Depth=2
-; CHECK-NEXT:    testb $1, %r26b
+; CHECK-NEXT:    testb $1, %r27b
 ; CHECK-NEXT:    jne .LBB0_8
 ; CHECK-NEXT:  # %bb.9: # in Loop: Header=BB0_1 Depth=1
-; CHECK-NEXT:    kmovw 14(%rbx), %k2 # 2-byte Reload
-; CHECK-NEXT:    movq 320(%rbp), %r29
-; CHECK-NEXT:    movq 256(%rbp), %r9
-; CHECK-NEXT:    movq 248(%rbp), %r10
-; CHECK-NEXT:    movq 240(%rbp), %r11
-; CHECK-NEXT:    movq 232(%rbp), %r16
-; CHECK-NEXT:    movq 224(%rbp), %r17
-; CHECK-NEXT:    movq 208(%rbp), %r18
+; CHECK-NEXT:    movq 56(%rbx), %r26 # 8-byte Reload
+; CHECK-NEXT:    movq 48(%rbx), %r25 # 8-byte Reload
+; CHECK-NEXT:    movq 40(%rbx), %r24 # 8-byte Reload
+; CHECK-NEXT:    movq 32(%rbx), %r23 # 8-byte Reload
+; CHECK-NEXT:    kmovw 6(%rbx), %k2 # 2-byte Reload
+; CHECK-NEXT:    movq 224(%rbp), %r29
+; CHECK-NEXT:    movq 160(%rbp), %r9
+; CHECK-NEXT:    movq 152(%rbp), %r10
+; CHECK-NEXT:    movq 144(%rbp), %r11
+; CHECK-NEXT:    movq 136(%rbp), %r16
+; CHECK-NEXT:    movq 128(%rbp), %r17
+; CHECK-NEXT:    movzbl 216(%rbp), %r18d
 ; CHECK-NEXT:    movq 200(%rbp), %r19
-; CHECK-NEXT:    movq 192(%rbp), %r22
-; CHECK-NEXT:    movq 184(%rbp), %r23
-; CHECK-NEXT:    movzbl 312(%rbp), %r24d
-; CHECK-NEXT:    movq 296(%rbp), %r27
-; CHECK-NEXT:    movq 288(%rbp), %r20
-; CHECK-NEXT:    movq 280(%rbp), %r21
+; CHECK-NEXT:    movq 192(%rbp), %r21
+; CHECK-NEXT:    movq 184(%rbp), %r28
 ; CHECK-NEXT:    movq 24(%rbx), %r8 # 8-byte Reload
-; CHECK-NEXT:    movq 16(%rbx), %rax # 8-byte Reload
-; CHECK-NEXT:    subq %r21, %r15
+; CHECK-NEXT:    movq 8(%rbx), %rax # 8-byte Reload
+; CHECK-NEXT:    subq %r28, %r15
 ; CHECK-NEXT:    jmp .LBB0_1
 ; CHECK-NEXT:    .p2align 4
 ; CHECK-NEXT:  .LBB0_11: # %compute_path
 ; CHECK-NEXT:    # in Loop: Header=BB0_1 Depth=1
-; CHECK-NEXT:    testb $1, %r26b
+; CHECK-NEXT:    testb $1, %r27b
 ; CHECK-NEXT:    jne .LBB0_12
 ; CHECK-NEXT:  # %bb.14: # %loop_exit
 ; CHECK-NEXT:    # in Loop: Header=BB0_1 Depth=1
-; CHECK-NEXT:    movq 272(%rbp), %rcx
+; CHECK-NEXT:    movq 176(%rbp), %rcx
 ; CHECK-NEXT:    addq %rax, %rcx
-; CHECK-NEXT:    andl $1, %r21d, %r25d
+; CHECK-NEXT:    andl $1, %r28d, %r22d
 ; CHECK-NEXT:    andl $1, %r8d, %edx
-; CHECK-NEXT:    movq %r20, %rax
-; CHECK-NEXT:    movq %r27, %r20
-; CHECK-NEXT:    movl %r24d, %r27d
-; CHECK-NEXT:    movq 336(%rbp), %r24
-; CHECK-NEXT:    movq 216(%rbp), %r28
+; CHECK-NEXT:    movl %r18d, %r20d
+; CHECK-NEXT:    movq 16(%rbx), %r18 # 8-byte Reload
+; CHECK-NEXT:    movq %r19, %rax
+; CHECK-NEXT:    movq 240(%rbp), %r19
 ; CHECK-NEXT:    vpxor %xmm0, %xmm0, %xmm0
-; CHECK-NEXT:    vmovdqu32 %ymm0, (%r28,%r24) {%k2}
-; CHECK-NEXT:    movl %r27d, %r24d
-; CHECK-NEXT:    movq %r20, %r27
-; CHECK-NEXT:    movq %rax, %r20
+; CHECK-NEXT:    vmovdqu32 %ymm0, (%r18,%r19) {%k2}
+; CHECK-NEXT:    movq %rax, %r19
+; CHECK-NEXT:    movl %r20d, %r18d
 ; CHECK-NEXT:    vmovups %ymm0, (%rcx) {%k2}
-; CHECK-NEXT:    cmpl %edx, %r25d
-; CHECK-NEXT:    movq 16(%rbx), %rax # 8-byte Reload
+; CHECK-NEXT:    cmpl %edx, %r22d
+; CHECK-NEXT:    movq 8(%rbx), %rax # 8-byte Reload
 ; CHECK-NEXT:    je .LBB0_6
 ; CHECK-NEXT:  # %bb.15:
 ; CHECK-NEXT:    movl $1, %eax
@@ -155,17 +154,17 @@ define fastcc i64 @foo(i32 %dim1, i32 %dim2, i32 %dim3, i32 %dim4, ptr %p1, ptr
 ; CHECK-NEXT:  .LBB0_4: # %vector_loop
 ; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
 ; CHECK-NEXT:    vmovdqu (%r9), %ymm1
-; CHECK-NEXT:    vpord (%r18), %ymm1, %ymm1
+; CHECK-NEXT:    vpord (%r26), %ymm1, %ymm1
 ; CHECK-NEXT:    vmovups %ymm0, (%r23) {%k2}
 ; CHECK-NEXT:    vmovups %ymm0, (%r12) {%k2}
 ; CHECK-NEXT:    vmovups (%r13,%r15), %ymm2
 ; CHECK-NEXT:    vcmpltps (%r30,%r15), %ymm2, %k1
 ; CHECK-NEXT:    vptestnmd %ymm1, %ymm1, %k1 {%k1}
 ; CHECK-NEXT:    vmovups (%r10), %ymm1 {%k1} {z}
-; CHECK-NEXT:    vmovups %ymm1, (%r22) {%k2}
+; CHECK-NEXT:    vmovups %ymm1, (%r24) {%k2}
 ; CHECK-NEXT:    vmovdqu32 %ymm0, (%rdi) {%k2}
 ; CHECK-NEXT:    vmovdqu32 %ymm0, (%r16) {%k2}
-; CHECK-NEXT:    vmovups %ymm0, (%r19) {%k2}
+; CHECK-NEXT:    vmovups %ymm0, (%r25) {%k2}
 ; CHECK-NEXT:    vmovups (%r31), %ymm1 {%k2} {z}
 ; CHECK-NEXT:    vmovups %ymm1, (%r17,%r29,4) {%k2}
 ; CHECK-NEXT:    vmovups %ymm0, (%r11) {%k2}



More information about the llvm-commits mailing list