Index: lib/Target/AArch64/AArch64SVEInstrInfo.td =================================================================== --- lib/Target/AArch64/AArch64SVEInstrInfo.td +++ lib/Target/AArch64/AArch64SVEInstrInfo.td @@ -507,4 +507,14 @@ def : Pat<(nxv2i64 (AArch64seriesvec GPR64:$start, GPR64:$step)), (INDEX_RR_D $start, $step)>; + // Unoptimized stores + def : Pat<(store (nxv16i8 ZPR:$val), GPR64sp:$base), + (ST1B_IMM ZPR:$val, (PTRUE_B 31), GPR64sp:$base, (i64 0))>; + def : Pat<(store (nxv8i16 ZPR:$val), GPR64sp:$base), + (ST1H_IMM ZPR:$val, (PTRUE_H 31), GPR64sp:$base, (i64 0))>; + def : Pat<(store (nxv4i32 ZPR:$val), GPR64sp:$base), + (ST1W_IMM ZPR:$val, (PTRUE_S 31), GPR64sp:$base, (i64 0))>; + def : Pat<(store (nxv2i64 ZPR:$val), GPR64sp:$base), + (ST1D_IMM ZPR:$val, (PTRUE_D 31), GPR64sp:$base, (i64 0))>; + } Index: test/CodeGen/AArch64/SVE/st1.ll =================================================================== --- /dev/null +++ test/CodeGen/AArch64/SVE/st1.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 void @st1_b( %val, * %ptr) { +; CHECK-LABEL: st1_b: +; CHECK: ptrue [[PG:p[0-9]+]].b +; CHECK-NEXT: st1b { z0.b }, [[PG]], [x0] +; CHECK-NEXT: ret + store %val, * %ptr + ret void +} + +define void @st1_h( %val, * %ptr) { +; CHECK-LABEL: st1_h: +; CHECK: ptrue [[PG:p[0-9]+]].h +; CHECK-NEXT: st1h { z0.h }, [[PG]], [x0] +; CHECK-NEXT: ret + store %val, * %ptr + ret void +} + +define void @st1_w( %val, * %ptr) { +; CHECK-LABEL: st1_w: +; CHECK: ptrue [[PG:p[0-9]+]].s +; CHECK-NEXT: st1w { z0.s }, [[PG]], [x0] +; CHECK-NEXT: ret + store %val, * %ptr + ret void +} + +define void @st1_d( %val, * %ptr) { +; CHECK-LABEL: st1_d: +; CHECK: ptrue [[PG:p[0-9]+]].d +; CHECK-NEXT: st1d { z0.d }, [[PG]], [x0] +; CHECK-NEXT: ret + store %val, * %ptr + ret void +}