]> granicus.if.org Git - llvm/commitdiff
[Hexagon] Patch to Extract i1 element from vector of i1
authorRon Lieberman <ronl@codeaurora.org>
Mon, 2 Oct 2017 00:16:15 +0000 (00:16 +0000)
committerRon Lieberman <ronl@codeaurora.org>
Mon, 2 Oct 2017 00:16:15 +0000 (00:16 +0000)
This patch extracts 1 element from vector consisting
of elements of size 1 bit at given index.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@314641 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Hexagon/HexagonISelLowering.cpp
test/CodeGen/Hexagon/vect/vect-extract-i1.ll [new file with mode: 0644]

index fcde4224a0075f3d6f0b85850786c93f3a914adb..0d2b27f089e497fa592e8a210a1f179dab9b3640 100644 (file)
@@ -2750,7 +2750,13 @@ HexagonTargetLowering::LowerEXTRACT_VECTOR(SDValue Op,
     MVT SVT = VecVT.getSimpleVT();
     uint64_t W = CW->getZExtValue();
 
-    if (W == 32) {
+    if (W == 1) {
+      MVT LocVT = MVT::getIntegerVT(SVT.getSizeInBits());
+      SDValue VecCast = DAG.getNode(ISD::BITCAST, dl, LocVT, Vec);
+      SDValue Shifted = DAG.getNode(ISD::SRA, dl, LocVT, VecCast, Offset);
+      return DAG.getNode(ISD::AND, dl, LocVT, Shifted,
+                         DAG.getConstant(1, dl, LocVT));
+    } else if (W == 32) {
       // Translate this node into EXTRACT_SUBREG.
       unsigned Subreg = (X == 0) ? Hexagon::isub_lo : 0;
 
diff --git a/test/CodeGen/Hexagon/vect/vect-extract-i1.ll b/test/CodeGen/Hexagon/vect/vect-extract-i1.ll
new file mode 100644 (file)
index 0000000..8bcf176
--- /dev/null
@@ -0,0 +1,9 @@
+; RUN: llc -march=hexagon < %s
+
+define i1 @t_i4x8(<4 x i8> %a, <4 x i8> %b) nounwind {
+entry:
+       %0 = add <4 x i8> %a, %b
+        %1 = bitcast <4 x i8> %0 to <32 x i1>
+        %2 = extractelement <32 x i1> %1, i32 0
+       ret i1 %2
+}