diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/ARM64/MCTargetDesc/ARM64MCCodeEmitter.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM64/MCTargetDesc/ARM64MCCodeEmitter.cpp b/llvm/lib/Target/ARM64/MCTargetDesc/ARM64MCCodeEmitter.cpp index 95020e4395e..f65099e85b0 100644 --- a/llvm/lib/Target/ARM64/MCTargetDesc/ARM64MCCodeEmitter.cpp +++ b/llvm/lib/Target/ARM64/MCTargetDesc/ARM64MCCodeEmitter.cpp @@ -550,6 +550,22 @@ unsigned ARM64MCCodeEmitter::fixMOVZ(const MCInst &MI, unsigned EncodedValue, if (UImm16MO.isImm()) return EncodedValue; + const ARM64MCExpr *A64E = cast<ARM64MCExpr>(UImm16MO.getExpr()); + switch (A64E->getKind()) { + case ARM64MCExpr::VK_DTPREL_G2: + case ARM64MCExpr::VK_DTPREL_G1: + case ARM64MCExpr::VK_DTPREL_G0: + case ARM64MCExpr::VK_GOTTPREL_G1: + case ARM64MCExpr::VK_TPREL_G2: + case ARM64MCExpr::VK_TPREL_G1: + case ARM64MCExpr::VK_TPREL_G0: + return EncodedValue & ~(1u << 30); + default: + // Nothing to do for an unsigned fixup. + return EncodedValue; + } + + return EncodedValue & ~(1u << 30); } |

