https://gcc.gnu.org/g:89d19ab91a167c4c2258cc6c9fa7dd448c007ab7

commit r15-6015-g89d19ab91a167c4c2258cc6c9fa7dd448c007ab7
Author: Dimitar Dimitrov <dimi...@dinux.eu>
Date:   Sun Dec 8 11:37:06 2024 +0200

    pru: Implement c and n asm operand modifiers
    
    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 <dimi...@dinux.eu>

Diff:
---
 gcc/config/pru/pru.cc                          | 12 +++++++++-
 gcc/testsuite/gcc.target/pru/asm-op-modifier.c | 32 ++++++++++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/gcc/config/pru/pru.cc b/gcc/config/pru/pru.cc
index 3b9ab362993f..5dd6391f3408 100644
--- a/gcc/config/pru/pru.cc
+++ b/gcc/config/pru/pru.cc
@@ -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
index 000000000000..6ace0311985d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/pru/asm-op-modifier.c
@@ -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));
+}

Reply via email to