Index: lib/Target/AArch64/AArch64SVEInstrInfo.td =================================================================== --- lib/Target/AArch64/AArch64SVEInstrInfo.td +++ lib/Target/AArch64/AArch64SVEInstrInfo.td @@ -517,6 +517,16 @@ def : Pat<(store (nxv2i64 ZPR:$val), GPR64sp:$base), (ST1D_IMM ZPR:$val, (PTRUE_D 31), GPR64sp:$base, (i64 0))>; + // Shift by register + def : Pat<(nxv16i8 (shl (nxv16i8 ZPR:$Zs1), (nxv16i8 ZPR:$Zs2))), + (LSL_ZPmZ_B (PTRUE_B 31), ZPR:$Zs1, ZPR:$Zs2)>; + def : Pat<(nxv8i16 (shl (nxv8i16 ZPR:$Zs1), (nxv8i16 ZPR:$Zs2))), + (LSL_ZPmZ_H (PTRUE_H 31), ZPR:$Zs1, ZPR:$Zs2)>; + def : Pat<(nxv4i32 (shl (nxv4i32 ZPR:$Zs1), (nxv4i32 ZPR:$Zs2))), + (LSL_ZPmZ_S (PTRUE_S 31), ZPR:$Zs1, ZPR:$Zs2)>; + def : Pat<(nxv2i64 (shl (nxv2i64 ZPR:$Zs1), (nxv2i64 ZPR:$Zs2))), + (LSL_ZPmZ_D (PTRUE_D 31), ZPR:$Zs1, ZPR:$Zs2)>; + // Add def : Pat<(nxv16i8 (add (nxv16i8 ZPR:$Zs1), (nxv16i8 ZPR:$Zs2))), (ADD_ZZZ_B ZPR:$Zs1, ZPR:$Zs2)>; Index: test/CodeGen/AArch64/SVE/shifts.ll =================================================================== --- /dev/null +++ test/CodeGen/AArch64/SVE/shifts.ll @@ -0,0 +1,41 @@ +; 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 @lsl_reg_b( %vec, %amount) { +; CHECK-LABEL: lsl_reg_b: +; CHECK: ptrue [[PG:p[0-7]]].b +; CHECK: lsl z0.b, [[PG]]/m, z0.b, z1.b +; CHECK-NEXT: ret + %shift = shl %vec, %amount + ret %shift +} + +define @lsl_reg_h( %vec, %amount) { +; CHECK-LABEL: lsl_reg_h: +; CHECK: ptrue [[PG:p[0-7]]].h +; CHECK: lsl z0.h, [[PG]]/m, z0.h, z1.h +; CHECK-NEXT: ret + %shift = shl %vec, %amount + ret %shift +} + +define @lsl_reg_s( %vec, %amount) { +; CHECK-LABEL: lsl_reg_s: +; CHECK: ptrue [[PG:p[0-7]]].s +; CHECK: lsl z0.s, [[PG]]/m, z0.s, z1.s +; CHECK-NEXT: ret + %shift = shl %vec, %amount + ret %shift +} + +define @lsl_reg_d( %vec, %amount) { +; CHECK-LABEL: lsl_reg_d: +; CHECK: ptrue [[PG:p[0-7]]].d +; CHECK: lsl z0.d, [[PG]]/m, z0.d, z1.d +; CHECK-NEXT: ret + %shift = shl %vec, %amount + ret %shift +} +