Index: lib/Target/AArch64/AArch64InstrFormats.td =================================================================== --- lib/Target/AArch64/AArch64InstrFormats.td +++ lib/Target/AArch64/AArch64InstrFormats.td @@ -480,40 +480,76 @@ def BranchTarget26Operand : BranchTarget<26>; def PCRelLabel19Operand : PCRelLabel<19>; -def MovWSymbolG3AsmOperand : AsmOperandClass { - let Name = "MovWSymbolG3"; +def MovZSymbolG3AsmOperand : AsmOperandClass { + let Name = "MovZSymbolG3"; let RenderMethod = "addImmOperands"; } -def movw_symbol_g3 : Operand { - let ParserMatchClass = MovWSymbolG3AsmOperand; +def movz_symbol_g3 : Operand { + let ParserMatchClass = MovZSymbolG3AsmOperand; } -def MovWSymbolG2AsmOperand : AsmOperandClass { - let Name = "MovWSymbolG2"; +def MovZSymbolG2AsmOperand : AsmOperandClass { + let Name = "MovZSymbolG2"; let RenderMethod = "addImmOperands"; } -def movw_symbol_g2 : Operand { - let ParserMatchClass = MovWSymbolG2AsmOperand; +def movz_symbol_g2 : Operand { + let ParserMatchClass = MovZSymbolG2AsmOperand; } -def MovWSymbolG1AsmOperand : AsmOperandClass { - let Name = "MovWSymbolG1"; +def MovZSymbolG1AsmOperand : AsmOperandClass { + let Name = "MovZSymbolG1"; let RenderMethod = "addImmOperands"; } -def movw_symbol_g1 : Operand { - let ParserMatchClass = MovWSymbolG1AsmOperand; +def movz_symbol_g1 : Operand { + let ParserMatchClass = MovZSymbolG1AsmOperand; } -def MovWSymbolG0AsmOperand : AsmOperandClass { - let Name = "MovWSymbolG0"; +def MovZSymbolG0AsmOperand : AsmOperandClass { + let Name = "MovZSymbolG0"; let RenderMethod = "addImmOperands"; } -def movw_symbol_g0 : Operand { - let ParserMatchClass = MovWSymbolG0AsmOperand; +def movz_symbol_g0 : Operand { + let ParserMatchClass = MovZSymbolG0AsmOperand; +} + +def MovKSymbolG3AsmOperand : AsmOperandClass { + let Name = "MovKSymbolG3"; + let RenderMethod = "addImmOperands"; +} + +def movk_symbol_g3 : Operand { + let ParserMatchClass = MovKSymbolG3AsmOperand; +} + +def MovKSymbolG2AsmOperand : AsmOperandClass { + let Name = "MovKSymbolG2"; + let RenderMethod = "addImmOperands"; +} + +def movk_symbol_g2 : Operand { + let ParserMatchClass = MovKSymbolG2AsmOperand; +} + +def MovKSymbolG1AsmOperand : AsmOperandClass { + let Name = "MovKSymbolG1"; + let RenderMethod = "addImmOperands"; +} + +def movk_symbol_g1 : Operand { + let ParserMatchClass = MovKSymbolG1AsmOperand; +} + +def MovKSymbolG0AsmOperand : AsmOperandClass { + let Name = "MovKSymbolG0"; + let RenderMethod = "addImmOperands"; +} + +def movk_symbol_g0 : Operand { + let ParserMatchClass = MovKSymbolG0AsmOperand; } class fixedpoint_i32 Index: lib/Target/AArch64/AArch64InstrInfo.td =================================================================== --- lib/Target/AArch64/AArch64InstrInfo.td +++ lib/Target/AArch64/AArch64InstrInfo.td @@ -846,29 +846,29 @@ def : InstAlias<"movz $dst, $imm", (MOVZXi GPR64:$dst, i32_imm0_65535:$imm, 0)>; // Next, we have various ELF relocations with the ":XYZ_g0:sym" syntax. -def : InstAlias<"movz $Rd, $sym", (MOVZXi GPR64:$Rd, movw_symbol_g3:$sym, 48)>; -def : InstAlias<"movz $Rd, $sym", (MOVZXi GPR64:$Rd, movw_symbol_g2:$sym, 32)>; -def : InstAlias<"movz $Rd, $sym", (MOVZXi GPR64:$Rd, movw_symbol_g1:$sym, 16)>; -def : InstAlias<"movz $Rd, $sym", (MOVZXi GPR64:$Rd, movw_symbol_g0:$sym, 0)>; +def : InstAlias<"movz $Rd, $sym", (MOVZXi GPR64:$Rd, movz_symbol_g3:$sym, 48)>; +def : InstAlias<"movz $Rd, $sym", (MOVZXi GPR64:$Rd, movz_symbol_g2:$sym, 32)>; +def : InstAlias<"movz $Rd, $sym", (MOVZXi GPR64:$Rd, movz_symbol_g1:$sym, 16)>; +def : InstAlias<"movz $Rd, $sym", (MOVZXi GPR64:$Rd, movz_symbol_g0:$sym, 0)>; -def : InstAlias<"movn $Rd, $sym", (MOVNXi GPR64:$Rd, movw_symbol_g3:$sym, 48)>; -def : InstAlias<"movn $Rd, $sym", (MOVNXi GPR64:$Rd, movw_symbol_g2:$sym, 32)>; -def : InstAlias<"movn $Rd, $sym", (MOVNXi GPR64:$Rd, movw_symbol_g1:$sym, 16)>; -def : InstAlias<"movn $Rd, $sym", (MOVNXi GPR64:$Rd, movw_symbol_g0:$sym, 0)>; +def : InstAlias<"movn $Rd, $sym", (MOVNXi GPR64:$Rd, movz_symbol_g3:$sym, 48)>; +def : InstAlias<"movn $Rd, $sym", (MOVNXi GPR64:$Rd, movz_symbol_g2:$sym, 32)>; +def : InstAlias<"movn $Rd, $sym", (MOVNXi GPR64:$Rd, movz_symbol_g1:$sym, 16)>; +def : InstAlias<"movn $Rd, $sym", (MOVNXi GPR64:$Rd, movz_symbol_g0:$sym, 0)>; -def : InstAlias<"movk $Rd, $sym", (MOVKXi GPR64:$Rd, movw_symbol_g3:$sym, 48), 0>; -def : InstAlias<"movk $Rd, $sym", (MOVKXi GPR64:$Rd, movw_symbol_g2:$sym, 32), 0>; -def : InstAlias<"movk $Rd, $sym", (MOVKXi GPR64:$Rd, movw_symbol_g1:$sym, 16), 0>; -def : InstAlias<"movk $Rd, $sym", (MOVKXi GPR64:$Rd, movw_symbol_g0:$sym, 0), 0>; +def : InstAlias<"movk $Rd, $sym", (MOVKXi GPR64:$Rd, movk_symbol_g3:$sym, 48), 0>; +def : InstAlias<"movk $Rd, $sym", (MOVKXi GPR64:$Rd, movk_symbol_g2:$sym, 32), 0>; +def : InstAlias<"movk $Rd, $sym", (MOVKXi GPR64:$Rd, movk_symbol_g1:$sym, 16), 0>; +def : InstAlias<"movk $Rd, $sym", (MOVKXi GPR64:$Rd, movk_symbol_g0:$sym, 0), 0>; -def : InstAlias<"movz $Rd, $sym", (MOVZWi GPR32:$Rd, movw_symbol_g1:$sym, 16)>; -def : InstAlias<"movz $Rd, $sym", (MOVZWi GPR32:$Rd, movw_symbol_g0:$sym, 0)>; +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<"movn $Rd, $sym", (MOVNWi GPR32:$Rd, movw_symbol_g1:$sym, 16)>; -def : InstAlias<"movn $Rd, $sym", (MOVNWi GPR32:$Rd, movw_symbol_g0:$sym, 0)>; +def : InstAlias<"movn $Rd, $sym", (MOVNWi GPR32:$Rd, movz_symbol_g1:$sym, 16)>; +def : InstAlias<"movn $Rd, $sym", (MOVNWi GPR32:$Rd, movz_symbol_g0:$sym, 0)>; -def : InstAlias<"movk $Rd, $sym", (MOVKWi GPR32:$Rd, movw_symbol_g1:$sym, 16), 0>; -def : InstAlias<"movk $Rd, $sym", (MOVKWi GPR32:$Rd, movw_symbol_g0:$sym, 0), 0>; +def : InstAlias<"movk $Rd, $sym", (MOVKWi GPR32:$Rd, movk_symbol_g1:$sym, 16), 0>; +def : InstAlias<"movk $Rd, $sym", (MOVKWi GPR32:$Rd, movk_symbol_g0:$sym, 0), 0>; // Final group of aliases covers true "mov $Rd, $imm" cases. multiclass movw_mov_alias Index: test/MC/AArch64/basic-a64-diagnostics.s =================================================================== --- test/MC/AArch64/basic-a64-diagnostics.s +++ test/MC/AArch64/basic-a64-diagnostics.s @@ -3247,24 +3247,157 @@ movk x19, #:abs_g0_s:sym movk w23, #:abs_g0_s:sym - +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk x19, #:abs_g0_s:sym +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk w23, #:abs_g0_s:sym +// CHECK-ERROR-NEXT: ^ movk x19, #:abs_g1_s:sym movk w23, #:abs_g1_s:sym - +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk x19, #:abs_g1_s:sym +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk w23, #:abs_g1_s:sym +// CHECK-ERROR-NEXT: ^ movz w2, #:abs_g2_s:sym movn w29, #:abs_g2_s:sym movk x19, #:abs_g2_s:sym movk w23, #:abs_g2_s:sym // CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] // CHECK-ERROR-NEXT: movz w2, #:abs_g2_s:sym -// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: ^ // CHECK-ERROR-NEXT: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] // CHECK-ERROR-NEXT: movn w29, #:abs_g2_s:sym // CHECK-ERROR-NEXT: ^ // CHECK-ERROR-NEXT: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk x19, #:abs_g2_s:sym +// CHECK-ERROR-NEXT: ^ +// CHECK-ERROR-NEXT: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] // CHECK-ERROR-NEXT: movk w23, #:abs_g2_s:sym // CHECK-ERROR-NEXT: ^ + movz x2, #:prel_g0_nc:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movz x2, #:prel_g0_nc:sym +// CHECK-ERROR-NEXT: ^ + movn w29, #:prel_g0_nc:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movn w29, #:prel_g0_nc:sym +// CHECK-ERROR-NEXT: ^ + movk x19, #:prel_g0:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk x19, #:prel_g0:sym +// CHECK-ERROR-NEXT: ^ + + movz x2, #:prel_g1_nc:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movz x2, #:prel_g1_nc:sym +// CHECK-ERROR-NEXT: ^ + movn w29, #:prel_g1_nc:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movn w29, #:prel_g1_nc:sym +// CHECK-ERROR-NEXT: ^ + movk x19, #:prel_g1:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk x19, #:prel_g1:sym +// CHECK-ERROR-NEXT: ^ + + movz x2, #:prel_g2_nc:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movz x2, #:prel_g2_nc:sym +// CHECK-ERROR-NEXT: ^ + movn w29, #:prel_g2_nc:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movn w29, #:prel_g2_nc:sym +// CHECK-ERROR-NEXT: ^ + movk x19, #:prel_g2:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk x19, #:prel_g2:sym +// CHECK-ERROR-NEXT: ^ + + movk x19, #:prel_g3:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk x19, #:prel_g3:sym +// CHECK-ERROR-NEXT: ^ + + movz x2, #:tprel_g0_nc:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movz x2, #:tprel_g0_nc:sym +// CHECK-ERROR-NEXT: ^ + movn w29, #:tprel_g0_nc:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movn w29, #:tprel_g0_nc:sym +// CHECK-ERROR-NEXT: ^ + movk x19, #:tprel_g0:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk x19, #:tprel_g0:sym +// CHECK-ERROR-NEXT: ^ + + movz x2, #:tprel_g1_nc:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movz x2, #:tprel_g1_nc:sym +// CHECK-ERROR-NEXT: ^ + movn w29, #:tprel_g1_nc:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movn w29, #:tprel_g1_nc:sym +// CHECK-ERROR-NEXT: ^ + movk x19, #:tprel_g1:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk x19, #:tprel_g1:sym +// CHECK-ERROR-NEXT: ^ + + movk x19, #:tprel_g2:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk x19, #:tprel_g2:sym +// CHECK-ERROR-NEXT: ^ + + movz x2, #:dtprel_g0_nc:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movz x2, #:dtprel_g0_nc:sym +// CHECK-ERROR-NEXT: ^ + movn w29, #:dtprel_g0_nc:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movn w29, #:dtprel_g0_nc:sym +// CHECK-ERROR-NEXT: ^ + movk x19, #:dtprel_g0:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk x19, #:dtprel_g0:sym +// CHECK-ERROR-NEXT: ^ + + movz x2, #:dtprel_g1_nc:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movz x2, #:dtprel_g1_nc:sym +// CHECK-ERROR-NEXT: ^ + movn w29, #:dtprel_g1_nc:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movn w29, #:dtprel_g1_nc:sym +// CHECK-ERROR-NEXT: ^ + movk x19, #:dtprel_g1:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk x19, #:dtprel_g1:sym +// CHECK-ERROR-NEXT: ^ + + movk x19, #:dtprel_g2:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk x19, #:dtprel_g2:sym +// CHECK-ERROR-NEXT: ^ + + movz x2, #:gottprel_g0_nc:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movz x2, #:gottprel_g0_nc:sym +// CHECK-ERROR-NEXT: ^ + movn w29, #:gottprel_g0_nc:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movn w29, #:gottprel_g0_nc:sym +// CHECK-ERROR-NEXT: ^ + + movk x19, #:gottprel_g1:sym +// CHECK-ERROR: error: {{expected relocated symbol or|immediate must be an}} integer in range [0, 65535] +// CHECK-ERROR-NEXT: movk x19, #:gottprel_g1:sym +// CHECK-ERROR-NEXT: ^ + //------------------------------------------------------------------------------ // PC-relative addressing //------------------------------------------------------------------------------