[llvm] 398df66 - [JITLink][AArch64] Implement MoveWide16 generic edge.
Sunho Kim via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 13 21:52:07 PDT 2022
Author: Sunho Kim
Date: 2022-06-14T13:51:47+09:00
New Revision: 398df667d6d1d8c0c60bca3a9c6e8ff1419ff958
URL: https://github.com/llvm/llvm-project/commit/398df667d6d1d8c0c60bca3a9c6e8ff1419ff958
DIFF: https://github.com/llvm/llvm-project/commit/398df667d6d1d8c0c60bca3a9c6e8ff1419ff958.diff
LOG: [JITLink][AArch64] Implement MoveWide16 generic edge.
Implements MoveWide16 generic edge kind that can be used to patch MOVZ/MOVK (imm16) instructions.
Reviewed By: lhames
Differential Revision: https://reviews.llvm.org/D127584
Added:
Modified:
llvm/include/llvm/ExecutionEngine/JITLink/aarch64.h
llvm/lib/ExecutionEngine/JITLink/aarch64.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/aarch64.h b/llvm/include/llvm/ExecutionEngine/JITLink/aarch64.h
index 2cebc03310e17..42a01c25de146 100644
--- a/llvm/include/llvm/ExecutionEngine/JITLink/aarch64.h
+++ b/llvm/include/llvm/ExecutionEngine/JITLink/aarch64.h
@@ -28,6 +28,7 @@ enum EdgeKind_aarch64 : Edge::Kind {
Pointer64Anon,
Page21,
PageOffset12,
+ MoveWide16,
GOTPage21,
GOTPageOffset12,
TLVPage21,
@@ -72,6 +73,25 @@ inline unsigned getPageOffset12Shift(uint32_t Instr) {
return 0;
}
+// Returns whether the Instr is MOVK/MOVZ (imm16) with a zero immediate field
+inline bool isMoveWideImm16(uint32_t Instr) {
+ constexpr uint32_t MoveWideImm16Mask = 0x5f9fffe0;
+ return (Instr & MoveWideImm16Mask) == 0x52800000;
+}
+
+// Returns the amount the address operand of MOVK/MOVZ (imm16)
+// should be shifted right by.
+//
+// The shift value is specfied in the assembly as LSL #<shift>.
+inline unsigned getMoveWide16Shift(uint32_t Instr) {
+ if (isMoveWideImm16(Instr)) {
+ uint32_t ImplicitShift = (Instr >> 21) & 0b11;
+ return ImplicitShift << 4;
+ }
+
+ return 0;
+}
+
/// Apply fixup expression for edge to block content.
inline Error applyFixup(LinkGraph &G, Block &B, const Edge &E) {
using namespace support;
@@ -152,6 +172,20 @@ inline Error applyFixup(LinkGraph &G, Block &B, const Edge &E) {
*(ulittle32_t *)FixupPtr = FixedInstr;
break;
}
+ case MoveWide16: {
+ uint64_t TargetOffset =
+ (E.getTarget().getAddress() + E.getAddend()).getValue();
+
+ uint32_t RawInstr = *(ulittle32_t *)FixupPtr;
+ assert(isMoveWideImm16(RawInstr) &&
+ "RawInstr isn't a MOVK/MOVZ instruction");
+
+ unsigned ImmShift = getMoveWide16Shift(RawInstr);
+ uint32_t Imm = (TargetOffset >> ImmShift) & 0xffff;
+ uint32_t FixedInstr = RawInstr | (Imm << 5);
+ *(ulittle32_t *)FixupPtr = FixedInstr;
+ break;
+ }
case LDRLiteral19: {
assert((FixupAddress.getValue() & 0x3) == 0 && "LDR is not 32-bit aligned");
assert(E.getAddend() == 0 && "LDRLiteral19 with non-zero addend");
diff --git a/llvm/lib/ExecutionEngine/JITLink/aarch64.cpp b/llvm/lib/ExecutionEngine/JITLink/aarch64.cpp
index 1397a45df4c2f..28a6f9ce90d92 100644
--- a/llvm/lib/ExecutionEngine/JITLink/aarch64.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/aarch64.cpp
@@ -38,6 +38,8 @@ const char *getEdgeKindName(Edge::Kind R) {
return "Page21";
case PageOffset12:
return "PageOffset12";
+ case MoveWide16:
+ return "MoveWide16";
case GOTPage21:
return "GOTPage21";
case GOTPageOffset12:
More information about the llvm-commits
mailing list