test subti3
authorSa Liu <saliu@gcc.gnu.org>
Thu, 8 May 2008 08:42:38 +0000 (08:42 +0000)
committerSa Liu <saliu@gcc.gnu.org>
Thu, 8 May 2008 08:42:38 +0000 (08:42 +0000)
From-SVN: r135074

gcc/testsuite/gcc.target/spu/subti3.c [new file with mode: 0644]

diff --git a/gcc/testsuite/gcc.target/spu/subti3.c b/gcc/testsuite/gcc.target/spu/subti3.c
new file mode 100644 (file)
index 0000000..4112c95
--- /dev/null
@@ -0,0 +1,45 @@
+/* { dg-do run } */
+/* { dg-options "-std=c99" } */
+#include <stdlib.h>
+typedef int TItype __attribute__ ((mode (TI)));
+typedef int DItype __attribute__ ((mode (DI)));
+typedef unsigned int UDItype __attribute__ ((mode (DI)));
+
+struct DIstruct {DItype high, low;};
+typedef union
+{
+  struct DIstruct s;
+  TItype t;
+} TIunion;
+
+static
+void sub_ddmmss (UDItype *sh, UDItype *sl, UDItype ah, UDItype al, UDItype bh, UDItype bl)
+{
+  UDItype x;
+  x = al - bl;
+  *sh = ah - bh - (x > al);
+  *sl = x;
+}
+
+int main(void)
+{
+  TIunion aa, bb, cc;
+  TItype m = 0x1111111111111110ULL;
+  TItype n = 0x1111111111111111ULL;
+  TItype d;
+
+  aa.s.high = m;
+  aa.s.low = m;
+  bb.s.high = n;
+  bb.s.low = n;
+
+
+  sub_ddmmss (&cc.s.high, &cc.s.low, aa.s.high, aa.s.low, bb.s.high, bb.s.low);
+  d = aa.t - bb.t;
+  if (d != cc.t)
+   abort();
+  cc.t = aa.t -d;
+  if (cc.t != bb.t)
+   abort();
+ return 0;
+}