From: Richard Henderson Date: Wed, 7 Apr 1999 03:18:52 +0000 (-0700) Subject: alpha.c (reg_no_subreg_operand): New function. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=67070f5c92f0ce0c3d65f2af0ed22001fcb1c5e8;p=gcc.git 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 --- diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c index c833e11a9f4..39e11f7292c 100644 --- a/gcc/config/alpha/alpha.c +++ b/gcc/config/alpha/alpha.c @@ -849,7 +849,7 @@ reg_not_elim_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 will do. */ @@ -871,6 +871,20 @@ normal_memory_operand (op, mode) 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. */ diff --git a/gcc/config/alpha/alpha.h b/gcc/config/alpha/alpha.h index 4587bbf96f0..c2eecefe9b4 100644 --- a/gcc/config/alpha/alpha.h +++ b/gcc/config/alpha/alpha.h @@ -2321,7 +2321,8 @@ do { \ {"reg_or_unaligned_mem_operand", {SUBREG, REG, MEM}}, \ {"any_memory_operand", {MEM}}, \ {"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. */ #define OBJECT_FORMAT_COFF diff --git a/gcc/config/alpha/alpha.md b/gcc/config/alpha/alpha.md index 55bdc11c551..838cff0a998 100644 --- a/gcc/config/alpha/alpha.md +++ b/gcc/config/alpha/alpha.md @@ -1988,7 +1988,7 @@ (define_insn "" [(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" "cvtq%,%+%& %1,%0" [(set_attr "type" "fadd") @@ -1996,7 +1996,7 @@ (define_insn "floatdisf2" [(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" "cvtq%,%+%& %1,%0" [(set_attr "type" "fadd") @@ -2004,7 +2004,7 @@ (define_insn "" [(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" "cvtq%-%+%& %1,%0" [(set_attr "type" "fadd") @@ -2012,7 +2012,7 @@ (define_insn "floatdidf2" [(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" "cvtq%-%+%& %1,%0" [(set_attr "type" "fadd")