diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -11569,6 +11569,8 @@ return false; switch (VT.getSimpleVT().SimpleTy) { + case MVT::f16: + return Subtarget->hasFullFP16(); case MVT::f32: case MVT::f64: return true; diff --git a/llvm/test/CodeGen/AArch64/f16-instructions.ll b/llvm/test/CodeGen/AArch64/f16-instructions.ll --- a/llvm/test/CodeGen/AArch64/f16-instructions.ll +++ b/llvm/test/CodeGen/AArch64/f16-instructions.ll @@ -62,6 +62,26 @@ ret half %r } +; CHECK-CVT-LABEL: test_fmadd: +; CHECK-CVT-NEXT: fcvt s1, h1 +; CHECK-CVT-NEXT: fcvt s0, h0 +; CHECK-CVT-NEXT: fmul s0, s0, s1 +; CHECK-CVT-NEXT: fcvt h0, s0 +; CHECK-CVT-NEXT: fcvt s0, h0 +; CHECK-CVT-NEXT: fcvt s1, h2 +; CHECK-CVT-NEXT: fadd s0, s0, s1 +; CHECK-CVT-NEXT: fcvt h0, s0 +; CHECK-CVT-NEXT: ret + +; CHECK-FP16-LABEL: test_fmadd: +; CHECK-FP16-NEXT: fmadd h0, h0, h1, h2 +; CHECK-FP16-NEXT: ret + +define half @test_fmadd(half %a, half %b, half %c) #0 { + %mul = fmul fast half %a, %b + %r = fadd fast half %mul, %c + ret half %r +} ; CHECK-CVT-LABEL: test_fdiv: ; CHECK-CVT-NEXT: fcvt s1, h1 ; CHECK-CVT-NEXT: fcvt s0, h0 @@ -1305,8 +1325,7 @@ ; CHECK-CVT-NEXT: ret ; CHECK-FP16-LABEL: test_fmuladd: -; CHECK-FP16-NEXT: fmul h0, h0, h1 -; CHECK-FP16-NEXT: fadd h0, h0, h2 +; CHECK-FP16-NEXT: fmadd h0, h0, h1, h2 ; CHECK-FP16-NEXT: ret define half @test_fmuladd(half %a, half %b, half %c) #0 {