From cf92d7df1e41e30f234fb58ec575335113233a29 Mon Sep 17 00:00:00 2001 From: Michael Hayes Date: Thu, 23 Mar 2000 22:15:46 +0000 Subject: [PATCH] Clobber DP reg in case address needs to be loaded out of memory. * config/c4x/c4x.md (load_immed_address): Add DP reg clobber. From-SVN: r32717 --- gcc/ChangeLog | 4 ++++ gcc/config/c4x/c4x.md | 34 +++++++++++++++++++++++++--------- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 45bfc374131..d4128b0c584 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2000-03-24 Michael Hayes + + * config/c4x/c4x.md (load_immed_address): Add DP reg clobber. + Thu Mar 23 17:10:48 2000 Richard Kenner * calls.c (expand_call): If TARGET is passed by reference and diff --git a/gcc/config/c4x/c4x.md b/gcc/config/c4x/c4x.md index 9d58f32c45d..89fe2d0bb16 100644 --- a/gcc/config/c4x/c4x.md +++ b/gcc/config/c4x/c4x.md @@ -1245,13 +1245,35 @@ 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 @@ -1274,7 +1296,8 @@ ; 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 @@ -1290,13 +1313,6 @@ 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" ""))] -- 2.30.2