blob: 24a206c4b95997fd73a5507bf8e76c523d9f79ad [file] [log] [blame]
/* Copyright (C) 2007 Free Software Foundation, Inc.
This file is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your option)
any later version.
This file is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with this file; see the file COPYING. If not, write to the Free
Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA. */
/* { dg-do run } */
#include <spu_mfcio.h>
#include <stdlib.h>
/* This test directly accesses the internal table used
by the MFC tag manager. */
extern vector unsigned int __mfc_tag_table;
/* This tag tests invalid tag release. Invalid tag release does
nothing to the tag table. */
void
test_tag_release01 (void)
{
unsigned int copy;
copy = spu_extract (__mfc_tag_table, 0);
mfc_tag_release (35);
if (copy != spu_extract (__mfc_tag_table, 0))
abort ();
}
/* More invalid release tests. */
void
test_tag_release_invalid (void)
{
unsigned int copy;
copy = spu_extract (__mfc_tag_table, 0);
if (mfc_tag_release (32) != MFC_TAG_INVALID)
abort ();
if (copy != spu_extract (__mfc_tag_table, 0))
abort ();
if (mfc_tag_release (17) != MFC_TAG_INVALID)
abort ();
if (copy != spu_extract (__mfc_tag_table, 0))
abort ();
}
/* Invalid multiple-tag release tests. */
void
test_tag_group_release_invalid (void)
{
unsigned int copy;
copy = spu_extract (__mfc_tag_table, 0);
if (mfc_multi_tag_release (32, 10) != MFC_TAG_INVALID)
abort ();
if (copy != spu_extract (__mfc_tag_table, 0))
abort ();
if (mfc_multi_tag_release (28, 10) != MFC_TAG_INVALID)
abort ();
if (copy != spu_extract (__mfc_tag_table, 0))
abort ();
if (mfc_multi_tag_release (17, 10) != MFC_TAG_INVALID)
abort ();
if (copy != spu_extract (__mfc_tag_table, 0))
abort ();
if (mfc_multi_tag_release (32, 10) != MFC_TAG_INVALID)
abort ();
if (copy != spu_extract (__mfc_tag_table, 0))
abort ();
}
/* The tag table should be in a pristine mode to run this test. */
void
test_tag_reserve01 (void)
{
unsigned int correct_table[32] =
{
0x80000000, 0xC0000000, 0xE0000000,
0xF0000000, 0xF8000000, 0xFC000000, 0xFE000000,
0xFF000000, 0xFF800000, 0xFFC00000, 0xFFE00000,
0xFFF00000, 0xFFF80000, 0xFFFC0000, 0xFFFE0000,
0xFFFF0000, 0xFFFF8000, 0xFFFFC000, 0xFFFFE000,
0xFFFFF000, 0xFFFFF800, 0xFFFFFC00, 0xFFFFFE00,
0xFFFFFF00, 0xFFFFFF80, 0xFFFFFFC0, 0xFFFFFFE0,
0xFFFFFFF0, 0xFFFFFFF8, 0xFFFFFFFC, 0xFFFFFFFE,
0xFFFFFFFF
};
unsigned int tag;
unsigned int i;
for (i = 0; i < 32; i++)
{
tag = mfc_tag_reserve ();
if (tag != i)
abort ();
}
for (i = 0; i < 32; i++)
{
tag = mfc_tag_reserve ();
if (tag != MFC_TAG_INVALID)
abort ();
}
for (i = 0; i < 32; i++)
{
mfc_tag_release (i);
if (spu_extract (__mfc_tag_table, 0) != correct_table[i])
abort ();
}
}
/* The tag table should be in a pristine mode to run this test. */
void
test_tag_reserve02 (void)
{
unsigned int correct_table[32] =
{
0x80000000, 0xC0000000, 0xA0000000, 0xF0000000,
0xA8000000, 0xFC000000, 0xAA000000, 0xFF000000,
0xAA800000, 0xFFC00000, 0xAAA00000, 0xFFF00000,
0xAAA80000, 0xFFFC0000, 0xAAAA0000, 0xFFFF0000,
0xAAAA8000, 0xFFFFC000, 0xAAAAA000, 0xFFFFF000,
0xAAAAA800, 0xFFFFFC00, 0xAAAAAA00, 0xFFFFFF00,
0xAAAAAA80, 0xFFFFFFC0, 0xAAAAAAA0, 0xFFFFFFF0,
0xAAAAAAA8, 0xFFFFFFFC, 0xAAAAAAAA, 0xFFFFFFFF
};
unsigned int correct_table2[32] =
{
0x80000000, 0xEAAAAAAA, 0xA0000000, 0xFAAAAAAA,
0xA8000000, 0xFEAAAAAA, 0xAA000000, 0xFFAAAAAA,
0xAA800000, 0xFFEAAAAA, 0xAAA00000, 0xFFFAAAAA,
0xAAA80000, 0xFFFEAAAA, 0xAAAA0000, 0xFFFFAAAA,
0xAAAA8000, 0xFFFFEAAA, 0xAAAAA000, 0xFFFFFAAA,
0xAAAAA800, 0xFFFFFEAA, 0xAAAAAA00, 0xFFFFFFAA,
0xAAAAAA80, 0xFFFFFFEA, 0xAAAAAAA0, 0xFFFFFFFA,
0xAAAAAAA8, 0xFFFFFFFE, 0xAAAAAAAA, 0xFFFFFFFF
};
unsigned int tag;
unsigned int i;
/* Reserve all 32 tags. */
for (i = 0; i < 32; i++)
{
tag = mfc_tag_reserve();
if (tag != i)
abort ();
}
for (i = 0; i < 32; i++)
{
tag = mfc_tag_reserve();
if (tag != MFC_TAG_INVALID)
abort ();
}
/* Release only 16 tags with a stride of 2. */
for (i = 0; i < 32; i += 2)
{
mfc_tag_release (i);
if (spu_extract (__mfc_tag_table, 0) != correct_table[i])
abort ();
}
/* Release the other 16 tags with a stride of 2. */
for (i = 1; i < 32; i += 2)
{
mfc_tag_release (i);
if (spu_extract (__mfc_tag_table, 0) != correct_table2[i])
abort ();
}
}
/* The tag table should be in a pristine mode to run this test. */
void
test_tag_reserve03 (void)
{
unsigned int tag;
unsigned int i;
/* Reserve all 32 tags. */
for (i = 0; i < 32; i++)
{
tag = mfc_tag_reserve ();
if (tag != i)
abort ();
}
for (i = 0; i < 32; i++)
{
tag = mfc_tag_reserve ();
if (tag != MFC_TAG_INVALID)
abort ();
}
/* Release only 16 tags with a stride of 2. */
for (i = 0; i < 32; i += 2)
mfc_tag_release (i);
/* Now let's re-reserve those tags. */
for (i = 0; i < 32; i += 2)
{
tag = mfc_tag_reserve ();
if (tag != i)
abort ();
}
/* Release all tags. */
for (i = 0; i < 32; i++)
mfc_tag_release (i);
if (spu_extract (__mfc_tag_table,0) != 0xFFFFFFFF)
abort ();
}
void
test_tag_group_reserve (void)
{
unsigned int tag;
unsigned int i;
unsigned int copy;
/* Reserve all tags. */
for (i = 0; i < 32; i++)
mfc_tag_reserve();
/* Release the first 4. */
for (i = 0; i < 4; i++)
mfc_tag_release (i);
/* Release tag 5 to 7. */
for (i = 5; i < 8; i++)
mfc_tag_release (i);
/* Release tag 9 to 19. */
for (i = 9; i < 20; i++)
mfc_tag_release (i);
/* Tag table should be 0xF77FF000. */
if (spu_extract (__mfc_tag_table, 0) != 0xF77FF000)
abort ();
/* Verify invalid release is detected. */
copy = spu_extract (__mfc_tag_table, 0);
if (mfc_multi_tag_release (1, 5) != MFC_TAG_INVALID)
abort ();
if (copy != spu_extract (__mfc_tag_table, 0))
abort ();
/* Reserve multiple tags. */
tag = mfc_multi_tag_reserve (5);
if (tag != 9)
abort ();
/* Tag table should be 0xF703F000. */
if (spu_extract (__mfc_tag_table, 0) != 0xF703F000)
abort ();
/* Release 5 tags in the group. */
mfc_multi_tag_release (tag, 5);
/* Tag table should be 0xF77FF000. */
if (spu_extract (__mfc_tag_table, 0) != 0xF77FF000)
abort ();
/* This call should not do anything. */
mfc_multi_tag_release (32, 5);
/* Tag table should be 0xF77FF000. */
if (spu_extract (__mfc_tag_table, 0) != 0xF77FF000)
abort ();
}
int
main (void)
{
test_tag_release01 ();
test_tag_release_invalid ();
test_tag_group_release_invalid ();
test_tag_reserve01 ();
test_tag_reserve02 ();
test_tag_reserve03 ();
test_tag_group_reserve ();
return 0;
}