Skip to content

Commit 1cf088b

Browse files
committed
[AArch64][GlobalISel] Added srhadd intrinsic support
GlobalISel now selects srhadd intrinsic, without falling back to SDAG. Note that GlobalISel-generated code involving uhadd seems to be inefficent when compared to SDAG.
1 parent def160d commit 1cf088b

File tree

3 files changed

+24
-7
lines changed

3 files changed

+24
-7
lines changed

llvm/lib/Target/AArch64/AArch64InstrGISel.td

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,12 @@ def G_SHADD : AArch64GenericInstruction {
257257
let hasSideEffects = 0;
258258
}
259259

260+
def G_SRHADD : AArch64GenericInstruction {
261+
let OutOperandList = (outs type0:$dst);
262+
let InOperandList = (ins type0:$src1, type1:$src2);
263+
let hasSideEffects = 0;
264+
}
265+
260266
// Generic instruction for the BSP pseudo. It is expanded into BSP, which
261267
// expands into BSL/BIT/BIF after register allocation.
262268
def G_BSP : AArch64GenericInstruction {
@@ -307,6 +313,7 @@ def : GINodeEquiv<G_USDOT, AArch64usdot>;
307313
def : GINodeEquiv<G_UHADD, avgflooru>;
308314
def : GINodeEquiv<G_URHADD, avgceilu>;
309315
def : GINodeEquiv<G_SHADD, avgfloors>;
316+
def : GINodeEquiv<G_SRHADD, avgceils>;
310317

311318
def : GINodeEquiv<G_EXTRACT_VECTOR_ELT, vector_extract>;
312319

llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1831,6 +1831,8 @@ bool AArch64LegalizerInfo::legalizeIntrinsic(LegalizerHelper &Helper,
18311831
return LowerBinOp(AArch64::G_URHADD);
18321832
case Intrinsic::aarch64_neon_shadd:
18331833
return LowerBinOp(AArch64::G_SHADD);
1834+
case Intrinsic::aarch64_neon_srhadd:
1835+
return LowerBinOp(AArch64::G_SRHADD);
18341836
case Intrinsic::aarch64_neon_abs: {
18351837
// Lower the intrinsic to G_ABS.
18361838
MIB.buildInstr(TargetOpcode::G_ABS, {MI.getOperand(0)}, {MI.getOperand(2)});

llvm/test/CodeGen/AArch64/freeze.ll

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
; RUN: llc -mtriple=aarch64-unknown-linux-gnu -global-isel -global-isel-abort=2 2>&1 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-GI
44

55
; CHECK-GI: warning: Instruction selection used fallback path for freeze_v2i8
6-
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for freeze_srhadd
76

87
%struct.T = type { i32, i32 }
98

@@ -509,12 +508,21 @@ define <8 x i16> @freeze_shadd(<8 x i8> %a0, <8 x i16> %a1) {
509508
}
510509

511510
define <8 x i16> @freeze_srhadd(<8 x i8> %a0, <8 x i16> %a1) {
512-
; CHECK-LABEL: freeze_srhadd:
513-
; CHECK: // %bb.0:
514-
; CHECK-NEXT: sshll v0.8h, v0.8b, #0
515-
; CHECK-NEXT: sshr v1.8h, v1.8h, #8
516-
; CHECK-NEXT: srhadd v0.8h, v0.8h, v1.8h
517-
; CHECK-NEXT: ret
511+
; CHECK-SD-LABEL: freeze_srhadd:
512+
; CHECK-SD: // %bb.0:
513+
; CHECK-SD-NEXT: sshll v0.8h, v0.8b, #0
514+
; CHECK-SD-NEXT: sshr v1.8h, v1.8h, #8
515+
; CHECK-SD-NEXT: srhadd v0.8h, v0.8h, v1.8h
516+
; CHECK-SD-NEXT: ret
517+
;
518+
; CHECK-GI-LABEL: freeze_srhadd:
519+
; CHECK-GI: // %bb.0:
520+
; CHECK-GI-NEXT: sshll v0.8h, v0.8b, #0
521+
; CHECK-GI-NEXT: sshr v1.8h, v1.8h, #8
522+
; CHECK-GI-NEXT: srhadd v0.8h, v0.8h, v1.8h
523+
; CHECK-GI-NEXT: shl v0.8h, v0.8h, #8
524+
; CHECK-GI-NEXT: sshr v0.8h, v0.8h, #8
525+
; CHECK-GI-NEXT: ret
518526
%x0 = sext <8 x i8> %a0 to <8 x i16>
519527
%x1 = ashr <8 x i16> %a1, splat (i16 8)
520528
%avg = call <8 x i16> @llvm.aarch64.neon.srhadd.v8i16(<8 x i16> %x0, <8 x i16> %x1)

0 commit comments

Comments
 (0)