mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
AArch64/ARM64: add support for :abs_gN_s: MOVZ modifiers
We only need assembly support, so it's fairly easy. llvm-svn: 207108
This commit is contained in:
parent
34f590d2a6
commit
58031e937f
@ -277,6 +277,15 @@ def movz_symbol_g0 : Operand<i32> {
|
||||
let ParserMatchClass = MovZSymbolG0AsmOperand;
|
||||
}
|
||||
|
||||
def MovKSymbolG3AsmOperand : AsmOperandClass {
|
||||
let Name = "MovKSymbolG3";
|
||||
let RenderMethod = "addImmOperands";
|
||||
}
|
||||
|
||||
def movk_symbol_g3 : Operand<i32> {
|
||||
let ParserMatchClass = MovKSymbolG3AsmOperand;
|
||||
}
|
||||
|
||||
def MovKSymbolG2AsmOperand : AsmOperandClass {
|
||||
let Name = "MovKSymbolG2";
|
||||
let RenderMethod = "addImmOperands";
|
||||
|
@ -383,6 +383,7 @@ def : InstAlias<"movz $Rd, $sym", (MOVZWi GPR32:$Rd, movz_symbol_g2:$sym, 32)>;
|
||||
def : InstAlias<"movz $Rd, $sym", (MOVZWi GPR32:$Rd, movz_symbol_g1:$sym, 16)>;
|
||||
def : InstAlias<"movz $Rd, $sym", (MOVZWi GPR32:$Rd, movz_symbol_g0:$sym, 0)>;
|
||||
|
||||
def : InstAlias<"movk $Rd, $sym", (MOVKXi GPR64:$Rd, movk_symbol_g3:$sym, 48)>;
|
||||
def : InstAlias<"movk $Rd, $sym", (MOVKXi GPR64:$Rd, movk_symbol_g2:$sym, 32)>;
|
||||
def : InstAlias<"movk $Rd, $sym", (MOVKXi GPR64:$Rd, movk_symbol_g1:$sym, 16)>;
|
||||
def : InstAlias<"movk $Rd, $sym", (MOVKXi GPR64:$Rd, movk_symbol_g0:$sym, 0)>;
|
||||
|
@ -610,6 +610,7 @@ public:
|
||||
|
||||
bool isMovZSymbolG2() const {
|
||||
static ARM64MCExpr::VariantKind Variants[] = { ARM64MCExpr::VK_ABS_G2,
|
||||
ARM64MCExpr::VK_ABS_G2_S,
|
||||
ARM64MCExpr::VK_TPREL_G2,
|
||||
ARM64MCExpr::VK_DTPREL_G2 };
|
||||
return isMovWSymbol(Variants);
|
||||
@ -617,6 +618,7 @@ public:
|
||||
|
||||
bool isMovZSymbolG1() const {
|
||||
static ARM64MCExpr::VariantKind Variants[] = { ARM64MCExpr::VK_ABS_G1,
|
||||
ARM64MCExpr::VK_ABS_G1_S,
|
||||
ARM64MCExpr::VK_GOTTPREL_G1,
|
||||
ARM64MCExpr::VK_TPREL_G1,
|
||||
ARM64MCExpr::VK_DTPREL_G1, };
|
||||
@ -625,11 +627,17 @@ public:
|
||||
|
||||
bool isMovZSymbolG0() const {
|
||||
static ARM64MCExpr::VariantKind Variants[] = { ARM64MCExpr::VK_ABS_G0,
|
||||
ARM64MCExpr::VK_ABS_G0_S,
|
||||
ARM64MCExpr::VK_TPREL_G0,
|
||||
ARM64MCExpr::VK_DTPREL_G0 };
|
||||
return isMovWSymbol(Variants);
|
||||
}
|
||||
|
||||
bool isMovKSymbolG3() const {
|
||||
static ARM64MCExpr::VariantKind Variants[] = { ARM64MCExpr::VK_ABS_G3 };
|
||||
return isMovWSymbol(Variants);
|
||||
}
|
||||
|
||||
bool isMovKSymbolG2() const {
|
||||
static ARM64MCExpr::VariantKind Variants[] = { ARM64MCExpr::VK_ABS_G2_NC };
|
||||
return isMovWSymbol(Variants);
|
||||
@ -2985,10 +2993,13 @@ bool ARM64AsmParser::parseSymbolicImmVal(const MCExpr *&ImmVal) {
|
||||
.Case("lo12", ARM64MCExpr::VK_LO12)
|
||||
.Case("abs_g3", ARM64MCExpr::VK_ABS_G3)
|
||||
.Case("abs_g2", ARM64MCExpr::VK_ABS_G2)
|
||||
.Case("abs_g2_s", ARM64MCExpr::VK_ABS_G2_S)
|
||||
.Case("abs_g2_nc", ARM64MCExpr::VK_ABS_G2_NC)
|
||||
.Case("abs_g1", ARM64MCExpr::VK_ABS_G1)
|
||||
.Case("abs_g1_s", ARM64MCExpr::VK_ABS_G1_S)
|
||||
.Case("abs_g1_nc", ARM64MCExpr::VK_ABS_G1_NC)
|
||||
.Case("abs_g0", ARM64MCExpr::VK_ABS_G0)
|
||||
.Case("abs_g0_s", ARM64MCExpr::VK_ABS_G0_S)
|
||||
.Case("abs_g0_nc", ARM64MCExpr::VK_ABS_G0_NC)
|
||||
.Case("dtprel_g2", ARM64MCExpr::VK_DTPREL_G2)
|
||||
.Case("dtprel_g1", ARM64MCExpr::VK_DTPREL_G1)
|
||||
|
@ -188,14 +188,20 @@ unsigned ARM64ELFObjectWriter::GetRelocType(const MCValue &Target,
|
||||
return ELF::R_AARCH64_MOVW_UABS_G3;
|
||||
if (RefKind == ARM64MCExpr::VK_ABS_G2)
|
||||
return ELF::R_AARCH64_MOVW_UABS_G2;
|
||||
if (RefKind == ARM64MCExpr::VK_ABS_G2_S)
|
||||
return ELF::R_AARCH64_MOVW_SABS_G2;
|
||||
if (RefKind == ARM64MCExpr::VK_ABS_G2_NC)
|
||||
return ELF::R_AARCH64_MOVW_UABS_G2_NC;
|
||||
if (RefKind == ARM64MCExpr::VK_ABS_G1)
|
||||
return ELF::R_AARCH64_MOVW_UABS_G1;
|
||||
if (RefKind == ARM64MCExpr::VK_ABS_G1_S)
|
||||
return ELF::R_AARCH64_MOVW_SABS_G1;
|
||||
if (RefKind == ARM64MCExpr::VK_ABS_G1_NC)
|
||||
return ELF::R_AARCH64_MOVW_UABS_G1_NC;
|
||||
if (RefKind == ARM64MCExpr::VK_ABS_G0)
|
||||
return ELF::R_AARCH64_MOVW_UABS_G0;
|
||||
if (RefKind == ARM64MCExpr::VK_ABS_G0_S)
|
||||
return ELF::R_AARCH64_MOVW_SABS_G0;
|
||||
if (RefKind == ARM64MCExpr::VK_ABS_G0_NC)
|
||||
return ELF::R_AARCH64_MOVW_UABS_G0_NC;
|
||||
if (RefKind == ARM64MCExpr::VK_DTPREL_G2)
|
||||
|
@ -36,10 +36,13 @@ StringRef ARM64MCExpr::getVariantKindName() const {
|
||||
case VK_LO12: return ":lo12:";
|
||||
case VK_ABS_G3: return ":abs_g3:";
|
||||
case VK_ABS_G2: return ":abs_g2:";
|
||||
case VK_ABS_G2_S: return ":abs_g2_s:";
|
||||
case VK_ABS_G2_NC: return ":abs_g2_nc:";
|
||||
case VK_ABS_G1: return ":abs_g1:";
|
||||
case VK_ABS_G1_S: return ":abs_g1_s:";
|
||||
case VK_ABS_G1_NC: return ":abs_g1_nc:";
|
||||
case VK_ABS_G0: return ":abs_g0:";
|
||||
case VK_ABS_G0_S: return ":abs_g0_s:";
|
||||
case VK_ABS_G0_NC: return ":abs_g0_nc:";
|
||||
case VK_DTPREL_G2: return ":dtprel_g2:";
|
||||
case VK_DTPREL_G1: return ":dtprel_g1:";
|
||||
|
@ -63,10 +63,13 @@ public:
|
||||
VK_ABS_PAGE = VK_ABS | VK_PAGE,
|
||||
VK_ABS_G3 = VK_ABS | VK_G3,
|
||||
VK_ABS_G2 = VK_ABS | VK_G2,
|
||||
VK_ABS_G2_S = VK_SABS | VK_G2,
|
||||
VK_ABS_G2_NC = VK_ABS | VK_G2 | VK_NC,
|
||||
VK_ABS_G1 = VK_ABS | VK_G1,
|
||||
VK_ABS_G1_S = VK_SABS | VK_G1,
|
||||
VK_ABS_G1_NC = VK_ABS | VK_G1 | VK_NC,
|
||||
VK_ABS_G0 = VK_ABS | VK_G0,
|
||||
VK_ABS_G0_S = VK_SABS | VK_G0,
|
||||
VK_ABS_G0_NC = VK_ABS | VK_G0 | VK_NC,
|
||||
VK_LO12 = VK_ABS | VK_PAGEOFF | VK_NC,
|
||||
VK_GOT_LO12 = VK_GOT | VK_PAGEOFF | VK_NC,
|
||||
|
@ -1,4 +1,7 @@
|
||||
// RUN: llvm-mc -triple=aarch64-none-linux-gnu -filetype=obj %s -o - | \
|
||||
// RUN: llvm-readobj -r | FileCheck -check-prefix=OBJ %s
|
||||
|
||||
// RUN: llvm-mc -triple=arm64-none-linux-gnu -filetype=obj %s -o - | \
|
||||
// RUN: llvm-readobj -r | FileCheck -check-prefix=OBJ %s
|
||||
|
||||
movz x0, #:abs_g0:some_label
|
||||
|
Loading…
Reference in New Issue
Block a user