[PATCH] D130548: [AArch64] Explicitly use v1i64 type for llvm.aarch64.neon.pmull64

Mingming Liu via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 25 23:59:08 PDT 2022


mingmingl updated this revision to Diff 447583.
mingmingl added reviewers: dmgreen, RKSimon, efriedma, davidxl.
mingmingl added a comment.

run 'clang-format' and polish comment


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D130548/new/

https://reviews.llvm.org/D130548

Files:
  llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
  llvm/test/CodeGen/AArch64/pmull-ldr-merge.ll


Index: llvm/test/CodeGen/AArch64/pmull-ldr-merge.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/AArch64/pmull-ldr-merge.ll
@@ -0,0 +1,50 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -verify-machineinstrs  -mtriple=aarch64-linux-gnu -mattr=+v8r,+neon,+crc,+crypto -o - %s| FileCheck %s --check-prefixes=CHECK,CHECK-SDAG
+
+define void @func(ptr %0, i64 %1, i64 %2) {
+; CHECK-LABEL: func:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    subs x8, x2, x1
+; CHECK-NEXT:    b.ls .LBB0_3
+; CHECK-NEXT:  // %bb.1:
+; CHECK-NEXT:    add x9, x0, #8
+; CHECK-NEXT:    lsl x10, x1, #4
+; CHECK-NEXT:  .LBB0_2: // =>This Inner Loop Header: Depth=1
+; CHECK-NEXT:    ldr d0, [x9, x10]
+; CHECK-NEXT:    subs x8, x8, #1
+; CHECK-NEXT:    ldr d1, [x9]
+; CHECK-NEXT:    pmull v0.1q, v1.1d, v0.1d
+; CHECK-NEXT:    stur q0, [x9, #-8]
+; CHECK-NEXT:    add x9, x9, #16
+; CHECK-NEXT:    b.ne .LBB0_2
+; CHECK-NEXT:  .LBB0_3:
+; CHECK-NEXT:    ret
+  %4 = icmp ugt i64 %2, %1
+  br i1 %4, label %5, label %7
+
+5:
+  %6 = sub i64 %2, %1
+  br label %8
+
+7:
+  ret void
+
+8:
+  %9 = phi i64 [ %18, %8 ], [ 0, %5 ]
+  %10 = phi i64 [ %12, %8 ], [ %1, %5 ]
+  %11 = getelementptr inbounds <2 x i64>, ptr %0, i64 %9
+  %12 = add nuw i64 %10, 1
+  %13 = getelementptr inbounds <2 x i64>, ptr %0, i64 %9, i64 1
+  %14 = load i64, ptr %13, align 8
+  %15 = getelementptr inbounds <2 x i64>, ptr %0, i64 %10, i64 1
+  %16 = load i64, ptr %15, align 8
+  %17 = tail call <16 x i8> @llvm.aarch64.neon.pmull64(i64 %14, i64 %16)
+  store <16 x i8> %17, ptr %11, align 16
+  %18 = add i64 %9, 1
+  %19 = icmp eq i64 %18, %6
+  br i1 %19, label %7, label %8
+}
+
+declare <16 x i8> @llvm.aarch64.neon.pmull64(i64, i64)
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; CHECK-SDAG: {{.*}}
Index: llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
===================================================================
--- llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -4512,6 +4512,27 @@
       report_fatal_error("Unexpected type for AArch64 NEON intrinic");
     }
   }
+  case Intrinsic::aarch64_neon_pmull64: {
+    // As a general convention, use "v1" types to represent scalar integer
+    // operations in vector registers.
+    //
+    // This helps ISel to make use of tablegen patterns and generate a load into
+    // SIMD registers directly.
+    SDValue Op1 = Op.getOperand(1);
+    SDValue Op2 = Op.getOperand(2);
+    if (Op1.getNode()->getOpcode() == ISD::LOAD &&
+        Op1.getNode()->getValueType(0) == MVT::i64) {
+      Op1 = DAG.getNode(ISD::BITCAST, dl, MVT::v1i64, Op1);
+    }
+    if (Op2.getNode()->getOpcode() == ISD::LOAD &&
+        Op2.getNode()->getValueType(0) == MVT::i64) {
+      Op2 = DAG.getNode(ISD::BITCAST, dl, MVT::v1i64, Op2);
+    }
+    return DAG.getNode(
+        ISD::INTRINSIC_WO_CHAIN, dl, Op.getValueType(),
+        DAG.getConstant(Intrinsic::aarch64_neon_pmull64, dl, MVT::i32), Op1,
+        Op2);
+  }
   case Intrinsic::aarch64_neon_smax:
     return DAG.getNode(ISD::SMAX, dl, Op.getValueType(),
                        Op.getOperand(1), Op.getOperand(2));


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D130548.447583.patch
Type: text/x-patch
Size: 3296 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220726/82deee03/attachment.bin>


More information about the llvm-commits mailing list