[llvm] [RISCV][P-ext] Support pabd(u).db/h. (PR #197332)
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Tue May 12 17:05:25 PDT 2026
https://github.com/topperc created https://github.com/llvm/llvm-project/pull/197332
None
>From d9224ec4ed88021f0b6a8d72fb4644bb128f1a5a Mon Sep 17 00:00:00 2001
From: Craig Topper <craig.topper at sifive.com>
Date: Tue, 12 May 2026 17:03:19 -0700
Subject: [PATCH] [RISCV][P-ext] Support pabd(u).db/h.
---
llvm/lib/Target/RISCV/RISCVISelLowering.cpp | 2 ++
llvm/lib/Target/RISCV/RISCVInstrInfoP.td | 10 +++++++
llvm/test/CodeGen/RISCV/rvp-simd-64.ll | 30 +++++----------------
3 files changed, 18 insertions(+), 24 deletions(-)
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index ac1ef084d1d24..650efc96c78d5 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -629,6 +629,8 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
setOperationAction({ISD::AVGFLOORS, ISD::AVGFLOORU}, P64VecVTs, Legal);
setOperationAction({ISD::SMIN, ISD::UMIN, ISD::SMAX, ISD::UMAX},
P64VecVTs, Legal);
+ setOperationAction({ISD::ABS, ISD::ABDS, ISD::ABDU},
+ {MVT::v4i16, MVT::v8i8}, Legal);
setOperationAction(ISD::BUILD_VECTOR, MVT::v2i32, Legal);
setOperationAction(ISD::EXTRACT_VECTOR_ELT, MVT::v2i32, Legal);
setOperationAction(ISD::CONCAT_VECTORS, {MVT::v4i16, MVT::v8i8}, Legal);
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoP.td b/llvm/lib/Target/RISCV/RISCVInstrInfoP.td
index 3f5508f5df4e8..fbdc7db8300d6 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoP.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoP.td
@@ -2258,6 +2258,16 @@ let Predicates = [HasStdExtP, IsRV32] in {
def : PatGprPairGprPair<riscv_asub, PASUB_DW, v2i32>;
def : PatGprPairGprPair<riscv_asubu, PASUBU_DW, v2i32>;
+ // 8-bit absolute difference patterns
+ def : Pat<(v8i8 (abs GPRPair:$rs1)), (PABD_DB GPRPair:$rs1, (v8i8 X0_Pair))>;
+ def : PatGprPairGprPair<abds, PABD_DB, v8i8>;
+ def : PatGprPairGprPair<abdu, PABDU_DB, v8i8>;
+
+ // 16-bit absolute difference patterns
+ def : Pat<(v4i16 (abs GPRPair:$rs1)), (PABD_DH GPRPair:$rs1, (v4i16 X0_Pair))>;
+ def : PatGprPairGprPair<abds, PABD_DH, v4i16>;
+ def : PatGprPairGprPair<abdu, PABDU_DH, v4i16>;
+
// [s|u]min/[s|u]max patterns
def : PatGprPairGprPair<smin, PMIN_DB, v8i8>;
def : PatGprPairGprPair<umin, PMINU_DB, v8i8>;
diff --git a/llvm/test/CodeGen/RISCV/rvp-simd-64.ll b/llvm/test/CodeGen/RISCV/rvp-simd-64.ll
index 6c6ee5ebcf6a8..79d390f3b3867 100644
--- a/llvm/test/CodeGen/RISCV/rvp-simd-64.ll
+++ b/llvm/test/CodeGen/RISCV/rvp-simd-64.ll
@@ -1040,12 +1040,7 @@ define <2 x i32> @test_pabs_w(<2 x i32> %a) {
define <4 x i16> @test_pabs_h(<4 x i16> %a) {
; RV32-LABEL: test_pabs_h:
; RV32: # %bb.0:
-; RV32-NEXT: lui a2, %hi(.LCPI38_0)
-; RV32-NEXT: lw a4, %lo(.LCPI38_0)(a2)
-; RV32-NEXT: addi a2, a2, %lo(.LCPI38_0)
-; RV32-NEXT: lw a5, 4(a2)
-; RV32-NEXT: psub.dh a2, a4, a0
-; RV32-NEXT: pmax.dh a0, a0, a2
+; RV32-NEXT: pabs.dh a0, a0
; RV32-NEXT: ret
;
; RV64-LABEL: test_pabs_h:
@@ -1059,12 +1054,7 @@ define <4 x i16> @test_pabs_h(<4 x i16> %a) {
define <8 x i8> @test_pabs_b(<8 x i8> %a) {
; RV32-LABEL: test_pabs_b:
; RV32: # %bb.0:
-; RV32-NEXT: lui a2, %hi(.LCPI39_0)
-; RV32-NEXT: lw a4, %lo(.LCPI39_0)(a2)
-; RV32-NEXT: addi a2, a2, %lo(.LCPI39_0)
-; RV32-NEXT: lw a5, 4(a2)
-; RV32-NEXT: psub.db a2, a4, a0
-; RV32-NEXT: pmax.db a0, a0, a2
+; RV32-NEXT: pabs.db a0, a0
; RV32-NEXT: ret
;
; RV64-LABEL: test_pabs_b:
@@ -1124,9 +1114,7 @@ define <2 x i32> @test_pdifu_w(<2 x i32> %a, <2 x i32> %b) {
define <4 x i16> @test_pdif_h(<4 x i16> %a, <4 x i16> %b) {
; RV32-LABEL: test_pdif_h:
; RV32: # %bb.0:
-; RV32-NEXT: pmin.dh a4, a0, a2
-; RV32-NEXT: pmax.dh a0, a0, a2
-; RV32-NEXT: psub.dh a0, a0, a4
+; RV32-NEXT: pabd.dh a0, a0, a2
; RV32-NEXT: ret
;
; RV64-LABEL: test_pdif_h:
@@ -1144,9 +1132,7 @@ define <4 x i16> @test_pdif_h(<4 x i16> %a, <4 x i16> %b) {
define <4 x i16> @test_pdifu_h(<4 x i16> %a, <4 x i16> %b) {
; RV32-LABEL: test_pdifu_h:
; RV32: # %bb.0:
-; RV32-NEXT: pminu.dh a4, a0, a2
-; RV32-NEXT: pmaxu.dh a0, a0, a2
-; RV32-NEXT: psub.dh a0, a0, a4
+; RV32-NEXT: pabdu.dh a0, a0, a2
; RV32-NEXT: ret
;
; RV64-LABEL: test_pdifu_h:
@@ -1163,9 +1149,7 @@ define <4 x i16> @test_pdifu_h(<4 x i16> %a, <4 x i16> %b) {
define <8 x i8> @test_pdif_b(<8 x i8> %a, <8 x i8> %b) {
; RV32-LABEL: test_pdif_b:
; RV32: # %bb.0:
-; RV32-NEXT: pmin.db a4, a0, a2
-; RV32-NEXT: pmax.db a0, a0, a2
-; RV32-NEXT: psub.db a0, a0, a4
+; RV32-NEXT: pabd.db a0, a0, a2
; RV32-NEXT: ret
;
; RV64-LABEL: test_pdif_b:
@@ -1182,9 +1166,7 @@ define <8 x i8> @test_pdif_b(<8 x i8> %a, <8 x i8> %b) {
define <8 x i8> @test_pdifu_b(<8 x i8> %a, <8 x i8> %b) {
; RV32-LABEL: test_pdifu_b:
; RV32: # %bb.0:
-; RV32-NEXT: pminu.db a4, a0, a2
-; RV32-NEXT: pmaxu.db a0, a0, a2
-; RV32-NEXT: psub.db a0, a0, a4
+; RV32-NEXT: pabdu.db a0, a0, a2
; RV32-NEXT: ret
;
; RV64-LABEL: test_pdifu_b:
More information about the llvm-commits
mailing list