aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2000-11-29 01:45:13 +0000
committerNick Clifton <nickc@gcc.gnu.org>2000-11-29 01:45:13 +0000
commit4bec9f7d6aef7b3d522d157f1daf368104616447 (patch)
tree484579cc9d7819a348fe69974d7fce833d214bc0 /gcc
parentabfadcb132909fa5bf7e7c3f385c20218d8017fc (diff)
downloadgcc-4bec9f7d6aef7b3d522d157f1daf368104616447.zip
gcc-4bec9f7d6aef7b3d522d157f1daf368104616447.tar.gz
gcc-4bec9f7d6aef7b3d522d157f1daf368104616447.tar.bz2
Fix pic_l;oad_addr to work in Thumb mode.
From-SVN: r37838
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/arm/arm.c22
-rw-r--r--gcc/config/arm/arm.md23
3 files changed, 40 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0fc0b84..1df50a7f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 5fc13de..678a481 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -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 ();
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index dc995111..22991b3 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -4055,20 +4055,23 @@
;; 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