[llvm] [test] Add missing tests for ldexpf128 and frexpf128 (PR #148794)
Trevor Gross via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 15 00:16:59 PDT 2025
https://github.com/tgross35 created https://github.com/llvm/llvm-project/pull/148794
For platforms that test `ldexp` tests and `frexp` but do not yet test the `f128` add versions, add test functions.
>From 6e81802e9ba5557fe260faf722b639ff26828934 Mon Sep 17 00:00:00 2001
From: Trevor Gross <tmgross at umich.edu>
Date: Tue, 15 Jul 2025 02:40:55 -0400
Subject: [PATCH] [test] Add missing tests for ldexpf128 and frexpf128
For platforms that test `ldexp` tests and `frexp` but do not yet test
the `f128` add versions, add test functions.
---
llvm/test/CodeGen/AArch64/ldexp.ll | 13 +++
llvm/test/CodeGen/AArch64/llvm.frexp.ll | 67 ++++++++++++
llvm/test/CodeGen/ARM/ldexp.ll | 8 ++
llvm/test/CodeGen/X86/ldexp.ll | 57 ++++++++++
llvm/test/CodeGen/X86/llvm.frexp.ll | 133 ++++++++++++++++++++++++
5 files changed, 278 insertions(+)
diff --git a/llvm/test/CodeGen/AArch64/ldexp.ll b/llvm/test/CodeGen/AArch64/ldexp.ll
index 6019fa1490e3d..75822f512ffdb 100644
--- a/llvm/test/CodeGen/AArch64/ldexp.ll
+++ b/llvm/test/CodeGen/AArch64/ldexp.ll
@@ -147,4 +147,17 @@ entry:
ret half %0
}
+define fp128 @testExpf128(fp128 %val, i32 %a) {
+; SVE-LABEL: testExpf128:
+; SVE: // %bb.0: // %entry
+; SVE-NEXT: b ldexpl
+;
+; WINDOWS-LABEL: testExpf128:
+; WINDOWS: // %bb.0: // %entry
+; WINDOWS-NEXT: b ldexpl
+entry:
+ %ldexp = call fp128 @llvm.ldexp.f128.i32(fp128 %val, i32 %a)
+ ret fp128 %ldexp
+}
+
declare half @llvm.ldexp.f16.i32(half, i32) memory(none)
diff --git a/llvm/test/CodeGen/AArch64/llvm.frexp.ll b/llvm/test/CodeGen/AArch64/llvm.frexp.ll
index 2213aa1429dbd..dca895cfcb976 100644
--- a/llvm/test/CodeGen/AArch64/llvm.frexp.ll
+++ b/llvm/test/CodeGen/AArch64/llvm.frexp.ll
@@ -1131,6 +1131,73 @@ define <2 x i32> @test_frexp_v2f64_v2i32_only_use_exp(<2 x double> %a) nounwind
ret <2 x i32> %result.1
}
+
+define { fp128, i32 } @test_frexp_f128_i32(fp128 %a) nounwind {
+; CHECK-LABEL: test_frexp_f128_i32:
+; CHECK: // %bb.0:
+; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NEXT: add x0, sp, #12
+; CHECK-NEXT: bl frexpl
+; CHECK-NEXT: ldr w0, [sp, #12]
+; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NEXT: ret
+;
+; WINDOWS-LABEL: test_frexp_f128_i32:
+; WINDOWS: // %bb.0:
+; WINDOWS-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINDOWS-NEXT: add x0, sp, #12
+; WINDOWS-NEXT: bl frexpl
+; WINDOWS-NEXT: ldr w0, [sp, #12]
+; WINDOWS-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINDOWS-NEXT: ret
+ %result = call { fp128, i32 } @llvm.frexp.f128.i32(fp128 %a)
+ ret { fp128, i32 } %result
+}
+
+define fp128 @test_frexp_f128_i32_only_use_fract(fp128 %a) nounwind {
+; CHECK-LABEL: test_frexp_f128_i32_only_use_fract:
+; CHECK: // %bb.0:
+; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NEXT: add x0, sp, #12
+; CHECK-NEXT: bl frexpl
+; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NEXT: ret
+;
+; WINDOWS-LABEL: test_frexp_f128_i32_only_use_fract:
+; WINDOWS: // %bb.0:
+; WINDOWS-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINDOWS-NEXT: add x0, sp, #12
+; WINDOWS-NEXT: bl frexpl
+; WINDOWS-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINDOWS-NEXT: ret
+ %result = call { fp128, i32 } @llvm.frexp.f128.i32(fp128 %a)
+ %result.0 = extractvalue { fp128, i32 } %result, 0
+ ret fp128 %result.0
+}
+
+define i32 @test_frexp_f128_i32_only_use_exp(fp128 %a) nounwind {
+; CHECK-LABEL: test_frexp_f128_i32_only_use_exp:
+; CHECK: // %bb.0:
+; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; CHECK-NEXT: add x0, sp, #12
+; CHECK-NEXT: bl frexpl
+; CHECK-NEXT: ldr w0, [sp, #12]
+; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; CHECK-NEXT: ret
+;
+; WINDOWS-LABEL: test_frexp_f128_i32_only_use_exp:
+; WINDOWS: // %bb.0:
+; WINDOWS-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
+; WINDOWS-NEXT: add x0, sp, #12
+; WINDOWS-NEXT: bl frexpl
+; WINDOWS-NEXT: ldr w0, [sp, #12]
+; WINDOWS-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
+; WINDOWS-NEXT: ret
+ %result = call { fp128, i32 } @llvm.frexp.f128.i32(fp128 %a)
+ %result.0 = extractvalue { fp128, i32 } %result, 1
+ ret i32 %result.0
+}
+
declare { float, i32 } @llvm.frexp.f32.i32(float) #0
declare { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float>) #0
declare { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float>) #0
diff --git a/llvm/test/CodeGen/ARM/ldexp.ll b/llvm/test/CodeGen/ARM/ldexp.ll
index cdf91eb902e05..1c2c35eaf4f37 100644
--- a/llvm/test/CodeGen/ARM/ldexp.ll
+++ b/llvm/test/CodeGen/ARM/ldexp.ll
@@ -55,4 +55,12 @@ entry:
ret half %0
}
+define fp128 @testExpf128(fp128 %val, i32 %a) {
+; LINUX: bl ldexpl
+; WINDOWS: bl ldexpl
+entry:
+ %0 = tail call fp128 @llvm.ldexp.f128.i32(fp128 %val, i32 %a)
+ ret fp128 %0
+}
+
declare half @llvm.ldexp.f16.i32(half, i32) memory(none)
diff --git a/llvm/test/CodeGen/X86/ldexp.ll b/llvm/test/CodeGen/X86/ldexp.ll
index 59ec7bfcaa910..c2126250deeca 100644
--- a/llvm/test/CodeGen/X86/ldexp.ll
+++ b/llvm/test/CodeGen/X86/ldexp.ll
@@ -557,6 +557,63 @@ define half @ldexp_f16(half %arg0, i32 %arg1) nounwind {
ret half %ldexp
}
+define fp128 @ldexp_f128(fp128 %arg0, i32 %arg1) nounwind {
+; X64-LABEL: ldexp_f128:
+; X64: # %bb.0:
+; X64-NEXT: jmp ldexpl at PLT # TAILCALL
+;
+; WIN64-LABEL: ldexp_f128:
+; WIN64: # %bb.0:
+; WIN64-NEXT: subq $56, %rsp
+; WIN64-NEXT: .seh_stackalloc 56
+; WIN64-NEXT: .seh_endprologue
+; WIN64-NEXT: movaps (%rcx), %xmm0
+; WIN64-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
+; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
+; WIN64-NEXT: callq ldexpl
+; WIN64-NEXT: nop
+; WIN64-NEXT: .seh_startepilogue
+; WIN64-NEXT: addq $56, %rsp
+; WIN64-NEXT: .seh_endepilogue
+; WIN64-NEXT: retq
+; WIN64-NEXT: .seh_endproc
+;
+; WIN32-LABEL: ldexp_f128:
+; WIN32: # %bb.0:
+; WIN32-NEXT: pushl %ebp
+; WIN32-NEXT: movl %esp, %ebp
+; WIN32-NEXT: pushl %edi
+; WIN32-NEXT: pushl %esi
+; WIN32-NEXT: andl $-16, %esp
+; WIN32-NEXT: subl $16, %esp
+; WIN32-NEXT: movl 8(%ebp), %esi
+; WIN32-NEXT: movl %esp, %eax
+; WIN32-NEXT: pushl 28(%ebp)
+; WIN32-NEXT: pushl 24(%ebp)
+; WIN32-NEXT: pushl 20(%ebp)
+; WIN32-NEXT: pushl 16(%ebp)
+; WIN32-NEXT: pushl 12(%ebp)
+; WIN32-NEXT: pushl %eax
+; WIN32-NEXT: calll _ldexpl
+; WIN32-NEXT: addl $24, %esp
+; WIN32-NEXT: movl (%esp), %eax
+; WIN32-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; WIN32-NEXT: movl {{[0-9]+}}(%esp), %edx
+; WIN32-NEXT: movl {{[0-9]+}}(%esp), %edi
+; WIN32-NEXT: movl %edi, 12(%esi)
+; WIN32-NEXT: movl %edx, 8(%esi)
+; WIN32-NEXT: movl %ecx, 4(%esi)
+; WIN32-NEXT: movl %eax, (%esi)
+; WIN32-NEXT: movl %esi, %eax
+; WIN32-NEXT: leal -8(%ebp), %esp
+; WIN32-NEXT: popl %esi
+; WIN32-NEXT: popl %edi
+; WIN32-NEXT: popl %ebp
+; WIN32-NEXT: retl
+ %ldexp = call fp128 @llvm.ldexp.f128.i32(fp128 %arg0, i32 %arg1)
+ ret fp128 %ldexp
+}
+
declare double @llvm.ldexp.f64.i32(double, i32) #0
declare float @llvm.ldexp.f32.i32(float, i32) #0
declare <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float>, <2 x i32>) #0
diff --git a/llvm/test/CodeGen/X86/llvm.frexp.ll b/llvm/test/CodeGen/X86/llvm.frexp.ll
index 83840dd85c533..8e94038df4bee 100644
--- a/llvm/test/CodeGen/X86/llvm.frexp.ll
+++ b/llvm/test/CodeGen/X86/llvm.frexp.ll
@@ -600,6 +600,139 @@ define i32 @test_frexp_f64_i32_only_use_exp(double %a) nounwind {
; ret <2 x i32> %result.1
; }
+define { fp128, i32 } @test_frexp_f128_i32(fp128 %a) nounwind {
+; X64-LABEL: test_frexp_f128_i32:
+; X64: # %bb.0:
+; X64-NEXT: pushq %rax
+; X64-NEXT: leaq {{[0-9]+}}(%rsp), %rdi
+; X64-NEXT: callq frexpl at PLT
+; X64-NEXT: movl {{[0-9]+}}(%rsp), %eax
+; X64-NEXT: popq %rcx
+; X64-NEXT: retq
+;
+; WIN32-LABEL: test_frexp_f128_i32:
+; WIN32: # %bb.0:
+; WIN32-NEXT: pushl %ebp
+; WIN32-NEXT: movl %esp, %ebp
+; WIN32-NEXT: pushl %ebx
+; WIN32-NEXT: pushl %edi
+; WIN32-NEXT: pushl %esi
+; WIN32-NEXT: andl $-16, %esp
+; WIN32-NEXT: subl $48, %esp
+; WIN32-NEXT: movl 8(%ebp), %esi
+; WIN32-NEXT: leal {{[0-9]+}}(%esp), %eax
+; WIN32-NEXT: leal {{[0-9]+}}(%esp), %ecx
+; WIN32-NEXT: pushl %eax
+; WIN32-NEXT: pushl 24(%ebp)
+; WIN32-NEXT: pushl 20(%ebp)
+; WIN32-NEXT: pushl 16(%ebp)
+; WIN32-NEXT: pushl 12(%ebp)
+; WIN32-NEXT: pushl %ecx
+; WIN32-NEXT: calll _frexpl
+; WIN32-NEXT: addl $24, %esp
+; WIN32-NEXT: movl {{[0-9]+}}(%esp), %eax
+; WIN32-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; WIN32-NEXT: movl {{[0-9]+}}(%esp), %edx
+; WIN32-NEXT: movl {{[0-9]+}}(%esp), %edi
+; WIN32-NEXT: movl {{[0-9]+}}(%esp), %ebx
+; WIN32-NEXT: movl %ebx, 12(%esi)
+; WIN32-NEXT: movl %edi, 8(%esi)
+; WIN32-NEXT: movl %edx, 4(%esi)
+; WIN32-NEXT: movl %ecx, (%esi)
+; WIN32-NEXT: movl %eax, 16(%esi)
+; WIN32-NEXT: movl %esi, %eax
+; WIN32-NEXT: leal -12(%ebp), %esp
+; WIN32-NEXT: popl %esi
+; WIN32-NEXT: popl %edi
+; WIN32-NEXT: popl %ebx
+; WIN32-NEXT: popl %ebp
+; WIN32-NEXT: retl
+ %result = call { fp128, i32 } @llvm.frexp.f128.i32(fp128 %a)
+ ret { fp128, i32 } %result
+}
+
+define fp128 @test_frexp_f128_i32_only_use_fract(fp128 %a) nounwind {
+; X64-LABEL: test_frexp_f128_i32_only_use_fract:
+; X64: # %bb.0:
+; X64-NEXT: pushq %rax
+; X64-NEXT: leaq {{[0-9]+}}(%rsp), %rdi
+; X64-NEXT: callq frexpl at PLT
+; X64-NEXT: popq %rax
+; X64-NEXT: retq
+;
+; WIN32-LABEL: test_frexp_f128_i32_only_use_fract:
+; WIN32: # %bb.0:
+; WIN32-NEXT: pushl %ebp
+; WIN32-NEXT: movl %esp, %ebp
+; WIN32-NEXT: pushl %edi
+; WIN32-NEXT: pushl %esi
+; WIN32-NEXT: andl $-16, %esp
+; WIN32-NEXT: subl $32, %esp
+; WIN32-NEXT: movl 8(%ebp), %esi
+; WIN32-NEXT: leal {{[0-9]+}}(%esp), %eax
+; WIN32-NEXT: movl %esp, %ecx
+; WIN32-NEXT: pushl %eax
+; WIN32-NEXT: pushl 24(%ebp)
+; WIN32-NEXT: pushl 20(%ebp)
+; WIN32-NEXT: pushl 16(%ebp)
+; WIN32-NEXT: pushl 12(%ebp)
+; WIN32-NEXT: pushl %ecx
+; WIN32-NEXT: calll _frexpl
+; WIN32-NEXT: addl $24, %esp
+; WIN32-NEXT: movl (%esp), %eax
+; WIN32-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; WIN32-NEXT: movl {{[0-9]+}}(%esp), %edx
+; WIN32-NEXT: movl {{[0-9]+}}(%esp), %edi
+; WIN32-NEXT: movl %edi, 12(%esi)
+; WIN32-NEXT: movl %edx, 8(%esi)
+; WIN32-NEXT: movl %ecx, 4(%esi)
+; WIN32-NEXT: movl %eax, (%esi)
+; WIN32-NEXT: movl %esi, %eax
+; WIN32-NEXT: leal -8(%ebp), %esp
+; WIN32-NEXT: popl %esi
+; WIN32-NEXT: popl %edi
+; WIN32-NEXT: popl %ebp
+; WIN32-NEXT: retl
+ %result = call { fp128, i32 } @llvm.frexp.f128.i32(fp128 %a)
+ %result.0 = extractvalue { fp128, i32 } %result, 0
+ ret fp128 %result.0
+}
+
+define i32 @test_frexp_f128_i32_only_use_exp(fp128 %a) nounwind {
+; X64-LABEL: test_frexp_f128_i32_only_use_exp:
+; X64: # %bb.0:
+; X64-NEXT: pushq %rax
+; X64-NEXT: leaq {{[0-9]+}}(%rsp), %rdi
+; X64-NEXT: callq frexpl at PLT
+; X64-NEXT: movl {{[0-9]+}}(%rsp), %eax
+; X64-NEXT: popq %rcx
+; X64-NEXT: retq
+;
+; WIN32-LABEL: test_frexp_f128_i32_only_use_exp:
+; WIN32: # %bb.0:
+; WIN32-NEXT: pushl %ebp
+; WIN32-NEXT: movl %esp, %ebp
+; WIN32-NEXT: andl $-16, %esp
+; WIN32-NEXT: subl $48, %esp
+; WIN32-NEXT: leal {{[0-9]+}}(%esp), %eax
+; WIN32-NEXT: leal {{[0-9]+}}(%esp), %ecx
+; WIN32-NEXT: pushl %eax
+; WIN32-NEXT: pushl 20(%ebp)
+; WIN32-NEXT: pushl 16(%ebp)
+; WIN32-NEXT: pushl 12(%ebp)
+; WIN32-NEXT: pushl 8(%ebp)
+; WIN32-NEXT: pushl %ecx
+; WIN32-NEXT: calll _frexpl
+; WIN32-NEXT: addl $24, %esp
+; WIN32-NEXT: movl {{[0-9]+}}(%esp), %eax
+; WIN32-NEXT: movl %ebp, %esp
+; WIN32-NEXT: popl %ebp
+; WIN32-NEXT: retl
+ %result = call { fp128, i32 } @llvm.frexp.f128.i32(fp128 %a)
+ %result.0 = extractvalue { fp128, i32 } %result, 1
+ ret i32 %result.0
+}
+
declare { float, i32 } @llvm.frexp.f32.i32(float) #0
declare { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float>) #0
declare { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float>) #0
More information about the llvm-commits
mailing list