This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH][M68K] Fix extendsidi pattern to handle ColdFire


Jeff Law wrote:
Maxim Kuvyrkov wrote:

...


I am outnumbered here :( Is the patch without (clobber (match_scratch:SI 3 "=X,X,X,X")) OK to check in?
Please submit it for a quick review.

See attached.



Thanks,


Maxim

2008-11-19  Maxim Kuvyrkov  <maxim@codesourcery.com>

	* config/m68k/m68k.md (extendsidi2, extendsidi2_mem): Merge, clean up.
	Disable unsupported alternative for ColdFire,
	add new alternative that ColdFire can handle.

2008-11-19  Maxim Kuvyrkov  <maxim@codesourcery.com>

	* gcc.c-torture/compile/20080929-1.c: New.
Index: testsuite/gcc.c-torture/compile/20080929-1.c
===================================================================
*** testsuite/gcc.c-torture/compile/20080929-1.c	(revision 0)
--- testsuite/gcc.c-torture/compile/20080929-1.c	(revision 0)
***************
*** 0 ****
--- 1,39 ----
+ struct option {
+   const char *name;
+   int has_arg;
+   int *flag;
+   int val;
+ };
+ enum {
+   UBI_DYNAMIC_VOLUME = 3,  UBI_STATIC_VOLUME = 4, };
+ typedef void * libubi_t;
+ struct ubi_dev_info {
+   int leb_size;
+ };
+ struct args {
+   int vol_id;
+   int vol_type;
+   long long bytes;
+   int lebs;
+   int alignment;
+   const char *node;
+   int maxavs;
+   int devn;
+ };
+ static struct args args = {
+   .vol_type = UBI_DYNAMIC_VOLUME,  .bytes = -1,  .lebs = -1,  .alignment = 1,  .vol_id = (-1),  .devn = -1, };
+ extern libubi_t libubi_open (int);
+ extern int ubi_get_dev_info (libubi_t, const char *, struct ubi_dev_info *);
+ int main(int argc, char * const argv[]) {
+   int err;
+   libubi_t libubi;
+   struct ubi_dev_info dev_info;
+   libubi = libubi_open(1);
+   if (!libubi)
+     return 0;
+   err = ubi_get_dev_info(libubi, args.node, &dev_info);
+   if (args.maxavs) {
+     args.bytes = dev_info.leb_size;
+   }
+   return 0;
+ }
Index: config/m68k/m68k.md
===================================================================
*** config/m68k/m68k.md	(revision 142161)
--- config/m68k/m68k.md	(working copy)
***************
*** 1703,1734 ****
  })
  
  (define_insn "extendsidi2"
!   [(set (match_operand:DI 0 "register_operand" "=d")
! 	(sign_extend:DI (match_operand:SI 1 "nonimmediate_src_operand" "rm")))]
    ""
  {
    CC_STATUS_INIT;
-   if (TARGET_68020 || TARGET_COLDFIRE)
-     return "move%.l %1,%R0\;smi %0\;extb%.l %0";
-   else
-     return "move%.l %1,%R0\;smi %0\;ext%.w %0\;ext%.l %0";
- })
  
! (define_insn "*extendsidi2_mem"
!   [(set (match_operand:DI 0 "memory_operand" "=o,<")
! 	(sign_extend:DI (match_operand:SI 1 "nonimmediate_src_operand" "rm,rm")))
!    (clobber (match_scratch:SI 2 "=d,d"))]
!    ""
! {
!   CC_STATUS_INIT;
    operands[3] = adjust_address (operands[0], SImode,
! 				which_alternative == 0 ? 4 : 0);
    operands[0] = adjust_address (operands[0], SImode, 0);
    if (TARGET_68020 || TARGET_COLDFIRE)
      return "move%.l %1,%3\;smi %2\;extb%.l %2\;move%.l %2,%0";
    else
      return "move%.l %1,%3\;smi %2\;ext%.w %2\;ext%.l %2\;move%.l %2,%0";
! })
  
  ;; Special case when one can avoid register clobbering, copy and test
  ;; Maybe there is a way to make that the general case, by forcing the
--- 1703,1737 ----
  })
  
  (define_insn "extendsidi2"
!   [(set (match_operand:DI 0 "nonimmediate_operand" "=d,o,o,<")
! 	(sign_extend:DI
! 	 (match_operand:SI 1 "nonimmediate_src_operand" "rm,rm,r<Q>,rm")))
!    (clobber (match_scratch:SI 2 "=X,d,d,d"))]
    ""
  {
    CC_STATUS_INIT;
  
!   if (which_alternative == 0)
!     /* Handle alternative 0.  */
!     {
!       if (TARGET_68020 || TARGET_COLDFIRE)
!         return "move%.l %1,%R0\;smi %0\;extb%.l %0";
!       else
!         return "move%.l %1,%R0\;smi %0\;ext%.w %0\;ext%.l %0";
!     }
! 
!   /* Handle alternatives 1, 2 and 3.  We don't need to adjust address by 4
!      in alternative 3 because autodecrement will do that for us.  */
    operands[3] = adjust_address (operands[0], SImode,
! 				which_alternative == 3 ? 0 : 4);
    operands[0] = adjust_address (operands[0], SImode, 0);
+ 
    if (TARGET_68020 || TARGET_COLDFIRE)
      return "move%.l %1,%3\;smi %2\;extb%.l %2\;move%.l %2,%0";
    else
      return "move%.l %1,%3\;smi %2\;ext%.w %2\;ext%.l %2\;move%.l %2,%0";
! }
!   [(set_attr "ok_for_coldfire" "yes,no,yes,yes")])
  
  ;; Special case when one can avoid register clobbering, copy and test
  ;; Maybe there is a way to make that the general case, by forcing the

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]