Skip to content

Commit fc0f1fc

Browse files
authored
ARM: Move remaining half convert libcall config into tablegen (#153408)
The __truncdfhf2 handling is kind of convoluted, but reproduces the existing, likely wrong, handling.
1 parent 004231a commit fc0f1fc

File tree

4 files changed

+118
-33
lines changed

4 files changed

+118
-33
lines changed

llvm/include/llvm/IR/RuntimeLibcalls.td

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1615,13 +1615,6 @@ def __aeabi_h2f : RuntimeLibcallImpl<FPEXT_F16_F32>; // CallingConv::ARM_AAPCS
16151615
def __gnu_f2h_ieee : RuntimeLibcallImpl<FPROUND_F32_F16>;
16161616
def __gnu_h2f_ieee : RuntimeLibcallImpl<FPEXT_F16_F32>;
16171617

1618-
// In EABI, these functions have an __aeabi_ prefix, but in GNUEABI
1619-
// they have a __gnu_ prefix (which is the default).
1620-
def EABIHalfConvertCalls : LibcallImpls<(add __aeabi_f2h, __aeabi_h2f),
1621-
isTargetAEABIAndAAPCS_ABI> {
1622-
let CallingConv = ARM_AAPCS;
1623-
}
1624-
16251618
// The half <-> float conversion functions are always soft-float on
16261619
// non-watchos platforms, but are needed for some targets which use a
16271620
// hard-float calling convention by default.
@@ -1630,6 +1623,27 @@ def ARMHalfConvertLibcallCallingConv : LibcallCallingConv<
16301623
(isAAPCS_ABI(TT, ABIName) ? CallingConv::ARM_AAPCS : CallingConv::ARM_APCS)}]
16311624
>;
16321625

1626+
def ARMLibgccHalfConvertCalls :
1627+
LibcallImpls<(add __truncsfhf2, __extendhfsf2),
1628+
RuntimeLibcallPredicate<[{!TT.isTargetAEABI() && TT.isOSBinFormatMachO()}]>> {
1629+
let CallingConv = ARMHalfConvertLibcallCallingConv;
1630+
}
1631+
1632+
// FIXME: These conditions are probably bugged. We're using the
1633+
// default libgcc call when the other cases are replaced.
1634+
def ARMDoubleToHalfCalls :
1635+
LibcallImpls<(add __truncdfhf2),
1636+
RuntimeLibcallPredicate<[{!TT.isTargetAEABI()}]>> {
1637+
let CallingConv = ARMHalfConvertLibcallCallingConv;
1638+
}
1639+
1640+
// In EABI, these functions have an __aeabi_ prefix, but in GNUEABI
1641+
// they have a __gnu_ prefix (which is the default).
1642+
def EABIHalfConvertCalls : LibcallImpls<(add __aeabi_f2h, __aeabi_h2f),
1643+
isTargetAEABIAndAAPCS_ABI> {
1644+
let CallingConv = ARM_AAPCS;
1645+
}
1646+
16331647
def GNUEABIHalfConvertCalls :
16341648
LibcallImpls<(add __gnu_f2h_ieee, __gnu_h2f_ieee),
16351649
RuntimeLibcallPredicate<[{!TT.isOSBinFormatMachO() &&
@@ -1756,7 +1770,9 @@ def isARMOrThumb : RuntimeLibcallPredicate<"TT.isARM() || TT.isThumb()">;
17561770

17571771
def ARMSystemLibrary
17581772
: SystemRuntimeLibrary<isARMOrThumb,
1759-
(add WinDefaultLibcallImpls,
1773+
(add (sub WinDefaultLibcallImpls, ARMLibgccHalfConvertCalls,
1774+
GNUEABIHalfConvertCalls,
1775+
ARMDoubleToHalfCalls),
17601776
LibcallImpls<(add __powisf2, __powidf2), isNotOSMSVCRT>,
17611777
LibmHasFrexpF32, LibmHasLdexpF32,
17621778
LibmHasFrexpF128, LibmHasLdexpF128,
@@ -1770,8 +1786,10 @@ def ARMSystemLibrary
17701786

17711787
AEABICalls,
17721788
AEABI45MemCalls,
1789+
ARMLibgccHalfConvertCalls,
17731790
EABIHalfConvertCalls,
17741791
GNUEABIHalfConvertCalls,
1792+
ARMDoubleToHalfCalls,
17751793

17761794
// Use divmod compiler-rt calls for iOS 5.0 and later.
17771795
LibcallImpls<(add __divmodsi4, __udivmodsi4),

llvm/lib/IR/RuntimeLibcalls.cpp

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -33,31 +33,6 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
3333
EABI EABIVersion, StringRef ABIName) {
3434
setTargetRuntimeLibcallSets(TT, ExceptionModel, FloatABI, EABIVersion,
3535
ABIName);
36-
37-
if (TT.isARM() || TT.isThumb()) {
38-
// The half <-> float conversion functions are always soft-float on
39-
// non-watchos platforms, but are needed for some targets which use a
40-
// hard-float calling convention by default.
41-
if (!TT.isWatchABI()) {
42-
if (isAAPCS_ABI(TT, ABIName)) {
43-
setLibcallImplCallingConv(RTLIB::impl___truncsfhf2,
44-
CallingConv::ARM_AAPCS);
45-
setLibcallImplCallingConv(RTLIB::impl___truncdfhf2,
46-
CallingConv::ARM_AAPCS);
47-
setLibcallImplCallingConv(RTLIB::impl___extendhfsf2,
48-
CallingConv::ARM_AAPCS);
49-
} else {
50-
setLibcallImplCallingConv(RTLIB::impl___truncsfhf2,
51-
CallingConv::ARM_APCS);
52-
setLibcallImplCallingConv(RTLIB::impl___truncdfhf2,
53-
CallingConv::ARM_APCS);
54-
setLibcallImplCallingConv(RTLIB::impl___extendhfsf2,
55-
CallingConv::ARM_APCS);
56-
}
57-
}
58-
59-
return;
60-
}
6136
}
6237

6338
LLVM_ATTRIBUTE_ALWAYS_INLINE

llvm/test/CodeGen/ARM/issue147935-half-convert-libcall-abi.ll

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
; RUN: llc -mtriple=arm-unknown-linux-eabi -mattr=+vfp2 < %s | FileCheck -check-prefixes=AAPCS-SOFT,EABI-SOFT %s
66
; RUN: llc -mtriple=armv7-unknown-linux -target-abi=apcs -float-abi=soft < %s | FileCheck -check-prefix=APCS %s
77
; RUN: llc -mtriple=armv7-unknown-linux -target-abi=apcs -float-abi=hard < %s | FileCheck -check-prefix=APCS %s
8+
; RUN: llc -mtriple=armv7k-apple-watchos2.0 -mcpu=cortex-a7 < %s | FileCheck -check-prefix=WATCHABI-HARD %s
9+
; RUN: llc -mtriple=armv7k-apple-watchos2.0 -mcpu=cortex-a7 -float-abi=soft < %s | FileCheck -check-prefix=WATCHABI-SOFT %s
810

911
define i1 @test(half %self) #0 {
1012
; GNU-AAPCS-HARD-LABEL: test:
@@ -72,6 +74,26 @@ define i1 @test(half %self) #0 {
7274
; APCS-NEXT: movwvs r0, #1
7375
; APCS-NEXT: pop {lr}
7476
; APCS-NEXT: bx lr
77+
;
78+
; WATCHABI-HARD-LABEL: test:
79+
; WATCHABI-HARD: @ %bb.0:
80+
; WATCHABI-HARD-NEXT: vcvtb.f32.f16 s0, s0
81+
; WATCHABI-HARD-NEXT: mov r0, #0
82+
; WATCHABI-HARD-NEXT: vcmp.f32 s0, s0
83+
; WATCHABI-HARD-NEXT: vmrs APSR_nzcv, fpscr
84+
; WATCHABI-HARD-NEXT: movwvs r0, #1
85+
; WATCHABI-HARD-NEXT: bx lr
86+
;
87+
; WATCHABI-SOFT-LABEL: test:
88+
; WATCHABI-SOFT: @ %bb.0:
89+
; WATCHABI-SOFT-NEXT: vmov s0, r0
90+
; WATCHABI-SOFT-NEXT: mov r1, #0
91+
; WATCHABI-SOFT-NEXT: vcvtb.f32.f16 s0, s0
92+
; WATCHABI-SOFT-NEXT: vcmp.f32 s0, s0
93+
; WATCHABI-SOFT-NEXT: vmrs APSR_nzcv, fpscr
94+
; WATCHABI-SOFT-NEXT: movwvs r1, #1
95+
; WATCHABI-SOFT-NEXT: mov r0, r1
96+
; WATCHABI-SOFT-NEXT: bx lr
7597
%_0 = fcmp une half %self, %self
7698
ret i1 %_0
7799
}
@@ -111,6 +133,21 @@ define float @f16_to_f32(ptr %p) #0 {
111133
; APCS: @ %bb.0:
112134
; APCS-NEXT: ldrh r0, [r0]
113135
; APCS-NEXT: b __gnu_h2f_ieee
136+
;
137+
; WATCHABI-HARD-LABEL: f16_to_f32:
138+
; WATCHABI-HARD: @ %bb.0:
139+
; WATCHABI-HARD-NEXT: ldrh r0, [r0]
140+
; WATCHABI-HARD-NEXT: vmov s0, r0
141+
; WATCHABI-HARD-NEXT: vcvtb.f32.f16 s0, s0
142+
; WATCHABI-HARD-NEXT: bx lr
143+
;
144+
; WATCHABI-SOFT-LABEL: f16_to_f32:
145+
; WATCHABI-SOFT: @ %bb.0:
146+
; WATCHABI-SOFT-NEXT: ldrh r0, [r0]
147+
; WATCHABI-SOFT-NEXT: vmov s0, r0
148+
; WATCHABI-SOFT-NEXT: vcvtb.f32.f16 s0, s0
149+
; WATCHABI-SOFT-NEXT: vmov r0, s0
150+
; WATCHABI-SOFT-NEXT: bx lr
114151
%load = load half, ptr %p
115152
%cvt = fpext half %load to float
116153
ret float %cvt
@@ -169,6 +206,21 @@ define void @f32_to_f16(ptr %p, float %arg) #0 {
169206
; APCS-NEXT: bl __gnu_f2h_ieee
170207
; APCS-NEXT: strh r0, [r4]
171208
; APCS-NEXT: pop {r4, pc}
209+
;
210+
; WATCHABI-HARD-LABEL: f32_to_f16:
211+
; WATCHABI-HARD: @ %bb.0:
212+
; WATCHABI-HARD-NEXT: vcvtb.f16.f32 s0, s0
213+
; WATCHABI-HARD-NEXT: vmov r1, s0
214+
; WATCHABI-HARD-NEXT: strh r1, [r0]
215+
; WATCHABI-HARD-NEXT: bx lr
216+
;
217+
; WATCHABI-SOFT-LABEL: f32_to_f16:
218+
; WATCHABI-SOFT: @ %bb.0:
219+
; WATCHABI-SOFT-NEXT: vmov s0, r1
220+
; WATCHABI-SOFT-NEXT: vcvtb.f16.f32 s0, s0
221+
; WATCHABI-SOFT-NEXT: vmov r1, s0
222+
; WATCHABI-SOFT-NEXT: strh r1, [r0]
223+
; WATCHABI-SOFT-NEXT: bx lr
172224
%cvt = fptrunc float %arg to half
173225
store half %cvt, ptr %p
174226
ret void
@@ -231,6 +283,23 @@ define double @f16_to_f64(ptr %p) #0 {
231283
; APCS-NEXT: vmov r0, r1, d16
232284
; APCS-NEXT: pop {lr}
233285
; APCS-NEXT: bx lr
286+
;
287+
; WATCHABI-HARD-LABEL: f16_to_f64:
288+
; WATCHABI-HARD: @ %bb.0:
289+
; WATCHABI-HARD-NEXT: ldrh r0, [r0]
290+
; WATCHABI-HARD-NEXT: vmov s0, r0
291+
; WATCHABI-HARD-NEXT: vcvtb.f32.f16 s0, s0
292+
; WATCHABI-HARD-NEXT: vcvt.f64.f32 d0, s0
293+
; WATCHABI-HARD-NEXT: bx lr
294+
;
295+
; WATCHABI-SOFT-LABEL: f16_to_f64:
296+
; WATCHABI-SOFT: @ %bb.0:
297+
; WATCHABI-SOFT-NEXT: ldrh r0, [r0]
298+
; WATCHABI-SOFT-NEXT: vmov s0, r0
299+
; WATCHABI-SOFT-NEXT: vcvtb.f32.f16 s0, s0
300+
; WATCHABI-SOFT-NEXT: vcvt.f64.f32 d16, s0
301+
; WATCHABI-SOFT-NEXT: vmov r0, r1, d16
302+
; WATCHABI-SOFT-NEXT: bx lr
234303
%load = load half, ptr %p
235304
%cvt = fpext half %load to double
236305
ret double %cvt
@@ -269,6 +338,28 @@ define void @f64_to_f16(ptr %p, double %arg) #0 {
269338
; APCS-NEXT: bl __truncdfhf2
270339
; APCS-NEXT: strh r0, [r4]
271340
; APCS-NEXT: pop {r4, pc}
341+
;
342+
; WATCHABI-HARD-LABEL: f64_to_f16:
343+
; WATCHABI-HARD: @ %bb.0:
344+
; WATCHABI-HARD-NEXT: push {r4, lr}
345+
; WATCHABI-HARD-NEXT: sub sp, sp, #8
346+
; WATCHABI-HARD-NEXT: mov r4, r0
347+
; WATCHABI-HARD-NEXT: bl ___truncdfhf2
348+
; WATCHABI-HARD-NEXT: strh r0, [r4]
349+
; WATCHABI-HARD-NEXT: add sp, sp, #8
350+
; WATCHABI-HARD-NEXT: pop {r4, pc}
351+
;
352+
; WATCHABI-SOFT-LABEL: f64_to_f16:
353+
; WATCHABI-SOFT: @ %bb.0:
354+
; WATCHABI-SOFT-NEXT: push {r4, lr}
355+
; WATCHABI-SOFT-NEXT: sub sp, sp, #8
356+
; WATCHABI-SOFT-NEXT: mov r4, r0
357+
; WATCHABI-SOFT-NEXT: mov r1, r3
358+
; WATCHABI-SOFT-NEXT: mov r0, r2
359+
; WATCHABI-SOFT-NEXT: bl ___truncdfhf2
360+
; WATCHABI-SOFT-NEXT: strh r0, [r4]
361+
; WATCHABI-SOFT-NEXT: add sp, sp, #8
362+
; WATCHABI-SOFT-NEXT: pop {r4, pc}
272363
%cvt = fptrunc double %arg to half
273364
store half %cvt, ptr %p
274365
ret void

llvm/utils/UpdateTestChecks/asm.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,7 @@ def get_run_handler(triple):
574574
"arm64-apple-macosx": (scrub_asm_arm_eabi, ASM_FUNCTION_AARCH64_DARWIN_RE),
575575
"armv7-apple-ios": (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_IOS_RE),
576576
"armv7-apple-darwin": (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_DARWIN_RE),
577+
"armv7k-apple-watchos": (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_DARWIN_RE),
577578
"thumb": (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_RE),
578579
"thumb-macho": (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_MACHO_RE),
579580
"thumbv5-macho": (scrub_asm_arm_eabi, ASM_FUNCTION_ARM_MACHO_RE),

0 commit comments

Comments
 (0)