diff options
author | Simon Atanasyan <simon@atanasyan.com> | 2019-03-29 15:15:22 +0000 |
---|---|---|
committer | Simon Atanasyan <simon@atanasyan.com> | 2019-03-29 15:15:22 +0000 |
commit | f26f56d6d3d6506fe888f9894bcc270ed7db07c5 (patch) | |
tree | 7754453d4f80633b1f4c6743526925ddcc71f635 /llvm/lib/Target/Mips/MipsSEISelLowering.cpp | |
parent | 4d81e877657a08007b95a839a8125cc1d9a8e00c (diff) | |
download | bcm5719-llvm-f26f56d6d3d6506fe888f9894bcc270ed7db07c5.tar.gz bcm5719-llvm-f26f56d6d3d6506fe888f9894bcc270ed7db07c5.zip |
[mips] Fix lowering a signed immediate for *.d MSA instructions
The `lowerMSASplatImm` function zero-extends `i32` immediates while
building constant. If target type is `i64`, negative immediate loses
the sign. As a result, for example `__builtin_msa_ldi_d(-1)` lowered
to series of instruction loads incorrect value 0xffffffff to the `$w0`
register instead of single `ldi.d $w0, -1` instruction.
The fix zero-extends unsigned immediates and signed-extend signed
immediates.
Differential Revision: http://reviews.llvm.org/D59884
llvm-svn: 357264
Diffstat (limited to 'llvm/lib/Target/Mips/MipsSEISelLowering.cpp')
-rw-r--r-- | llvm/lib/Target/Mips/MipsSEISelLowering.cpp | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/llvm/lib/Target/Mips/MipsSEISelLowering.cpp b/llvm/lib/Target/Mips/MipsSEISelLowering.cpp index ab6ff197ce8..9698a4979e5 100644 --- a/llvm/lib/Target/Mips/MipsSEISelLowering.cpp +++ b/llvm/lib/Target/Mips/MipsSEISelLowering.cpp @@ -1378,9 +1378,10 @@ static SDValue lowerMSASplatZExt(SDValue Op, unsigned OpNr, SelectionDAG &DAG) { static SDValue lowerMSASplatImm(SDValue Op, unsigned ImmOp, SelectionDAG &DAG, bool IsSigned = false) { + auto *CImm = cast<ConstantSDNode>(Op->getOperand(ImmOp)); return DAG.getConstant( APInt(Op->getValueType(0).getScalarType().getSizeInBits(), - Op->getConstantOperandVal(ImmOp), IsSigned), + IsSigned ? CImm->getSExtValue() : CImm->getZExtValue(), IsSigned), SDLoc(Op), Op->getValueType(0)); } |