Fix pic_l;oad_addr to work in Thumb mode.
authorNick Clifton <nickc@redhat.com>
Wed, 29 Nov 2000 01:45:13 +0000 (01:45 +0000)
committerNick Clifton <nickc@gcc.gnu.org>
Wed, 29 Nov 2000 01:45:13 +0000 (01:45 +0000)
From-SVN: r37838

gcc/ChangeLog
gcc/config/arm/arm.c
gcc/config/arm/arm.md

index 0fc0b844a11e63457b77afdff0679897f9c89765..1df50a7f68216045e42f9568e2aa2cf292a587f3 100644 (file)
@@ -1,3 +1,13 @@
+2000-11-28  Nick Clifton  <nickc@redhat.com>
+
+       * config/arm/arm.md (pic_load_addr): Split into
+       pic_load_addr_arm and pic_load_addr_thumb.
+
+       * config/arm/arm.c (legitimize_pic_address): Generate either
+       ARM or Thumb versions of pic_load_addr.
+       (arm_finalize_pic): Generate either ARM or Thumb versions of
+       pic_load_addr.
+
 2000-11-28  Richard Henderson  <rth@redhat.com>
 
        * calls.c (expand_call): Defer const/pure NO_DEFER_POP until
index 5fc13defe9840663c6310706d1cb93a9bf2538ae..678a4819f4c185383f6da299862d4b94d8ed9c56 100644 (file)
@@ -1920,7 +1920,10 @@ legitimize_pic_address (orig, mode, reg)
       else
        address = reg;
 
-      emit_insn (gen_pic_load_addr (address, orig));
+      if (TARGET_ARM)
+       emit_insn (gen_pic_load_addr_arm (address, orig));
+      else
+       emit_insn (gen_pic_load_addr_thumb (address, orig));
 
       pic_ref = gen_rtx_MEM (Pmode,
                             gen_rtx_PLUS (Pmode, pic_offset_table_rtx,
@@ -1993,8 +1996,12 @@ legitimize_pic_address (orig, mode, reg)
       if (NEED_GOT_RELOC)
        {
          rtx pic_ref, address = gen_reg_rtx (Pmode);
+
+         if (TARGET_ARM)
+           emit_insn (gen_pic_load_addr_arm (address, orig));
+         else
+           emit_insn (gen_pic_load_addr_thumb (address, orig));
          
-         emit_insn (gen_pic_load_addr (address, orig));
          pic_ref = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, address);
          
          emit_move_insn (address, pic_ref);
@@ -2044,11 +2051,16 @@ arm_finalize_pic ()
 
   pic_rtx = gen_rtx_CONST (Pmode, gen_rtx_MINUS (Pmode, pic_tmp2, pic_tmp));
   
-  emit_insn (gen_pic_load_addr (pic_offset_table_rtx, pic_rtx));
   if (TARGET_ARM)
-    emit_insn (gen_pic_add_dot_plus_eight (pic_offset_table_rtx, l1));
+    {
+      emit_insn (gen_pic_load_addr_arm (pic_offset_table_rtx, pic_rtx));
+      emit_insn (gen_pic_add_dot_plus_eight (pic_offset_table_rtx, l1));
+    }
   else
-    emit_insn (gen_pic_add_dot_plus_four (pic_offset_table_rtx, l1));
+    {
+      emit_insn (gen_pic_load_addr_thumb (pic_offset_table_rtx, pic_rtx));
+      emit_insn (gen_pic_add_dot_plus_four (pic_offset_table_rtx, l1));
+    }
 
   seq = gen_sequence ();
   end_sequence ();
index dc99511132d75b0c636e5272a4fab1f77d269e85..22991b3a1c5793e0553e2877fbdf86024401303c 100644 (file)
 ;; the insn alone, and to force the minipool generation pass to then move
 ;; the GOT symbol to memory.
 
-(define_insn "pic_load_addr"
+(define_insn "pic_load_addr_arm"
   [(set (match_operand:SI 0 "s_register_operand" "=r")
        (unspec:SI [(match_operand:SI 1 "" "mX")] 3))]
-  "TARGET_EITHER && flag_pic"
+  "TARGET_ARM && flag_pic"
   "ldr%?\\t%0, %1"
   [(set_attr "type" "load")
-   (set (attr "pool_range")
-       (if_then_else (eq_attr "is_thumb" "yes")
-                     (const_int 1024)
-                     (const_int 4096)))
-   (set (attr "neg_pool_range")
-       (if_then_else (eq_attr "is_thumb" "yes")
-                     (const_int 0)
-                     (const_int 4084)))]
+   (set (attr "pool_range")     (const_int 4096))
+   (set (attr "neg_pool_range") (const_int 4084))]
+)
+
+(define_insn "pic_load_addr_thumb"
+  [(set (match_operand:SI 0 "s_register_operand" "=l")
+       (unspec:SI [(match_operand:SI 1 "" "mX")] 3))]
+  "TARGET_THUMB && flag_pic"
+  "ldr\\t%0, %1"
+  [(set_attr "type" "load")
+   (set (attr "pool_range") (const_int 1024))]
 )
 
 ;; This variant is used for AOF assembly, since it needs to mention the