diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp | 27 | ||||
-rw-r--r-- | llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCExpr.cpp | 8 | ||||
-rw-r--r-- | llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCExpr.h | 3 |
3 files changed, 22 insertions, 16 deletions
diff --git a/llvm/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp b/llvm/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp index 44d1dd64e12..89340eb581e 100644 --- a/llvm/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp +++ b/llvm/lib/Target/Hexagon/AsmParser/HexagonAsmParser.cpp @@ -361,20 +361,17 @@ public: void addSignedImmOperands(MCInst &Inst, unsigned N) const { assert(N == 1 && "Invalid number of operands!"); - MCExpr const *Expr = getImm(); + HexagonMCExpr *Expr = + const_cast<HexagonMCExpr *>(cast<HexagonMCExpr>(getImm())); int64_t Value; if (!Expr->evaluateAsAbsolute(Value)) { Inst.addOperand(MCOperand::createExpr(Expr)); return; } - int64_t Extended = SignExtend64 (Value, 32); - if ((Extended < 0) == (Value < 0)) { - Inst.addOperand(MCOperand::createExpr(Expr)); - return; - } - // Flip bit 33 to signal signed unsigned mismatch - Extended ^= 0x100000000; - Inst.addOperand(MCOperand::createImm(Extended)); + int64_t Extended = SignExtend64(Value, 32); + if ((Extended < 0) != (Value < 0)) + Expr->setSignMismatch(); + Inst.addOperand(MCOperand::createExpr(Expr)); } void addf32ExtOperands(MCInst &Inst, unsigned N) const { @@ -763,17 +760,15 @@ void HexagonAsmParser::canonicalizeImmediates(MCInst &MCI) { for (MCOperand &I : MCI) if (I.isImm()) { int64_t Value (I.getImm()); - if ((Value & 0x100000000) != (Value & 0x80000000)) { - // Detect flipped bit 33 wrt bit 32 and signal warning - Value ^= 0x100000000; - if (WarnSignedMismatch) - Warning (MCI.getLoc(), "Signed/Unsigned mismatch"); - } NewInst.addOperand(MCOperand::createExpr(HexagonMCExpr::create( MCConstantExpr::create(Value, getContext()), getContext()))); } - else + else { + if (I.isExpr() && cast<HexagonMCExpr>(I.getExpr())->signMismatch() && + WarnSignedMismatch) + Warning (MCI.getLoc(), "Signed/Unsigned mismatch"); NewInst.addOperand(I); + } MCI = NewInst; } diff --git a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCExpr.cpp b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCExpr.cpp index 8a83e7b1b9b..329c3611aa8 100644 --- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCExpr.cpp +++ b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCExpr.cpp @@ -67,3 +67,11 @@ HexagonMCExpr::HexagonMCExpr(MCExpr const *Expr) void HexagonMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const { Expr->print(OS, MAI); } + +void HexagonMCExpr::setSignMismatch(bool Val) { + SignMismatch = Val; +} + +bool HexagonMCExpr::signMismatch() const { + return SignMismatch; +}
\ No newline at end of file diff --git a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCExpr.h b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCExpr.h index 1396f2df02e..bca40cfaf6f 100644 --- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCExpr.h +++ b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCExpr.h @@ -31,6 +31,8 @@ public: bool mustNotExtend() const; void setS23_2_reloc(bool Val = true); bool s23_2_reloc() const; + void setSignMismatch(bool Val = true); + bool signMismatch() const; private: HexagonMCExpr(MCExpr const *Expr); @@ -38,6 +40,7 @@ private: bool MustNotExtend; bool MustExtend; bool S23_2_reloc; + bool SignMismatch; }; } // end namespace llvm |