Index: llvm/lib/Target/ARM/ARMInstrVFP.td =================================================================== --- llvm/lib/Target/ARM/ARMInstrVFP.td +++ llvm/lib/Target/ARM/ARMInstrVFP.td @@ -1023,9 +1023,9 @@ Sched<[WriteFPSQRT32]>; def VSQRTH : AHuI<0b11101, 0b11, 0b0001, 0b11, 0, - (outs SPR:$Sd), (ins SPR:$Sm), + (outs HPR:$Sd), (ins HPR:$Sm), IIC_fpSQRT16, "vsqrt", ".f16\t$Sd, $Sm", - []>; + [(set HPR:$Sd, (fsqrt (f16 HPR:$Sm)))]>; let hasSideEffects = 0 in { let isMoveReg = 1 in { Index: llvm/test/CodeGen/ARM/fp16-full.ll =================================================================== --- llvm/test/CodeGen/ARM/fp16-full.ll +++ llvm/test/CodeGen/ARM/fp16-full.ll @@ -217,13 +217,17 @@ ret void } -; FIXME -;define void @test_sqrt(half* %p) { -; %a = load half, half* %p, align 2 -; %r = call half @llvm.sqrt.f16(half %a) -; store half %r, half* %p -; ret void -;} +define void @test_sqrt(half* %p) { +; CHECK-LABEL: test_sqrt: +; CHECK: vldr.16 s0, [r0] +; CHECK-NEXT: vsqrt.f16 s0, s0 +; CHECK-NEXT: vstr.16 s0, [r0] +; CHECK-NEXT: bx lr + %a = load half, half* %p, align 2 + %r = call half @llvm.sqrt.f16(half %a) + store half %r, half* %p + ret void +} ; FIXME ;define void @test_fpowi(half* %p, i32 %b) {