int main(int argc, char *argv[]) { int i; u8 *buff1, *buff2, gf_const_tbl[64], a = 2; struct perf start, stop; printf("gf_vect_mul_sse_perf:\n"); gf_vect_mul_init(a, gf_const_tbl); // Allocate large mem region buff1 = (u8 *) malloc(TEST_LEN); buff2 = (u8 *) malloc(TEST_LEN); if (NULL == buff1 || NULL == buff2) { printf("Failed to allocate %dB\n", TEST_LEN); return 1; } memset(buff1, 0, TEST_LEN); memset(buff2, 0, TEST_LEN); printf("Start timed tests\n"); fflush(0); gf_vect_mul_sse(TEST_LEN, gf_const_tbl, buff1, buff2); perf_start(&start); for (i = 0; i < TEST_LOOPS; i++) { gf_vect_mul_init(a, gf_const_tbl); // in a re-build would only calc once gf_vect_mul_sse(TEST_LEN, gf_const_tbl, buff1, buff2); } perf_stop(&stop); printf("gf_vect_mul_sse" TEST_TYPE_STR ": "); perf_print(stop, start, (long long)TEST_LEN * i); return 0; }
int main(int argc, char *argv[]) { int i; u8 *buff1, *buff2, *buff3, gf_const_tbl[64], a = 2; int tsize; int align, size; unsigned char *efence_buff1; unsigned char *efence_buff2; unsigned char *efence_buff3; printf("gf_vect_mul_sse_test: "); mk_gf_field(); gf_vect_mul_init(a, gf_const_tbl); buff1 = (u8*) malloc(TEST_SIZE); buff2 = (u8*) malloc(TEST_SIZE); buff3 = (u8*) malloc(TEST_SIZE); if (NULL == buff1 || NULL == buff2 || NULL == buff3){ printf("buffer alloc error\n"); return -1; } // Fill with rand data for(i=0; i<TEST_SIZE; i++) buff1[i] = rand(); gf_vect_mul_sse(TEST_SIZE, gf_const_tbl, buff1, buff2); for (i=0; i<TEST_SIZE; i++){ if (gf_mul(a, buff1[i]) != buff2[i]) { printf("fail at %d, 0x%x x 2 = 0x%x (0x%x)\n", i, buff1[i], buff2[i], gf_mul(2, buff1[i])); return -1; } } gf_vect_mul_base(TEST_SIZE, gf_const_tbl, buff1, buff3); // Check reference function for (i=0; i<TEST_SIZE; i++){ if (buff2[i] != buff3[i]) { printf("fail at %d, 0x%x x 0x%d = 0x%x (0x%x)\n", i, a, buff1[i], buff2[i], gf_mul(a, buff1[i])); return -1; } } for(i=0; i<TEST_SIZE; i++) buff1[i] = rand(); // Check each possible constant for(a=0; a!=255; a++){ gf_vect_mul_init(a, gf_const_tbl); gf_vect_mul_sse(TEST_SIZE, gf_const_tbl, buff1, buff2); for (i=0; i<TEST_SIZE; i++) if (gf_mul(a, buff1[i]) != buff2[i]) { printf("fail at %d, 0x%x x %d = 0x%x (0x%x)\n", i, a, buff1[i], buff2[i], gf_mul(2, buff1[i])); return -1; } putchar('.'); } // Check buffer len for (tsize = TEST_SIZE; tsize > 0; tsize -= 32){ a = rand(); gf_vect_mul_init(a, gf_const_tbl); gf_vect_mul_sse(tsize, gf_const_tbl, buff1, buff2); for (i=0; i<tsize; i++) if (gf_mul(a, buff1[i]) != buff2[i]) { printf("fail at %d, 0x%x x %d = 0x%x (0x%x)\n", i, a, buff1[i], buff2[i], gf_mul(2, buff1[i])); return -1; } if (0 == tsize % (32*8)) { putchar('.'); fflush(0); } } // Run tests at end of buffer for Electric Fence align = 32; a = 2; mk_gf_field(); gf_vect_mul_init(a, gf_const_tbl); for(size=0; size<TEST_SIZE; size+=align){ // Line up TEST_SIZE from end efence_buff1 = buff1 + size; efence_buff2 = buff2 + size; efence_buff3 = buff3 + size; gf_vect_mul_sse(TEST_SIZE-size, gf_const_tbl, efence_buff1, efence_buff2); for (i=0; i<TEST_SIZE-size; i++) if (gf_mul(a, efence_buff1[i]) != efence_buff2[i]) { printf("fail at %d, 0x%x x 2 = 0x%x (0x%x)\n", i, efence_buff1[i], efence_buff2[i], gf_mul(2, efence_buff1[i])); return 1; } gf_vect_mul_base(TEST_SIZE-size, gf_const_tbl, efence_buff1, efence_buff3); // Check reference function for (i=0; i<TEST_SIZE-size; i++) if (efence_buff2[i] != efence_buff3[i]) { printf("fail at %d, 0x%x x 0x%d = 0x%x (0x%x)\n", i, a, efence_buff2[i], efence_buff3[i], gf_mul(2, efence_buff1[i])); return 1; } putchar('.'); } printf(" done: Pass\n"); fflush(0); return 0; }