Skip to content

Commit 4c9da4f

Browse files
[LLVM][SVE] Add isel for bfloat based constant splats.
There are no dedicated bfloat MOV instructions but we can use the half variants when the encoing allows (e.g. f16(1.875) == bf16(1.0)).
1 parent 05bf293 commit 4c9da4f

File tree

2 files changed

+10
-6
lines changed

2 files changed

+10
-6
lines changed

llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -931,6 +931,13 @@ let Predicates = [HasSVE_or_SME] in {
931931
(FDUP_ZI_S fpimm32:$imm8)>;
932932
def : Pat<(nxv2f64 (splat_vector fpimm64:$imm8)),
933933
(FDUP_ZI_D fpimm64:$imm8)>;
934+
// Some half precision immediates alias with bfloat (e.g. f16(1.875) == bf16(1.0)).
935+
def : Pat<(nxv8bf16 (splat_vector fpimmbf16:$imm8)),
936+
(FDUP_ZI_H (fpimm16XForm bf16:$imm8))>;
937+
def : Pat<(nxv4bf16 (splat_vector fpimmbf16:$imm8)),
938+
(FDUP_ZI_H (fpimm16XForm bf16:$imm8))>;
939+
def : Pat<(nxv2bf16 (splat_vector fpimmbf16:$imm8)),
940+
(FDUP_ZI_H (fpimm16XForm bf16:$imm8))>;
934941
}
935942

936943
// Select elements from either vector (predicated)

llvm/test/CodeGen/AArch64/sve-vector-splat.ll

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -486,8 +486,7 @@ define <vscale x 2 x double> @splat_nxv2f64_imm() {
486486
define <vscale x 8 x bfloat> @splat_nxv8bf16_imm() {
487487
; CHECK-LABEL: splat_nxv8bf16_imm:
488488
; CHECK: // %bb.0:
489-
; CHECK-NEXT: fmov h0, #1.87500000
490-
; CHECK-NEXT: mov z0.h, h0
489+
; CHECK-NEXT: fmov z0.h, #1.87500000
491490
; CHECK-NEXT: ret
492491
ret <vscale x 8 x bfloat> splat(bfloat 1.0)
493492
}
@@ -496,8 +495,7 @@ define <vscale x 8 x bfloat> @splat_nxv8bf16_imm() {
496495
define <vscale x 4 x bfloat> @splat_nxv4bf16_imm() {
497496
; CHECK-LABEL: splat_nxv4bf16_imm:
498497
; CHECK: // %bb.0:
499-
; CHECK-NEXT: fmov h0, #-1.87500000
500-
; CHECK-NEXT: mov z0.h, h0
498+
; CHECK-NEXT: fmov z0.h, #-1.87500000
501499
; CHECK-NEXT: ret
502500
ret <vscale x 4 x bfloat> splat(bfloat -1.0)
503501
}
@@ -506,8 +504,7 @@ define <vscale x 4 x bfloat> @splat_nxv4bf16_imm() {
506504
define <vscale x 2 x bfloat> @splat_nxv2bf16_imm() {
507505
; CHECK-LABEL: splat_nxv2bf16_imm:
508506
; CHECK: // %bb.0:
509-
; CHECK-NEXT: fmov h0, #1.87500000
510-
; CHECK-NEXT: mov z0.h, h0
507+
; CHECK-NEXT: fmov z0.h, #1.87500000
511508
; CHECK-NEXT: ret
512509
ret <vscale x 2 x bfloat> splat(bfloat 1.0)
513510
}

0 commit comments

Comments
 (0)