Index: llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td =================================================================== --- llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td +++ llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td @@ -1702,6 +1702,7 @@ defm : unpred_store; defm : unpred_store< store, nxv2i64, ST1D_IMM, PTRUE_D>; defm : unpred_store< store, nxv8f16, ST1H_IMM, PTRUE_H>; + defm : unpred_store< store, nxv8bf16, ST1H_IMM, PTRUE_H>; defm : unpred_store< store, nxv4f16, ST1H_S_IMM, PTRUE_S>; defm : unpred_store< store, nxv2f16, ST1H_D_IMM, PTRUE_D>; defm : unpred_store< store, nxv4f32, ST1W_IMM, PTRUE_S>; @@ -1740,6 +1741,7 @@ defm : unpred_load; defm : unpred_load< load, nxv2i64, LD1D_IMM, PTRUE_D>; defm : unpred_load< load, nxv8f16, LD1H_IMM, PTRUE_H>; + defm : unpred_load< load, nxv8bf16, LD1H_IMM, PTRUE_H>; defm : unpred_load< load, nxv4f16, LD1H_S_IMM, PTRUE_S>; defm : unpred_load< load, nxv2f16, LD1H_D_IMM, PTRUE_D>; defm : unpred_load< load, nxv4f32, LD1W_IMM, PTRUE_S>; Index: llvm/test/CodeGen/AArch64/spillfill-sve.ll =================================================================== --- llvm/test/CodeGen/AArch64/spillfill-sve.ll +++ llvm/test/CodeGen/AArch64/spillfill-sve.ll @@ -1,4 +1,4 @@ -; RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=+sve < %s | FileCheck %s +; RUN: llc -mtriple=aarch64-none-linux-gnu -mattr=+sve -mattr=+bf16 < %s | FileCheck %s ; This file checks that unpredicated load/store instructions to locals ; use the right instructions and offsets. @@ -199,6 +199,50 @@ ret void } +define void @fill_nxv8bf16() { +; CHECK-LABEL: fill_nxv8bf16 +; CHECK-DAG: ld1h { z{{[01]}}.h }, p0/z, [sp] +; CHECK-DAG: ld1h { z{{[01]}}.h }, p0/z, [sp, #1, mul vl] + %local0 = alloca + %local1 = alloca + load volatile , * %local0 + load volatile , * %local1 + ret void +} + +define void @fill_nxv8f16() { +; CHECK-LABEL: fill_nxv8f16 +; CHECK-DAG: ld1h { z{{[01]}}.h }, p0/z, [sp] +; CHECK-DAG: ld1h { z{{[01]}}.h }, p0/z, [sp, #1, mul vl] + %local0 = alloca + %local1 = alloca + load volatile , * %local0 + load volatile , * %local1 + ret void +} + +define void @fill_nxv4f32() { +; CHECK-LABEL: fill_nxv4f32 +; CHECK-DAG: ld1w { z{{[01]}}.s }, p0/z, [sp] +; CHECK-DAG: ld1w { z{{[01]}}.s }, p0/z, [sp, #1, mul vl] + %local0 = alloca + %local1 = alloca + load volatile , * %local0 + load volatile , * %local1 + ret void +} + +define void @fill_nxv2f64() { +; CHECK-LABEL: fill_nxv2f64 +; CHECK-DAG: ld1d { z{{[01]}}.d }, p0/z, [sp] +; CHECK-DAG: ld1d { z{{[01]}}.d }, p0/z, [sp, #1, mul vl] + %local0 = alloca + %local1 = alloca + load volatile , * %local0 + load volatile , * %local1 + ret void +} + ; Data spills @@ -312,6 +356,50 @@ ret void } +define void @spill_nxv8f16( %v0, %v1) { +; CHECK-LABEL: spill_nxv8f16 +; CHECK-DAG: st1h { z{{[01]}}.h }, p0, [sp] +; CHECK-DAG: st1h { z{{[01]}}.h }, p0, [sp, #1, mul vl] + %local0 = alloca + %local1 = alloca + store volatile %v0, * %local0 + store volatile %v1, * %local1 + ret void +} + +define void @spill_nxv8bf16( %v0, %v1) { +; CHECK-LABEL: spill_nxv8bf16 +; CHECK-DAG: st1h { z{{[01]}}.h }, p0, [sp] +; CHECK-DAG: st1h { z{{[01]}}.h }, p0, [sp, #1, mul vl] + %local0 = alloca + %local1 = alloca + store volatile %v0, * %local0 + store volatile %v1, * %local1 + ret void +} + +define void @spill_nxv4f32( %v0, %v1) { +; CHECK-LABEL: spill_nxv4f32 +; CHECK-DAG: st1w { z{{[01]}}.s }, p0, [sp] +; CHECK-DAG: st1w { z{{[01]}}.s }, p0, [sp, #1, mul vl] + %local0 = alloca + %local1 = alloca + store volatile %v0, * %local0 + store volatile %v1, * %local1 + ret void +} + +define void @spill_nxv2f64( %v0, %v1) { +; CHECK-LABEL: spill_nxv2f64 +; CHECK-DAG: st1d { z{{[01]}}.d }, p0, [sp] +; CHECK-DAG: st1d { z{{[01]}}.d }, p0, [sp, #1, mul vl] + %local0 = alloca + %local1 = alloca + store volatile %v0, * %local0 + store volatile %v1, * %local1 + ret void +} + ; Predicate fills define void @fill_nxv16i1() {