[llvm] fc0f1fc - ARM: Move remaining half convert libcall config into tablegen (#153408)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 10 20:11:50 PDT 2025
Author: Matt Arsenault
Date: 2025-09-11T12:11:46+09:00
New Revision: fc0f1fc6952e424fb14b60cc6ab5bfab53680a69
URL: https://github.com/llvm/llvm-project/commit/fc0f1fc6952e424fb14b60cc6ab5bfab53680a69
DIFF: https://github.com/llvm/llvm-project/commit/fc0f1fc6952e424fb14b60cc6ab5bfab53680a69.diff
LOG: ARM: Move remaining half convert libcall config into tablegen (#153408)
The __truncdfhf2 handling is kind of convoluted, but reproduces
the existing, likely wrong, handling.
Added:
Modified:
llvm/include/llvm/IR/RuntimeLibcalls.td
llvm/lib/IR/RuntimeLibcalls.cpp
llvm/test/CodeGen/ARM/issue147935-half-convert-libcall-abi.ll
llvm/utils/UpdateTestChecks/asm.py
Removed:
################################################################################
diff --git a/llvm/include/llvm/IR/RuntimeLibcalls.td b/llvm/include/llvm/IR/RuntimeLibcalls.td
index c909ec6c660b7..fd0ea3a2332c9 100644
--- a/llvm/include/llvm/IR/RuntimeLibcalls.td
+++ b/llvm/include/llvm/IR/RuntimeLibcalls.td
@@ -1615,13 +1615,6 @@ def __aeabi_h2f : RuntimeLibcallImpl<FPEXT_F16_F32>; // CallingConv::ARM_AAPCS
def __gnu_f2h_ieee : RuntimeLibcallImpl<FPROUND_F32_F16>;
def __gnu_h2f_ieee : RuntimeLibcallImpl<FPEXT_F16_F32>;
-// In EABI, these functions have an __aeabi_ prefix, but in GNUEABI
-// they have a __gnu_ prefix (which is the default).
-def EABIHalfConvertCalls : LibcallImpls<(add __aeabi_f2h, __aeabi_h2f),
- isTargetAEABIAndAAPCS_ABI> {
- let CallingConv = ARM_AAPCS;
-}
-
// The half <-> float conversion functions are always soft-float on
// non-watchos platforms, but are needed for some targets which use a
// hard-float calling convention by default.
@@ -1630,6 +1623,27 @@ def ARMHalfConvertLibcallCallingConv : LibcallCallingConv<
(isAAPCS_ABI(TT, ABIName) ? CallingConv::ARM_AAPCS : CallingConv::ARM_APCS)}]
>;
+def ARMLibgccHalfConvertCalls :
+ LibcallImpls<(add __truncsfhf2, __extendhfsf2),
+ RuntimeLibcallPredicate<[{!TT.isTargetAEABI() && TT.isOSBinFormatMachO()}]>> {
+ let CallingConv = ARMHalfConvertLibcallCallingConv;
+}
+
+// FIXME: These conditions are probably bugged. We're using the
+// default libgcc call when the other cases are replaced.
+def ARMDoubleToHalfCalls :
+ LibcallImpls<(add __truncdfhf2),
+ RuntimeLibcallPredicate<[{!TT.isTargetAEABI()}]>> {
+ let CallingConv = ARMHalfConvertLibcallCallingConv;
+}
+
+// In EABI, these functions have an __aeabi_ prefix, but in GNUEABI
+// they have a __gnu_ prefix (which is the default).
+def EABIHalfConvertCalls : LibcallImpls<(add __aeabi_f2h, __aeabi_h2f),
+ isTargetAEABIAndAAPCS_ABI> {
+ let CallingConv = ARM_AAPCS;
+}
+
def GNUEABIHalfConvertCalls :
LibcallImpls<(add __gnu_f2h_ieee, __gnu_h2f_ieee),
RuntimeLibcallPredicate<[{!TT.isOSBinFormatMachO() &&
@@ -1756,7 +1770,9 @@ def isARMOrThumb : RuntimeLibcallPredicate<"TT.isARM() || TT.isThumb()">;
def ARMSystemLibrary
: SystemRuntimeLibrary<isARMOrThumb,
- (add WinDefaultLibcallImpls,
+ (add (sub WinDefaultLibcallImpls, ARMLibgccHalfConvertCalls,
+ GNUEABIHalfConvertCalls,
+ ARMDoubleToHalfCalls),
LibcallImpls<(add __powisf2, __powidf2), isNotOSMSVCRT>,
LibmHasFrexpF32, LibmHasLdexpF32,
LibmHasFrexpF128, LibmHasLdexpF128,
@@ -1770,8 +1786,10 @@ def ARMSystemLibrary
AEABICalls,
AEABI45MemCalls,
+ ARMLibgccHalfConvertCalls,
EABIHalfConvertCalls,
GNUEABIHalfConvertCalls,
+ ARMDoubleToHalfCalls,
// Use divmod compiler-rt calls for iOS 5.0 and later.
LibcallImpls<(add __divmodsi4, __udivmodsi4),
diff --git a/llvm/lib/IR/RuntimeLibcalls.cpp b/llvm/lib/IR/RuntimeLibcalls.cpp
index 4fe5714a74e3f..7ea2e46a54183 100644
--- a/llvm/lib/IR/RuntimeLibcalls.cpp
+++ b/llvm/lib/IR/RuntimeLibcalls.cpp
@@ -33,31 +33,6 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
EABI EABIVersion, StringRef ABIName) {
setTargetRuntimeLibcallSets(TT, ExceptionModel, FloatABI, EABIVersion,
ABIName);
-
- if (TT.isARM() || TT.isThumb()) {
- // The half <-> float conversion functions are always soft-float on
- // non-watchos platforms, but are needed for some targets which use a
- // hard-float calling convention by default.
- if (!TT.isWatchABI()) {
- if (isAAPCS_ABI(TT, ABIName)) {
- setLibcallImplCallingConv(RTLIB::impl___truncsfhf2,
- CallingConv::ARM_AAPCS);
- setLibcallImplCallingConv(RTLIB::impl___truncdfhf2,
- CallingConv::ARM_AAPCS);
- setLibcallImplCallingConv(RTLIB::impl___extendhfsf2,
- CallingConv::ARM_AAPCS);
- } else {
- setLibcallImplCallingConv(RTLIB::impl___truncsfhf2,
- CallingConv::ARM_APCS);
- setLibcallImplCallingConv(RTLIB::impl___truncdfhf2,
- CallingConv::ARM_APCS);
- setLibcallImplCallingConv(RTLIB::impl___extendhfsf2,
- CallingConv::ARM_APCS);
- }
- }
-
- return;
- }
}
LLVM_ATTRIBUTE_ALWAYS_INLINE
diff --git a/llvm/test/CodeGen/ARM/issue147935-half-convert-libcall-abi.ll b/llvm/test/CodeGen/ARM/issue147935-half-convert-libcall-abi.ll
index 33f3efccd039e..be18eb3a9aa22 100644
--- a/llvm/test/CodeGen/ARM/issue147935-half-convert-libcall-abi.ll
+++ b/llvm/test/CodeGen/ARM/issue147935-half-convert-libcall-abi.ll
@@ -5,6 +5,8 @@
; RUN: llc -mtriple=arm-unknown-linux-eabi -mattr=+vfp2 < %s | FileCheck -check-prefixes=AAPCS-SOFT,EABI-SOFT %s
; RUN: llc -mtriple=armv7-unknown-linux -target-abi=apcs -float-abi=soft < %s | FileCheck -check-prefix=APCS %s
; RUN: llc -mtriple=armv7-unknown-linux -target-abi=apcs -float-abi=hard < %s | FileCheck -check-prefix=APCS %s
+; RUN: llc -mtriple=armv7k-apple-watchos2.0 -mcpu=cortex-a7 < %s | FileCheck -check-prefix=WATCHABI-HARD %s
+; RUN: llc -mtriple=armv7k-apple-watchos2.0 -mcpu=cortex-a7 -float-abi=soft < %s | FileCheck -check-prefix=WATCHABI-SOFT %s
define i1 @test(half %self) #0 {
; GNU-AAPCS-HARD-LABEL: test:
@@ -72,6 +74,26 @@ define i1 @test(half %self) #0 {
; APCS-NEXT: movwvs r0, #1
; APCS-NEXT: pop {lr}
; APCS-NEXT: bx lr
+;
+; WATCHABI-HARD-LABEL: test:
+; WATCHABI-HARD: @ %bb.0:
+; WATCHABI-HARD-NEXT: vcvtb.f32.f16 s0, s0
+; WATCHABI-HARD-NEXT: mov r0, #0
+; WATCHABI-HARD-NEXT: vcmp.f32 s0, s0
+; WATCHABI-HARD-NEXT: vmrs APSR_nzcv, fpscr
+; WATCHABI-HARD-NEXT: movwvs r0, #1
+; WATCHABI-HARD-NEXT: bx lr
+;
+; WATCHABI-SOFT-LABEL: test:
+; WATCHABI-SOFT: @ %bb.0:
+; WATCHABI-SOFT-NEXT: vmov s0, r0
+; WATCHABI-SOFT-NEXT: mov r1, #0
+; WATCHABI-SOFT-NEXT: vcvtb.f32.f16 s0, s0
+; WATCHABI-SOFT-NEXT: vcmp.f32 s0, s0
+; WATCHABI-SOFT-NEXT: vmrs APSR_nzcv, fpscr
+; WATCHABI-SOFT-NEXT: movwvs r1, #1
+; WATCHABI-SOFT-NEXT: mov r0, r1
+; WATCHABI-SOFT-NEXT: bx lr
%_0 = fcmp une half %self, %self
ret i1 %_0
}
@@ -111,6 +133,21 @@ define float @f16_to_f32(ptr %p) #0 {
; APCS: @ %bb.0:
; APCS-NEXT: ldrh r0, [r0]
; APCS-NEXT: b __gnu_h2f_ieee
+;
+; WATCHABI-HARD-LABEL: f16_to_f32:
+; WATCHABI-HARD: @ %bb.0:
+; WATCHABI-HARD-NEXT: ldrh r0, [r0]
+; WATCHABI-HARD-NEXT: vmov s0, r0
+; WATCHABI-HARD-NEXT: vcvtb.f32.f16 s0, s0
+; WATCHABI-HARD-NEXT: bx lr
+;
+; WATCHABI-SOFT-LABEL: f16_to_f32:
+; WATCHABI-SOFT: @ %bb.0:
+; WATCHABI-SOFT-NEXT: ldrh r0, [r0]
+; WATCHABI-SOFT-NEXT: vmov s0, r0
+; WATCHABI-SOFT-NEXT: vcvtb.f32.f16 s0, s0
+; WATCHABI-SOFT-NEXT: vmov r0, s0
+; WATCHABI-SOFT-NEXT: bx lr
%load = load half, ptr %p
%cvt = fpext half %load to float
ret float %cvt
@@ -169,6 +206,21 @@ define void @f32_to_f16(ptr %p, float %arg) #0 {
; APCS-NEXT: bl __gnu_f2h_ieee
; APCS-NEXT: strh r0, [r4]
; APCS-NEXT: pop {r4, pc}
+;
+; WATCHABI-HARD-LABEL: f32_to_f16:
+; WATCHABI-HARD: @ %bb.0:
+; WATCHABI-HARD-NEXT: vcvtb.f16.f32 s0, s0
+; WATCHABI-HARD-NEXT: vmov r1, s0
+; WATCHABI-HARD-NEXT: strh r1, [r0]
+; WATCHABI-HARD-NEXT: bx lr
+;
+; WATCHABI-SOFT-LABEL: f32_to_f16:
+; WATCHABI-SOFT: @ %bb.0:
+; WATCHABI-SOFT-NEXT: vmov s0, r1
+; WATCHABI-SOFT-NEXT: vcvtb.f16.f32 s0, s0
+; WATCHABI-SOFT-NEXT: vmov r1, s0
+; WATCHABI-SOFT-NEXT: strh r1, [r0]
+; WATCHABI-SOFT-NEXT: bx lr
%cvt = fptrunc float %arg to half
store half %cvt, ptr %p
ret void
@@ -231,6 +283,23 @@ define double @f16_to_f64(ptr %p) #0 {
; APCS-NEXT: vmov r0, r1, d16
; APCS-NEXT: pop {lr}
; APCS-NEXT: bx lr
+;
+; WATCHABI-HARD-LABEL: f16_to_f64:
+; WATCHABI-HARD: @ %bb.0:
+; WATCHABI-HARD-NEXT: ldrh r0, [r0]
+; WATCHABI-HARD-NEXT: vmov s0, r0
+; WATCHABI-HARD-NEXT: vcvtb.f32.f16 s0, s0
+; WATCHABI-HARD-NEXT: vcvt.f64.f32 d0, s0
+; WATCHABI-HARD-NEXT: bx lr
+;
+; WATCHABI-SOFT-LABEL: f16_to_f64:
+; WATCHABI-SOFT: @ %bb.0:
+; WATCHABI-SOFT-NEXT: ldrh r0, [r0]
+; WATCHABI-SOFT-NEXT: vmov s0, r0
+; WATCHABI-SOFT-NEXT: vcvtb.f32.f16 s0, s0
+; WATCHABI-SOFT-NEXT: vcvt.f64.f32 d16, s0
+; WATCHABI-SOFT-NEXT: vmov r0, r1, d16
+; WATCHABI-SOFT-NEXT: bx lr
%load = load half, ptr %p
%cvt = fpext half %load to double
ret double %cvt
@@ -269,6 +338,28 @@ define void @f64_to_f16(ptr %p, double %arg) #0 {
; APCS-NEXT: bl __truncdfhf2
; APCS-NEXT: strh r0, [r4]
; APCS-NEXT: pop {r4, pc}
+;
+; WATCHABI-HARD-LABEL: f64_to_f16:
+; WATCHABI-HARD: @ %bb.0:
+; WATCHABI-HARD-NEXT: push {r4, lr}
+; WATCHABI-HARD-NEXT: sub sp, sp, #8
+; WATCHABI-HARD-NEXT: mov r4, r0
+; WATCHABI-HARD-NEXT: bl ___truncdfhf2
+; WATCHABI-HARD-NEXT: strh r0, [r4]
+; WATCHABI-HARD-NEXT: add sp, sp, #8
+; WATCHABI-HARD-NEXT: pop {r4, pc}
+;
+; WATCHABI-SOFT-LABEL: f64_to_f16:
+; WATCHABI-SOFT: @ %bb.0:
+; WATCHABI-SOFT-NEXT: push {r4, lr}
+; WATCHABI-SOFT-NEXT: sub sp, sp, #8
+; WATCHABI-SOFT-NEXT: mov r4, r0
+; WATCHABI-SOFT-NEXT: mov r1, r3
+; WATCHABI-SOFT-NEXT: mov r0, r2
+; WATCHABI-SOFT-NEXT: bl ___truncdfhf2
+; WATCHABI-SOFT-NEXT: strh r0, [r4]
+; WATCHABI-SOFT-NEXT: add sp, sp, #8
+; WATCHABI-SOFT-NEXT: pop {r4, pc}
%cvt = fptrunc double %arg to half
store half %cvt, ptr %p
ret void
diff --git a/llvm/utils/UpdateTestChecks/asm.py b/llvm/utils/UpdateTestChecks/asm.py
index 570dbd081eb79..457b23f4a5f59 100644
--- a/llvm/utils/UpdateTestChecks/asm.py
+++ b/llvm/utils/UpdateTestChecks/asm.py
@@ -574,6 +574,7 @@ def get_run_handler(triple):
"arm64-apple-macosx": (scrub_asm_arm_eabi, ASM_FUNCTION_AARCH64_DARWIN_RE),
"armv7-apple-ios": (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_IOS_RE),
"armv7-apple-darwin": (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_DARWIN_RE),
+ "armv7k-apple-watchos": (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_DARWIN_RE),
"thumb": (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
"thumb-macho": (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_MACHO_RE),
"thumbv5-macho": (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_MACHO_RE),
More information about the llvm-commits
mailing list