From a5350ddc612732cc2a3cb313ed86d4c6dbf7907a Mon Sep 17 00:00:00 2001 From: Chris Schlumberger-Socha Date: Wed, 29 May 2013 13:08:16 +0000 Subject: [PATCH] [AArch64] Implement support for --mcmodel=tiny This patch adds support for the tiny absolute memory model. Co-Authored-By: Marcus Shawcroft From-SVN: r199408 --- gcc/ChangeLog | 13 +++++++++++++ gcc/config/aarch64/aarch64-protos.h | 1 + gcc/config/aarch64/aarch64.c | 17 ++++++++++++++--- gcc/config/aarch64/predicates.md | 2 +- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6c4997351f0..a57c56dd78e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2012-05-29 Chris Schlumberger-Socha + Marcus Shawcroft + + * 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 Marcus Shawcroft diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h index 91fcde80cf6..bdb6b040578 100644 --- a/gcc/config/aarch64/aarch64-protos.h +++ b/gcc/config/aarch64/aarch64-protos.h @@ -81,6 +81,7 @@ enum aarch64_symbol_type SYMBOL_SMALL_TLSDESC, SYMBOL_SMALL_GOTTPREL, SYMBOL_SMALL_TPREL, + SYMBOL_TINY_ABSOLUTE, SYMBOL_FORCE_TO_MEM }; diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 59e6234291b..9c77888157d 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -524,6 +524,10 @@ aarch64_load_symref_appropriately (rtx dest, rtx imm, return; } + case SYMBOL_TINY_ABSOLUTE: + emit_insn (gen_rtx_SET (Pmode, dest, imm)); + return; + case SYMBOL_SMALL_GOT: { rtx tmp_reg = dest; @@ -826,6 +830,7 @@ aarch64_expand_mov_immediate (rtx dest, rtx imm) case SYMBOL_SMALL_TPREL: case SYMBOL_SMALL_ABSOLUTE: + case SYMBOL_TINY_ABSOLUTE: aarch64_load_symref_appropriately (dest, imm, sty); return; @@ -5030,6 +5035,8 @@ aarch64_classify_symbol (rtx x, case AARCH64_CMODEL_TINY_PIC: case AARCH64_CMODEL_TINY: + return SYMBOL_TINY_ABSOLUTE; + case AARCH64_CMODEL_SMALL_PIC: case AARCH64_CMODEL_SMALL: return SYMBOL_SMALL_ABSOLUTE; @@ -5051,6 +5058,10 @@ aarch64_classify_symbol (rtx x, switch (aarch64_cmodel) { case AARCH64_CMODEL_TINY: + if (SYMBOL_REF_WEAK (x)) + return SYMBOL_FORCE_TO_MEM; + return SYMBOL_TINY_ABSOLUTE; + case AARCH64_CMODEL_SMALL: if (SYMBOL_REF_WEAK (x)) return SYMBOL_FORCE_TO_MEM; @@ -6444,10 +6455,9 @@ aarch64_simd_imm_scalar_p (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED) bool aarch64_mov_operand_p (rtx x, - enum aarch64_symbol_context context ATTRIBUTE_UNUSED, + enum aarch64_symbol_context context, enum machine_mode mode) { - if (GET_CODE (x) == HIGH && aarch64_valid_symref (XEXP (x, 0), GET_MODE (XEXP (x, 0)))) return true; @@ -6458,7 +6468,8 @@ aarch64_mov_operand_p (rtx x, if (GET_CODE (x) == SYMBOL_REF && mode == DImode && CONSTANT_ADDRESS_P (x)) return true; - return false; + return aarch64_classify_symbolic_expression (x, context) + == SYMBOL_TINY_ABSOLUTE; } /* Return a const_int vector of VAL. */ diff --git a/gcc/config/aarch64/predicates.md b/gcc/config/aarch64/predicates.md index 16c4385e845..3248f610da0 100644 --- a/gcc/config/aarch64/predicates.md +++ b/gcc/config/aarch64/predicates.md @@ -166,7 +166,7 @@ }) (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 "memory_operand") (match_test "aarch64_mov_operand_p (op, SYMBOL_CONTEXT_ADR, mode)"))))) -- 2.30.2