re PR target/90530 (Invalid SUBREG insn generated by reload)
authorJohn David Anglin <danglin@gcc.gnu.org>
Fri, 24 May 2019 23:12:16 +0000 (23:12 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Fri, 24 May 2019 23:12:16 +0000 (23:12 +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: r271611

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

index 93ba0f23592dc3a5234a8c15b25b07339e65384e..19c6095c83b0b8b6c76596cf060e9c2cd3908b37 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  Jakub Jelinek  <jakub@redhat.com>
 
        * tree-core.h (enum omp_clause_code): Add OMP_CLAUSE__CONDTEMP_.
index 6509dc42b1f07e299427cd7871050e0d5619f220..aa8e346ccea9342e833663ece2a1d9be8dc953aa 100644 (file)
@@ -10011,10 +10011,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"