[AArch64] Implement support for --mcmodel=tiny
authorChris Schlumberger-Socha <chris.schlumberger-socha@arm.com>
Wed, 29 May 2013 13:08:16 +0000 (13:08 +0000)
committerMarcus Shawcroft <mshawcroft@gcc.gnu.org>
Wed, 29 May 2013 13:08:16 +0000 (13:08 +0000)
This patch adds support for the tiny absolute memory model.

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

gcc/ChangeLog
gcc/config/aarch64/aarch64-protos.h
gcc/config/aarch64/aarch64.c
gcc/config/aarch64/predicates.md

index 6c4997351f0b2a8403cf934d7a1b5ae8ae045126..a57c56dd78e230931de4d46da18e5a4d20ade992 100644 (file)
@@ -1,3 +1,16 @@
+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>
            Marcus Shawcroft  <marcus.shawcroft@arm.com>
 
index 91fcde80cf65805bb7f3eb06f31c58bc43314f6b..bdb6b0405785612777333717fb42eb63232b78c6 100644 (file)
@@ -81,6 +81,7 @@ enum aarch64_symbol_type
   SYMBOL_SMALL_TLSDESC,
   SYMBOL_SMALL_GOTTPREL,
   SYMBOL_SMALL_TPREL,
+  SYMBOL_TINY_ABSOLUTE,
   SYMBOL_FORCE_TO_MEM
 };
 
index 59e6234291b47630e0ea1202228585d2bc974bfe..9c77888157d41e9895cada8c17e83035c2ea308a 100644 (file)
@@ -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.  */
index 16c4385e84568009ecd726f3db50c236d5658eef..3248f610da0cb6e693c1b01b31a5e17116a4e577 100644 (file)
 })
 
 (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)")))))