Skip to content

[X86] Update the fp128/i128 test to show stack alignment (NFC) #148753

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 15, 2025

Conversation

tgross35
Copy link
Contributor

Adding an extra argument before a fp128 only changes the stack offset by four bytes, while it should instead go in the next 16-aligned slot. Add a test demonstrating the current behavior.

no_x86_scrub_sp is added because offset from the stack pointer is needed to show the problem.

Relevant issue: #77401

Adding an extra argument before a `fp128` only changes the stack offset
by four bytes, while it should instead go in the next 16-aligned slot.
Add a test demonstrating the current behavior.

`no_x86_scrub_sp` is added because offset from the stack pointer is
needed to show the problem.

Relevant issue: llvm#77401
@llvmbot
Copy link
Member

llvmbot commented Jul 15, 2025

@llvm/pr-subscribers-backend-x86

Author: Trevor Gross (tgross35)

Changes

Adding an extra argument before a fp128 only changes the stack offset by four bytes, while it should instead go in the next 16-aligned slot. Add a test demonstrating the current behavior.

no_x86_scrub_sp is added because offset from the stack pointer is needed to show the problem.

Relevant issue: #77401


Patch is 30.11 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/148753.diff

1 Files Affected:

  • (modified) llvm/test/CodeGen/X86/i128-fp128-abi.ll (+282-131)
diff --git a/llvm/test/CodeGen/X86/i128-fp128-abi.ll b/llvm/test/CodeGen/X86/i128-fp128-abi.ll
index be8f7923b8f98..4152dcf07f7e7 100644
--- a/llvm/test/CodeGen/X86/i128-fp128-abi.ll
+++ b/llvm/test/CodeGen/X86/i128-fp128-abi.ll
@@ -1,4 +1,4 @@
-; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --no_x86_scrub_sp
 
 ; Combined ABI tests for fp128 and i128
 
@@ -15,6 +15,154 @@
 ; RUN: sed 's/PrimTy/fp128/g' %s | sed 's/Prim0/0xL0/g' | llc -mtriple=i686-pc-windows-msvc -verify-machineinstrs     | FileCheck %s --check-prefix=CHECK-MSVC32
 ; RUN: sed 's/PrimTy/i128/g'  %s | sed 's/Prim0/0/g'    | llc -mtriple=i686-pc-windows-msvc -verify-machineinstrs     | FileCheck %s --check-prefix=CHECK-MSVC32
 
+define void @store(PrimTy %x, ptr %p) nounwind {
+; CHECK-X64-F128-LABEL: store:
+; CHECK-X64-F128:       # %bb.0:
+; CHECK-X64-F128-NEXT:    movaps %xmm0, (%rdi)
+; CHECK-X64-F128-NEXT:    retq
+;
+; CHECK-X64-I128-LABEL: store:
+; CHECK-X64-I128:       # %bb.0:
+; CHECK-X64-I128-NEXT:    movq %rsi, 8(%rdx)
+; CHECK-X64-I128-NEXT:    movq %rdi, (%rdx)
+; CHECK-X64-I128-NEXT:    retq
+;
+; CHECK-MSVC64-F128-LABEL: store:
+; CHECK-MSVC64-F128:       # %bb.0:
+; CHECK-MSVC64-F128-NEXT:    movaps (%rcx), %xmm0
+; CHECK-MSVC64-F128-NEXT:    movaps %xmm0, (%rdx)
+; CHECK-MSVC64-F128-NEXT:    retq
+;
+; CHECK-MSVC64-I128-LABEL: store:
+; CHECK-MSVC64-I128:       # %bb.0:
+; CHECK-MSVC64-I128-NEXT:    movq %rdx, 8(%r8)
+; CHECK-MSVC64-I128-NEXT:    movq %rcx, (%r8)
+; CHECK-MSVC64-I128-NEXT:    retq
+;
+; CHECK-MINGW-F128-LABEL: store:
+; CHECK-MINGW-F128:       # %bb.0:
+; CHECK-MINGW-F128-NEXT:    movaps (%rcx), %xmm0
+; CHECK-MINGW-F128-NEXT:    movaps %xmm0, (%rdx)
+; CHECK-MINGW-F128-NEXT:    retq
+;
+; CHECK-MINGW-I128-LABEL: store:
+; CHECK-MINGW-I128:       # %bb.0:
+; CHECK-MINGW-I128-NEXT:    movq %rdx, 8(%r8)
+; CHECK-MINGW-I128-NEXT:    movq %rcx, (%r8)
+; CHECK-MINGW-I128-NEXT:    retq
+;
+; CHECK-X86-LABEL: store:
+; CHECK-X86:       # %bb.0:
+; CHECK-X86-NEXT:    pushl %edi
+; CHECK-X86-NEXT:    pushl %esi
+; CHECK-X86-NEXT:    movl 12(%esp), %eax
+; CHECK-X86-NEXT:    movl 16(%esp), %ecx
+; CHECK-X86-NEXT:    movl 20(%esp), %edx
+; CHECK-X86-NEXT:    movl 24(%esp), %esi
+; CHECK-X86-NEXT:    movl 28(%esp), %edi
+; CHECK-X86-NEXT:    movl %esi, 12(%edi)
+; CHECK-X86-NEXT:    movl %edx, 8(%edi)
+; CHECK-X86-NEXT:    movl %ecx, 4(%edi)
+; CHECK-X86-NEXT:    movl %eax, (%edi)
+; CHECK-X86-NEXT:    popl %esi
+; CHECK-X86-NEXT:    popl %edi
+; CHECK-X86-NEXT:    retl
+;
+; CHECK-MSVC32-LABEL: store:
+; CHECK-MSVC32:       # %bb.0:
+; CHECK-MSVC32-NEXT:    pushl %edi
+; CHECK-MSVC32-NEXT:    pushl %esi
+; CHECK-MSVC32-NEXT:    movl 12(%esp), %eax
+; CHECK-MSVC32-NEXT:    movl 16(%esp), %ecx
+; CHECK-MSVC32-NEXT:    movl 20(%esp), %edx
+; CHECK-MSVC32-NEXT:    movl 24(%esp), %esi
+; CHECK-MSVC32-NEXT:    movl 28(%esp), %edi
+; CHECK-MSVC32-NEXT:    movl %esi, 12(%edi)
+; CHECK-MSVC32-NEXT:    movl %edx, 8(%edi)
+; CHECK-MSVC32-NEXT:    movl %ecx, 4(%edi)
+; CHECK-MSVC32-NEXT:    movl %eax, (%edi)
+; CHECK-MSVC32-NEXT:    popl %esi
+; CHECK-MSVC32-NEXT:    popl %edi
+; CHECK-MSVC32-NEXT:    retl
+  store PrimTy %x, ptr %p
+  ret void
+}
+
+; Illustrate stack alignment
+; FIXME(#77401): alignment on x86-32 is ABI-incorrect.
+define void @store_perturbed(i8 %_0, PrimTy %x, ptr %p) nounwind {
+; CHECK-X64-F128-LABEL: store_perturbed:
+; CHECK-X64-F128:       # %bb.0:
+; CHECK-X64-F128-NEXT:    movaps %xmm0, (%rsi)
+; CHECK-X64-F128-NEXT:    retq
+;
+; CHECK-X64-I128-LABEL: store_perturbed:
+; CHECK-X64-I128:       # %bb.0:
+; CHECK-X64-I128-NEXT:    movq %rdx, 8(%rcx)
+; CHECK-X64-I128-NEXT:    movq %rsi, (%rcx)
+; CHECK-X64-I128-NEXT:    retq
+;
+; CHECK-MSVC64-F128-LABEL: store_perturbed:
+; CHECK-MSVC64-F128:       # %bb.0:
+; CHECK-MSVC64-F128-NEXT:    movaps (%rdx), %xmm0
+; CHECK-MSVC64-F128-NEXT:    movaps %xmm0, (%r8)
+; CHECK-MSVC64-F128-NEXT:    retq
+;
+; CHECK-MSVC64-I128-LABEL: store_perturbed:
+; CHECK-MSVC64-I128:       # %bb.0:
+; CHECK-MSVC64-I128-NEXT:    movq %r8, 8(%r9)
+; CHECK-MSVC64-I128-NEXT:    movq %rdx, (%r9)
+; CHECK-MSVC64-I128-NEXT:    retq
+;
+; CHECK-MINGW-F128-LABEL: store_perturbed:
+; CHECK-MINGW-F128:       # %bb.0:
+; CHECK-MINGW-F128-NEXT:    movaps (%rdx), %xmm0
+; CHECK-MINGW-F128-NEXT:    movaps %xmm0, (%r8)
+; CHECK-MINGW-F128-NEXT:    retq
+;
+; CHECK-MINGW-I128-LABEL: store_perturbed:
+; CHECK-MINGW-I128:       # %bb.0:
+; CHECK-MINGW-I128-NEXT:    movq %r8, 8(%r9)
+; CHECK-MINGW-I128-NEXT:    movq %rdx, (%r9)
+; CHECK-MINGW-I128-NEXT:    retq
+;
+; CHECK-X86-LABEL: store_perturbed:
+; CHECK-X86:       # %bb.0:
+; CHECK-X86-NEXT:    pushl %edi
+; CHECK-X86-NEXT:    pushl %esi
+; CHECK-X86-NEXT:    movl 16(%esp), %eax
+; CHECK-X86-NEXT:    movl 20(%esp), %ecx
+; CHECK-X86-NEXT:    movl 24(%esp), %edx
+; CHECK-X86-NEXT:    movl 28(%esp), %esi
+; CHECK-X86-NEXT:    movl 32(%esp), %edi
+; CHECK-X86-NEXT:    movl %esi, 12(%edi)
+; CHECK-X86-NEXT:    movl %edx, 8(%edi)
+; CHECK-X86-NEXT:    movl %ecx, 4(%edi)
+; CHECK-X86-NEXT:    movl %eax, (%edi)
+; CHECK-X86-NEXT:    popl %esi
+; CHECK-X86-NEXT:    popl %edi
+; CHECK-X86-NEXT:    retl
+;
+; CHECK-MSVC32-LABEL: store_perturbed:
+; CHECK-MSVC32:       # %bb.0:
+; CHECK-MSVC32-NEXT:    pushl %edi
+; CHECK-MSVC32-NEXT:    pushl %esi
+; CHECK-MSVC32-NEXT:    movl 16(%esp), %eax
+; CHECK-MSVC32-NEXT:    movl 20(%esp), %ecx
+; CHECK-MSVC32-NEXT:    movl 24(%esp), %edx
+; CHECK-MSVC32-NEXT:    movl 28(%esp), %esi
+; CHECK-MSVC32-NEXT:    movl 32(%esp), %edi
+; CHECK-MSVC32-NEXT:    movl %esi, 12(%edi)
+; CHECK-MSVC32-NEXT:    movl %edx, 8(%edi)
+; CHECK-MSVC32-NEXT:    movl %ecx, 4(%edi)
+; CHECK-MSVC32-NEXT:    movl %eax, (%edi)
+; CHECK-MSVC32-NEXT:    popl %esi
+; CHECK-MSVC32-NEXT:    popl %edi
+; CHECK-MSVC32-NEXT:    retl
+  store PrimTy %x, ptr %p
+  ret void
+}
+
 define PrimTy @return(ptr %p) nounwind {
 ; CHECK-X64-F128-LABEL: return:
 ; CHECK-X64-F128:       # %bb.0:
@@ -53,8 +201,8 @@ define PrimTy @return(ptr %p) nounwind {
 ; CHECK-X86:       # %bb.0:
 ; CHECK-X86-NEXT:    pushl %edi
 ; CHECK-X86-NEXT:    pushl %esi
-; CHECK-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; CHECK-X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; CHECK-X86-NEXT:    movl 12(%esp), %eax
+; CHECK-X86-NEXT:    movl 16(%esp), %ecx
 ; CHECK-X86-NEXT:    movl (%ecx), %edx
 ; CHECK-X86-NEXT:    movl 4(%ecx), %esi
 ; CHECK-X86-NEXT:    movl 8(%ecx), %edi
@@ -71,8 +219,8 @@ define PrimTy @return(ptr %p) nounwind {
 ; CHECK-MSVC32:       # %bb.0:
 ; CHECK-MSVC32-NEXT:    pushl %edi
 ; CHECK-MSVC32-NEXT:    pushl %esi
-; CHECK-MSVC32-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; CHECK-MSVC32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; CHECK-MSVC32-NEXT:    movl 12(%esp), %eax
+; CHECK-MSVC32-NEXT:    movl 16(%esp), %ecx
 ; CHECK-MSVC32-NEXT:    movl (%ecx), %edx
 ; CHECK-MSVC32-NEXT:    movl 4(%ecx), %esi
 ; CHECK-MSVC32-NEXT:    movl 8(%ecx), %edi
@@ -123,11 +271,11 @@ define PrimTy @first_arg(PrimTy %x) nounwind {
 ; CHECK-X86:       # %bb.0:
 ; CHECK-X86-NEXT:    pushl %edi
 ; CHECK-X86-NEXT:    pushl %esi
-; CHECK-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; CHECK-X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; CHECK-X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
-; CHECK-X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
-; CHECK-X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
+; CHECK-X86-NEXT:    movl 12(%esp), %eax
+; CHECK-X86-NEXT:    movl 16(%esp), %ecx
+; CHECK-X86-NEXT:    movl 20(%esp), %edx
+; CHECK-X86-NEXT:    movl 24(%esp), %esi
+; CHECK-X86-NEXT:    movl 28(%esp), %edi
 ; CHECK-X86-NEXT:    movl %edi, 12(%eax)
 ; CHECK-X86-NEXT:    movl %esi, 8(%eax)
 ; CHECK-X86-NEXT:    movl %edx, 4(%eax)
@@ -140,11 +288,11 @@ define PrimTy @first_arg(PrimTy %x) nounwind {
 ; CHECK-MSVC32:       # %bb.0:
 ; CHECK-MSVC32-NEXT:    pushl %edi
 ; CHECK-MSVC32-NEXT:    pushl %esi
-; CHECK-MSVC32-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; CHECK-MSVC32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; CHECK-MSVC32-NEXT:    movl {{[0-9]+}}(%esp), %edx
-; CHECK-MSVC32-NEXT:    movl {{[0-9]+}}(%esp), %esi
-; CHECK-MSVC32-NEXT:    movl {{[0-9]+}}(%esp), %edi
+; CHECK-MSVC32-NEXT:    movl 12(%esp), %eax
+; CHECK-MSVC32-NEXT:    movl 16(%esp), %ecx
+; CHECK-MSVC32-NEXT:    movl 20(%esp), %edx
+; CHECK-MSVC32-NEXT:    movl 24(%esp), %esi
+; CHECK-MSVC32-NEXT:    movl 28(%esp), %edi
 ; CHECK-MSVC32-NEXT:    movl %edi, 12(%eax)
 ; CHECK-MSVC32-NEXT:    movl %esi, 8(%eax)
 ; CHECK-MSVC32-NEXT:    movl %edx, 4(%eax)
@@ -155,6 +303,8 @@ define PrimTy @first_arg(PrimTy %x) nounwind {
   ret PrimTy %x
 }
 
+; Leading args such that i128 is the last possible position where it still
+; gets passed in registers.
 define PrimTy @leading_args(i64 %_0, i64 %_1, i64 %_2, i64 %_3, PrimTy %x) nounwind {
 ; CHECK-X64-F128-LABEL: leading_args:
 ; CHECK-X64-F128:       # %bb.0:
@@ -168,37 +318,37 @@ define PrimTy @leading_args(i64 %_0, i64 %_1, i64 %_2, i64 %_3, PrimTy %x) nounw
 ;
 ; CHECK-MSVC64-F128-LABEL: leading_args:
 ; CHECK-MSVC64-F128:       # %bb.0:
-; CHECK-MSVC64-F128-NEXT:    movq {{[0-9]+}}(%rsp), %rax
+; CHECK-MSVC64-F128-NEXT:    movq 40(%rsp), %rax
 ; CHECK-MSVC64-F128-NEXT:    movaps (%rax), %xmm0
 ; CHECK-MSVC64-F128-NEXT:    retq
 ;
 ; CHECK-MSVC64-I128-LABEL: leading_args:
 ; CHECK-MSVC64-I128:       # %bb.0:
-; CHECK-MSVC64-I128-NEXT:    movq {{[0-9]+}}(%rsp), %rax
-; CHECK-MSVC64-I128-NEXT:    movq {{[0-9]+}}(%rsp), %rdx
+; CHECK-MSVC64-I128-NEXT:    movq 40(%rsp), %rax
+; CHECK-MSVC64-I128-NEXT:    movq 48(%rsp), %rdx
 ; CHECK-MSVC64-I128-NEXT:    retq
 ;
 ; CHECK-MINGW-F128-LABEL: leading_args:
 ; CHECK-MINGW-F128:       # %bb.0:
-; CHECK-MINGW-F128-NEXT:    movq {{[0-9]+}}(%rsp), %rax
+; CHECK-MINGW-F128-NEXT:    movq 40(%rsp), %rax
 ; CHECK-MINGW-F128-NEXT:    movaps (%rax), %xmm0
 ; CHECK-MINGW-F128-NEXT:    retq
 ;
 ; CHECK-MINGW-I128-LABEL: leading_args:
 ; CHECK-MINGW-I128:       # %bb.0:
-; CHECK-MINGW-I128-NEXT:    movq {{[0-9]+}}(%rsp), %rax
-; CHECK-MINGW-I128-NEXT:    movq {{[0-9]+}}(%rsp), %rdx
+; CHECK-MINGW-I128-NEXT:    movq 40(%rsp), %rax
+; CHECK-MINGW-I128-NEXT:    movq 48(%rsp), %rdx
 ; CHECK-MINGW-I128-NEXT:    retq
 ;
 ; CHECK-X86-LABEL: leading_args:
 ; CHECK-X86:       # %bb.0:
 ; CHECK-X86-NEXT:    pushl %edi
 ; CHECK-X86-NEXT:    pushl %esi
-; CHECK-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; CHECK-X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; CHECK-X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
-; CHECK-X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
-; CHECK-X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
+; CHECK-X86-NEXT:    movl 12(%esp), %eax
+; CHECK-X86-NEXT:    movl 48(%esp), %ecx
+; CHECK-X86-NEXT:    movl 52(%esp), %edx
+; CHECK-X86-NEXT:    movl 56(%esp), %esi
+; CHECK-X86-NEXT:    movl 60(%esp), %edi
 ; CHECK-X86-NEXT:    movl %edi, 12(%eax)
 ; CHECK-X86-NEXT:    movl %esi, 8(%eax)
 ; CHECK-X86-NEXT:    movl %edx, 4(%eax)
@@ -211,11 +361,11 @@ define PrimTy @leading_args(i64 %_0, i64 %_1, i64 %_2, i64 %_3, PrimTy %x) nounw
 ; CHECK-MSVC32:       # %bb.0:
 ; CHECK-MSVC32-NEXT:    pushl %edi
 ; CHECK-MSVC32-NEXT:    pushl %esi
-; CHECK-MSVC32-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; CHECK-MSVC32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; CHECK-MSVC32-NEXT:    movl {{[0-9]+}}(%esp), %edx
-; CHECK-MSVC32-NEXT:    movl {{[0-9]+}}(%esp), %esi
-; CHECK-MSVC32-NEXT:    movl {{[0-9]+}}(%esp), %edi
+; CHECK-MSVC32-NEXT:    movl 12(%esp), %eax
+; CHECK-MSVC32-NEXT:    movl 48(%esp), %ecx
+; CHECK-MSVC32-NEXT:    movl 52(%esp), %edx
+; CHECK-MSVC32-NEXT:    movl 56(%esp), %esi
+; CHECK-MSVC32-NEXT:    movl 60(%esp), %edi
 ; CHECK-MSVC32-NEXT:    movl %edi, 12(%eax)
 ; CHECK-MSVC32-NEXT:    movl %esi, 8(%eax)
 ; CHECK-MSVC32-NEXT:    movl %edx, 4(%eax)
@@ -226,6 +376,7 @@ define PrimTy @leading_args(i64 %_0, i64 %_1, i64 %_2, i64 %_3, PrimTy %x) nounw
   ret PrimTy %x
 }
 
+; The i128 of interest must be in memory.
 define PrimTy @many_leading_args(i64 %_0, i64 %_1, i64 %_2, i64 %_3, i64 %_4, PrimTy %_5, PrimTy %x) nounwind {
 ; CHECK-X64-F128-LABEL: many_leading_args:
 ; CHECK-X64-F128:       # %bb.0:
@@ -234,43 +385,43 @@ define PrimTy @many_leading_args(i64 %_0, i64 %_1, i64 %_2, i64 %_3, i64 %_4, Pr
 ;
 ; CHECK-X64-I128-LABEL: many_leading_args:
 ; CHECK-X64-I128:       # %bb.0:
-; CHECK-X64-I128-NEXT:    movq {{[0-9]+}}(%rsp), %rax
-; CHECK-X64-I128-NEXT:    movq {{[0-9]+}}(%rsp), %rdx
+; CHECK-X64-I128-NEXT:    movq 24(%rsp), %rax
+; CHECK-X64-I128-NEXT:    movq 32(%rsp), %rdx
 ; CHECK-X64-I128-NEXT:    retq
 ;
 ; CHECK-MSVC64-F128-LABEL: many_leading_args:
 ; CHECK-MSVC64-F128:       # %bb.0:
-; CHECK-MSVC64-F128-NEXT:    movq {{[0-9]+}}(%rsp), %rax
+; CHECK-MSVC64-F128-NEXT:    movq 56(%rsp), %rax
 ; CHECK-MSVC64-F128-NEXT:    movaps (%rax), %xmm0
 ; CHECK-MSVC64-F128-NEXT:    retq
 ;
 ; CHECK-MSVC64-I128-LABEL: many_leading_args:
 ; CHECK-MSVC64-I128:       # %bb.0:
-; CHECK-MSVC64-I128-NEXT:    movq {{[0-9]+}}(%rsp), %rax
-; CHECK-MSVC64-I128-NEXT:    movq {{[0-9]+}}(%rsp), %rdx
+; CHECK-MSVC64-I128-NEXT:    movq 64(%rsp), %rax
+; CHECK-MSVC64-I128-NEXT:    movq 72(%rsp), %rdx
 ; CHECK-MSVC64-I128-NEXT:    retq
 ;
 ; CHECK-MINGW-F128-LABEL: many_leading_args:
 ; CHECK-MINGW-F128:       # %bb.0:
-; CHECK-MINGW-F128-NEXT:    movq {{[0-9]+}}(%rsp), %rax
+; CHECK-MINGW-F128-NEXT:    movq 56(%rsp), %rax
 ; CHECK-MINGW-F128-NEXT:    movaps (%rax), %xmm0
 ; CHECK-MINGW-F128-NEXT:    retq
 ;
 ; CHECK-MINGW-I128-LABEL: many_leading_args:
 ; CHECK-MINGW-I128:       # %bb.0:
-; CHECK-MINGW-I128-NEXT:    movq {{[0-9]+}}(%rsp), %rax
-; CHECK-MINGW-I128-NEXT:    movq {{[0-9]+}}(%rsp), %rdx
+; CHECK-MINGW-I128-NEXT:    movq 64(%rsp), %rax
+; CHECK-MINGW-I128-NEXT:    movq 72(%rsp), %rdx
 ; CHECK-MINGW-I128-NEXT:    retq
 ;
 ; CHECK-X86-LABEL: many_leading_args:
 ; CHECK-X86:       # %bb.0:
 ; CHECK-X86-NEXT:    pushl %edi
 ; CHECK-X86-NEXT:    pushl %esi
-; CHECK-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; CHECK-X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; CHECK-X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
-; CHECK-X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
-; CHECK-X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
+; CHECK-X86-NEXT:    movl 12(%esp), %eax
+; CHECK-X86-NEXT:    movl 72(%esp), %ecx
+; CHECK-X86-NEXT:    movl 76(%esp), %edx
+; CHECK-X86-NEXT:    movl 80(%esp), %esi
+; CHECK-X86-NEXT:    movl 84(%esp), %edi
 ; CHECK-X86-NEXT:    movl %edi, 12(%eax)
 ; CHECK-X86-NEXT:    movl %esi, 8(%eax)
 ; CHECK-X86-NEXT:    movl %edx, 4(%eax)
@@ -283,11 +434,11 @@ define PrimTy @many_leading_args(i64 %_0, i64 %_1, i64 %_2, i64 %_3, i64 %_4, Pr
 ; CHECK-MSVC32:       # %bb.0:
 ; CHECK-MSVC32-NEXT:    pushl %edi
 ; CHECK-MSVC32-NEXT:    pushl %esi
-; CHECK-MSVC32-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; CHECK-MSVC32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; CHECK-MSVC32-NEXT:    movl {{[0-9]+}}(%esp), %edx
-; CHECK-MSVC32-NEXT:    movl {{[0-9]+}}(%esp), %esi
-; CHECK-MSVC32-NEXT:    movl {{[0-9]+}}(%esp), %edi
+; CHECK-MSVC32-NEXT:    movl 12(%esp), %eax
+; CHECK-MSVC32-NEXT:    movl 72(%esp), %ecx
+; CHECK-MSVC32-NEXT:    movl 76(%esp), %edx
+; CHECK-MSVC32-NEXT:    movl 80(%esp), %esi
+; CHECK-MSVC32-NEXT:    movl 84(%esp), %edi
 ; CHECK-MSVC32-NEXT:    movl %edi, 12(%eax)
 ; CHECK-MSVC32-NEXT:    movl %esi, 8(%eax)
 ; CHECK-MSVC32-NEXT:    movl %edx, 4(%eax)
@@ -305,43 +456,43 @@ define PrimTy @trailing_arg(i64 %_0, i64 %_1, i64 %_2, i64 %_3, i64 %_4, PrimTy
 ;
 ; CHECK-X64-I128-LABEL: trailing_arg:
 ; CHECK-X64-I128:       # %bb.0:
-; CHECK-X64-I128-NEXT:    movq {{[0-9]+}}(%rsp), %rax
-; CHECK-X64-I128-NEXT:    movq {{[0-9]+}}(%rsp), %rdx
+; CHECK-X64-I128-NEXT:    movq 8(%rsp), %rax
+; CHECK-X64-I128-NEXT:    movq 16(%rsp), %rdx
 ; CHECK-X64-I128-NEXT:    retq
 ;
 ; CHECK-MSVC64-F128-LABEL: trailing_arg:
 ; CHECK-MSVC64-F128:       # %bb.0:
-; CHECK-MSVC64-F128-NEXT:    movq {{[0-9]+}}(%rsp), %rax
+; CHECK-MSVC64-F128-NEXT:    movq 48(%rsp), %rax
 ; CHECK-MSVC64-F128-NEXT:    movaps (%rax), %xmm0
 ; CHECK-MSVC64-F128-NEXT:    retq
 ;
 ; CHECK-MSVC64-I128-LABEL: trailing_arg:
 ; CHECK-MSVC64-I128:       # %bb.0:
-; CHECK-MSVC64-I128-NEXT:    movq {{[0-9]+}}(%rsp), %rax
-; CHECK-MSVC64-I128-NEXT:    movq {{[0-9]+}}(%rsp), %rdx
+; CHECK-MSVC64-I128-NEXT:    movq 48(%rsp), %rax
+; CHECK-MSVC64-I128-NEXT:    movq 56(%rsp), %rdx
 ; CHECK-MSVC64-I128-NEXT:    retq
 ;
 ; CHECK-MINGW-F128-LABEL: trailing_arg:
 ; CHECK-MINGW-F128:       # %bb.0:
-; CHECK-MINGW-F128-NEXT:    movq {{[0-9]+}}(%rsp), %rax
+; CHECK-MINGW-F128-NEXT:    movq 48(%rsp), %rax
 ; CHECK-MINGW-F128-NEXT:    movaps (%rax), %xmm0
 ; CHECK-MINGW-F128-NEXT:    retq
 ;
 ; CHECK-MINGW-I128-LABEL: trailing_arg:
 ; CHECK-MINGW-I128:       # %bb.0:
-; CHECK-MINGW-I128-NEXT:    movq {{[0-9]+}}(%rsp), %rax
-; CHECK-MINGW-I128-NEXT:    movq {{[0-9]+}}(%rsp), %rdx
+; CHECK-MINGW-I128-NEXT:    movq 48(%rsp), %rax
+; CHECK-MINGW-I128-NEXT:    movq 56(%rsp), %rdx
 ; CHECK-MINGW-I128-NEXT:    retq
 ;
 ; CHECK-X86-LABEL: trailing_arg:
 ; CHECK-X86:       # %bb.0:
 ; CHECK-X86-NEXT:    pushl %edi
 ; CHECK-X86-NEXT:    pushl %esi
-; CHECK-X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; CHECK-X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; CHECK-X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
-; CHECK-X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
-; CHECK-X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
+; CHECK-X86-NEXT:    movl 12(%esp), %eax
+; CHECK-X86-NEXT:    movl 56(%esp), %ecx
+; CHECK-X86-NEXT:    movl 60(%esp), %edx
+; CHECK-X86-NEXT:    movl 64(%esp), %esi
+; CHECK-X86-NEXT:    movl 68(%esp), %edi
 ; CHECK-X86-NEXT:    movl %edi, 12(%eax)
 ; CHECK-X86-NEXT:    movl %esi, 8(%eax)
 ; CHECK-X86-NEXT:    movl %edx, 4(%eax)
@@ -354,11 +505,11 @@ define PrimTy @trailing_arg(i64 %_0, i64 %_1, i64 %_2, i64 %_3, i64 %_4, PrimTy
 ; CHECK-MSVC32:       # %bb.0:
 ; CHECK-MSVC32-NEXT:    pushl %edi
 ; CHECK-MSVC32-NEXT:    pushl %esi
-; CHECK-MSVC32-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; CHECK-MSVC32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; CHECK-MSVC32-NEXT:    movl {{[0-9]+}}(%esp), %edx
-; CHECK-MSVC32-NEXT:    movl {{[0-9]+}}(%esp), %esi
-; CHECK-MSVC32-NEXT:    movl {{[0-9]+}}(%esp), %edi
+; CHECK-MSVC32-NEXT:    movl 12(%esp), %eax
+; CHECK-MSVC32-NEXT:    movl 56(%esp), %ecx
+; CHECK-MSVC32-NEXT:    movl 60(%esp), %edx
+; CHECK-MSVC32-NEXT:    movl 64(%esp), %esi
+; CHECK-MSVC32-NEXT:    movl 68(%esp), %edi
 ; CHECK-MSVC32-NEXT:    movl %edi, 12(%eax)
 ; CHECK-MSVC32-NEXT:    movl %esi, 8(%eax)
 ; CHECK-MSVC32-NEXT:    movl %edx, 4(%eax)
@@ -388,8 +539,8 @@ define void @call_first_arg(PrimTy %x) nounwind {
 ; CHECK-MSVC64-F128:       # %bb.0:
 ; CHECK-MSVC64-F128-NEXT:    subq $56, %rsp
 ; CHECK-MSVC64-F128-NEXT:    movaps (%rcx), %xmm0
-; CHECK-MSVC64-F128-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp)
-; CHECK-MSVC64-F128-NEXT:    leaq {{[0-9]+}}(%rsp), %rcx
+; CHECK-MSVC64-F128-NEXT:    movaps %xmm0, 32(%rsp)
+; CHECK-MSVC64-F128-NEXT:    leaq 32(%rsp), %rcx
 ; CHECK-MSVC64-F128-NEXT:    callq first_arg
 ; CHECK-MSVC64-F128-NEXT:    addq $56, %rsp
 ; CHECK-MSVC64-F128-NEXT:    retq
@@ -405,8 +556,8 @@ define void @call_first_arg(PrimTy %x) nounwind {
 ; CHECK-MINGW-F128:       # %bb.0:
 ; CHECK-MINGW-F128-NEXT:    subq $56, %rsp
 ; CHECK-MINGW-F128-NEXT:    movaps (%rcx), %xmm0
-; CHECK-MINGW-F128-NEXT:    movaps %xmm0, {{[0-9]+}}(%rsp)
-; CHECK-MINGW-F128-NEXT:    leaq {{[0-9]+}}(%rsp), %rcx
+; CHECK-MINGW-F128-NEXT:    movaps %xmm0, 32(%rsp)
+; CHECK-MINGW-F128-NEXT:    leaq 32(%rsp), %rcx
 ; CHECK-MINGW-F128-NEXT:    callq first_arg
 ; CHECK-MINGW-F128-NEXT:    addq $56, %rsp
 ; CHECK-MINGW-F128-NEXT:    retq
@@ -421,11 +572,11 @@ define void @call_first_arg(PrimTy %x) nounwind {
 ; CHECK-X86-LABEL: call_first_arg:
 ; CHECK-X86:       # %bb.0:
 ; CHECK-X86-NEXT:    subl $40, %esp
-; CHECK-X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
-; CHECK-X86-NEXT:    pushl {{[0-9]+}}(%esp)
-; CHECK-X86-NEXT:    pushl {{[0-9]+}}(%esp)
-; CHECK-X86-NEXT:    pushl {{[0-9]+}}(%esp)
-; CHECK-X86-NEXT:    pushl {{[0-9]+}}(%esp)
+; CHECK-X86-NEXT:    leal 12(%esp), %eax
+; CHECK-X86-NEXT:    pushl 56(%esp)
+; CHECK-X86-NEXT:    pushl 56(%esp)
+; CHECK-X86-NEXT:    pushl 56(%esp)
+; CHECK-X86-NEXT:    pushl 56(%esp)
 ; CHECK-X86-NEXT:    pushl %eax
 ; CHECK-X86-NEXT:    calll first_arg@PLT
 ; CHECK-X86-NEXT:    addl $56, %esp
@@ -481,9 +632,9 @@ define void @call_leading_args(PrimTy %x) nounwind {
 ; CHECK-MSVC64-F128:       # %bb.0:
 ; CHECK-MSVC64-F128-NEXT:    subq $72, %rsp
 ; CHECK-MSVC64-F128-NEXT:  ...
[truncated]

@tgross35
Copy link
Contributor Author

This is the test for #138092. @nikic or @phoebewang could you review?

Copy link
Contributor

@phoebewang phoebewang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

@tgross35
Copy link
Contributor Author

@phoebewang could you please merge this for me?

@phoebewang phoebewang merged commit 10b5558 into llvm:main Jul 15, 2025
11 checks passed
@tgross35
Copy link
Contributor Author

Thank you!

@tgross35 tgross35 deleted the x86-32-f128-abi-test branch July 15, 2025 03:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants