Add Zcmp extension testcases, zcmpe means Zcmp with RVE extension.

Co-Authored by: Nandni Jamnadas <nandni.jamna...@embecosm.com>
Co-Authored by: Yulong Shi <yul...@iscas.ac.cn>
Co-Authored by: Shihua Liao <shi...@iscas.ac.cn>
Co-Authored by: Sinan Lin <sinan....@linux.alibaba.com>

gcc/testsuite/ChangeLog:

        * gcc.target/riscv/zc-zcmp-push-pop-1.c: New test.
        * gcc.target/riscv/zc-zcmp-push-pop-2.c: New test.
        * gcc.target/riscv/zc-zcmp-push-pop-3.c: New test.
        * gcc.target/riscv/zc-zcmp-push-pop-4.c: New test.
        * gcc.target/riscv/zc-zcmp-push-pop-5.c: New test.
        * gcc.target/riscv/zc-zcmp-push-pop-6.c: New test.
        * gcc.target/riscv/zc-zcmp-push-pop-7.c: New test.
        * gcc.target/riscv/zc-zcmpe-push-pop-1.c: New test.
        * gcc.target/riscv/zc-zcmpe-push-pop-2.c: New test.
        * gcc.target/riscv/zc-zcmpe-push-pop-3.c: New test.
        * gcc.target/riscv/zc-zcmpe-push-pop-4.c: New test.
        * gcc.target/riscv/zc-zcmpe-push-pop-5.c: New test.
        * gcc.target/riscv/zc-zcmpe-push-pop-6.c: New test.
        * gcc.target/riscv/zc-zcmpe-push-pop-7.c: New test.
---
 .../gcc.target/riscv/zc-zcmp-push-pop-1.c       | 15 +++++++++++++++
 .../gcc.target/riscv/zc-zcmp-push-pop-2.c       | 17 +++++++++++++++++
 .../gcc.target/riscv/zc-zcmp-push-pop-3.c       | 17 +++++++++++++++++
 .../gcc.target/riscv/zc-zcmp-push-pop-4.c       | 17 +++++++++++++++++
 .../gcc.target/riscv/zc-zcmp-push-pop-5.c       | 17 +++++++++++++++++
 .../gcc.target/riscv/zc-zcmp-push-pop-6.c       | 13 +++++++++++++
 .../gcc.target/riscv/zc-zcmp-push-pop-7.c       | 16 ++++++++++++++++
 .../gcc.target/riscv/zc-zcmpe-push-pop-1.c      | 15 +++++++++++++++
 .../gcc.target/riscv/zc-zcmpe-push-pop-2.c      | 17 +++++++++++++++++
 .../gcc.target/riscv/zc-zcmpe-push-pop-3.c      | 17 +++++++++++++++++
 .../gcc.target/riscv/zc-zcmpe-push-pop-4.c      | 17 +++++++++++++++++
 .../gcc.target/riscv/zc-zcmpe-push-pop-5.c      | 17 +++++++++++++++++
 .../gcc.target/riscv/zc-zcmpe-push-pop-6.c      | 13 +++++++++++++
 .../gcc.target/riscv/zc-zcmpe-push-pop-7.c      | 16 ++++++++++++++++
 14 files changed, 224 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-1.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-2.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-3.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-4.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-5.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-6.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-7.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-1.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-2.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-3.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-4.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-5.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-6.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-7.c

diff --git a/gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-1.c 
b/gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-1.c
new file mode 100644
index 00000000000..58bb39438ce
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-1.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv64g_zca_zcmp -mabi=lp64d -O0" } */
+
+int foo1(int a)
+{
+    return a;
+}
+
+int foo2(int b)
+{
+    return foo1(b);
+}
+
+/* { dg-final { scan-assembler "cm.push\t{ra,s0},-32" } } */
+/* { dg-final { scan-assembler "cm.popret\t{ra,s0},32" } } */
diff --git a/gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-2.c 
b/gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-2.c
new file mode 100644
index 00000000000..2c692d80137
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-2.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv32g_zca_zcmp -mabi=ilp32d -O2" } */
+
+void foo2 (int a, int b);
+
+int foo1(int a, int b)
+{ 
+    if (b < a)
+    {
+        foo2(a, b);
+        foo1(a, b);
+    }
+    return 0;
+}
+
+/* { dg-final { scan-assembler "cm.push\t{ra,s0-s1},-16" } } */
+/* { dg-final { scan-assembler "cm.popretz\t{ra,s0-s1},16" } } */
diff --git a/gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-3.c 
b/gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-3.c
new file mode 100644
index 00000000000..ef22ce3d0f0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-3.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv32g_zca_zcmp -mabi=ilp32d -O2" } */
+
+void foo2 (int a, int b, int c, int d);
+
+int foo1(int a, int b, int c, int d)
+{ 
+    if (b < a)
+    {
+        foo2(a, b, c, d);
+        foo1(a, b, c, d);
+    }
+    return 0;
+}
+
+/* { dg-final { scan-assembler "cm.push\t{ra,s0-s3},-32" } } */
+/* { dg-final { scan-assembler "cm.popretz\t{ra,s0-s3},32" } } */
diff --git a/gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-4.c 
b/gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-4.c
new file mode 100644
index 00000000000..00eb200ed0b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-4.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv32g_zca_zcmp -mabi=ilp32d -O2" } */
+
+void foo2 (int a, int b, int c, int d, int e);
+
+int foo1(int a, int b, int c, int d, int e)
+{
+    if (b < a)
+    {
+        foo2(a, b, c, d, e);
+        foo1(a, b, c, d, e);
+    }
+    return -1;
+}
+
+/* { dg-final { scan-assembler "cm.push\t{ra,s0-s4},-32" } } */
+/* { dg-final { scan-assembler "cm.popret\t{ra,s0-s4},32" } } */
diff --git a/gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-5.c 
b/gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-5.c
new file mode 100644
index 00000000000..0361bd9da18
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-5.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv32g_zca_zcmp -mabi=ilp32d -O2" } */
+
+int foo2 (int, int);
+
+int foo1(int n, int k)
+{
+  int mat[n + 1][k + 1];
+  mat[0][0] = 1;
+  for (int i = 1; i <= n; i++)
+    for (int j = 1; j <= foo2(i, k); j++)
+      mat[i][j] = j * mat[i - 1][j - 1];
+  return mat[n][k];
+}
+
+/* { dg-final { scan-assembler "cm.push\t{ra,s0-s11},-80" } } */
+/* { dg-final { scan-assembler "cm.popret\t{ra,s0-s11},80" } } */
diff --git a/gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-6.c 
b/gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-6.c
new file mode 100644
index 00000000000..f90243aa20f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-6.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv32g_zca_zcmp -mabi=ilp32d -O0" } */
+
+#include <stdio.h>
+
+void __attribute__ ((interrupt ("user")))
+foo (void)
+{
+  char buf[560] = {0};
+  printf("%d", buf[1]);
+}
+
+/* { dg-final { scan-assembler "cm.pop\t{ra,s0},64" } } */
diff --git a/gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-7.c 
b/gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-7.c
new file mode 100644
index 00000000000..265643407ef
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/zc-zcmp-push-pop-7.c
@@ -0,0 +1,16 @@
+/* This testcase is to test whether push/pop can correctly split stack 
adjustment offset. */
+/* { dg-do compile } */
+/* { dg-options "-march=rv32g_zca_zcmp -mabi=ilp32d -O0" } */
+
+void test (char *);
+
+int foo()
+{
+  char m[512] = {0};
+  test (m);
+}
+
+/* { dg-final { scan-assembler "cm.push\t{ra,s0},-64" } } */
+/* { dg-final { scan-assembler "addi\tsp,sp,-464" } } */
+/* { dg-final { scan-assembler "addi\tsp,sp,464" } } */
+/* { dg-final { scan-assembler "cm.popret\t{ra,s0},64" } } */
diff --git a/gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-1.c 
b/gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-1.c
new file mode 100644
index 00000000000..2c1a79e1852
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-1.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv32e_zcmp -mabi=ilp32e -O0" } */
+
+int foo1(int a)
+{
+    return a;
+}
+
+int foo2(int b)
+{
+    return foo1(b);
+}
+
+/* { dg-final { scan-assembler "cm.push\t{ra,s0},-16" } } */
+/* { dg-final { scan-assembler "cm.popret\t{ra,s0},16" } } */
diff --git a/gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-2.c 
b/gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-2.c
new file mode 100644
index 00000000000..2da4dd10bf2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-2.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv32e_zcmp -mabi=ilp32e -O0" } */
+
+void foo2 (int a, int b);
+
+int foo1(int a, int b)
+{ 
+    if (b < a)
+    {
+        foo2(a, b);
+        foo1(a, b);
+    }
+    return 0;
+}
+
+/* { dg-final { scan-assembler "cm.push\t{ra,s0},-32" } } */
+/* { dg-final { scan-assembler "cm.popret\t{ra,s0},32" } } */
diff --git a/gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-3.c 
b/gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-3.c
new file mode 100644
index 00000000000..85a6f7c1074
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-3.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv32e_zcmp -mabi=ilp32e -O2" } */
+
+void foo2 (int a, int b, int c, int d);
+
+int foo1(int a, int b, int c, int d)
+{ 
+    if (b < a)
+    {
+        foo2(a, b, c, d);
+        foo1(a, b, c, d);
+    }
+    return 0;
+}
+
+/* { dg-final { scan-assembler "cm.push\t{ra,s0-s1},-32" } } */
+/* { dg-final { scan-assembler "cm.popretz\t{ra,s0-s1},32" } } */
diff --git a/gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-4.c 
b/gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-4.c
new file mode 100644
index 00000000000..4195322e6fb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-4.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv32e_zcmp -mabi=ilp32e -O2" } */
+
+void foo2 (int a, int b, int c, int d, int e);
+
+int foo1(int a, int b, int c, int d, int e)
+{
+    if (b < a)
+    {
+        foo2(a, b, c, d, e);
+        foo1(a, b, c, d, e);
+    }
+    return -1;
+}
+
+/* { dg-final { scan-assembler "cm.push\t{ra,s0-s1},-32" } } */
+/* { dg-final { scan-assembler "cm.popret\t{ra,s0-s1},32" } } */
diff --git a/gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-5.c 
b/gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-5.c
new file mode 100644
index 00000000000..b9ec12738eb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-5.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv32e_zcmp -mabi=ilp32e -O2" } */
+
+int foo2 (int, int);
+
+int foo1(int n, int k)
+{
+  int mat[n + 1][k + 1];
+  mat[0][0] = 1;
+  for (int i = 1; i <= n; i++)
+    for (int j = 1; j <= foo2(i, k); j++)
+      mat[i][j] = j * mat[i - 1][j - 1];
+  return mat[n][k];
+}
+
+/* { dg-final { scan-assembler "cm.push\t{ra,s0-s1},-64" } } */
+/* { dg-final { scan-assembler "cm.popret\t{ra,s0-s1},64" } } */
diff --git a/gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-6.c 
b/gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-6.c
new file mode 100644
index 00000000000..67d6236bab6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-6.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-march=rv32e_zcmp -mabi=ilp32e -O0" } */
+
+#include <stdio.h>
+
+void __attribute__ ((interrupt ("user")))
+foo (void)
+{
+  char buf[560] = {0};
+  printf("%d", buf[1]);
+}
+
+/* { dg-final { scan-assembler "cm.pop\t{ra,s0},64" } } */
diff --git a/gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-7.c 
b/gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-7.c
new file mode 100644
index 00000000000..89fe96a29de
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/zc-zcmpe-push-pop-7.c
@@ -0,0 +1,16 @@
+/* This testcase is to test whether push/pop can correctly split stack 
adjustment offset. */
+/* { dg-do compile } */
+/* { dg-options "-march=rv32e_zcmp -mabi=ilp32e -O0" } */
+
+void test (char *);
+
+int foo()
+{
+  char m[512] = {0};
+  test (m);
+}
+
+/* { dg-final { scan-assembler "cm.push\t{ra,s0},-64" } } */
+/* { dg-final { scan-assembler "addi\tsp,sp,-460" } } */
+/* { dg-final { scan-assembler "addi\tsp,sp,460" } } */
+/* { dg-final { scan-assembler "cm.popret\t{ra,s0},64" } } */
-- 
2.25.1

Reply via email to