diff mbox series

[committed] pru: Implement c and n asm operand modifiers

Message ID 20241208105213.547032-1-dimitar@dinux.eu
State New
Headers show
Series [committed] pru: Implement c and n asm operand modifiers | expand

Commit Message

Dimitar Dimitrov Dec. 8, 2024, 10:52 a.m. UTC
Fix c-c++-common/toplevel-asm-1.c failure for PRU backend, caused by
missing implementation of the "c" asm operand modifier.

Pushed to trunk.

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                         | 12 ++++++-
 .../gcc.target/pru/asm-op-modifier.c          | 32 +++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.target/pru/asm-op-modifier.c
diff mbox series

Patch

diff --git a/gcc/config/pru/pru.cc b/gcc/config/pru/pru.cc
index 3b9ab362993..5dd6391f340 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 00000000000..6ace0311985
--- /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));
+}