Commit a5350ddc by Chris Schlumberger-Socha Committed by Marcus Shawcroft

[AArch64] Implement support for --mcmodel=tiny

This patch adds support for the tiny absolute memory model.


Co-Authored-By: Marcus Shawcroft <marcus.shawcroft@arm.com>

From-SVN: r199408
parent 17f4d4bf
2012-05-29 Chris Schlumberger-Socha <chris.schlumberger-socha@arm.com>
Marcus Shawcroft <marcus.shawcroft@arm.com>
* config/aarch64/aarch64-protos.h (aarch64_symbol_type): Define
SYMBOL_TINY_ABSOLUTE.
* config/aarch64/aarch64.c (aarch64_load_symref_appropriately): Handle
SYMBOL_TINY_ABSOLUTE.
(aarch64_expand_mov_immediate): Likewise.
(aarch64_classify_symbol): Likewise.
(aarch64_mov_operand_p): Remove ATTRIBUTE_UNUSED.
Permit SYMBOL_TINY_ABSOLUTE.
* config/aarch64/predicates.md (aarch64_mov_operand): Permit CONST.
2013-05-29 Chris Schlumberger-Socha <chris.schlumberger-socha@arm.com> 2013-05-29 Chris Schlumberger-Socha <chris.schlumberger-socha@arm.com>
Marcus Shawcroft <marcus.shawcroft@arm.com> Marcus Shawcroft <marcus.shawcroft@arm.com>
......
...@@ -81,6 +81,7 @@ enum aarch64_symbol_type ...@@ -81,6 +81,7 @@ enum aarch64_symbol_type
SYMBOL_SMALL_TLSDESC, SYMBOL_SMALL_TLSDESC,
SYMBOL_SMALL_GOTTPREL, SYMBOL_SMALL_GOTTPREL,
SYMBOL_SMALL_TPREL, SYMBOL_SMALL_TPREL,
SYMBOL_TINY_ABSOLUTE,
SYMBOL_FORCE_TO_MEM SYMBOL_FORCE_TO_MEM
}; };
......
...@@ -524,6 +524,10 @@ aarch64_load_symref_appropriately (rtx dest, rtx imm, ...@@ -524,6 +524,10 @@ aarch64_load_symref_appropriately (rtx dest, rtx imm,
return; return;
} }
case SYMBOL_TINY_ABSOLUTE:
emit_insn (gen_rtx_SET (Pmode, dest, imm));
return;
case SYMBOL_SMALL_GOT: case SYMBOL_SMALL_GOT:
{ {
rtx tmp_reg = dest; rtx tmp_reg = dest;
...@@ -826,6 +830,7 @@ aarch64_expand_mov_immediate (rtx dest, rtx imm) ...@@ -826,6 +830,7 @@ aarch64_expand_mov_immediate (rtx dest, rtx imm)
case SYMBOL_SMALL_TPREL: case SYMBOL_SMALL_TPREL:
case SYMBOL_SMALL_ABSOLUTE: case SYMBOL_SMALL_ABSOLUTE:
case SYMBOL_TINY_ABSOLUTE:
aarch64_load_symref_appropriately (dest, imm, sty); aarch64_load_symref_appropriately (dest, imm, sty);
return; return;
...@@ -5030,6 +5035,8 @@ aarch64_classify_symbol (rtx x, ...@@ -5030,6 +5035,8 @@ aarch64_classify_symbol (rtx x,
case AARCH64_CMODEL_TINY_PIC: case AARCH64_CMODEL_TINY_PIC:
case AARCH64_CMODEL_TINY: case AARCH64_CMODEL_TINY:
return SYMBOL_TINY_ABSOLUTE;
case AARCH64_CMODEL_SMALL_PIC: case AARCH64_CMODEL_SMALL_PIC:
case AARCH64_CMODEL_SMALL: case AARCH64_CMODEL_SMALL:
return SYMBOL_SMALL_ABSOLUTE; return SYMBOL_SMALL_ABSOLUTE;
...@@ -5051,6 +5058,10 @@ aarch64_classify_symbol (rtx x, ...@@ -5051,6 +5058,10 @@ aarch64_classify_symbol (rtx x,
switch (aarch64_cmodel) switch (aarch64_cmodel)
{ {
case AARCH64_CMODEL_TINY: case AARCH64_CMODEL_TINY:
if (SYMBOL_REF_WEAK (x))
return SYMBOL_FORCE_TO_MEM;
return SYMBOL_TINY_ABSOLUTE;
case AARCH64_CMODEL_SMALL: case AARCH64_CMODEL_SMALL:
if (SYMBOL_REF_WEAK (x)) if (SYMBOL_REF_WEAK (x))
return SYMBOL_FORCE_TO_MEM; return SYMBOL_FORCE_TO_MEM;
...@@ -6444,10 +6455,9 @@ aarch64_simd_imm_scalar_p (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED) ...@@ -6444,10 +6455,9 @@ aarch64_simd_imm_scalar_p (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED)
bool bool
aarch64_mov_operand_p (rtx x, aarch64_mov_operand_p (rtx x,
enum aarch64_symbol_context context ATTRIBUTE_UNUSED, enum aarch64_symbol_context context,
enum machine_mode mode) enum machine_mode mode)
{ {
if (GET_CODE (x) == HIGH if (GET_CODE (x) == HIGH
&& aarch64_valid_symref (XEXP (x, 0), GET_MODE (XEXP (x, 0)))) && aarch64_valid_symref (XEXP (x, 0), GET_MODE (XEXP (x, 0))))
return true; return true;
...@@ -6458,7 +6468,8 @@ aarch64_mov_operand_p (rtx x, ...@@ -6458,7 +6468,8 @@ aarch64_mov_operand_p (rtx x,
if (GET_CODE (x) == SYMBOL_REF && mode == DImode && CONSTANT_ADDRESS_P (x)) if (GET_CODE (x) == SYMBOL_REF && mode == DImode && CONSTANT_ADDRESS_P (x))
return true; return true;
return false; return aarch64_classify_symbolic_expression (x, context)
== SYMBOL_TINY_ABSOLUTE;
} }
/* Return a const_int vector of VAL. */ /* Return a const_int vector of VAL. */
......
...@@ -166,7 +166,7 @@ ...@@ -166,7 +166,7 @@
}) })
(define_predicate "aarch64_mov_operand" (define_predicate "aarch64_mov_operand"
(and (match_code "reg,subreg,mem,const_int,symbol_ref,high") (and (match_code "reg,subreg,mem,const,const_int,symbol_ref,label_ref,high")
(ior (match_operand 0 "register_operand") (ior (match_operand 0 "register_operand")
(ior (match_operand 0 "memory_operand") (ior (match_operand 0 "memory_operand")
(match_test "aarch64_mov_operand_p (op, SYMBOL_CONTEXT_ADR, mode)"))))) (match_test "aarch64_mov_operand_p (op, SYMBOL_CONTEXT_ADR, mode)")))))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment