summaryrefslogtreecommitdiffstats
path: root/3rdparty/openpgm-svn-r1085/pgm/checksum_perftest.c
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/openpgm-svn-r1085/pgm/checksum_perftest.c')
-rw-r--r--3rdparty/openpgm-svn-r1085/pgm/checksum_perftest.c807
1 files changed, 807 insertions, 0 deletions
diff --git a/3rdparty/openpgm-svn-r1085/pgm/checksum_perftest.c b/3rdparty/openpgm-svn-r1085/pgm/checksum_perftest.c
new file mode 100644
index 0000000..678a066
--- /dev/null
+++ b/3rdparty/openpgm-svn-r1085/pgm/checksum_perftest.c
@@ -0,0 +1,807 @@
+/* vim:ts=8:sts=8:sw=4:noai:noexpandtab
+ *
+ * performance tests for PGM checksum routines
+ *
+ * Copyright (c) 2010 Miru Limited.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#define __STDC_FORMAT_MACROS
+#include <inttypes.h>
+#include <signal.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <glib.h>
+#include <check.h>
+
+
+/* mock state */
+
+static unsigned perf_testsize = 0;
+static unsigned perf_answer = 0;
+
+
+static
+void
+mock_setup_100b (void)
+{
+ perf_testsize = 100;
+ perf_answer = 0x6ea8;
+}
+
+static
+void
+mock_setup_200b (void)
+{
+ perf_testsize = 200;
+ perf_answer = 0x86e1;
+}
+
+static
+void
+mock_setup_1500b (void)
+{
+ perf_testsize = 1500;
+ perf_answer = 0xec69;
+}
+
+static
+void
+mock_setup_9kb (void)
+{
+ perf_testsize = 9000;
+ perf_answer = 0x576e;
+}
+
+static
+void
+mock_setup_64kb (void)
+{
+ perf_testsize = 65535;
+ perf_answer = 0x3fc0;
+}
+
+/* mock functions for external references */
+
+size_t
+pgm_transport_pkt_offset2 (
+ const bool can_fragment,
+ const bool use_pgmcc
+ )
+{
+ return 0;
+}
+
+#define CHECKSUM_DEBUG
+#include "checksum.c"
+
+
+static
+void
+mock_setup (void)
+{
+ g_assert (pgm_time_init (NULL));
+}
+
+static
+void
+mock_teardown (void)
+{
+ g_assert (pgm_time_shutdown ());
+}
+
+
+/* target:
+ * guint16
+ * pgm_inet_checksum (
+ * const void* src,
+ * guint len,
+ * int csum
+ * )
+ */
+
+START_TEST (test_8bit)
+{
+ const unsigned iterations = 1000;
+ char* source = alloca (perf_testsize);
+ for (unsigned i = 0, j = 0; i < perf_testsize; i++) {
+ j = j * 1103515245 + 12345;
+ source[i] = j;
+ }
+ const guint16 answer = perf_answer; /* network order */
+
+ guint16 csum;
+ pgm_time_t start, check;
+
+ start = pgm_time_update_now();
+ for (unsigned i = iterations; i; i--) {
+ csum = ~do_csum_8bit (source, perf_testsize, 0);
+/* function calculates answer in host order */
+ csum = g_htons (csum);
+ fail_unless (answer == csum, "checksum mismatch 0x%04x (0x%04x)", csum, answer);
+ }
+
+ check = pgm_time_update_now();
+ g_message ("8-bit/%u: elapsed time %" PGM_TIME_FORMAT " us, unit time %" PGM_TIME_FORMAT " us",
+ perf_testsize,
+ (guint64)(check - start),
+ (guint64)((check - start) / iterations));
+}
+END_TEST
+
+/* checksum + memcpy */
+START_TEST (test_8bit_memcpy)
+{
+ const unsigned iterations = 1000;
+ char* source = alloca (perf_testsize);
+ char* target = alloca (perf_testsize);
+ for (unsigned i = 0, j = 0; i < perf_testsize; i++) {
+ j = j * 1103515245 + 12345;
+ source[i] = j;
+ }
+ const guint16 answer = perf_answer; /* network order */
+
+ guint16 csum;
+ pgm_time_t start, check;
+
+ start = pgm_time_update_now();
+ for (unsigned i = iterations; i; i--) {
+ memcpy (target, source, perf_testsize);
+ csum = ~do_csum_8bit (target, perf_testsize, 0);
+/* function calculates answer in host order */
+ csum = g_htons (csum);
+ fail_unless (answer == csum, "checksum mismatch 0x%04x (0x%04x)", csum, answer);
+ }
+
+ check = pgm_time_update_now();
+ g_message ("8-bit/%u: elapsed time %" PGM_TIME_FORMAT " us, unit time %" PGM_TIME_FORMAT " us",
+ perf_testsize,
+ (guint64)(check - start),
+ (guint64)((check - start) / iterations));
+}
+END_TEST
+
+/* checksum & copy */
+START_TEST (test_8bit_csumcpy)
+{
+ const unsigned iterations = 1000;
+ char* source = alloca (perf_testsize);
+ char* target = alloca (perf_testsize);
+ for (unsigned i = 0, j = 0; i < perf_testsize; i++) {
+ j = j * 1103515245 + 12345;
+ source[i] = j;
+ }
+ const guint16 answer = perf_answer; /* network order */
+
+ guint16 csum;
+ pgm_time_t start, check;
+
+ start = pgm_time_update_now();
+ for (unsigned i = iterations; i; i--) {
+ csum = ~do_csumcpy_8bit (source, target, perf_testsize, 0);
+/* function calculates answer in host order */
+ csum = g_htons (csum);
+ fail_unless (answer == csum, "checksum mismatch 0x%04x (0x%04x)", csum, answer);
+ }
+
+ check = pgm_time_update_now();
+ g_message ("8-bit/%u: elapsed time %" PGM_TIME_FORMAT " us, unit time %" PGM_TIME_FORMAT " us",
+ perf_testsize,
+ (guint64)(check - start),
+ (guint64)((check - start) / iterations));
+}
+END_TEST
+
+START_TEST (test_16bit)
+{
+ const unsigned iterations = 1000;
+ char* source = alloca (perf_testsize);
+ for (unsigned i = 0, j = 0; i < perf_testsize; i++) {
+ j = j * 1103515245 + 12345;
+ source[i] = j;
+ }
+ const guint16 answer = perf_answer; /* network order */
+
+ guint16 csum;
+ pgm_time_t start, check;
+
+ start = pgm_time_update_now();
+ for (unsigned i = iterations; i; i--) {
+ csum = ~do_csum_16bit (source, perf_testsize, 0);
+/* function calculates answer in host order */
+ csum = g_htons (csum);
+ fail_unless (answer == csum, "checksum mismatch 0x%04x (0x%04x)", csum, answer);
+ }
+
+ check = pgm_time_update_now();
+ g_message ("16-bit/%u: elapsed time %" PGM_TIME_FORMAT " us, unit time %" PGM_TIME_FORMAT " us",
+ perf_testsize,
+ (guint64)(check - start),
+ (guint64)((check - start) / iterations));
+}
+END_TEST
+
+START_TEST (test_16bit_memcpy)
+{
+ const unsigned iterations = 1000;
+ char* source = alloca (perf_testsize);
+ char* target = alloca (perf_testsize);
+ for (unsigned i = 0, j = 0; i < perf_testsize; i++) {
+ j = j * 1103515245 + 12345;
+ source[i] = j;
+ }
+ const guint16 answer = perf_answer; /* network order */
+
+ guint16 csum;
+ pgm_time_t start, check;
+
+ start = pgm_time_update_now();
+ for (unsigned i = iterations; i; i--) {
+ memcpy (target, source, perf_testsize);
+ csum = ~do_csum_16bit (target, perf_testsize, 0);
+/* function calculates answer in host order */
+ csum = g_htons (csum);
+ fail_unless (answer == csum, "checksum mismatch 0x%04x (0x%04x)", csum, answer);
+ }
+
+ check = pgm_time_update_now();
+ g_message ("16-bit/%u: elapsed time %" PGM_TIME_FORMAT " us, unit time %" PGM_TIME_FORMAT " us",
+ perf_testsize,
+ (guint64)(check - start),
+ (guint64)((check - start) / iterations));
+}
+END_TEST
+
+START_TEST (test_16bit_csumcpy)
+{
+ const unsigned iterations = 1000;
+ char* source = alloca (perf_testsize);
+ char* target = alloca (perf_testsize);
+ for (unsigned i = 0, j = 0; i < perf_testsize; i++) {
+ j = j * 1103515245 + 12345;
+ source[i] = j;
+ }
+ const guint16 answer = perf_answer; /* network order */
+
+ guint16 csum;
+ pgm_time_t start, check;
+
+ start = pgm_time_update_now();
+ for (unsigned i = iterations; i; i--) {
+ csum = ~do_csumcpy_16bit (source, target, perf_testsize, 0);
+/* function calculates answer in host order */
+ csum = g_htons (csum);
+ fail_unless (answer == csum, "checksum mismatch 0x%04x (0x%04x)", csum, answer);
+ }
+
+ check = pgm_time_update_now();
+ g_message ("16-bit/%u: elapsed time %" PGM_TIME_FORMAT " us, unit time %" PGM_TIME_FORMAT " us",
+ perf_testsize,
+ (guint64)(check - start),
+ (guint64)((check - start) / iterations));
+}
+END_TEST
+
+START_TEST (test_32bit)
+{
+ const unsigned iterations = 1000;
+ char* source = alloca (perf_testsize);
+ for (unsigned i = 0, j = 0; i < perf_testsize; i++) {
+ j = j * 1103515245 + 12345;
+ source[i] = j;
+ }
+ const guint16 answer = perf_answer; /* network order */
+
+ guint16 csum;
+ pgm_time_t start, check;
+
+ start = pgm_time_update_now();
+ for (unsigned i = iterations; i; i--) {
+ csum = ~do_csum_32bit (source, perf_testsize, 0);
+/* function calculates answer in host order */
+ csum = g_htons (csum);
+ fail_unless (answer == csum, "checksum mismatch 0x%04x (0x%04x)", csum, answer);
+ }
+
+ check = pgm_time_update_now();
+ g_message ("32-bit/%u: elapsed time %" PGM_TIME_FORMAT " us, unit time %" PGM_TIME_FORMAT " us",
+ perf_testsize,
+ (guint64)(check - start),
+ (guint64)((check - start) / iterations));
+}
+END_TEST
+
+START_TEST (test_32bit_memcpy)
+{
+ const unsigned iterations = 1000;
+ char* source = alloca (perf_testsize);
+ char* target = alloca (perf_testsize);
+ for (unsigned i = 0, j = 0; i < perf_testsize; i++) {
+ j = j * 1103515245 + 12345;
+ source[i] = j;
+ }
+ const guint16 answer = perf_answer; /* network order */
+
+ guint16 csum;
+ pgm_time_t start, check;
+
+ start = pgm_time_update_now();
+ for (unsigned i = iterations; i; i--) {
+ memcpy (target, source, perf_testsize);
+ csum = ~do_csum_32bit (target, perf_testsize, 0);
+/* function calculates answer in host order */
+ csum = g_htons (csum);
+ fail_unless (answer == csum, "checksum mismatch 0x%04x (0x%04x)", csum, answer);
+ }
+
+ check = pgm_time_update_now();
+ g_message ("32-bit/%u: elapsed time %" PGM_TIME_FORMAT " us, unit time %" PGM_TIME_FORMAT " us",
+ perf_testsize,
+ (guint64)(check - start),
+ (guint64)((check - start) / iterations));
+}
+END_TEST
+
+START_TEST (test_32bit_csumcpy)
+{
+ const unsigned iterations = 1000;
+ char* source = alloca (perf_testsize);
+ char* target = alloca (perf_testsize);
+ for (unsigned i = 0, j = 0; i < perf_testsize; i++) {
+ j = j * 1103515245 + 12345;
+ source[i] = j;
+ }
+ const guint16 answer = perf_answer; /* network order */
+
+ guint16 csum;
+ pgm_time_t start, check;
+
+ start = pgm_time_update_now();
+ for (unsigned i = iterations; i; i--) {
+ csum = ~do_csumcpy_32bit (source, target, perf_testsize, 0);
+/* function calculates answer in host order */
+ csum = g_htons (csum);
+ fail_unless (answer == csum, "checksum mismatch 0x%04x (0x%04x)", csum, answer);
+ }
+
+ check = pgm_time_update_now();
+ g_message ("32-bit/%u: elapsed time %" PGM_TIME_FORMAT " us, unit time %" PGM_TIME_FORMAT " us",
+ perf_testsize,
+ (guint64)(check - start),
+ (guint64)((check - start) / iterations));
+}
+END_TEST
+
+START_TEST (test_64bit)
+{
+ const unsigned iterations = 1000;
+ char* source = alloca (perf_testsize);
+ for (unsigned i = 0, j = 0; i < perf_testsize; i++) {
+ j = j * 1103515245 + 12345;
+ source[i] = j;
+ }
+ const guint16 answer = perf_answer; /* network order */
+
+ guint16 csum;
+ pgm_time_t start, check;
+
+ start = pgm_time_update_now();
+ for (unsigned i = iterations; i; i--) {
+ csum = ~do_csum_64bit (source, perf_testsize, 0);
+/* function calculates answer in host order */
+ csum = g_htons (csum);
+ fail_unless (answer == csum, "checksum mismatch 0x%04x (0x%04x)", csum, answer);
+ }
+
+ check = pgm_time_update_now();
+ g_message ("64-bit/%u: elapsed time %" PGM_TIME_FORMAT " us, unit time %" PGM_TIME_FORMAT " us",
+ perf_testsize,
+ (guint64)(check - start),
+ (guint64)((check - start) / iterations));
+}
+END_TEST
+
+START_TEST (test_64bit_memcpy)
+{
+ const unsigned iterations = 1000;
+ char* source = alloca (perf_testsize);
+ char* target = alloca (perf_testsize);
+ for (unsigned i = 0, j = 0; i < perf_testsize; i++) {
+ j = j * 1103515245 + 12345;
+ source[i] = j;
+ }
+ const guint16 answer = perf_answer; /* network order */
+
+ guint16 csum;
+ pgm_time_t start, check;
+
+ start = pgm_time_update_now();
+ for (unsigned i = iterations; i; i--) {
+ memcpy (target, source, perf_testsize);
+ csum = ~do_csum_64bit (target, perf_testsize, 0);
+/* function calculates answer in host order */
+ csum = g_htons (csum);
+ fail_unless (answer == csum, "checksum mismatch 0x%04x (0x%04x)", csum, answer);
+ }
+
+ check = pgm_time_update_now();
+ g_message ("64-bit/%u: elapsed time %" PGM_TIME_FORMAT " us, unit time %" PGM_TIME_FORMAT " us",
+ perf_testsize,
+ (guint64)(check - start),
+ (guint64)((check - start) / iterations));
+}
+END_TEST
+
+START_TEST (test_64bit_csumcpy)
+{
+ const unsigned iterations = 1000;
+ char* source = alloca (perf_testsize);
+ char* target = alloca (perf_testsize);
+ for (unsigned i = 0, j = 0; i < perf_testsize; i++) {
+ j = j * 1103515245 + 12345;
+ source[i] = j;
+ }
+ const guint16 answer = perf_answer; /* network order */
+
+ guint16 csum;
+ pgm_time_t start, check;
+
+ start = pgm_time_update_now();
+ for (unsigned i = iterations; i; i--) {
+ csum = ~do_csumcpy_64bit (source, target, perf_testsize, 0);
+/* function calculates answer in host order */
+ csum = g_htons (csum);
+ fail_unless (answer == csum, "checksum mismatch 0x%04x (0x%04x)", csum, answer);
+ }
+
+ check = pgm_time_update_now();
+ g_message ("64-bit/%u: elapsed time %" PGM_TIME_FORMAT " us, unit time %" PGM_TIME_FORMAT " us",
+ perf_testsize,
+ (guint64)(check - start),
+ (guint64)((check - start) / iterations));
+}
+END_TEST
+
+#if defined(__amd64) || defined(__x86_64__)
+START_TEST (test_vector)
+{
+ const unsigned iterations = 1000;
+ char* source = alloca (perf_testsize);
+ for (unsigned i = 0, j = 0; i < perf_testsize; i++) {
+ j = j * 1103515245 + 12345;
+ source[i] = j;
+ }
+ const guint16 answer = perf_answer; /* network order */
+
+ guint16 csum;
+ pgm_time_t start, check;
+
+ start = pgm_time_update_now();
+ for (unsigned i = iterations; i; i--) {
+ csum = ~do_csum_vector (source, perf_testsize, 0);
+/* function calculates answer in host order */
+ csum = g_htons (csum);
+ fail_unless (answer == csum, "checksum mismatch 0x%04x (0x%04x)", csum, answer);
+ }
+
+ check = pgm_time_update_now();
+ g_message ("vector/%u: elapsed time %" PGM_TIME_FORMAT " us, unit time %" PGM_TIME_FORMAT " us",
+ perf_testsize,
+ (guint64)(check - start),
+ (guint64)((check - start) / iterations));
+}
+END_TEST
+
+START_TEST (test_vector_memcpy)
+{
+ const unsigned iterations = 1000;
+ char* source = alloca (perf_testsize);
+ char* target = alloca (perf_testsize);
+ for (unsigned i = 0, j = 0; i < perf_testsize; i++) {
+ j = j * 1103515245 + 12345;
+ source[i] = j;
+ }
+ const guint16 answer = perf_answer; /* network order */
+
+ guint16 csum;
+ pgm_time_t start, check;
+
+ start = pgm_time_update_now();
+ for (unsigned i = iterations; i; i--) {
+ memcpy (target, source, perf_testsize);
+ csum = ~do_csum_vector (target, perf_testsize, 0);
+/* function calculates answer in host order */
+ csum = g_htons (csum);
+ fail_unless (answer == csum, "checksum mismatch 0x%04x (0x%04x)", csum, answer);
+ }
+
+ check = pgm_time_update_now();
+ g_message ("vector/%u: elapsed time %" PGM_TIME_FORMAT " us, unit time %" PGM_TIME_FORMAT " us",
+ perf_testsize,
+ (guint64)(check - start),
+ (guint64)((check - start) / iterations));
+}
+END_TEST
+
+START_TEST (test_vector_csumcpy)
+{
+ const unsigned iterations = 1000;
+ char* source = alloca (perf_testsize);
+ char* target = alloca (perf_testsize);
+ for (unsigned i = 0, j = 0; i < perf_testsize; i++) {
+ j = j * 1103515245 + 12345;
+ source[i] = j;
+ }
+ const guint16 answer = perf_answer; /* network order */
+
+ guint16 csum;
+ pgm_time_t start, check;
+
+ start = pgm_time_update_now();
+ for (unsigned i = iterations; i; i--) {
+ csum = ~do_csumcpy_vector (source, target, perf_testsize, 0);
+/* function calculates answer in host order */
+ csum = g_htons (csum);
+ fail_unless (answer == csum, "checksum mismatch 0x%04x (0x%04x)", csum, answer);
+ }
+
+ check = pgm_time_update_now();
+ g_message ("vector/%u: elapsed time %" PGM_TIME_FORMAT " us, unit time %" PGM_TIME_FORMAT " us",
+ perf_testsize,
+ (guint64)(check - start),
+ (guint64)((check - start) / iterations));
+}
+END_TEST
+#endif /* defined(__amd64) || defined(__x86_64__) */
+
+
+
+static
+Suite*
+make_csum_performance_suite (void)
+{
+ Suite* s;
+
+ s = suite_create ("Raw checksum performance");
+
+ TCase* tc_100b = tcase_create ("100b");
+ suite_add_tcase (s, tc_100b);
+ tcase_add_checked_fixture (tc_100b, mock_setup, mock_teardown);
+ tcase_add_checked_fixture (tc_100b, mock_setup_100b, NULL);
+ tcase_add_test (tc_100b, test_8bit);
+ tcase_add_test (tc_100b, test_16bit);
+ tcase_add_test (tc_100b, test_32bit);
+ tcase_add_test (tc_100b, test_64bit);
+#if defined(__amd64) || defined(__x86_64__)
+ tcase_add_test (tc_100b, test_vector);
+#endif
+
+ TCase* tc_200b = tcase_create ("200b");
+ suite_add_tcase (s, tc_200b);
+ tcase_add_checked_fixture (tc_200b, mock_setup, mock_teardown);
+ tcase_add_checked_fixture (tc_200b, mock_setup_200b, NULL);
+ tcase_add_test (tc_200b, test_8bit);
+ tcase_add_test (tc_200b, test_16bit);
+ tcase_add_test (tc_200b, test_32bit);
+ tcase_add_test (tc_200b, test_64bit);
+#if defined(__amd64) || defined(__x86_64__)
+ tcase_add_test (tc_200b, test_vector);
+#endif
+
+ TCase* tc_1500b = tcase_create ("1500b");
+ suite_add_tcase (s, tc_1500b);
+ tcase_add_checked_fixture (tc_1500b, mock_setup, mock_teardown);
+ tcase_add_checked_fixture (tc_1500b, mock_setup_1500b, NULL);
+ tcase_add_test (tc_1500b, test_8bit);
+ tcase_add_test (tc_1500b, test_16bit);
+ tcase_add_test (tc_1500b, test_32bit);
+ tcase_add_test (tc_1500b, test_64bit);
+#if defined(__amd64) || defined(__x86_64__)
+ tcase_add_test (tc_1500b, test_vector);
+#endif
+
+ TCase* tc_9kb = tcase_create ("9KB");
+ suite_add_tcase (s, tc_9kb);
+ tcase_add_checked_fixture (tc_9kb, mock_setup, mock_teardown);
+ tcase_add_checked_fixture (tc_9kb, mock_setup_9kb, NULL);
+ tcase_add_test (tc_9kb, test_8bit);
+ tcase_add_test (tc_9kb, test_16bit);
+ tcase_add_test (tc_9kb, test_32bit);
+ tcase_add_test (tc_9kb, test_64bit);
+#if defined(__amd64) || defined(__x86_64__)
+ tcase_add_test (tc_9kb, test_vector);
+#endif
+
+ TCase* tc_64kb = tcase_create ("64KB");
+ suite_add_tcase (s, tc_64kb);
+ tcase_add_checked_fixture (tc_64kb, mock_setup, mock_teardown);
+ tcase_add_checked_fixture (tc_64kb, mock_setup_64kb, NULL);
+ tcase_add_test (tc_64kb, test_8bit);
+ tcase_add_test (tc_64kb, test_16bit);
+ tcase_add_test (tc_64kb, test_32bit);
+ tcase_add_test (tc_64kb, test_64bit);
+#if defined(__amd64) || defined(__x86_64__)
+ tcase_add_test (tc_64kb, test_vector);
+#endif
+
+ return s;
+}
+
+static
+Suite*
+make_csum_memcpy_performance_suite (void)
+{
+ Suite* s;
+
+ s = suite_create ("Checksum and memcpy performance");
+
+ TCase* tc_100b = tcase_create ("100b");
+ suite_add_tcase (s, tc_100b);
+ tcase_add_checked_fixture (tc_100b, mock_setup, mock_teardown);
+ tcase_add_checked_fixture (tc_100b, mock_setup_100b, NULL);
+ tcase_add_test (tc_100b, test_8bit_memcpy);
+ tcase_add_test (tc_100b, test_16bit_memcpy);
+ tcase_add_test (tc_100b, test_32bit_memcpy);
+ tcase_add_test (tc_100b, test_64bit_memcpy);
+#if defined(__amd64) || defined(__x86_64__)
+ tcase_add_test (tc_100b, test_vector_memcpy);
+#endif
+
+ TCase* tc_200b = tcase_create ("200b");
+ suite_add_tcase (s, tc_200b);
+ tcase_add_checked_fixture (tc_200b, mock_setup, mock_teardown);
+ tcase_add_checked_fixture (tc_200b, mock_setup_200b, NULL);
+ tcase_add_test (tc_200b, test_8bit_memcpy);
+ tcase_add_test (tc_200b, test_16bit_memcpy);
+ tcase_add_test (tc_200b, test_32bit_memcpy);
+ tcase_add_test (tc_200b, test_64bit_memcpy);
+#if defined(__amd64) || defined(__x86_64__)
+ tcase_add_test (tc_200b, test_vector_memcpy);
+#endif
+
+ TCase* tc_1500b = tcase_create ("1500b");
+ suite_add_tcase (s, tc_1500b);
+ tcase_add_checked_fixture (tc_1500b, mock_setup, mock_teardown);
+ tcase_add_checked_fixture (tc_1500b, mock_setup_1500b, NULL);
+ tcase_add_test (tc_1500b, test_8bit_memcpy);
+ tcase_add_test (tc_1500b, test_16bit_memcpy);
+ tcase_add_test (tc_1500b, test_32bit_memcpy);
+ tcase_add_test (tc_1500b, test_64bit_memcpy);
+#if defined(__amd64) || defined(__x86_64__)
+ tcase_add_test (tc_1500b, test_vector_memcpy);
+#endif
+
+ TCase* tc_9kb = tcase_create ("9KB");
+ suite_add_tcase (s, tc_9kb);
+ tcase_add_checked_fixture (tc_9kb, mock_setup, mock_teardown);
+ tcase_add_checked_fixture (tc_9kb, mock_setup_9kb, NULL);
+ tcase_add_test (tc_9kb, test_8bit_memcpy);
+ tcase_add_test (tc_9kb, test_16bit_memcpy);
+ tcase_add_test (tc_9kb, test_32bit_memcpy);
+ tcase_add_test (tc_9kb, test_64bit_memcpy);
+#if defined(__amd64) || defined(__x86_64__)
+ tcase_add_test (tc_9kb, test_vector_memcpy);
+#endif
+
+ TCase* tc_64kb = tcase_create ("64KB");
+ suite_add_tcase (s, tc_64kb);
+ tcase_add_checked_fixture (tc_64kb, mock_setup, mock_teardown);
+ tcase_add_checked_fixture (tc_64kb, mock_setup_64kb, NULL);
+ tcase_add_test (tc_64kb, test_8bit_memcpy);
+ tcase_add_test (tc_64kb, test_16bit_memcpy);
+ tcase_add_test (tc_64kb, test_32bit_memcpy);
+ tcase_add_test (tc_64kb, test_64bit_memcpy);
+#if defined(__amd64) || defined(__x86_64__)
+ tcase_add_test (tc_64kb, test_vector_memcpy);
+#endif
+
+ return s;
+}
+
+static
+Suite*
+make_csumcpy_performance_suite (void)
+{
+ Suite* s;
+
+ s = suite_create ("Checksum copy performance");
+
+ TCase* tc_100b = tcase_create ("100b");
+ suite_add_tcase (s, tc_100b);
+ tcase_add_checked_fixture (tc_100b, mock_setup, mock_teardown);
+ tcase_add_checked_fixture (tc_100b, mock_setup_100b, NULL);
+ tcase_add_test (tc_100b, test_8bit_csumcpy);
+ tcase_add_test (tc_100b, test_16bit_csumcpy);
+ tcase_add_test (tc_100b, test_32bit_csumcpy);
+ tcase_add_test (tc_100b, test_64bit_csumcpy);
+#if defined(__amd64) || defined(__x86_64__)
+ tcase_add_test (tc_100b, test_vector_csumcpy);
+#endif
+
+ TCase* tc_200b = tcase_create ("200b");
+ suite_add_tcase (s, tc_200b);
+ tcase_add_checked_fixture (tc_200b, mock_setup, mock_teardown);
+ tcase_add_checked_fixture (tc_200b, mock_setup_200b, NULL);
+ tcase_add_test (tc_200b, test_8bit_csumcpy);
+ tcase_add_test (tc_200b, test_16bit_csumcpy);
+ tcase_add_test (tc_200b, test_32bit_csumcpy);
+ tcase_add_test (tc_200b, test_64bit_csumcpy);
+#if defined(__amd64) || defined(__x86_64__)
+ tcase_add_test (tc_200b, test_vector_csumcpy);
+#endif
+
+ TCase* tc_1500b = tcase_create ("1500b");
+ suite_add_tcase (s, tc_1500b);
+ tcase_add_checked_fixture (tc_1500b, mock_setup, mock_teardown);
+ tcase_add_checked_fixture (tc_1500b, mock_setup_1500b, NULL);
+ tcase_add_test (tc_1500b, test_8bit_csumcpy);
+ tcase_add_test (tc_1500b, test_16bit_csumcpy);
+ tcase_add_test (tc_1500b, test_32bit_csumcpy);
+ tcase_add_test (tc_1500b, test_64bit_csumcpy);
+#if defined(__amd64) || defined(__x86_64__)
+ tcase_add_test (tc_1500b, test_vector_csumcpy);
+#endif
+
+ TCase* tc_9kb = tcase_create ("9KB");
+ suite_add_tcase (s, tc_9kb);
+ tcase_add_checked_fixture (tc_9kb, mock_setup, mock_teardown);
+ tcase_add_checked_fixture (tc_9kb, mock_setup_9kb, NULL);
+ tcase_add_test (tc_9kb, test_8bit_csumcpy);
+ tcase_add_test (tc_9kb, test_16bit_csumcpy);
+ tcase_add_test (tc_9kb, test_32bit_csumcpy);
+ tcase_add_test (tc_9kb, test_64bit_csumcpy);
+#if defined(__amd64) || defined(__x86_64__)
+ tcase_add_test (tc_9kb, test_vector_csumcpy);
+#endif
+
+ TCase* tc_64kb = tcase_create ("64KB");
+ suite_add_tcase (s, tc_64kb);
+ tcase_add_checked_fixture (tc_64kb, mock_setup, mock_teardown);
+ tcase_add_checked_fixture (tc_64kb, mock_setup_64kb, NULL);
+ tcase_add_test (tc_64kb, test_8bit_csumcpy);
+ tcase_add_test (tc_64kb, test_16bit_csumcpy);
+ tcase_add_test (tc_64kb, test_32bit_csumcpy);
+ tcase_add_test (tc_64kb, test_64bit_csumcpy);
+#if defined(__amd64) || defined(__x86_64__)
+ tcase_add_test (tc_64kb, test_vector_csumcpy);
+#endif
+
+ return s;
+}
+
+
+static
+Suite*
+make_master_suite (void)
+{
+ Suite* s = suite_create ("Master");
+ return s;
+}
+
+int
+main (void)
+{
+ SRunner* sr = srunner_create (make_master_suite ());
+ srunner_add_suite (sr, make_csum_performance_suite ());
+ srunner_add_suite (sr, make_csum_memcpy_performance_suite ());
+ srunner_add_suite (sr, make_csumcpy_performance_suite ());
+ srunner_run_all (sr, CK_ENV);
+ int number_failed = srunner_ntests_failed (sr);
+ srunner_free (sr);
+ return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+
+/* eof */