Skip to content

Commit def160d

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

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
@@ -251,6 +251,12 @@ def G_URHADD : AArch64GenericInstruction {
251251
let hasSideEffects = 0;
252252
}
253253

254+
def G_SHADD : AArch64GenericInstruction {
255+
let OutOperandList = (outs type0:$dst);
256+
let InOperandList = (ins type0:$src1, type1:$src2);
257+
let hasSideEffects = 0;
258+
}
259+
254260
// Generic instruction for the BSP pseudo. It is expanded into BSP, which
255261
// expands into BSL/BIT/BIF after register allocation.
256262
def G_BSP : AArch64GenericInstruction {
@@ -300,6 +306,7 @@ def : GINodeEquiv<G_USDOT, AArch64usdot>;
300306

301307
def : GINodeEquiv<G_UHADD, avgflooru>;
302308
def : GINodeEquiv<G_URHADD, avgceilu>;
309+
def : GINodeEquiv<G_SHADD, avgfloors>;
303310

304311
def : GINodeEquiv<G_EXTRACT_VECTOR_ELT, vector_extract>;
305312

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1829,6 +1829,8 @@ bool AArch64LegalizerInfo::legalizeIntrinsic(LegalizerHelper &Helper,
18291829
return LowerBinOp(AArch64::G_UHADD);
18301830
case Intrinsic::aarch64_neon_urhadd:
18311831
return LowerBinOp(AArch64::G_URHADD);
1832+
case Intrinsic::aarch64_neon_shadd:
1833+
return LowerBinOp(AArch64::G_SHADD);
18321834
case Intrinsic::aarch64_neon_abs: {
18331835
// Lower the intrinsic to G_ABS.
18341836
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_shadd
76
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for freeze_srhadd
87

98
%struct.T = type { i32, i32 }
@@ -485,12 +484,21 @@ define <8 x i16> @freeze_urhadd(<8 x i16> %a0, <8 x i16> %a1) {
485484
}
486485

487486
define <8 x i16> @freeze_shadd(<8 x i8> %a0, <8 x i16> %a1) {
488-
; CHECK-LABEL: freeze_shadd:
489-
; CHECK: // %bb.0:
490-
; CHECK-NEXT: sshll v0.8h, v0.8b, #0
491-
; CHECK-NEXT: sshr v1.8h, v1.8h, #8
492-
; CHECK-NEXT: shadd v0.8h, v0.8h, v1.8h
493-
; CHECK-NEXT: ret
487+
; CHECK-SD-LABEL: freeze_shadd:
488+
; CHECK-SD: // %bb.0:
489+
; CHECK-SD-NEXT: sshll v0.8h, v0.8b, #0
490+
; CHECK-SD-NEXT: sshr v1.8h, v1.8h, #8
491+
; CHECK-SD-NEXT: shadd v0.8h, v0.8h, v1.8h
492+
; CHECK-SD-NEXT: ret
493+
;
494+
; CHECK-GI-LABEL: freeze_shadd:
495+
; CHECK-GI: // %bb.0:
496+
; CHECK-GI-NEXT: sshll v0.8h, v0.8b, #0
497+
; CHECK-GI-NEXT: sshr v1.8h, v1.8h, #8
498+
; CHECK-GI-NEXT: shadd v0.8h, v0.8h, v1.8h
499+
; CHECK-GI-NEXT: shl v0.8h, v0.8h, #8
500+
; CHECK-GI-NEXT: sshr v0.8h, v0.8h, #8
501+
; CHECK-GI-NEXT: ret
494502
%x0 = sext <8 x i8> %a0 to <8 x i16>
495503
%x1 = ashr <8 x i16> %a1, splat (i16 8)
496504
%avg = call <8 x i16> @llvm.aarch64.neon.shadd.v8i16(<8 x i16> %x0, <8 x i16> %x1)

0 commit comments

Comments
 (0)