Index: lib/Target/AArch64/AArch64SVEInstrInfo.td =================================================================== --- lib/Target/AArch64/AArch64SVEInstrInfo.td +++ lib/Target/AArch64/AArch64SVEInstrInfo.td @@ -517,4 +517,13 @@ def : Pat<(store (nxv2i64 ZPR:$val), GPR64sp:$base), (ST1D_IMM ZPR:$val, (PTRUE_D 31), GPR64sp:$base, (i64 0))>; + // Add + def : Pat<(nxv16i8 (add (nxv16i8 ZPR:$Zs1), (nxv16i8 ZPR:$Zs2))), + (ADD_ZZZ_B ZPR:$Zs1, ZPR:$Zs2)>; + def : Pat<(nxv8i16 (add (nxv8i16 ZPR:$Zs1), (nxv8i16 ZPR:$Zs2))), + (ADD_ZZZ_H ZPR:$Zs1, ZPR:$Zs2)>; + def : Pat<(nxv4i32 (add (nxv4i32 ZPR:$Zs1), (nxv4i32 ZPR:$Zs2))), + (ADD_ZZZ_S ZPR:$Zs1, ZPR:$Zs2)>; + def : Pat<(nxv2i64 (add (nxv2i64 ZPR:$Zs1), (nxv2i64 ZPR:$Zs2))), + (ADD_ZZZ_D ZPR:$Zs1, ZPR:$Zs2)>; } Index: test/CodeGen/AArch64/SVE/arith.ll =================================================================== --- /dev/null +++ test/CodeGen/AArch64/SVE/arith.ll @@ -0,0 +1,36 @@ +; RUN: llc -verify-machineinstrs -mattr=+sve < %s | FileCheck %s + +target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" +target triple = "aarch64--linux-gnueabi" + +define @add_reg_b( %a, %b) { +; CHECK-LABEL: add_reg_b: +; CHECK: add z0.b, z0.b, z1.b +; CHECK-NEXT: ret + %res = add %a, %b + ret %res +} + +define @add_reg_h( %a, %b) { +; CHECK-LABEL: add_reg_h: +; CHECK: add z0.h, z0.h, z1.h +; CHECK-NEXT: ret + %res = add %a, %b + ret %res +} + +define @add_reg_s( %a, %b) { +; CHECK-LABEL: add_reg_s: +; CHECK: add z0.s, z0.s, z1.s +; CHECK-NEXT: ret + %res = add %a, %b + ret %res +} + +define @add_reg_d( %a, %b) { +; CHECK-LABEL: add_reg_d: +; CHECK: add z0.d, z0.d, z1.d +; CHECK-NEXT: ret + %res = add %a, %b + ret %res +}