[llvm] [AArch64][GlobalISel] Legalization for bf16 fptosi.sat/fptoui.sat (PR #209378)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 13 22:46:25 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-aarch64
Author: David Green (davemgreen)
<details>
<summary>Changes</summary>
This is the equivalent change to #<!-- -->209206 for fptoi.sat.
---
Patch is 118.80 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/209378.diff
6 Files Affected:
- (modified) llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp (+6-1)
- (modified) llvm/test/CodeGen/AArch64/bf16-instructions.ll (+2-18)
- (modified) llvm/test/CodeGen/AArch64/bf16-v4-instructions.ll (+159-66)
- (modified) llvm/test/CodeGen/AArch64/bf16-v8-instructions.ll (+585-145)
- (modified) llvm/test/CodeGen/AArch64/round-fptosi-sat-scalar.ll (+692-163)
- (modified) llvm/test/CodeGen/AArch64/round-fptoui-sat-scalar.ll (+693-163)
``````````diff
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
index df8da27e6769d..387ed79893d3c 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
@@ -985,7 +985,12 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
.moreElementsToNextPow2(0)
.widenScalarToNextPow2(0, /*MinSize=*/32)
.minScalar(0, s32)
- .widenScalarOrEltToNextPow2OrMinSize(1, /*MinSize=*/HasFP16 ? 16 : 32)
+ .widenScalarIf(
+ [HasFP16](const LegalityQuery &Query) {
+ return (!HasFP16 && Query.Types[1].getScalarType().isFloat16()) ||
+ Query.Types[1].getScalarType().isBFloat16();
+ },
+ changeElementTo(1, f32))
.widenScalarIf(
[=](const LegalityQuery &Query) {
unsigned ITySize = Query.Types[0].getScalarSizeInBits();
diff --git a/llvm/test/CodeGen/AArch64/bf16-instructions.ll b/llvm/test/CodeGen/AArch64/bf16-instructions.ll
index eb902d36fbf74..9cd31ca7cc99f 100644
--- a/llvm/test/CodeGen/AArch64/bf16-instructions.ll
+++ b/llvm/test/CodeGen/AArch64/bf16-instructions.ll
@@ -4,15 +4,7 @@
; RUN: llc < %s -mtriple aarch64 -mattr=-bf16 -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-CVT,CHECK-CVT-GI
; RUN: llc < %s -mtriple aarch64 -mattr=+bf16 -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-BF16,CHECK-BF16-GI
-; CHECK-CVT-GI: warning: Instruction selection used fallback path for test_fptosi_sat_i8
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_sat_i16
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_sat_i32
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_sat_i64
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i8
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i16
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i32
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i64
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_uitofp_i32
+; CHECK-CVT-GI: warning: Instruction selection used fallback path for test_uitofp_i32
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_uitofp_i64
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i32
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i64
@@ -21,15 +13,7 @@
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fpext_double
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fpext_double_fast
;
-; CHECK-BF16-GI: warning: Instruction selection used fallback path for test_fptosi_sat_i8
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_sat_i16
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_sat_i32
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_sat_i64
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i8
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i16
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i32
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i64
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_uitofp_i32
+; CHECK-BF16-GI: warning: Instruction selection used fallback path for test_uitofp_i32
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_uitofp_i64
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i32
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i64
diff --git a/llvm/test/CodeGen/AArch64/bf16-v4-instructions.ll b/llvm/test/CodeGen/AArch64/bf16-v4-instructions.ll
index 78b48901673b6..ea262467e66fe 100644
--- a/llvm/test/CodeGen/AArch64/bf16-v4-instructions.ll
+++ b/llvm/test/CodeGen/AArch64/bf16-v4-instructions.ll
@@ -4,15 +4,7 @@
; RUN: llc < %s -mtriple aarch64 -mattr=-bf16 -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-CVT,CHECK-CVT-GI
; RUN: llc < %s -mtriple aarch64 -mattr=+bf16 -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-BF16,CHECK-BF16-GI
-; CHECK-CVT-GI: warning: Instruction selection used fallback path for test_fptosi_sat_i8
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_sat_i16
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_sat_i32
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_sat_i64
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i8
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i16
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i32
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i64
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i8
+; CHECK-CVT-GI: warning: Instruction selection used fallback path for test_sitofp_i8
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i16
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i32
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i64
@@ -21,15 +13,7 @@
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_uitofp_i32
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_uitofp_i64
;
-; CHECK-BF16-GI: warning: Instruction selection used fallback path for test_fptosi_sat_i8
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_sat_i16
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_sat_i32
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_sat_i64
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i8
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i16
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i32
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i64
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i8
+; CHECK-BF16-GI: warning: Instruction selection used fallback path for test_sitofp_i8
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i16
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i32
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i64
@@ -1361,16 +1345,49 @@ define <4 x i64> @test_fptoui_i64(<4 x bfloat> %a) #0 {
}
define <4 x i8> @test_fptosi_sat_i8(<4 x bfloat> %a) {
-; CHECK-LABEL: test_fptosi_sat_i8:
-; CHECK: // %bb.0:
-; CHECK-NEXT: shll v0.4s, v0.4h, #16
-; CHECK-NEXT: movi v1.4s, #127
-; CHECK-NEXT: fcvtzs v0.4s, v0.4s
-; CHECK-NEXT: smin v0.4s, v0.4s, v1.4s
-; CHECK-NEXT: mvni v1.4s, #127
-; CHECK-NEXT: smax v0.4s, v0.4s, v1.4s
-; CHECK-NEXT: xtn v0.4h, v0.4s
-; CHECK-NEXT: ret
+; CHECK-CVT-SD-LABEL: test_fptosi_sat_i8:
+; CHECK-CVT-SD: // %bb.0:
+; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT: movi v1.4s, #127
+; CHECK-CVT-SD-NEXT: fcvtzs v0.4s, v0.4s
+; CHECK-CVT-SD-NEXT: smin v0.4s, v0.4s, v1.4s
+; CHECK-CVT-SD-NEXT: mvni v1.4s, #127
+; CHECK-CVT-SD-NEXT: smax v0.4s, v0.4s, v1.4s
+; CHECK-CVT-SD-NEXT: xtn v0.4h, v0.4s
+; CHECK-CVT-SD-NEXT: ret
+;
+; CHECK-BF16-SD-LABEL: test_fptosi_sat_i8:
+; CHECK-BF16-SD: // %bb.0:
+; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT: movi v1.4s, #127
+; CHECK-BF16-SD-NEXT: fcvtzs v0.4s, v0.4s
+; CHECK-BF16-SD-NEXT: smin v0.4s, v0.4s, v1.4s
+; CHECK-BF16-SD-NEXT: mvni v1.4s, #127
+; CHECK-BF16-SD-NEXT: smax v0.4s, v0.4s, v1.4s
+; CHECK-BF16-SD-NEXT: xtn v0.4h, v0.4s
+; CHECK-BF16-SD-NEXT: ret
+;
+; CHECK-CVT-GI-LABEL: test_fptosi_sat_i8:
+; CHECK-CVT-GI: // %bb.0:
+; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT: movi v1.4s, #127
+; CHECK-CVT-GI-NEXT: mvni v2.4s, #127
+; CHECK-CVT-GI-NEXT: fcvtzs v0.4s, v0.4s
+; CHECK-CVT-GI-NEXT: smin v0.4s, v0.4s, v1.4s
+; CHECK-CVT-GI-NEXT: smax v0.4s, v0.4s, v2.4s
+; CHECK-CVT-GI-NEXT: xtn v0.4h, v0.4s
+; CHECK-CVT-GI-NEXT: ret
+;
+; CHECK-BF16-GI-LABEL: test_fptosi_sat_i8:
+; CHECK-BF16-GI: // %bb.0:
+; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT: movi v1.4s, #127
+; CHECK-BF16-GI-NEXT: mvni v2.4s, #127
+; CHECK-BF16-GI-NEXT: fcvtzs v0.4s, v0.4s
+; CHECK-BF16-GI-NEXT: smin v0.4s, v0.4s, v1.4s
+; CHECK-BF16-GI-NEXT: smax v0.4s, v0.4s, v2.4s
+; CHECK-BF16-GI-NEXT: xtn v0.4h, v0.4s
+; CHECK-BF16-GI-NEXT: ret
%i = call <4 x i8> @llvm.fptosi.sat.v4i8.v4bf16(<4 x bfloat> %a)
ret <4 x i8> %i
}
@@ -1397,25 +1414,63 @@ define <4 x i32> @test_fptosi_sat_i32(<4 x bfloat> %a) {
}
define <4 x i64> @test_fptosi_sat_i64(<4 x bfloat> %a) {
-; CHECK-LABEL: test_fptosi_sat_i64:
-; CHECK: // %bb.0:
-; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
-; CHECK-NEXT: mov h1, v0.h[2]
-; CHECK-NEXT: mov h2, v0.h[1]
-; CHECK-NEXT: mov h3, v0.h[3]
-; CHECK-NEXT: shll v0.4s, v0.4h, #16
-; CHECK-NEXT: shll v1.4s, v1.4h, #16
-; CHECK-NEXT: shll v2.4s, v2.4h, #16
-; CHECK-NEXT: shll v3.4s, v3.4h, #16
-; CHECK-NEXT: fcvtzs x8, s0
-; CHECK-NEXT: fcvtzs x9, s1
-; CHECK-NEXT: fcvtzs x10, s2
-; CHECK-NEXT: fcvtzs x11, s3
-; CHECK-NEXT: fmov d0, x8
-; CHECK-NEXT: fmov d1, x9
-; CHECK-NEXT: mov v0.d[1], x10
-; CHECK-NEXT: mov v1.d[1], x11
-; CHECK-NEXT: ret
+; CHECK-CVT-SD-LABEL: test_fptosi_sat_i64:
+; CHECK-CVT-SD: // %bb.0:
+; CHECK-CVT-SD-NEXT: // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-SD-NEXT: mov h1, v0.h[2]
+; CHECK-CVT-SD-NEXT: mov h2, v0.h[1]
+; CHECK-CVT-SD-NEXT: mov h3, v0.h[3]
+; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT: shll v2.4s, v2.4h, #16
+; CHECK-CVT-SD-NEXT: shll v3.4s, v3.4h, #16
+; CHECK-CVT-SD-NEXT: fcvtzs x8, s0
+; CHECK-CVT-SD-NEXT: fcvtzs x9, s1
+; CHECK-CVT-SD-NEXT: fcvtzs x10, s2
+; CHECK-CVT-SD-NEXT: fcvtzs x11, s3
+; CHECK-CVT-SD-NEXT: fmov d0, x8
+; CHECK-CVT-SD-NEXT: fmov d1, x9
+; CHECK-CVT-SD-NEXT: mov v0.d[1], x10
+; CHECK-CVT-SD-NEXT: mov v1.d[1], x11
+; CHECK-CVT-SD-NEXT: ret
+;
+; CHECK-BF16-SD-LABEL: test_fptosi_sat_i64:
+; CHECK-BF16-SD: // %bb.0:
+; CHECK-BF16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-SD-NEXT: mov h1, v0.h[2]
+; CHECK-BF16-SD-NEXT: mov h2, v0.h[1]
+; CHECK-BF16-SD-NEXT: mov h3, v0.h[3]
+; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT: shll v2.4s, v2.4h, #16
+; CHECK-BF16-SD-NEXT: shll v3.4s, v3.4h, #16
+; CHECK-BF16-SD-NEXT: fcvtzs x8, s0
+; CHECK-BF16-SD-NEXT: fcvtzs x9, s1
+; CHECK-BF16-SD-NEXT: fcvtzs x10, s2
+; CHECK-BF16-SD-NEXT: fcvtzs x11, s3
+; CHECK-BF16-SD-NEXT: fmov d0, x8
+; CHECK-BF16-SD-NEXT: fmov d1, x9
+; CHECK-BF16-SD-NEXT: mov v0.d[1], x10
+; CHECK-BF16-SD-NEXT: mov v1.d[1], x11
+; CHECK-BF16-SD-NEXT: ret
+;
+; CHECK-CVT-GI-LABEL: test_fptosi_sat_i64:
+; CHECK-CVT-GI: // %bb.0:
+; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT: fcvtl v1.2d, v0.2s
+; CHECK-CVT-GI-NEXT: fcvtl2 v2.2d, v0.4s
+; CHECK-CVT-GI-NEXT: fcvtzs v0.2d, v1.2d
+; CHECK-CVT-GI-NEXT: fcvtzs v1.2d, v2.2d
+; CHECK-CVT-GI-NEXT: ret
+;
+; CHECK-BF16-GI-LABEL: test_fptosi_sat_i64:
+; CHECK-BF16-GI: // %bb.0:
+; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT: fcvtl v1.2d, v0.2s
+; CHECK-BF16-GI-NEXT: fcvtl2 v2.2d, v0.4s
+; CHECK-BF16-GI-NEXT: fcvtzs v0.2d, v1.2d
+; CHECK-BF16-GI-NEXT: fcvtzs v1.2d, v2.2d
+; CHECK-BF16-GI-NEXT: ret
%i = call <4 x i64> @llvm.fptosi.sat.v4i64.v4bf16(<4 x bfloat> %a)
ret <4 x i64> %i
}
@@ -1455,25 +1510,63 @@ define <4 x i32> @test_fptoui_sat_i32(<4 x bfloat> %a) {
}
define <4 x i64> @test_fptoui_sat_i64(<4 x bfloat> %a) {
-; CHECK-LABEL: test_fptoui_sat_i64:
-; CHECK: // %bb.0:
-; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0
-; CHECK-NEXT: mov h1, v0.h[2]
-; CHECK-NEXT: mov h2, v0.h[1]
-; CHECK-NEXT: mov h3, v0.h[3]
-; CHECK-NEXT: shll v0.4s, v0.4h, #16
-; CHECK-NEXT: shll v1.4s, v1.4h, #16
-; CHECK-NEXT: shll v2.4s, v2.4h, #16
-; CHECK-NEXT: shll v3.4s, v3.4h, #16
-; CHECK-NEXT: fcvtzu x8, s0
-; CHECK-NEXT: fcvtzu x9, s1
-; CHECK-NEXT: fcvtzu x10, s2
-; CHECK-NEXT: fcvtzu x11, s3
-; CHECK-NEXT: fmov d0, x8
-; CHECK-NEXT: fmov d1, x9
-; CHECK-NEXT: mov v0.d[1], x10
-; CHECK-NEXT: mov v1.d[1], x11
-; CHECK-NEXT: ret
+; CHECK-CVT-SD-LABEL: test_fptoui_sat_i64:
+; CHECK-CVT-SD: // %bb.0:
+; CHECK-CVT-SD-NEXT: // kill: def $d0 killed $d0 def $q0
+; CHECK-CVT-SD-NEXT: mov h1, v0.h[2]
+; CHECK-CVT-SD-NEXT: mov h2, v0.h[1]
+; CHECK-CVT-SD-NEXT: mov h3, v0.h[3]
+; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT: shll v1.4s, v1.4h, #16
+; CHECK-CVT-SD-NEXT: shll v2.4s, v2.4h, #16
+; CHECK-CVT-SD-NEXT: shll v3.4s, v3.4h, #16
+; CHECK-CVT-SD-NEXT: fcvtzu x8, s0
+; CHECK-CVT-SD-NEXT: fcvtzu x9, s1
+; CHECK-CVT-SD-NEXT: fcvtzu x10, s2
+; CHECK-CVT-SD-NEXT: fcvtzu x11, s3
+; CHECK-CVT-SD-NEXT: fmov d0, x8
+; CHECK-CVT-SD-NEXT: fmov d1, x9
+; CHECK-CVT-SD-NEXT: mov v0.d[1], x10
+; CHECK-CVT-SD-NEXT: mov v1.d[1], x11
+; CHECK-CVT-SD-NEXT: ret
+;
+; CHECK-BF16-SD-LABEL: test_fptoui_sat_i64:
+; CHECK-BF16-SD: // %bb.0:
+; CHECK-BF16-SD-NEXT: // kill: def $d0 killed $d0 def $q0
+; CHECK-BF16-SD-NEXT: mov h1, v0.h[2]
+; CHECK-BF16-SD-NEXT: mov h2, v0.h[1]
+; CHECK-BF16-SD-NEXT: mov h3, v0.h[3]
+; CHECK-BF16-SD-NEXT: shll v0.4s, v0.4h, #16
+; CHECK-BF16-SD-NEXT: shll v1.4s, v1.4h, #16
+; CHECK-BF16-SD-NEXT: shll v2.4s, v2.4h, #16
+; CHECK-BF16-SD-NEXT: shll v3.4s, v3.4h, #16
+; CHECK-BF16-SD-NEXT: fcvtzu x8, s0
+; CHECK-BF16-SD-NEXT: fcvtzu x9, s1
+; CHECK-BF16-SD-NEXT: fcvtzu x10, s2
+; CHECK-BF16-SD-NEXT: fcvtzu x11, s3
+; CHECK-BF16-SD-NEXT: fmov d0, x8
+; CHECK-BF16-SD-NEXT: fmov d1, x9
+; CHECK-BF16-SD-NEXT: mov v0.d[1], x10
+; CHECK-BF16-SD-NEXT: mov v1.d[1], x11
+; CHECK-BF16-SD-NEXT: ret
+;
+; CHECK-CVT-GI-LABEL: test_fptoui_sat_i64:
+; CHECK-CVT-GI: // %bb.0:
+; CHECK-CVT-GI-NEXT: shll v0.4s, v0.4h, #16
+; CHECK-CVT-GI-NEXT: fcvtl v1.2d, v0.2s
+; CHECK-CVT-GI-NEXT: fcvtl2 v2.2d, v0.4s
+; CHECK-CVT-GI-NEXT: fcvtzu v0.2d, v1.2d
+; CHECK-CVT-GI-NEXT: fcvtzu v1.2d, v2.2d
+; CHECK-CVT-GI-NEXT: ret
+;
+; CHECK-BF16-GI-LABEL: test_fptoui_sat_i64:
+; CHECK-BF16-GI: // %bb.0:
+; CHECK-BF16-GI-NEXT: shll v0.4s, v0.4h, #16
+; CHECK-BF16-GI-NEXT: fcvtl v1.2d, v0.2s
+; CHECK-BF16-GI-NEXT: fcvtl2 v2.2d, v0.4s
+; CHECK-BF16-GI-NEXT: fcvtzu v0.2d, v1.2d
+; CHECK-BF16-GI-NEXT: fcvtzu v1.2d, v2.2d
+; CHECK-BF16-GI-NEXT: ret
%i = call <4 x i64> @llvm.fptoui.sat.v4i64.v4bf16(<4 x bfloat> %a)
ret <4 x i64> %i
}
diff --git a/llvm/test/CodeGen/AArch64/bf16-v8-instructions.ll b/llvm/test/CodeGen/AArch64/bf16-v8-instructions.ll
index 382576f94dfdd..85faf1facc264 100644
--- a/llvm/test/CodeGen/AArch64/bf16-v8-instructions.ll
+++ b/llvm/test/CodeGen/AArch64/bf16-v8-instructions.ll
@@ -5,15 +5,7 @@
; RUN: llc < %s -mtriple aarch64 -mattr=-bf16 -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-CVT,CHECK-CVT-GI
; RUN: llc < %s -mtriple aarch64 -mattr=+bf16 -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-BF16,CHECK-BF16-GI
-; CHECK-CVT-GI: warning: Instruction selection used fallback path for test_fptosi_sat_i8
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_sat_i16
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_sat_i32
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_sat_i64
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i8
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i16
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i32
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i64
-; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i8
+; CHECK-CVT-GI: warning: Instruction selection used fallback path for test_sitofp_i8
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_v16i8
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i16
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i32
@@ -24,15 +16,7 @@
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_uitofp_i32
; CHECK-CVT-GI-NEXT: warning: Instruction selection used fallback path for test_uitofp_i64
;
-; CHECK-BF16-GI: warning: Instruction selection used fallback path for test_fptosi_sat_i8
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_sat_i16
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_sat_i32
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptosi_sat_i64
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i8
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i16
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i32
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_fptoui_sat_i64
-; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i8
+; CHECK-BF16-GI: warning: Instruction selection used fallback path for test_sitofp_i8
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_v16i8
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i16
; CHECK-BF16-GI-NEXT: warning: Instruction selection used fallback path for test_sitofp_i32
@@ -3056,168 +3040,624 @@ define <8 x i64> @test_fptoui_i64(<8 x bfloat> %a) #0 {
}
define <8 x i8> @test_fptosi_sat_i8(<8 x bfloat> %a) {
-; CHECK-LABEL: test_fptosi_sat_i8:
-; CHECK: // %bb.0:
-; CHECK-NEXT: shll2 v2.4s, v0.8h, #16
-; CHECK-NEXT: shll v0.4s, v0.4h, #16
-; CHECK-NEXT: movi v1.4s, #127
-; CHECK-NEXT: mvni v3.4s, #127
-; CHECK-NEXT: fcvtzs v2.4s, v2.4s
-; CHECK-NEXT: fcvtzs v0.4s, v0.4s
-; CHECK-NEXT: smin v2.4s, v2.4s, v1.4s
-; CHECK-NEXT: smin v0.4s, v0.4s, v1.4s
-; CHECK-NEXT: smax v1.4s, v2.4s, v3.4s
-; CHECK-NEXT: smax v0.4s, v0.4s, v3.4s
-; CHECK-NEXT: uzp1 v0.8h, v0.8h, v1.8h
-; CHECK-NEXT: xtn v0.8b, v0.8h
-; CHECK-NEXT: ret
+; CHECK-CVT-SD-LABEL: test_fptosi_sat_i8:
+; CHECK-CVT-SD: // %bb.0:
+; CHECK-CVT-SD-NEXT: shll2 v2.4s, v0.8h, #16
+; CHECK-CVT-SD-NEXT: shll v0.4s, v0.4h, #16
+; CHECK-CVT-SD-NEXT: movi v1.4s, #127
+; CHECK-CVT-SD-NEXT: mvni v3...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/209378
More information about the llvm-commits
mailing list