]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/90530 (Invalid SUBREG insn generated by reload)
authorJohn David Anglin <danglin@gcc.gnu.org>
Fri, 24 May 2019 23:20:25 +0000 (23:20 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Fri, 24 May 2019 23:20:25 +0000 (23:20 +0000)
PR target/90530
* config/pa/pa.c (pa_cannot_change_mode_class): Accept mode changes
from DImode to SImode in floating-point registers on 64-bit target.
* config/pa/pa.md (umulsidi3): Change nonimmediate_operand to
register_operand in xmpyu patterns.

From-SVN: r271614

gcc/ChangeLog
gcc/config/pa/pa.c
gcc/config/pa/pa.md

index 785793af037c55b3d1548b3e3eb583bf18613b21..3af31c0d0b3bc3c4d4a6558ff7406415d23114f2 100644 (file)
@@ -1,3 +1,11 @@
+2019-05-24  John David Anglin  <danglin@gcc.gnu.org>
+
+       PR target/90530
+       * config/pa/pa.c (pa_cannot_change_mode_class): Accept mode changes
+       from DImode to SImode in floating-point registers on 64-bit target.
+       * config/pa/pa.md (umulsidi3): Change nonimmediate_operand to
+       register_operand in xmpyu patterns.
+
 2019-05-23  Uroš Bizjak  <ubizjak@gmail.com>
 
        Backported from mainline
index 6d260baf55d986bb4fd2598c33c1bc068df417be..020ac35cc7fdc623ed935097e5ae4f3466e5b63a 100644 (file)
@@ -10001,10 +10001,11 @@ pa_cannot_change_mode_class (machine_mode from, machine_mode to,
   /* There is no way to load QImode or HImode values directly from memory
      to a FP register.  SImode loads to the FP registers are not zero
      extended.  On the 64-bit target, this conflicts with the definition
-     of LOAD_EXTEND_OP.  Thus, we can't allow changing between modes with
-     different sizes in the floating-point registers.  */
+     of LOAD_EXTEND_OP.  Thus, we reject all mode changes in the FP registers
+     except for DImode to SImode on the 64-bit target.  It is handled by
+     register renaming in pa_print_operand.  */
   if (MAYBE_FP_REG_CLASS_P (rclass))
-    return true;
+    return !(TARGET_64BIT && from == DImode && to == SImode);
 
   /* HARD_REGNO_MODE_OK places modes with sizes larger than a word
      in specific sets of registers.  Thus, we cannot allow changing
index d975ddb0f701c007060f157d0c776f1634e873eb..70fa4cb2935e162eee36790e6c97c277e6438068 100644 (file)
 
 (define_insn "umulsidi3"
   [(set (match_operand:DI 0 "register_operand" "=f")
-       (mult:DI (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "f"))
-                (zero_extend:DI (match_operand:SI 2 "nonimmediate_operand" "f"))))]
+       (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "f"))
+                (zero_extend:DI (match_operand:SI 2 "register_operand" "f"))))]
   "TARGET_PA_11 && ! TARGET_DISABLE_FPREGS && ! TARGET_SOFT_FLOAT"
   "xmpyu %1,%2,%0"
   [(set_attr "type" "fpmuldbl")
 
 (define_insn ""
   [(set (match_operand:DI 0 "register_operand" "=f")
-       (mult:DI (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "f"))
+       (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "f"))
                 (match_operand:DI 2 "uint32_operand" "f")))]
   "TARGET_PA_11 && ! TARGET_DISABLE_FPREGS && ! TARGET_SOFT_FLOAT && !TARGET_64BIT"
   "xmpyu %1,%R2,%0"
 
 (define_insn ""
   [(set (match_operand:DI 0 "register_operand" "=f")
-       (mult:DI (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "f"))
+       (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "f"))
                 (match_operand:DI 2 "uint32_operand" "f")))]
   "TARGET_PA_11 && ! TARGET_DISABLE_FPREGS && ! TARGET_SOFT_FLOAT && TARGET_64BIT"
   "xmpyu %1,%2R,%0"