]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
pru: Implement c and n asm operand modifiers
authorDimitar Dimitrov <dimitar@dinux.eu>
Sun, 8 Dec 2024 09:37:06 +0000 (11:37 +0200)
committerDimitar Dimitrov <dimitar@dinux.eu>
Sun, 8 Dec 2024 10:51:04 +0000 (12:51 +0200)
Fix c-c++-common/toplevel-asm-1.c failure for PRU backend, caused by
missing implementation of the "c" asm operand modifier.

gcc/ChangeLog:

* config/pru/pru.cc (pru_print_operand): Implement c and n
inline assembly operand modifiers.

gcc/testsuite/ChangeLog:

* gcc.target/pru/asm-op-modifier.c: New test.

Signed-off-by: Dimitar Dimitrov <dimitar@dinux.eu>
gcc/config/pru/pru.cc
gcc/testsuite/gcc.target/pru/asm-op-modifier.c [new file with mode: 0644]

index 3b9ab362993fbe4f482d69c89882ea00d242f5f9..5dd6391f34084cea3d6bf59d9706a19ba9a5fd18 100644 (file)
@@ -1858,12 +1858,22 @@ pru_print_operand (FILE *file, rtx op, int letter)
          fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op) & 0xff);
          return;
        }
+      else if (letter == 'c')
+       {
+         fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (op));
+         return;
+       }
+      else if (letter == 'n')
+       {
+         fprintf (file, HOST_WIDE_INT_PRINT_DEC, -INTVAL (op));
+         return;
+       }
       /* Else, fall through.  */
 
     case CONST:
     case LABEL_REF:
     case SYMBOL_REF:
-      if (letter == 0)
+      if (letter == 0 || letter == 'c')
        {
          output_addr_const (file, op);
          return;
diff --git a/gcc/testsuite/gcc.target/pru/asm-op-modifier.c b/gcc/testsuite/gcc.target/pru/asm-op-modifier.c
new file mode 100644 (file)
index 0000000..6ace031
--- /dev/null
@@ -0,0 +1,32 @@
+/* Test ASM operand modifiers. */
+
+/* { dg-do compile } */
+/* { dg-options "-O1" } */
+
+struct S {
+  char b;
+  int a;
+  short c;
+};
+
+void
+test_const_int (void)
+{
+  /* { dg-final { scan-assembler "# printing 7 and -5" } } */
+  asm volatile ("# printing %c0 and %n1"
+    : :
+    "i" (sizeof(struct S)),
+    "i" (__builtin_offsetof (struct S, c)));
+}
+
+extern int g;
+
+void
+test_sym (void)
+{
+  /* { dg-final { scan-assembler "# outputting g and test_sym" } } */
+  asm volatile ("# outputting %c0 and %c1"
+    : :
+    "i" (&g),
+    "i" (&test_sym));
+}