[ARM][7/7] Convert FP mnemonics to UAL | f{ld,st}m -> v{ld,st}m
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>
Tue, 9 Sep 2014 11:29:21 +0000 (11:29 +0000)
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>
Tue, 9 Sep 2014 11:29:21 +0000 (11:29 +0000)
* config/arm/arm.md (vfp_pop_multiple_with_writeback): Use vldm
mnemonic instead of fldmfdd.
* config/arm/arm.c (vfp_output_fstmd): Rename to...
(vfp_output_vstmd): ... This.  Convert output to UAL syntax.
Output vpush when address register is SP.
* config/arm/arm-protos.h (vfp_output_fstmd): Rename to...
(vfp_output_vstmd): ... This.
* config/arm/vfp.md (push_multi_vfp): Update call to
vfp_output_vstmd.

From-SVN: r215056

gcc/ChangeLog
gcc/config/arm/arm-protos.h
gcc/config/arm/arm.c
gcc/config/arm/arm.md
gcc/config/arm/vfp.md

index 75c1dd3973fe92cc762d4fd1dc38b58b53a500bb..be964cbcfce4aeba590e93637b2724b2b9415bd1 100644 (file)
@@ -1,3 +1,15 @@
+2014-09-09  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       * config/arm/arm.md (vfp_pop_multiple_with_writeback): Use vldm
+       mnemonic instead of fldmfdd.
+       * config/arm/arm.c (vfp_output_fstmd): Rename to...
+       (vfp_output_vstmd): ... This.  Convert output to UAL syntax.
+       Output vpush when address register is SP.
+       * config/arm/arm-protos.h (vfp_output_fstmd): Rename to...
+       (vfp_output_vstmd): ... This.
+       * config/arm/vfp.md (push_multi_vfp): Update call to
+       vfp_output_vstmd.
+
 2014-09-09  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * config/arm/vfp.md (*movcc_vfp): Use UAL syntax.
index 0878ab40e6dc728629976ada771609229ced0497..61d7f9d237263b7994a31e8ea9b390a7624e7390 100644 (file)
@@ -149,7 +149,7 @@ extern bool arm_is_long_call_p (tree);
 extern int    arm_emit_vector_const (FILE *, rtx);
 extern void arm_emit_fp16_const (rtx c);
 extern const char * arm_output_load_gr (rtx *);
-extern const char *vfp_output_fstmd (rtx *);
+extern const char *vfp_output_vstmd (rtx *);
 extern void arm_output_multireg_pop (rtx *, bool, rtx, bool, bool);
 extern void arm_set_return_address (rtx, rtx);
 extern int arm_eliminable_register (rtx);
index 06b1b6f39b4d3ab46863aefa9d3f85016329e894..d75ca4293ed21568fc69d554192d7b5cb648ab37 100644 (file)
@@ -17630,14 +17630,22 @@ arm_output_multireg_pop (rtx *operands, bool return_pc, rtx cond, bool reverse,
 /* Output the assembly for a store multiple.  */
 
 const char *
-vfp_output_fstmd (rtx * operands)
+vfp_output_vstmd (rtx * operands)
 {
   char pattern[100];
   int p;
   int base;
   int i;
+  rtx addr_reg = REG_P (XEXP (operands[0], 0))
+                  ? XEXP (operands[0], 0)
+                  : XEXP (XEXP (operands[0], 0), 0);
+  bool push_p =  REGNO (addr_reg) == SP_REGNUM;
+
+  if (push_p)
+    strcpy (pattern, "vpush%?.64\t{%P1");
+  else
+    strcpy (pattern, "vstmdb%?.64\t%m0!, {%P1");
 
-  strcpy (pattern, "fstmfdd%?\t%m0!, {%P1");
   p = strlen (pattern);
 
   gcc_assert (REG_P (operands[1]));
index 0e43dd21bff900caa4a99cb07d8a26077e98dbaf..53235749098c0daf6fc095cb1b78d401551ad29e 100644 (file)
     int num_regs = XVECLEN (operands[0], 0);
     char pattern[100];
     rtx op_list[2];
-    strcpy (pattern, \"fldmfdd\\t\");
+    strcpy (pattern, \"vldm\\t\");
     strcat (pattern, reg_names[REGNO (SET_DEST (XVECEXP (operands[0], 0, 0)))]);
     strcat (pattern, \"!, {\");
     op_list[0] = XEXP (XVECEXP (operands[0], 0, 1), 0);
index 06c057fdfc0d5840c33ceafad9a88856363937ed..a2034498518c0e5315c11cb5d8877a7d480ef5d9 100644 (file)
          (unspec:BLK [(match_operand:DF 1 "vfp_register_operand" "")]
                      UNSPEC_PUSH_MULT))])]
   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP"
-  "* return vfp_output_fstmd (operands);"
+  "* return vfp_output_vstmd (operands);"
   [(set_attr "type" "f_stored")]
 )