summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2019-07-18 16:51:53 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2019-07-18 16:51:53 +0000
commit76427f849fc94ca36e11b0a9d648fa0bba1e22b9 (patch)
tree2fee8634fdefdbfea0ef681a404ff57a7af90495 /llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
parentcb2d8e912512305fb5c45cf0f35f654f713dfa7c (diff)
downloadbcm5719-llvm-76427f849fc94ca36e11b0a9d648fa0bba1e22b9.tar.gz
bcm5719-llvm-76427f849fc94ca36e11b0a9d648fa0bba1e22b9.zip
AArch64: Unify relocation restrictions between MOVK/MOVN/MOVZ.
There doesn't seem to be a practical reason for these instructions to have different restrictions on the types of relocations that they may be used with, notwithstanding the language in the ELF AArch64 spec that implies that specific relocations are meant to be used with specific instructions. For example, we currently forbid the first instruction in the following sequence, despite it currently being used by clang to generate a global reference under -mcmodel=large: movz x0, #:abs_g0_nc:foo movk x0, #:abs_g1_nc:foo movk x0, #:abs_g2_nc:foo movk x0, #:abs_g3:foo Therefore, allow MOVK/MOVN/MOVZ to accept the union of the set of relocations that they currently accept individually. Differential Revision: https://reviews.llvm.org/D64466 llvm-svn: 366461
Diffstat (limited to 'llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp')
-rw-r--r--llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp51
1 files changed, 17 insertions, 34 deletions
diff --git a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
index f4c55d48d21..21a8b66b5c8 100644
--- a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
+++ b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
@@ -935,48 +935,31 @@ public:
return false;
}
- bool isMovZSymbolG3() const {
+ bool isMovWSymbolG3() const {
return isMovWSymbol(AArch64MCExpr::VK_ABS_G3);
}
- bool isMovZSymbolG2() const {
- return isMovWSymbol({AArch64MCExpr::VK_ABS_G2, AArch64MCExpr::VK_ABS_G2_S,
- AArch64MCExpr::VK_TPREL_G2,
- AArch64MCExpr::VK_DTPREL_G2});
- }
-
- bool isMovZSymbolG1() const {
- return isMovWSymbol({
- AArch64MCExpr::VK_ABS_G1, AArch64MCExpr::VK_ABS_G1_S,
- AArch64MCExpr::VK_GOTTPREL_G1, AArch64MCExpr::VK_TPREL_G1,
- AArch64MCExpr::VK_DTPREL_G1,
- });
- }
-
- bool isMovZSymbolG0() const {
- return isMovWSymbol({AArch64MCExpr::VK_ABS_G0, AArch64MCExpr::VK_ABS_G0_S,
- AArch64MCExpr::VK_TPREL_G0,
- AArch64MCExpr::VK_DTPREL_G0});
- }
-
- bool isMovKSymbolG3() const {
- return isMovWSymbol(AArch64MCExpr::VK_ABS_G3);
- }
-
- bool isMovKSymbolG2() const {
- return isMovWSymbol(AArch64MCExpr::VK_ABS_G2_NC);
+ bool isMovWSymbolG2() const {
+ return isMovWSymbol(
+ {AArch64MCExpr::VK_ABS_G2, AArch64MCExpr::VK_ABS_G2_S,
+ AArch64MCExpr::VK_ABS_G2_NC, AArch64MCExpr::VK_TPREL_G2,
+ AArch64MCExpr::VK_DTPREL_G2});
}
- bool isMovKSymbolG1() const {
- return isMovWSymbol({AArch64MCExpr::VK_ABS_G1_NC,
- AArch64MCExpr::VK_TPREL_G1_NC,
- AArch64MCExpr::VK_DTPREL_G1_NC});
+ bool isMovWSymbolG1() const {
+ return isMovWSymbol(
+ {AArch64MCExpr::VK_ABS_G1, AArch64MCExpr::VK_ABS_G1_S,
+ AArch64MCExpr::VK_ABS_G1_NC, AArch64MCExpr::VK_GOTTPREL_G1,
+ AArch64MCExpr::VK_TPREL_G1, AArch64MCExpr::VK_TPREL_G1_NC,
+ AArch64MCExpr::VK_DTPREL_G1, AArch64MCExpr::VK_DTPREL_G1_NC});
}
- bool isMovKSymbolG0() const {
+ bool isMovWSymbolG0() const {
return isMovWSymbol(
- {AArch64MCExpr::VK_ABS_G0_NC, AArch64MCExpr::VK_GOTTPREL_G0_NC,
- AArch64MCExpr::VK_TPREL_G0_NC, AArch64MCExpr::VK_DTPREL_G0_NC});
+ {AArch64MCExpr::VK_ABS_G0, AArch64MCExpr::VK_ABS_G0_S,
+ AArch64MCExpr::VK_ABS_G0_NC, AArch64MCExpr::VK_GOTTPREL_G0_NC,
+ AArch64MCExpr::VK_TPREL_G0, AArch64MCExpr::VK_TPREL_G0_NC,
+ AArch64MCExpr::VK_DTPREL_G0, AArch64MCExpr::VK_DTPREL_G0_NC});
}
template<int RegWidth, int Shift>
OpenPOWER on IntegriCloud