Clobber DP reg in case address needs to be loaded out of memory.
authorMichael Hayes <m.hayes@elec.canterbury.ac.nz>
Thu, 23 Mar 2000 22:15:46 +0000 (22:15 +0000)
committerMichael Hayes <m.hayes@gcc.gnu.org>
Thu, 23 Mar 2000 22:15:46 +0000 (22:15 +0000)
* config/c4x/c4x.md (load_immed_address):  Add DP reg clobber.

From-SVN: r32717

gcc/ChangeLog
gcc/config/c4x/c4x.md

index 45bfc374131a5ece7b9b29c7a2278853c1bcf7c2..d4128b0c5842ea38b601e2cc565e992911d3fb48 100644 (file)
@@ -1,3 +1,7 @@
+2000-03-24  Michael Hayes  <m.hayes@elec.canterbury.ac.nz>
+
+       * config/c4x/c4x.md (load_immed_address):  Add DP reg clobber.
+
 Thu Mar 23 17:10:48 2000  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
        * calls.c (expand_call): If TARGET is passed by reference and
index 9d58f32c45dfa29343f28dfc341d7fd08549d5e3..89fe2d0bb169a3c63d11a73291f9ac260924007e 100644 (file)
    operands[5] = c4x_operand_subword (operands[1], 1, 1, HImode);
 }")
 
+
+; We need to clobber the DP reg to be safe in case we
+; need to load this address from memory
+(define_insn "load_immed_address"
+  [(set (match_operand:QI 0 "reg_operand" "=a?x?c*r")
+        (match_operand:QI 1 "symbolic_address_operand" ""))
+   (clobber (reg:QI 16))]
+  "TARGET_LOAD_ADDRESS"
+  "#"
+  [(set_attr "type" "multi")])
+
+
+(define_split
+  [(set (match_operand:QI 0 "std_reg_operand" "")
+        (match_operand:QI 1 "symbolic_address_operand" ""))
+   (clobber (reg:QI 16))]
+  "! TARGET_C3X && ! TARGET_TI"
+  [(set (match_dup 0) (high:QI (match_dup 1)))
+   (set (match_dup 0) (lo_sum:QI (match_dup 0) (match_dup 1)))]
+  "")
+
 ; CC has been selected to load a symbolic address.  We force the address
 ; into memory and then generate LDP and LDIU insns.
 ; This is also required for the C30 if we pretend that we can 
 ; easily load symbolic addresses into a register.
 (define_split
   [(set (match_operand:QI 0 "reg_operand" "")
-        (match_operand:QI 1 "symbolic_address_operand" ""))]
+        (match_operand:QI 1 "symbolic_address_operand" ""))
+   (clobber (reg:QI 16))]
   "! TARGET_SMALL 
    && (TARGET_C3X || TARGET_TI
        || (reload_completed
 ; for the small memory model.
 (define_split
   [(set (match_operand:QI 0 "reg_operand" "")
-        (match_operand:QI 1 "symbolic_address_operand" ""))]
+        (match_operand:QI 1 "symbolic_address_operand" ""))
+   (clobber (reg:QI 16))]
   "TARGET_SMALL
    && (TARGET_C3X || TARGET_TI
        || (reload_completed
                                                  XEXP (operands[2], 0)));
 }")
 
-(define_insn "load_immed_address"
-  [(set (match_operand:QI 0 "reg_operand" "=a?x?c*r")
-        (match_operand:QI 1 "symbolic_address_operand" ""))]
-  "TARGET_LOAD_ADDRESS"
-  "#"
-  [(set_attr "type" "multi")])
-
 (define_insn "loadhi_big_constant"
   [(set (match_operand:HI 0 "reg_operand" "=c*d")
         (match_operand:HI 1 "const_int_operand" ""))]