Commit 67070f5c by Richard Henderson

alpha.c (reg_no_subreg_operand): New function.

        * alpha.c (reg_no_subreg_operand): New function.
        * alpha.h (PREDICATE_CODES): Add it.
        * alpha.md (floatdi?f patterns): Use it for op1.

From-SVN: r26232
parent d22cba0a
...@@ -849,7 +849,7 @@ reg_not_elim_operand (op, mode) ...@@ -849,7 +849,7 @@ reg_not_elim_operand (op, mode)
return register_operand (op, mode); return register_operand (op, mode);
} }
/* Return 1 is OP is a memory location that is not an reference (using /* Return 1 is OP is a memory location that is not a reference (using
an AND) to an unaligned location. Take into account what reload an AND) to an unaligned location. Take into account what reload
will do. */ will do. */
...@@ -871,6 +871,20 @@ normal_memory_operand (op, mode) ...@@ -871,6 +871,20 @@ normal_memory_operand (op, mode)
return GET_CODE (op) == MEM && GET_CODE (XEXP (op, 0)) != AND; return GET_CODE (op) == MEM && GET_CODE (XEXP (op, 0)) != AND;
} }
/* Accept a register, but not a subreg of any kind. This allows us to
avoid pathological cases in reload wrt data movement common in
int->fp conversion. */
int
reg_no_subreg_operand (op, mode)
register rtx op;
enum machine_mode mode;
{
if (GET_CODE (op) == SUBREG)
return 0;
return register_operand (op, mode);
}
/* Return 1 if this function can directly return via $26. */ /* Return 1 if this function can directly return via $26. */
......
...@@ -2321,7 +2321,8 @@ do { \ ...@@ -2321,7 +2321,8 @@ do { \
{"reg_or_unaligned_mem_operand", {SUBREG, REG, MEM}}, \ {"reg_or_unaligned_mem_operand", {SUBREG, REG, MEM}}, \
{"any_memory_operand", {MEM}}, \ {"any_memory_operand", {MEM}}, \
{"hard_fp_register_operand", {SUBREG, REG}}, \ {"hard_fp_register_operand", {SUBREG, REG}}, \
{"reg_not_elim_operand", {SUBREG, REG}}, {"reg_not_elim_operand", {SUBREG, REG}}, \
{"reg_no_subreg_operand", {REG}},
/* Tell collect that the object format is ECOFF. */ /* Tell collect that the object format is ECOFF. */
#define OBJECT_FORMAT_COFF #define OBJECT_FORMAT_COFF
......
...@@ -1988,7 +1988,7 @@ ...@@ -1988,7 +1988,7 @@
(define_insn "" (define_insn ""
[(set (match_operand:SF 0 "register_operand" "=&f") [(set (match_operand:SF 0 "register_operand" "=&f")
(float:SF (match_operand:DI 1 "register_operand" "f")))] (float:SF (match_operand:DI 1 "reg_no_subreg_operand" "f")))]
"TARGET_FP && alpha_tp == ALPHA_TP_INSN" "TARGET_FP && alpha_tp == ALPHA_TP_INSN"
"cvtq%,%+%& %1,%0" "cvtq%,%+%& %1,%0"
[(set_attr "type" "fadd") [(set_attr "type" "fadd")
...@@ -1996,7 +1996,7 @@ ...@@ -1996,7 +1996,7 @@
(define_insn "floatdisf2" (define_insn "floatdisf2"
[(set (match_operand:SF 0 "register_operand" "=f") [(set (match_operand:SF 0 "register_operand" "=f")
(float:SF (match_operand:DI 1 "register_operand" "f")))] (float:SF (match_operand:DI 1 "reg_no_subreg_operand" "f")))]
"TARGET_FP" "TARGET_FP"
"cvtq%,%+%& %1,%0" "cvtq%,%+%& %1,%0"
[(set_attr "type" "fadd") [(set_attr "type" "fadd")
...@@ -2004,7 +2004,7 @@ ...@@ -2004,7 +2004,7 @@
(define_insn "" (define_insn ""
[(set (match_operand:DF 0 "register_operand" "=&f") [(set (match_operand:DF 0 "register_operand" "=&f")
(float:DF (match_operand:DI 1 "register_operand" "f")))] (float:DF (match_operand:DI 1 "reg_no_subreg_operand" "f")))]
"TARGET_FP && alpha_tp == ALPHA_TP_INSN" "TARGET_FP && alpha_tp == ALPHA_TP_INSN"
"cvtq%-%+%& %1,%0" "cvtq%-%+%& %1,%0"
[(set_attr "type" "fadd") [(set_attr "type" "fadd")
...@@ -2012,7 +2012,7 @@ ...@@ -2012,7 +2012,7 @@
(define_insn "floatdidf2" (define_insn "floatdidf2"
[(set (match_operand:DF 0 "register_operand" "=f") [(set (match_operand:DF 0 "register_operand" "=f")
(float:DF (match_operand:DI 1 "register_operand" "f")))] (float:DF (match_operand:DI 1 "reg_no_subreg_operand" "f")))]
"TARGET_FP" "TARGET_FP"
"cvtq%-%+%& %1,%0" "cvtq%-%+%& %1,%0"
[(set_attr "type" "fadd") [(set_attr "type" "fadd")
......
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