| /* |
| * Header file for test utilities |
| * |
| * 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/>. |
| * |
| */ |
| |
| #ifndef TEST_UTILS_128_H |
| #define TEST_UTILS_128_H |
| |
| #include <stdio.h> |
| #include <stdint.h> |
| #include <inttypes.h> |
| #include <string.h> |
| |
| #define PRINT_RESULTS 0 |
| #define PRINT_FAILURES 0 |
| |
| |
| static inline int32_t check_results_128(const char *isa_ase_name, |
| const char *group_name, |
| const char *instruction_name, |
| const uint32_t test_count, |
| const double elapsed_time, |
| const uint64_t *b128_result, |
| const uint64_t *b128_expect) |
| { |
| #if PRINT_RESULTS |
| uint32_t ii; |
| printf("\n"); |
| for (ii = 0; ii < test_count; ii++) { |
| uint64_t a, b; |
| memcpy(&a, (b128_result + 2 * ii), 8); |
| memcpy(&b, (b128_result + 2 * ii + 1), 8); |
| if (ii % 8 != 0) { |
| printf(" { 0x%016llxULL, 0x%016llxULL, },\n", a, b); |
| } else { |
| printf(" { 0x%016llxULL, 0x%016llxULL, }, /* %3d */\n", |
| a, b, ii); |
| } |
| } |
| printf("\n"); |
| #endif |
| uint32_t i; |
| uint32_t pass_count = 0; |
| uint32_t fail_count = 0; |
| |
| printf("| %-10s \t| %-20s\t| %-16s \t|", |
| isa_ase_name, group_name, instruction_name); |
| for (i = 0; i < test_count; i++) { |
| if ((b128_result[2 * i] == b128_expect[2 * i]) && |
| (b128_result[2 * i + 1] == b128_expect[2 * i + 1])) { |
| pass_count++; |
| } else { |
| #if PRINT_FAILURES |
| uint32_t ii; |
| uint64_t a, b; |
| |
| printf("\n"); |
| |
| printf("FAILURE for test case %d!\n", i); |
| |
| memcpy(&a, (b128_expect + 2 * i), 8); |
| memcpy(&b, (b128_expect + 2 * i + 1), 8); |
| printf("Expected result : { 0x%016llxULL, 0x%016llxULL, },\n", |
| a, b); |
| |
| memcpy(&a, (b128_result + 2 * i), 8); |
| memcpy(&b, (b128_result + 2 * i + 1), 8); |
| printf("Actual result : { 0x%016llxULL, 0x%016llxULL, },\n", |
| a, b); |
| |
| printf("\n"); |
| #endif |
| fail_count++; |
| } |
| } |
| |
| printf(" PASS: %3d \t| FAIL: %3d \t| elapsed time: %5.2f ms \t|\n", |
| pass_count, fail_count, elapsed_time); |
| |
| if (fail_count > 0) { |
| return -1; |
| } else { |
| return 0; |
| } |
| } |
| |
| #endif |