summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>2018-07-25 16:20:59 +0000
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>2018-07-25 16:20:59 +0000
commit4e07509d18f17b5ea387d2ddc16381ccb316927b (patch)
treee8bf8f00a2764c8f56965f5cd056b50f4d3de78b /llvm/lib
parent78ab659bb41296a47f8793614e9ac44cfe55aaa6 (diff)
downloadbcm5719-llvm-4e07509d18f17b5ea387d2ddc16381ccb316927b.tar.gz
bcm5719-llvm-4e07509d18f17b5ea387d2ddc16381ccb316927b.zip
[Hexagon] Properly scale bit index when extracting elements from vNi1
For example v = <2 x i1> is represented as bbbbaaaa in a predicate register, where b = v[1], a = v[0]. Extracting v[1] is equivalent to extracting bit 4 from the predicate register. llvm-svn: 337934
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/Hexagon/HexagonISelLowering.cpp4
1 files changed, 3 insertions, 1 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp b/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp
index 29cf70ab8e1..604d84994b6 100644
--- a/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp
+++ b/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp
@@ -2327,7 +2327,9 @@ HexagonTargetLowering::extractVector(SDValue VecV, SDValue IdxV,
// If the value extracted is a single bit, use tstbit.
if (ValWidth == 1) {
SDValue A0 = getInstr(Hexagon::C2_tfrpr, dl, MVT::i32, {VecV}, DAG);
- return DAG.getNode(HexagonISD::TSTBIT, dl, MVT::i1, A0, IdxV);
+ SDValue M0 = DAG.getConstant(8 / VecWidth, dl, MVT::i32);
+ SDValue I0 = DAG.getNode(ISD::MUL, dl, MVT::i32, IdxV, M0);
+ return DAG.getNode(HexagonISD::TSTBIT, dl, MVT::i1, A0, I0);
}
// Each bool vector (v2i1, v4i1, v8i1) always occupies 8 bits in
OpenPOWER on IntegriCloud