Commit 9a89adb8 by Richard Henderson Committed by Richard Henderson

ia64.md (movdi): Delay calling ia64_expand_load_address.

        * config/ia64/ia64.md (movdi): Delay calling ia64_expand_load_address.
        (movdi_symbolic): New.

From-SVN: r35685
parent 00e149c7
2000-08-14 Richard Henderson <rth@cygnus.com>
* config/ia64/ia64.md (movdi): Delay calling ia64_expand_load_address.
(movdi_symbolic): New.
2000-08-14 Jim Wilson <wilson@cygnus.com> 2000-08-14 Jim Wilson <wilson@cygnus.com>
* config/ia64/ia64.h (ASM_SPEC): Pass -mconstant-gp and -mauto-pic * config/ia64/ia64.h (ASM_SPEC): Pass -mconstant-gp and -mauto-pic
......
...@@ -351,14 +351,21 @@ ...@@ -351,14 +351,21 @@
"" ""
" "
{ {
if (! reload_in_progress && ! reload_completed
&& ! ia64_move_ok (operands[0], operands[1]))
operands[1] = force_reg (DImode, operands[1]);
if (! TARGET_NO_PIC && symbolic_operand (operands[1], DImode)) if (! TARGET_NO_PIC && symbolic_operand (operands[1], DImode))
{ {
ia64_expand_load_address (operands[0], operands[1]); /* Before optimization starts, delay committing to any particular
type of PIC address load. If this function gets deferred, we
may acquire information that changes the value of the
sdata_symbolic_operand predicate. */
if (rtx_equal_function_value_matters)
emit_insn (gen_movdi_symbolic (operands[0], operands[1]));
else
ia64_expand_load_address (operands[0], operands[1]);
DONE; DONE;
} }
if (! reload_in_progress && ! reload_completed
&& ! ia64_move_ok (operands[0], operands[1]))
operands[1] = force_reg (DImode, operands[1]);
}") }")
;; Errata 72 workaround. ;; Errata 72 workaround.
...@@ -407,6 +414,22 @@ ...@@ -407,6 +414,22 @@
[(set_attr "type" "A,A,L,M,M,F,I,I,M,M") [(set_attr "type" "A,A,L,M,M,F,I,I,M,M")
(set_attr "predicable" "no")]) (set_attr "predicable" "no")])
;; This is used during early compilation to delay the decision on
;; how to refer to a variable as long as possible. This is especially
;; important between initial rtl generation and optimization for
;; deferred functions, since we may acquire additional information
;; on the variables used in the meantime.
(define_insn_and_split "movdi_symbolic"
[(set (match_operand:DI 0 "register_operand" "=r")
(match_operand:DI 1 "symbolic_operand" "s"))
(use (reg:DI 1))]
""
"* abort ();"
""
[(const_int 0)]
"ia64_expand_load_address (operands[0], operands[1]); DONE;")
(define_insn "*movdi_internal_astep" (define_insn "*movdi_internal_astep"
[(set (match_operand:DI 0 "destination_operand" [(set (match_operand:DI 0 "destination_operand"
"=r,r,r,r, m, r,*f,*f,*f, Q, r,*b*e, r,*d, r,*c") "=r,r,r,r, m, r,*f,*f,*f, Q, r,*b*e, r,*d, r,*c")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment