diff options
author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2018-07-25 16:20:59 +0000 |
---|---|---|
committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2018-07-25 16:20:59 +0000 |
commit | 4e07509d18f17b5ea387d2ddc16381ccb316927b (patch) | |
tree | e8bf8f00a2764c8f56965f5cd056b50f4d3de78b /llvm/lib | |
parent | 78ab659bb41296a47f8793614e9ac44cfe55aaa6 (diff) | |
download | bcm5719-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.cpp | 4 |
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 |