Executable test case for asm flags, by David Wohlferd.
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 12 Apr 2016 13:04:44 +0000 (13:04 +0000)
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 12 Apr 2016 13:04:44 +0000 (13:04 +0000)
* gcc.target/i386/asm-flag-6.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@234900 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/asm-flag-6.c [new file with mode: 0644]

index 93ca043..64753aa 100644 (file)
@@ -1,3 +1,7 @@
+2016-04-12  David Wohlferd  <dw@LimeGreenSocks.com>
+
+       * gcc.target/i386/asm-flag-6.c: New test.
+
 2016-04-12  Tom de Vries  <tom@codesourcery.com>
 
        PR tree-optimization/68756
diff --git a/gcc/testsuite/gcc.target/i386/asm-flag-6.c b/gcc/testsuite/gcc.target/i386/asm-flag-6.c
new file mode 100644 (file)
index 0000000..458587e
--- /dev/null
@@ -0,0 +1,276 @@
+/* Executable testcase for 'output flags.'  */
+/* { dg-do run } */
+
+char TestC ()
+{
+  char r;
+
+  __asm__ ("stc" : "=@ccc"(r));
+  if (r)
+  {
+    __asm__ ("clc" : "=@ccnc"(r));
+    if (r)
+      return 1;
+  }
+  return 0;
+}
+
+char TestE ()
+{
+  char r;
+
+  /* 1 equals 1.  */
+  __asm__ ("cmp $1, %1" : "=@cce"(r) : "r" (1));
+  if (r)
+  {
+    /* 1 not equals 2.  */
+    __asm__ ("cmp $2, %1" : "=@ccne"(r) : "r" (1));
+    if (r)
+      return 1;
+  }
+  return 0;
+}
+
+char TestZ ()
+{
+  char r;
+
+  /* 1 equals 1.  */
+  __asm__ ("cmp $1, %1" : "=@ccz"(r) : "r" (1));
+  if (r)
+  {
+    /* 1 not equals 2.  */
+    __asm__ ("cmp $2, %1" : "=@ccnz"(r) : "r" (1));
+    if (r)
+      return 1;
+  }
+  return 0;
+}
+
+char TestA ()
+{
+  char r;
+
+  /* 1 a 0.  */
+  __asm__ ("cmp $0, %1" : "=@cca"(r) : "r" (1));
+  if (r)
+  {
+    /* 1 na 2.  */
+    __asm__ ("cmp $2, %1" : "=@ccna"(r) : "r" (1));
+    if (r)
+    {
+      /* 1 na 1.  */
+      __asm__ ("cmp $1, %1" : "=@ccna"(r) : "r" (1));
+      if (r)
+       return 1;
+    }
+  }
+  return 0;
+}
+
+char TestAE ()
+{
+  char r;
+
+  /* 1 ae 0.  */
+  __asm__ ("cmp $0, %1" : "=@ccae"(r) : "r" (1));
+  if (r)
+  {
+    /* 1 nae 2.  */
+    __asm__ ("cmp $2, %1" : "=@ccnae"(r) : "r" (1));
+    if (r)
+    {
+      /* 1 ae 1.  */
+      __asm__ ("cmp $1, %1" : "=@ccae"(r) : "r" (1));
+      if (r)
+       return 1;
+    }
+  }
+  return 0;
+}
+
+char TestB ()
+{
+  char r;
+
+  /* 1 b 2.  */
+  __asm__ ("cmp $2, %1" : "=@ccb"(r) : "r" (1));
+  if (r)
+  {
+    /* 1 nb 0.  */
+    __asm__ ("cmp $0, %1" : "=@ccnb"(r) : "r" (1));
+    if (r)
+    {
+      /* 1 nb 1.  */
+      __asm__ ("cmp $1, %1" : "=@ccnb"(r) : "r" (1));
+      if (r)
+       return 1;
+    }
+  }
+  return 0;
+}
+
+char TestBE ()
+{
+  char r;
+
+  /* 1 be 2.  */
+  __asm__ ("cmp $2, %1" : "=@ccbe"(r) : "r" (1));
+  if (r)
+  {
+    /* 1 nbe 0.  */
+    __asm__ ("cmp $0, %1" : "=@ccnbe"(r) : "r" (1));
+    if (r)
+    {
+      /* 1 be 1.  */
+      __asm__ ("cmp $1, %1" : "=@ccbe"(r) : "r" (1));
+      if (r)
+       return 1;
+    }
+  }
+  return 0;
+}
+
+char TestG ()
+{
+  char r;
+
+  /* 1 g 0.  */
+  __asm__ ("cmp $0, %1" : "=@ccg"(r) : "r" (1));
+  if (r)
+  {
+    /* 1 ng 2.  */
+    __asm__ ("cmp $2, %1" : "=@ccng"(r) : "r" (1));
+    if (r)
+    {
+      /* 1 ng 1.  */
+      __asm__ ("cmp $1, %1" : "=@ccng"(r) : "r" (1));
+      if (r)
+       return 1;
+    }
+  }
+  return 0;
+}
+
+char TestGE ()
+{
+  char r;
+
+  /* 1 ge 0.  */
+  __asm__ ("cmp $0, %1" : "=@ccge"(r) : "r" (1));
+  if (r)
+  {
+    /* 1 nge 2.  */
+    __asm__ ("cmp $2, %1" : "=@ccnge"(r) : "r" (1));
+    if (r)
+    {
+      /* 1 ge 1.  */
+      __asm__ ("cmp $1, %1" : "=@ccge"(r) : "r" (1));
+      if (r)
+       return 1;
+    }
+  }
+  return 0;
+}
+
+char TestL ()
+{
+  char r;
+
+  /* 1 l 2.  */
+  __asm__ ("cmp $2, %1" : "=@ccl"(r) : "r" (1));
+  if (r)
+  {
+    /* 1 nl 0.  */
+    __asm__ ("cmp $0, %1" : "=@ccnl"(r) : "r" (1));
+    if (r)
+    {
+      /* 1 nl 1.  */
+      __asm__ ("cmp $1, %1" : "=@ccnl"(r) : "r" (1));
+      if (r)
+       return 1;
+    }
+  }
+  return 0;
+}
+
+char TestLE ()
+{
+  char r;
+
+  /* 1 le 2.  */
+  __asm__ ("cmp $2, %1" : "=@ccle"(r) : "r" (1));
+  if (r)
+  {
+    /* 1 nle 0.  */
+    __asm__ ("cmp $0, %1" : "=@ccnle"(r) : "r" (1));
+    if (r)
+    {
+      /* 1 le 1.  */
+      __asm__ ("cmp $1, %1" : "=@ccle"(r) : "r" (1));
+      if (r)
+       return 1;
+    }
+  }
+  return 0;
+}
+
+char TestO ()
+{
+  char r;
+  unsigned char res = 128;
+
+  /* overflow.  */
+  __asm__ ("addb $128, %1" : "=@cco"(r), "+r"(res));
+  if (r)
+  {
+    /* not overflow.  */
+    __asm__ ("addb $1, %1" : "=@ccno"(r), "+r"(res));
+    if (r)
+      return 1;
+  }
+  return 0;
+}
+
+char TestP ()
+{
+  char r, res = 1;
+
+  /* even # bits.  */
+  __asm__ ("addb $2, %1" : "=@ccp"(r), "+r"(res));
+  if (r)
+  {
+    /* odd # bits.  */
+    __asm__ ("addb $1, %1" : "=@ccnp"(r), "+r"(res));
+    if (r)
+      return 1;
+  }
+  return 0;
+}
+
+char TestS ()
+{
+  char r, res = 1;
+
+  /* sign bit set.  */
+  __asm__ ("addb $128, %1" : "=@ccs"(r), "+r"(res));
+  if (r)
+  {
+    /* sign bit not set.  */
+    __asm__ ("subb $128, %1" : "=@ccns"(r), "+r"(res));
+    if (r)
+      return 1;
+  }
+  return 0;
+}
+
+/* dg-do treats exit code of 0 as success.  */
+int main ()
+{
+  if (TestC () && TestE () && TestZ () && TestA ()
+      && TestAE () && TestB () && TestBE () && TestG ()
+      && TestGE () && TestL () && TestLE () && TestO ()
+      && TestP ()  && TestS ())
+    return 0;
+  __builtin_abort ();
+}