]> 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:15:49 +0000 (23:15 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Fri, 24 May 2019 23:15:49 +0000 (23:15 +0000)
PR target/90530
* config/pa/pa.c (pa_can_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: r271612

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

index f90cf262fdf355c52ee9338aaf9071db09bd3951..1bf25158edd9cc85cec536bb6d09426809bef006 100644 (file)
@@ -1,3 +1,11 @@
+2019-05-24  John David Anglin  <danglin@gcc.gnu.org>
+
+       PR target/90530
+       * config/pa/pa.c (pa_can_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-24  Martin Liska  <mliska@suse.cz>
 
        Backport from mainline
index 532046cff552e51f1fd2add000507cbaa0de1956..95b7a5857db8b1f62662160e3c2511440b0ed4a6 100644 (file)
@@ -10008,10 +10008,11 @@ pa_can_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 false;
+    return TARGET_64BIT && from == DImode && to == SImode;
 
   /* TARGET_HARD_REGNO_MODE_OK places modes with sizes larger than a word
      in specific sets of registers.  Thus, we cannot allow changing
index 1b4a5247370e3683f28ca989edded3141f3010ed..8308b37461df89200f35f6ec7dbee4798375b9ea 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"