[llvm] r361713 - [ARM] Promote fp16 frem
David Green via llvm-commits
llvm-commits at lists.llvm.org
Sun May 26 03:30:22 PDT 2019
Author: dmgreen
Date: Sun May 26 03:30:22 2019
New Revision: 361713
URL: http://llvm.org/viewvc/llvm-project?rev=361713&view=rev
Log:
[ARM] Promote fp16 frem
Promote fp16 frem operations on ARM to floats so they call fmodf.
Differential Revision: https://reviews.llvm.org/D62321
Modified:
llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
llvm/trunk/test/CodeGen/ARM/fp16-fullfp16.ll
Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp?rev=361713&r1=361712&r2=361713&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp Sun May 26 03:30:22 2019
@@ -1142,6 +1142,11 @@ ARMTargetLowering::ARMTargetLowering(con
}
}
+ // FP16 often need to be promoted to call lib functions
+ if (Subtarget->hasFullFP16()) {
+ setOperationAction(ISD::FREM, MVT::f16, Promote);
+ }
+
if (Subtarget->hasNEON()) {
// vmin and vmax aren't available in a scalar form, so we use
// a NEON instruction with an undef lane instead.
Modified: llvm/trunk/test/CodeGen/ARM/fp16-fullfp16.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/fp16-fullfp16.ll?rev=361713&r1=361712&r2=361713&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/fp16-fullfp16.ll (original)
+++ llvm/trunk/test/CodeGen/ARM/fp16-fullfp16.ll Sun May 26 03:30:22 2019
@@ -57,14 +57,25 @@ define void @test_fdiv(half* %p, half* %
ret void
}
-; FIXME
-;define void @test_frem(half* %p, half* %q) {
-; %a = load half, half* %p, align 2
-; %b = load half, half* %q, align 2
-; %r = frem half %a, %b
-; store half %r, half* %p
-; ret void
-;}
+define arm_aapcs_vfpcc void @test_frem(half* %p, half* %q) {
+; CHECK-LABEL: test_frem:
+; CHECK: .save {r4, lr}
+; CHECK-NEXT: push {r4, lr}
+; CHECK-NEXT: vldr.16 s2, [r1]
+; CHECK-NEXT: vldr.16 s0, [r0]
+; CHECK-NEXT: mov r4, r0
+; CHECK-NEXT: vcvtb.f32.f16 s0, s0
+; CHECK-NEXT: vcvtb.f32.f16 s1, s2
+; CHECK-NEXT: bl fmodf
+; CHECK-NEXT: vcvtb.f16.f32 s0, s0
+; CHECK-NEXT: vstr.16 s0, [r4]
+; CHECK-NEXT: pop {r4, pc}
+ %a = load half, half* %p, align 2
+ %b = load half, half* %q, align 2
+ %r = frem half %a, %b
+ store half %r, half* %p
+ ret void
+}
define void @test_load_store(half* %p, half* %q) {
; CHECK-LABEL: test_load_store:
More information about the llvm-commits
mailing list