RISC-V: Add testcase for testing li pseudo instruction
diff mbox series

Message ID 20190823071302.12692-1-kito.cheng@sifive.com
State New
Headers show
Series
  • RISC-V: Add testcase for testing li pseudo instruction
Related show

Commit Message

Kito Cheng Aug. 23, 2019, 7:13 a.m. UTC
gcc/testsuite/ChangeLog:

	gcc.target/riscv/li.c: New test.
---
 gcc/testsuite/gcc.target/riscv/li.c | 36 +++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/riscv/li.c

Comments

Jim Wilson Aug. 23, 2019, 10:08 p.m. UTC | #1
On Fri, Aug 23, 2019 at 12:13 AM Kito Cheng <kito.cheng@sifive.com> wrote:
> gcc/testsuite/ChangeLog:
>         gcc.target/riscv/li.c: New test.

Thanks.  This looks good.

This is incidentally a test for a new binutils patch that improves the
li macro to emit compressed instructions when possible.  We need an
execution test to verify it is right, and we can't easily put that in
binutils, so it is going here.

Jim
Kito Cheng Aug. 26, 2019, 2:17 a.m. UTC | #2
Committed as r274920


On Sat, Aug 24, 2019 at 6:08 AM Jim Wilson <jimw@sifive.com> wrote:
>
> On Fri, Aug 23, 2019 at 12:13 AM Kito Cheng <kito.cheng@sifive.com> wrote:
> > gcc/testsuite/ChangeLog:
> >         gcc.target/riscv/li.c: New test.
>
> Thanks.  This looks good.
>
> This is incidentally a test for a new binutils patch that improves the
> li macro to emit compressed instructions when possible.  We need an
> execution test to verify it is right, and we can't easily put that in
> binutils, so it is going here.
>
> Jim

Patch
diff mbox series

diff --git a/gcc/testsuite/gcc.target/riscv/li.c b/gcc/testsuite/gcc.target/riscv/li.c
new file mode 100644
index 00000000000..fa5c02caee8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/li.c
@@ -0,0 +1,36 @@ 
+/* { dg-do run } */
+/* { dg-options "-O1" } */
+#include <stdlib.h>
+#define LOAD_IMM(var, val) \
+        asm ("li %0, %1\n": "=r"(var): "i" (val))
+
+#define CHECK_LI(type, val) \
+  { \
+    type var; \
+    LOAD_IMM(var, val); \
+    if (var != val) \
+      abort(); \
+  }
+
+#define CHECK_LI32(val) CHECK_LI(int, val)
+#define CHECK_LI64(val) CHECK_LI(long long, val)
+
+int main()
+{
+  CHECK_LI32(0x8001);
+  CHECK_LI32(0x1f01);
+  CHECK_LI32(0x12345001);
+  CHECK_LI32(0xf2345001);
+#if __riscv_xlen == 64
+  CHECK_LI64(0x8001ll);
+  CHECK_LI64(0x1f01ll);
+  CHECK_LI64(0x12345001ll);
+  CHECK_LI64(0xf2345001ll);
+  CHECK_LI64(0xf12345001ll);
+  CHECK_LI64(0xff00ff00ff001f01ll);
+  CHECK_LI64(0x7ffffffff2345001ll);
+  CHECK_LI64(0x7f0f243ff2345001ll);
+  CHECK_LI64(0x1234567887654321ll);
+#endif
+  return 0;
+}