Index: llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td =================================================================== --- llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td +++ llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td @@ -1070,6 +1070,13 @@ def : Pat<(nxv2f64 (bitconvert (nxv8f16 ZPR:$src))), (nxv2f64 ZPR:$src)>; def : Pat<(nxv2f64 (bitconvert (nxv4f32 ZPR:$src))), (nxv2f64 ZPR:$src)>; + def : Pat<(nxv8f16 (fadd (nxv8f16 ZPR:$Zs1), (nxv8f16 ZPR:$Zs2))), + (FADD_ZZZ_H ZPR:$Zs1, ZPR:$Zs2)>; + def : Pat<(nxv4f32 (fadd (nxv4f32 ZPR:$Zs1), (nxv4f32 ZPR:$Zs2))), + (FADD_ZZZ_S ZPR:$Zs1, ZPR:$Zs2)>; + def : Pat<(nxv2f64 (fadd (nxv2f64 ZPR:$Zs1), (nxv2f64 ZPR:$Zs2))), + (FADD_ZZZ_D ZPR:$Zs1, ZPR:$Zs2)>; + } let Predicates = [HasSVE2] in { Index: llvm/test/CodeGen/AArch64/sve-fp.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/AArch64/sve-fp.ll @@ -0,0 +1,25 @@ +; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s + +define @fadd_h( %a, %b) { +; CHECK-LABEL: fadd_h: +; CHECK: fadd z0.h, z0.h, z1.h +; CHECK-NEXT: ret + %res = fadd %a, %b + ret %res +} + +define @fadd_s( %a, %b) { +; CHECK-LABEL: fadd_s: +; CHECK: fadd z0.s, z0.s, z1.s +; CHECK-NEXT: ret + %res = fadd %a, %b + ret %res +} + +define @fadd_d( %a, %b) { +; CHECK-LABEL: fadd_d: +; CHECK: fadd z0.d, z0.d, z1.d +; CHECK-NEXT: ret + %res = fadd %a, %b + ret %res +}