diff options
author | Richard Henderson <rth@cygnus.com> | 2000-08-24 15:17:54 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2000-08-24 15:17:54 -0700 |
commit | cc914f8cbf08651475d06920039616636173b75c (patch) | |
tree | 92fb8653cba8ef26648311fd07e35f75e6ed18cd /gcc/testsuite/gcc.dg/ia64-sync-1.c | |
parent | 0551c32d8bd642833f411c7cea2b870b3d87a70d (diff) | |
download | gcc-cc914f8cbf08651475d06920039616636173b75c.zip gcc-cc914f8cbf08651475d06920039616636173b75c.tar.gz gcc-cc914f8cbf08651475d06920039616636173b75c.tar.bz2 |
New tests.
From-SVN: r35959
Diffstat (limited to 'gcc/testsuite/gcc.dg/ia64-sync-1.c')
-rw-r--r-- | gcc/testsuite/gcc.dg/ia64-sync-1.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/ia64-sync-1.c b/gcc/testsuite/gcc.dg/ia64-sync-1.c new file mode 100644 index 0000000..d2a9b0b --- /dev/null +++ b/gcc/testsuite/gcc.dg/ia64-sync-1.c @@ -0,0 +1,67 @@ +/* { dg-do run { target ia64-*-* } } */ +/* { dg-options } */ + +/* Test basic functionality of the intrinsics. The operations should + not be optimized away if no one checks the return values. */ + +#include <ia64intrin.h> + +static int AI[12]; +static int init_noret_si[12] = { 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0 }; +static int test_noret_si[12] = { 1, 1, 1, 0, 1, 4, 22, -12, 7, 8, 9, 7 }; + +static void +do_noret_si (void) +{ + __sync_val_compare_and_swap(AI+0, 0, 1); + __sync_bool_compare_and_swap(AI+1, 0, 1); + __sync_lock_test_and_set(AI+2, 1); + __sync_lock_release(AI+3); + + __sync_fetch_and_add(AI+4, 1); + __sync_fetch_and_add(AI+5, 4); + __sync_fetch_and_add(AI+6, 22); + __sync_fetch_and_sub(AI+7, 12); + __sync_fetch_and_and(AI+8, 7); + __sync_fetch_and_or(AI+9, 8); + __sync_fetch_and_xor(AI+10, 9); + __sync_fetch_and_nand(AI+11, 7); +} + +static long AL[12]; +static long init_noret_di[12] = { 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0 }; +static long test_noret_di[12] = { 1, 1, 1, 0, 1, 4, 22, -12, 7, 8, 9, 7 }; + +static void +do_noret_di (void) +{ + __sync_val_compare_and_swap(AL+0, 0, 1); + __sync_bool_compare_and_swap(AL+1, 0, 1); + __sync_lock_test_and_set(AL+2, 1); + __sync_lock_release(AL+3); + + __sync_fetch_and_add(AL+4, 1); + __sync_fetch_and_add(AL+5, 4); + __sync_fetch_and_add(AL+6, 22); + __sync_fetch_and_sub(AL+7, 12); + __sync_fetch_and_and(AL+8, 7); + __sync_fetch_and_or(AL+9, 8); + __sync_fetch_and_xor(AL+10, 9); + __sync_fetch_and_nand(AL+11, 7); +} + +int main() +{ + memcpy(AI, init_noret_si, sizeof(init_noret_si)); + memcpy(AL, init_noret_di, sizeof(init_noret_di)); + + do_noret_si (); + do_noret_di (); + + if (memcmp (AI, test_noret_si, sizeof(test_noret_si))) + abort (); + if (memcmp (AL, test_noret_di, sizeof(test_noret_di))) + abort (); + + return 0; +} |