diff options
author | Aleksandar Markovic | 2019-03-05 16:34:33 +0100 |
---|---|---|
committer | Aleksandar Markovic | 2019-03-05 17:03:15 +0100 |
commit | 9dea2df84855b246113a5587bdd43fc21dc0ea6b (patch) | |
tree | cf7587e25003a27730888137893798438e83f18b | |
parent | tests/tcg: target/mips: Add tests for MIPS64R6 bit swap instructions (diff) | |
download | qemu-9dea2df84855b246113a5587bdd43fc21dc0ea6b.tar.gz qemu-9dea2df84855b246113a5587bdd43fc21dc0ea6b.tar.xz qemu-9dea2df84855b246113a5587bdd43fc21dc0ea6b.zip |
tests/tcg: target/mips: Add tests for MIPS64R6 bit count instructions
Add tests for MIPS64R6 bit count instructions: CLO, CLZ, DCLO, and DCLZ.
Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
Reviewed-by: Aleksandar Rikalo <arikalo@wavecomp.com>
Message-Id: <1551800076-8104-12-git-send-email-aleksandar.markovic@rt-rk.com>
4 files changed, 576 insertions, 0 deletions
diff --git a/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_clo.c b/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_clo.c new file mode 100644 index 0000000000..ca9a739c50 --- /dev/null +++ b/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_clo.c @@ -0,0 +1,144 @@ +/* + * Test program for MIPS64R6 instruction CLO + * + * Copyright (C) 2019 Wave Computing, Inc. + * Copyright (C) 2019 Aleksandar Markovic <amarkovic@wavecomp.com> + * + * This program 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 program 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 program. If not, see <https://www.gnu.org/licenses/>. + * + */ + +#include <sys/time.h> +#include <stdint.h> + +#include "../../../../include/wrappers_mips64r6.h" +#include "../../../../include/test_inputs_64.h" +#include "../../../../include/test_utils_64.h" + +#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT) + + +int32_t main(void) +{ + char *instruction_name = "CLO"; + int32_t ret; + uint32_t i; + struct timeval start, end; + double elapsed_time; + + uint64_t b64_result[TEST_COUNT_TOTAL]; + uint64_t b64_expect[TEST_COUNT_TOTAL] = { + 0x0000000000000020ULL, /* 0 */ + 0x0000000000000000ULL, + 0x0000000000000001ULL, + 0x0000000000000000ULL, + 0x0000000000000002ULL, + 0x0000000000000000ULL, + 0x0000000000000003ULL, + 0x0000000000000000ULL, + 0x0000000000000004ULL, /* 8 */ + 0x0000000000000000ULL, + 0x0000000000000005ULL, + 0x0000000000000000ULL, + 0x0000000000000006ULL, + 0x0000000000000000ULL, + 0x0000000000000007ULL, + 0x0000000000000000ULL, + 0x0000000000000008ULL, /* 16 */ + 0x0000000000000000ULL, + 0x0000000000000009ULL, + 0x0000000000000000ULL, + 0x000000000000000aULL, + 0x0000000000000000ULL, + 0x000000000000000bULL, + 0x0000000000000000ULL, + 0x000000000000000cULL, /* 24 */ + 0x0000000000000000ULL, + 0x000000000000000dULL, + 0x0000000000000000ULL, + 0x000000000000000eULL, + 0x0000000000000000ULL, + 0x000000000000000fULL, + 0x0000000000000000ULL, + 0x0000000000000010ULL, /* 32 */ + 0x0000000000000000ULL, + 0x0000000000000011ULL, + 0x0000000000000000ULL, + 0x0000000000000012ULL, + 0x0000000000000000ULL, + 0x0000000000000013ULL, + 0x0000000000000000ULL, + 0x0000000000000014ULL, /* 40 */ + 0x0000000000000000ULL, + 0x0000000000000015ULL, + 0x0000000000000000ULL, + 0x0000000000000016ULL, + 0x0000000000000000ULL, + 0x0000000000000017ULL, + 0x0000000000000000ULL, + 0x0000000000000018ULL, /* 48 */ + 0x0000000000000000ULL, + 0x0000000000000019ULL, + 0x0000000000000000ULL, + 0x000000000000001aULL, + 0x0000000000000000ULL, + 0x000000000000001bULL, + 0x0000000000000000ULL, + 0x000000000000001cULL, /* 56 */ + 0x0000000000000000ULL, + 0x000000000000001dULL, + 0x0000000000000000ULL, + 0x000000000000001eULL, + 0x0000000000000000ULL, + 0x000000000000001fULL, + 0x0000000000000000ULL, + 0x0000000000000001ULL, /* 64 */ + 0x0000000000000005ULL, + 0x0000000000000001ULL, + 0x0000000000000000ULL, + 0x0000000000000001ULL, + 0x0000000000000002ULL, + 0x0000000000000001ULL, + 0x0000000000000006ULL, + 0x0000000000000000ULL, /* 72 */ + 0x0000000000000001ULL, + 0x0000000000000001ULL, + 0x0000000000000001ULL, + 0x0000000000000003ULL, + 0x0000000000000001ULL, + 0x0000000000000000ULL, + 0x0000000000000001ULL, + }; + + gettimeofday(&start, NULL); + + for (i = 0; i < TEST_COUNT_TOTAL; i++) { + if (i < PATTERN_INPUTS_64_COUNT) { + do_mips64r6_CLO(b64_pattern_se + i, b64_result + i); + } else { + do_mips64r6_CLO(b64_random_se + (i - PATTERN_INPUTS_64_COUNT), + b64_result + i); + } + } + + gettimeofday(&end, NULL); + + elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0; + elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0; + + ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time, + b64_result, b64_expect); + + return ret; +} diff --git a/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_clz.c b/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_clz.c new file mode 100644 index 0000000000..0a7d21dcbd --- /dev/null +++ b/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_clz.c @@ -0,0 +1,144 @@ +/* + * Test program for MIPS64R6 instruction CLZ + * + * Copyright (C) 2019 Wave Computing, Inc. + * Copyright (C) 2019 Aleksandar Markovic <amarkovic@wavecomp.com> + * + * This program 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 program 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 program. If not, see <https://www.gnu.org/licenses/>. + * + */ + +#include <sys/time.h> +#include <stdint.h> + +#include "../../../../include/wrappers_mips64r6.h" +#include "../../../../include/test_inputs_64.h" +#include "../../../../include/test_utils_64.h" + +#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT) + + +int32_t main(void) +{ + char *instruction_name = "CLZ"; + int32_t ret; + uint32_t i; + struct timeval start, end; + double elapsed_time; + + uint64_t b64_result[TEST_COUNT_TOTAL]; + uint64_t b64_expect[TEST_COUNT_TOTAL] = { + 0x0000000000000000ULL, /* 0 */ + 0x0000000000000020ULL, + 0x0000000000000000ULL, + 0x0000000000000001ULL, + 0x0000000000000000ULL, + 0x0000000000000002ULL, + 0x0000000000000000ULL, + 0x0000000000000003ULL, + 0x0000000000000000ULL, /* 8 */ + 0x0000000000000004ULL, + 0x0000000000000000ULL, + 0x0000000000000005ULL, + 0x0000000000000000ULL, + 0x0000000000000006ULL, + 0x0000000000000000ULL, + 0x0000000000000007ULL, + 0x0000000000000000ULL, /* 16 */ + 0x0000000000000008ULL, + 0x0000000000000000ULL, + 0x0000000000000009ULL, + 0x0000000000000000ULL, + 0x000000000000000aULL, + 0x0000000000000000ULL, + 0x000000000000000bULL, + 0x0000000000000000ULL, /* 24 */ + 0x000000000000000cULL, + 0x0000000000000000ULL, + 0x000000000000000dULL, + 0x0000000000000000ULL, + 0x000000000000000eULL, + 0x0000000000000000ULL, + 0x000000000000000fULL, + 0x0000000000000000ULL, /* 32 */ + 0x0000000000000010ULL, + 0x0000000000000000ULL, + 0x0000000000000011ULL, + 0x0000000000000000ULL, + 0x0000000000000012ULL, + 0x0000000000000000ULL, + 0x0000000000000013ULL, + 0x0000000000000000ULL, /* 40 */ + 0x0000000000000014ULL, + 0x0000000000000000ULL, + 0x0000000000000015ULL, + 0x0000000000000000ULL, + 0x0000000000000016ULL, + 0x0000000000000000ULL, + 0x0000000000000017ULL, + 0x0000000000000000ULL, /* 48 */ + 0x0000000000000018ULL, + 0x0000000000000000ULL, + 0x0000000000000019ULL, + 0x0000000000000000ULL, + 0x000000000000001aULL, + 0x0000000000000000ULL, + 0x000000000000001bULL, + 0x0000000000000000ULL, /* 56 */ + 0x000000000000001cULL, + 0x0000000000000000ULL, + 0x000000000000001dULL, + 0x0000000000000000ULL, + 0x000000000000001eULL, + 0x0000000000000000ULL, + 0x000000000000001fULL, + 0x0000000000000000ULL, /* 64 */ + 0x0000000000000000ULL, + 0x0000000000000000ULL, + 0x0000000000000001ULL, + 0x0000000000000000ULL, + 0x0000000000000000ULL, + 0x0000000000000000ULL, + 0x0000000000000000ULL, + 0x0000000000000002ULL, /* 72 */ + 0x0000000000000000ULL, + 0x0000000000000000ULL, + 0x0000000000000000ULL, + 0x0000000000000000ULL, + 0x0000000000000000ULL, + 0x0000000000000001ULL, + 0x0000000000000000ULL, + }; + + gettimeofday(&start, NULL); + + for (i = 0; i < TEST_COUNT_TOTAL; i++) { + if (i < PATTERN_INPUTS_64_COUNT) { + do_mips64r6_CLZ(b64_pattern_se + i, b64_result + i); + } else { + do_mips64r6_CLZ(b64_random_se + (i - PATTERN_INPUTS_64_COUNT), + b64_result + i); + } + } + + gettimeofday(&end, NULL); + + elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0; + elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0; + + ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time, + b64_result, b64_expect); + + return ret; +} diff --git a/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_dclo.c b/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_dclo.c new file mode 100644 index 0000000000..72bb473f66 --- /dev/null +++ b/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_dclo.c @@ -0,0 +1,144 @@ +/* + * Test program for MIPS64R6 instruction DCLO + * + * Copyright (C) 2019 Wave Computing, Inc. + * Copyright (C) 2019 Aleksandar Markovic <amarkovic@wavecomp.com> + * + * This program 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 program 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 program. If not, see <https://www.gnu.org/licenses/>. + * + */ + +#include <sys/time.h> +#include <stdint.h> + +#include "../../../../include/wrappers_mips64r6.h" +#include "../../../../include/test_inputs_64.h" +#include "../../../../include/test_utils_64.h" + +#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT) + + +int32_t main(void) +{ + char *instruction_name = "DCLO"; + int32_t ret; + uint32_t i; + struct timeval start, end; + double elapsed_time; + + uint64_t b64_result[TEST_COUNT_TOTAL]; + uint64_t b64_expect[TEST_COUNT_TOTAL] = { + 0x0000000000000040ULL, /* 0 */ + 0x0000000000000000ULL, + 0x0000000000000001ULL, + 0x0000000000000000ULL, + 0x0000000000000002ULL, + 0x0000000000000000ULL, + 0x0000000000000003ULL, + 0x0000000000000000ULL, + 0x0000000000000004ULL, /* 8 */ + 0x0000000000000000ULL, + 0x0000000000000005ULL, + 0x0000000000000000ULL, + 0x0000000000000006ULL, + 0x0000000000000000ULL, + 0x0000000000000007ULL, + 0x0000000000000000ULL, + 0x0000000000000008ULL, /* 16 */ + 0x0000000000000000ULL, + 0x0000000000000009ULL, + 0x0000000000000000ULL, + 0x000000000000000aULL, + 0x0000000000000000ULL, + 0x000000000000000bULL, + 0x0000000000000000ULL, + 0x000000000000000cULL, /* 24 */ + 0x0000000000000000ULL, + 0x000000000000000dULL, + 0x0000000000000000ULL, + 0x000000000000000eULL, + 0x0000000000000000ULL, + 0x000000000000000fULL, + 0x0000000000000000ULL, + 0x0000000000000010ULL, /* 32 */ + 0x0000000000000000ULL, + 0x0000000000000011ULL, + 0x0000000000000000ULL, + 0x0000000000000012ULL, + 0x0000000000000000ULL, + 0x0000000000000013ULL, + 0x0000000000000000ULL, + 0x0000000000000014ULL, /* 40 */ + 0x0000000000000000ULL, + 0x0000000000000015ULL, + 0x0000000000000000ULL, + 0x0000000000000016ULL, + 0x0000000000000000ULL, + 0x0000000000000017ULL, + 0x0000000000000000ULL, + 0x0000000000000018ULL, /* 48 */ + 0x0000000000000000ULL, + 0x0000000000000019ULL, + 0x0000000000000000ULL, + 0x000000000000001aULL, + 0x0000000000000000ULL, + 0x000000000000001bULL, + 0x0000000000000000ULL, + 0x000000000000001cULL, /* 56 */ + 0x0000000000000000ULL, + 0x000000000000001dULL, + 0x0000000000000000ULL, + 0x000000000000001eULL, + 0x0000000000000000ULL, + 0x000000000000001fULL, + 0x0000000000000000ULL, + 0x0000000000000001ULL, /* 64 */ + 0x0000000000000005ULL, + 0x0000000000000001ULL, + 0x0000000000000000ULL, + 0x0000000000000001ULL, + 0x0000000000000002ULL, + 0x0000000000000001ULL, + 0x0000000000000006ULL, + 0x0000000000000000ULL, /* 72 */ + 0x0000000000000001ULL, + 0x0000000000000001ULL, + 0x0000000000000001ULL, + 0x0000000000000003ULL, + 0x0000000000000001ULL, + 0x0000000000000000ULL, + 0x0000000000000001ULL, + }; + + gettimeofday(&start, NULL); + + for (i = 0; i < TEST_COUNT_TOTAL; i++) { + if (i < PATTERN_INPUTS_64_COUNT) { + do_mips64r6_DCLO((void *)&b64_pattern[i], (void *)&b64_result[i]); + } else { + do_mips64r6_DCLO((void *)&b64_random[i - PATTERN_INPUTS_64_COUNT], + (void *)&b64_result[i]); + } + } + + gettimeofday(&end, NULL); + + elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0; + elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0; + + ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time, + b64_result, b64_expect); + + return ret; +} diff --git a/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_dclz.c b/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_dclz.c new file mode 100644 index 0000000000..87df12b36c --- /dev/null +++ b/tests/tcg/mips/user/isa/mips64r6/bit-count/test_mips64r6_dclz.c @@ -0,0 +1,144 @@ +/* + * Test program for MIPS64R6 instruction DCLZ + * + * Copyright (C) 2019 Wave Computing, Inc. + * Copyright (C) 2019 Aleksandar Markovic <amarkovic@wavecomp.com> + * + * This program 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 program 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 program. If not, see <https://www.gnu.org/licenses/>. + * + */ + +#include <sys/time.h> +#include <stdint.h> + +#include "../../../../include/wrappers_mips64r6.h" +#include "../../../../include/test_inputs_64.h" +#include "../../../../include/test_utils_64.h" + +#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT) + + +int32_t main(void) +{ + char *instruction_name = "DCLZ"; + int32_t ret; + uint32_t i; + struct timeval start, end; + double elapsed_time; + + uint64_t b64_result[TEST_COUNT_TOTAL]; + uint64_t b64_expect[TEST_COUNT_TOTAL] = { + 0x0000000000000000ULL, /* 0 */ + 0x0000000000000040ULL, + 0x0000000000000000ULL, + 0x0000000000000001ULL, + 0x0000000000000000ULL, + 0x0000000000000002ULL, + 0x0000000000000000ULL, + 0x0000000000000003ULL, + 0x0000000000000000ULL, /* 8 */ + 0x0000000000000004ULL, + 0x0000000000000000ULL, + 0x0000000000000005ULL, + 0x0000000000000000ULL, + 0x0000000000000006ULL, + 0x0000000000000000ULL, + 0x0000000000000007ULL, + 0x0000000000000000ULL, /* 16 */ + 0x0000000000000008ULL, + 0x0000000000000000ULL, + 0x0000000000000009ULL, + 0x0000000000000000ULL, + 0x000000000000000aULL, + 0x0000000000000000ULL, + 0x000000000000000bULL, + 0x0000000000000000ULL, /* 24 */ + 0x000000000000000cULL, + 0x0000000000000000ULL, + 0x000000000000000dULL, + 0x0000000000000000ULL, + 0x000000000000000eULL, + 0x0000000000000000ULL, + 0x000000000000000fULL, + 0x0000000000000000ULL, /* 32 */ + 0x0000000000000010ULL, + 0x0000000000000000ULL, + 0x0000000000000011ULL, + 0x0000000000000000ULL, + 0x0000000000000012ULL, + 0x0000000000000000ULL, + 0x0000000000000013ULL, + 0x0000000000000000ULL, /* 40 */ + 0x0000000000000014ULL, + 0x0000000000000000ULL, + 0x0000000000000015ULL, + 0x0000000000000000ULL, + 0x0000000000000016ULL, + 0x0000000000000000ULL, + 0x0000000000000017ULL, + 0x0000000000000000ULL, /* 48 */ + 0x0000000000000018ULL, + 0x0000000000000000ULL, + 0x0000000000000019ULL, + 0x0000000000000000ULL, + 0x000000000000001aULL, + 0x0000000000000000ULL, + 0x000000000000001bULL, + 0x0000000000000000ULL, /* 56 */ + 0x000000000000001cULL, + 0x0000000000000000ULL, + 0x000000000000001dULL, + 0x0000000000000000ULL, + 0x000000000000001eULL, + 0x0000000000000000ULL, + 0x000000000000001fULL, + 0x0000000000000000ULL, /* 64 */ + 0x0000000000000000ULL, + 0x0000000000000000ULL, + 0x0000000000000001ULL, + 0x0000000000000000ULL, + 0x0000000000000000ULL, + 0x0000000000000000ULL, + 0x0000000000000000ULL, + 0x0000000000000002ULL, /* 72 */ + 0x0000000000000000ULL, + 0x0000000000000000ULL, + 0x0000000000000000ULL, + 0x0000000000000000ULL, + 0x0000000000000000ULL, + 0x0000000000000001ULL, + 0x0000000000000000ULL, + }; + + gettimeofday(&start, NULL); + + for (i = 0; i < TEST_COUNT_TOTAL; i++) { + if (i < PATTERN_INPUTS_64_COUNT) { + do_mips64r6_DCLZ(b64_pattern + i, b64_result + i); + } else { + do_mips64r6_DCLZ(b64_random + (i - PATTERN_INPUTS_64_COUNT), + b64_result + i); + } + } + + gettimeofday(&end, NULL); + + elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0; + elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0; + + ret = check_results_64(instruction_name, TEST_COUNT_TOTAL, elapsed_time, + b64_result, b64_expect); + + return ret; +} |