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]

RFA: Define EXTRA_MEMORY_CONSTRAINT for FRV


Hi Aldy, Hi Alex,

  The Linux kernel developers working on the FRV port recently ran
  across a problem with the gcc 4.x series not being able to handle a
  "U" constraint inside an asm statement.  eg:

  void jump3(unsigned long *ppte, unsigned long pte, unsigned long n)
  {
    ppte[n] = pte;
    asm volatile("dcf %M0" :: "U"(ppte[n]));
  }

  The solution I found was to define EXTRA_MEMORY_CONSTRAINT and
  have it treat the U constraint as another kind of memory
  constraint.

  So - may I apply the patch below please ?  It also treats the R and
  T as memory constraints although I have not tested these.  I did
  test the patch by compiling the test fragment above, but the
  FRV toolchain itself does not build due to the problem reported in
  PR 28583.

Cheers
  Nick

gcc/ChangeLog
2006-09-05  Nick Clifton  <nickc@redhat.com>

	* config/frv/frv.h (EXTRA_MEMORY_CONSTRAINT): Define.

Index: gcc/config/frv/frv.h
===================================================================
--- gcc/config/frv/frv.h	(revision 116693)
+++ gcc/config/frv/frv.h	(working copy)
@@ -1376,6 +1376,9 @@ extern enum reg_class reg_class_from_let
    : (C) == 'U' ? EXTRA_CONSTRAINT_FOR_U (VALUE)			\
    : 0)
 
+#define EXTRA_MEMORY_CONSTRAINT(C,STR) \
+  ((C) == 'U' || (C) == 'R' || (C) == 'T')
+
 #define CONSTRAINT_LEN(C, STR) \
   ((C) == 'D' ? 3 : DEFAULT_CONSTRAINT_LEN ((C), (STR)))
 


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