diff --git a/lib/Target/AArch64/AArch64ISelLowering.cpp b/lib/Target/AArch64/AArch64ISelLowering.cpp index 076145c36b2d..04219baf041f 100644 --- a/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -4780,6 +4780,8 @@ AArch64TargetLowering::getRegForInlineAsmConstraint( return std::make_pair(0U, &AArch64::GPR64commonRegClass); return std::make_pair(0U, &AArch64::GPR32commonRegClass); case 'w': + if (VT.getSizeInBits() == 16) + return std::make_pair(0U, &AArch64::FPR16RegClass); if (VT.getSizeInBits() == 32) return std::make_pair(0U, &AArch64::FPR32RegClass); if (VT.getSizeInBits() == 64) diff --git a/test/CodeGen/AArch64/neon-inline-asm-16-bit-fp.ll b/test/CodeGen/AArch64/neon-inline-asm-16-bit-fp.ll new file mode 100644 index 000000000000..3656a7879770 --- /dev/null +++ b/test/CodeGen/AArch64/neon-inline-asm-16-bit-fp.ll @@ -0,0 +1,20 @@ +; RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=+neon < %s | FileCheck %s + +; generated from +; __fp16 test(__fp16 a1, __fp16 a2) { +; __fp16 res0; +; __asm__("sqrshl %h[__res], %h[__A], %h[__B]" +; : [__res] "=w" (res0) +; : [__A] "w" (a1), [__B] "w" (a2) +; : +; ); +; return res0; +;} + +; Function Attrs: nounwind readnone +define half @test(half %a1, half %a2) #0 { +entry: + ;CHECK: sqrshl {{h[0-9]+}}, {{h[0-9]+}}, {{h[0-9]+}} + %0 = tail call half asm "sqrshl ${0:h}, ${1:h}, ${2:h}", "=w,w,w" (half %a1, half %a2) #1 + ret half %0 +}