* gcc.target/bfin: New directory.
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 4 May 2006 15:14:43 +0000 (15:14 +0000)
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 4 May 2006 15:14:43 +0000 (15:14 +0000)
* gcc.target/bfin/bfin.exp: New file.
* gcc.target/bfin/frmul.c: New file.
* gcc.target/bfin/arith.c: New file.
* gcc.target/bfin/mul-combine.c: New file.
* gcc.target/bfin/shift.c: New file.

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

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/bfin/arith.c [new file with mode: 0644]
gcc/testsuite/gcc.target/bfin/bfin.exp [new file with mode: 0644]
gcc/testsuite/gcc.target/bfin/frmul.c [new file with mode: 0644]
gcc/testsuite/gcc.target/bfin/mul-combine.c [new file with mode: 0644]
gcc/testsuite/gcc.target/bfin/shift.c [new file with mode: 0644]

index c6077c4..798df54 100644 (file)
@@ -1,3 +1,12 @@
+2005-05-04  Bernd Schmidt  <bernd.schmidt@analog.com>
+
+       * gcc.target/bfin: New directory.
+       * gcc.target/bfin/bfin.exp: New file.
+       * gcc.target/bfin/frmul.c: New file.
+       * gcc.target/bfin/arith.c: New file.
+       * gcc.target/bfin/mul-combine.c: New file.
+       * gcc.target/bfin/shift.c: New file.
+
 2006-05-04  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/14287
diff --git a/gcc/testsuite/gcc.target/bfin/arith.c b/gcc/testsuite/gcc.target/bfin/arith.c
new file mode 100644 (file)
index 0000000..211506c
--- /dev/null
@@ -0,0 +1,48 @@
+extern void abort (void);
+extern void exit (int);
+
+typedef int  __v2hi __attribute ((vector_size(4)));
+typedef __v2hi fract2x16;
+typedef short fract16;
+
+int main ()
+{
+  fract2x16 a, b, c, d;
+  fract16 t1, t2;
+  a = __builtin_bfin_compose_2x16 (0x3000, 0x2000);
+  b = __builtin_bfin_compose_2x16 (0x7000, 0x5000);
+  c = __builtin_bfin_compose_2x16 (0x7000, 0xc000);
+
+  d = __builtin_bfin_add_fr2x16 (a, b);
+  t1 = __builtin_bfin_extract_lo (d);
+  t2 = __builtin_bfin_extract_hi (d);
+  if (t1 != 0x7000 || t2 != 0x7fff)
+    abort ();
+
+  d = __builtin_bfin_sub_fr2x16 (a, b);
+  t1 = __builtin_bfin_extract_lo (d);
+  t2 = __builtin_bfin_extract_hi (d);
+  if (t1 != -0x3000 || t2 != -0x4000)
+    abort ();
+
+  d = __builtin_bfin_negate_fr2x16 (c);
+  t1 = __builtin_bfin_extract_lo (d);
+  t2 = __builtin_bfin_extract_hi (d);
+  if (t1 != 0x4000 || t2 != -0x7000)
+    abort ();
+  
+  if (__builtin_bfin_add_fr1x32 (0x7fffffff, 1) != 0x7fffffff)
+    abort ();
+
+  if (__builtin_bfin_add_fr1x32 (0x80000000, -1) != 0x80000000)
+    abort ();
+    
+  if (__builtin_bfin_add_fr1x32 (0x80000001, -1) != 0x80000000)
+    abort ();
+    
+  if (__builtin_bfin_add_fr1x32 (0xFEDCBA98, 0x11111111) != 0x0FEDCBA9)
+    abort ();
+    
+  exit (0);
+}
+
diff --git a/gcc/testsuite/gcc.target/bfin/bfin.exp b/gcc/testsuite/gcc.target/bfin/bfin.exp
new file mode 100644 (file)
index 0000000..37f0a7c
--- /dev/null
@@ -0,0 +1,23 @@
+# Tests for the Blackfin
+
+if {![istarget bfin-*]} {
+    return 0
+}
+
+load_lib gcc-dg.exp
+
+# If a testcase doesn't have special options, use these.
+global DEFAULT_CFLAGS
+if ![info exists DEFAULT_CFLAGS] then {
+    set DEFAULT_CFLAGS " -ansi -pedantic-errors"
+}
+
+# Initialize `dg'.
+dg-init
+
+# Main loop.
+dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] \
+       "" $DEFAULT_CFLAGS
+
+# All done.
+dg-finish
diff --git a/gcc/testsuite/gcc.target/bfin/frmul.c b/gcc/testsuite/gcc.target/bfin/frmul.c
new file mode 100644 (file)
index 0000000..390d02f
--- /dev/null
@@ -0,0 +1,149 @@
+extern void abort (void);
+extern void exit (int);
+
+typedef int  __v2hi __attribute ((vector_size(4)));
+typedef __v2hi fract2x16;
+typedef short fract16;
+
+#define GETVECT(HILO1,HILO2,IN1,IN2)                                   \
+  __builtin_bfin_compose_2x16 ((HILO2) ? __builtin_bfin_extract_hi (IN1) : __builtin_bfin_extract_lo (IN1), \
+                         (HILO1) ? __builtin_bfin_extract_hi (IN2) : __builtin_bfin_extract_lo (IN2))
+#define DOTEST(IN1, IN2, HL1, HL2, HL3, HL4)                                   \
+  __builtin_bfin_multr_fr2x16 (GETVECT (HL1, HL2, IN1, IN1), \
+                         GETVECT (HL3, HL4, IN2, IN2))
+
+#define FUNC(HL1, HL2, HL3, HL4) \
+  fract2x16 foo ## HL1 ## HL2 ## HL3 ## HL4 (fract2x16 a, fract2x16 b)\
+  { \
+    return DOTEST(a, b, HL1, HL2, HL3, HL4);\
+  }
+
+FUNC (0, 0, 0, 0)
+FUNC (1, 0, 0, 0)
+FUNC (0, 1, 0, 0)
+FUNC (1, 1, 0, 0)
+FUNC (0, 0, 1, 0)
+FUNC (1, 0, 1, 0)
+FUNC (0, 1, 1, 0)
+FUNC (1, 1, 1, 0)
+FUNC (0, 0, 0, 1)
+FUNC (1, 0, 0, 1)
+FUNC (0, 1, 0, 1)
+FUNC (1, 1, 0, 1)
+FUNC (0, 0, 1, 1)
+FUNC (1, 0, 1, 1)
+FUNC (0, 1, 1, 1)
+FUNC (1, 1, 1, 1)
+
+#define RES1 0x1400
+#define RES2 0x1e00
+#define RES3 0x1c00
+#define RES4 0x2a00
+
+
+int main ()
+{
+  fract2x16 a, b, c;
+  fract16 t1, t2;
+  a = __builtin_bfin_compose_2x16 (0x3000, 0x2000);
+  b = __builtin_bfin_compose_2x16 (0x7000, 0x5000);
+
+  c = foo0000 (a, b);
+  t1 = __builtin_bfin_extract_lo (c);
+  t2 = __builtin_bfin_extract_hi (c);
+  if (t1 != RES1 || t2 != RES1)
+    abort ();
+
+  c = foo1000 (a, b);
+  t1 = __builtin_bfin_extract_lo (c);
+  t2 = __builtin_bfin_extract_hi (c);
+  if (t1 != RES2 || t2 != RES1)
+    abort ();
+
+  c = foo0100 (a, b);
+  t1 = __builtin_bfin_extract_lo (c);
+  t2 = __builtin_bfin_extract_hi (c);
+  if (t1 != RES1 || t2 != RES2)
+    abort ();
+
+  c = foo1100 (a, b);
+  t1 = __builtin_bfin_extract_lo (c);
+  t2 = __builtin_bfin_extract_hi (c);
+  if (t1 != RES2 || t2 != RES2)
+    abort ();
+
+  c = foo0010 (a, b);
+  t1 = __builtin_bfin_extract_lo (c);
+  t2 = __builtin_bfin_extract_hi (c);
+  if (t1 != RES3 || t2 != RES1)
+    abort ();
+
+  c = foo1010 (a, b);
+  t1 = __builtin_bfin_extract_lo (c);
+  t2 = __builtin_bfin_extract_hi (c);
+  if (t1 != RES4 || t2 != RES1)
+    abort ();
+
+  c = foo0110 (a, b);
+  t1 = __builtin_bfin_extract_lo (c);
+  t2 = __builtin_bfin_extract_hi (c);
+  if (t1 != RES3 || t2 != RES2)
+    abort ();
+
+  c = foo1110 (a, b);
+  t1 = __builtin_bfin_extract_lo (c);
+  t2 = __builtin_bfin_extract_hi (c);
+  if (t1 != RES4 || t2 != RES2)
+    abort ();
+
+  c = foo0001 (a, b);
+  t1 = __builtin_bfin_extract_lo (c);
+  t2 = __builtin_bfin_extract_hi (c);
+  if (t1 != RES1 || t2 != RES3)
+    abort ();
+
+  c = foo1001 (a, b);
+  t1 = __builtin_bfin_extract_lo (c);
+  t2 = __builtin_bfin_extract_hi (c);
+  if (t1 != RES2 || t2 != RES3)
+    abort ();
+
+  c = foo0101 (a, b);
+  t1 = __builtin_bfin_extract_lo (c);
+  t2 = __builtin_bfin_extract_hi (c);
+  if (t1 != RES1 || t2 != RES4)
+    abort ();
+
+  c = foo1101 (a, b);
+  t1 = __builtin_bfin_extract_lo (c);
+  t2 = __builtin_bfin_extract_hi (c);
+  if (t1 != RES2 || t2 != RES4)
+    abort ();
+
+  c = foo0011 (a, b);
+  t1 = __builtin_bfin_extract_lo (c);
+  t2 = __builtin_bfin_extract_hi (c);
+  if (t1 != RES3 || t2 != RES3)
+    abort ();
+
+  c = foo1011 (a, b);
+  t1 = __builtin_bfin_extract_lo (c);
+  t2 = __builtin_bfin_extract_hi (c);
+  if (t1 != RES4 || t2 != RES3)
+    abort ();
+
+  c = foo0111 (a, b);
+  t1 = __builtin_bfin_extract_lo (c);
+  t2 = __builtin_bfin_extract_hi (c);
+  if (t1 != RES3 || t2 != RES4)
+    abort ();
+
+  c = foo1111 (a, b);
+  t1 = __builtin_bfin_extract_lo (c);
+  t2 = __builtin_bfin_extract_hi (c);
+  if (t1 != RES4 || t2 != RES4)
+    abort ();
+
+  exit (0);
+}
+
diff --git a/gcc/testsuite/gcc.target/bfin/mul-combine.c b/gcc/testsuite/gcc.target/bfin/mul-combine.c
new file mode 100644 (file)
index 0000000..59129b5
--- /dev/null
@@ -0,0 +1,45 @@
+/* Make sure combine eliminates all unnecessary instructions for the
+   sixteen cases of hi/lo multiplications.  */
+
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+/* { dg-final { scan-assembler-not "<<" } } */
+/* { dg-final { scan-assembler-not "PACK" } } */
+
+extern void abort (void);
+extern void exit (int);
+
+typedef int  __v2hi __attribute ((vector_size(4)));
+typedef __v2hi fract2x16;
+typedef short fract16;
+
+#define GETVECT(HILO1,HILO2,IN1,IN2)                                   \
+  __builtin_bfin_compose_2x16 ((HILO2) ? __builtin_bfin_extract_hi (IN1) : __builtin_bfin_extract_lo (IN1), \
+                         (HILO1) ? __builtin_bfin_extract_hi (IN2) : __builtin_bfin_extract_lo (IN2))
+#define DOTEST(IN1, IN2, HL1, HL2, HL3, HL4)                                   \
+  __builtin_bfin_multr_fr2x16 (GETVECT (HL1, HL2, IN1, IN1), \
+                         GETVECT (HL3, HL4, IN2, IN2))
+
+#define FUNC(HL1, HL2, HL3, HL4) \
+  fract2x16 foo ## HL1 ## HL2 ## HL3 ## HL4 (fract2x16 a, fract2x16 b)\
+  { \
+    return DOTEST(a, b, HL1, HL2, HL3, HL4);\
+  }
+
+FUNC (0, 0, 0, 0)
+FUNC (1, 0, 0, 0)
+FUNC (0, 1, 0, 0)
+FUNC (1, 1, 0, 0)
+FUNC (0, 0, 1, 0)
+FUNC (1, 0, 1, 0)
+FUNC (0, 1, 1, 0)
+FUNC (1, 1, 1, 0)
+FUNC (0, 0, 0, 1)
+FUNC (1, 0, 0, 1)
+FUNC (0, 1, 0, 1)
+FUNC (1, 1, 0, 1)
+FUNC (0, 0, 1, 1)
+FUNC (1, 0, 1, 1)
+FUNC (0, 1, 1, 1)
+FUNC (1, 1, 1, 1)
diff --git a/gcc/testsuite/gcc.target/bfin/shift.c b/gcc/testsuite/gcc.target/bfin/shift.c
new file mode 100644 (file)
index 0000000..1f17883
--- /dev/null
@@ -0,0 +1,73 @@
+extern void abort (void);
+extern void exit (int);
+
+typedef int  __v2hi __attribute ((vector_size(4)));
+typedef __v2hi fract2x16;
+typedef short fract16;
+
+int main ()
+{
+  fract2x16 a, b, c, d;
+  fract16 t1, t2;
+  a = __builtin_bfin_compose_2x16 (0xe005, 0x1000);
+  b = __builtin_bfin_compose_2x16 (0x7000, 0x5000);
+  c = __builtin_bfin_compose_2x16 (0x7000, 0xc000);
+
+  d = __builtin_bfin_shl_fr2x16 (c, 2);
+  t1 = __builtin_bfin_extract_lo (d);
+  t2 = __builtin_bfin_extract_hi (d);
+  if ((unsigned short)t1 != 0x8000 || t2 != 0x7fff)
+    abort ();
+
+  d = __builtin_bfin_shl_fr2x16 (c, -2);
+  t1 = __builtin_bfin_extract_lo (d);
+  t2 = __builtin_bfin_extract_hi (d);
+  if ((unsigned short)t1 != 0xf000 || t2 != 0x1c00)
+    abort ();
+
+  d = __builtin_bfin_shl_fr2x16 (a, 2);
+  t1 = __builtin_bfin_extract_lo (d);
+  t2 = __builtin_bfin_extract_hi (d);
+  if (t1 != 0x4000 || (unsigned short)t2 != 0x8014)
+    abort ();
+
+  d = __builtin_bfin_shl_fr2x16 (c, -4);
+  t1 = __builtin_bfin_extract_lo (d);
+  t2 = __builtin_bfin_extract_hi (d);
+  if ((unsigned short)t1 != 0xfc00 || t2 != 0x0700)
+    abort ();
+
+  d = __builtin_bfin_shl_fr2x16 (c, 2);
+  t1 = __builtin_bfin_extract_lo (d);
+  t2 = __builtin_bfin_extract_hi (d);
+  if ((unsigned short)t1 != 0x8000 || t2 != 0x7fff)
+    abort ();
+
+  d = __builtin_bfin_shl_fr2x16 (a, -2);
+  t1 = __builtin_bfin_extract_lo (d);
+  t2 = __builtin_bfin_extract_hi (d);
+  if (t1 != 0x0400 || (unsigned short)t2 != 0xf801)
+    abort ();
+
+  /* lsh */
+  d = __builtin_bfin_lshl_fr2x16 (c, -4);
+  t1 = __builtin_bfin_extract_lo (d);
+  t2 = __builtin_bfin_extract_hi (d);
+  if (t1 != 0x0c00 || t2 != 0x0700)
+    abort ();
+
+  d = __builtin_bfin_lshl_fr2x16 (c, 2);
+  t1 = __builtin_bfin_extract_lo (d);
+  t2 = __builtin_bfin_extract_hi (d);
+  if (t1 != 0x0000 || t2 != -0x4000)
+    abort ();
+
+  d = __builtin_bfin_lshl_fr2x16 (a, -2);
+  t1 = __builtin_bfin_extract_lo (d);
+  t2 = __builtin_bfin_extract_hi (d);
+  if (t1 != 0x0400 || (unsigned short)t2 != 0x3801)
+    abort ();
+
+  exit (0);
+}
+