Commit 5eedb0ce by Bernd Schmidt Committed by Bernd Schmidt

bfin: New directory.

	* 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.

From-SVN: r113529
parent d818832c
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
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);
}
# 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
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);
}
/* 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)
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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment