aboutsummaryrefslogtreecommitdiffstats
path: root/test/monniaux/division/harness.c
diff options
context:
space:
mode:
authornicolas.nardino <nicolas.nardino@ens-lyon.fr>2021-06-22 15:58:10 +0200
committernicolas.nardino <nicolas.nardino@ens-lyon.fr>2021-06-22 15:58:10 +0200
commitc5e8595480604c78260017cc771b0e4195fdd182 (patch)
treee7a05088dd8ad7003367be4c832bf5967ab92523 /test/monniaux/division/harness.c
parent10cbe4b28ef6dc5d02c9a5d4d369484e4943a18d (diff)
parentcf2aa686bcf9a823562fe977df6dd778d5467985 (diff)
downloadcompcert-kvx-c5e8595480604c78260017cc771b0e4195fdd182.tar.gz
compcert-kvx-c5e8595480604c78260017cc771b0e4195fdd182.zip
Merge branch 'kvx-sched-w-reg-press' of gricad-gitlab.univ-grenoble-alpes.fr:sixcy/CompCert into kvx-sched-w-reg-press
Diffstat (limited to 'test/monniaux/division/harness.c')
-rw-r--r--test/monniaux/division/harness.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/test/monniaux/division/harness.c b/test/monniaux/division/harness.c
new file mode 100644
index 00000000..b6ce674d
--- /dev/null
+++ b/test/monniaux/division/harness.c
@@ -0,0 +1,82 @@
+#include <stdint.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <math.h>
+#include <assert.h>
+#include "../cycles.h"
+
+static uint32_t dm_random_uint32(void) {
+ static uint32_t current=UINT32_C(0xDEADBEEF);
+ current = ((uint64_t) current << 6) % UINT32_C(4294967291);
+ return current;
+}
+
+static uint64_t dm_biased_random_uint32(void) {
+ uint32_t flags = dm_random_uint32();
+ uint32_t r;
+ switch (flags & 15) {
+ case 0:
+ r = dm_random_uint32() & 0xFU;
+ break;
+ case 1:
+ r = dm_random_uint32() & 0xFFU;
+ break;
+ case 2:
+ r = dm_random_uint32() & 0xFFFU;
+ break;
+ case 3:
+ r = dm_random_uint32() & 0xFFFFU;
+ break;
+ case 4:
+ r = dm_random_uint32() & 0xFFFFFU;
+ break;
+ case 5:
+ r = dm_random_uint32() & 0xFFFFFFU;
+ break;
+ case 6:
+ r = dm_random_uint32() & 0xFFFFFFFU;
+ break;
+ case 7:
+ r = dm_random_uint32() & 0x3;
+ break;
+ default:
+ r = dm_random_uint32();
+ }
+ return r;
+}
+
+inline uint32_t native_udiv32(uint32_t x, uint32_t y) {
+ return x/y;
+}
+extern uint32_t my_udiv32(uint32_t x, uint32_t y);
+
+int main() {
+ cycle_t time_me=0, time_native=0;
+ cycle_count_config();
+
+ for(int i=0; i<1000; i++) {
+ uint32_t x = dm_biased_random_uint32();
+ uint32_t y = dm_biased_random_uint32();
+ if (y == 0) continue;
+
+ cycle_t cycle_a, cycle_b, cycle_c;
+
+ uint32_t q1, q2;
+ cycle_a = get_cycle();
+ q1 = native_udiv32(x, y);
+ cycle_b = get_cycle();
+ q2 = my_udiv32(x, y);
+ cycle_c = get_cycle();
+
+ if(q1 != q2) {
+ printf("ERREUR %u %u\n", q1, q2);
+ }
+
+ time_native += cycle_b - cycle_a;
+ time_me += cycle_c - cycle_b;
+ }
+
+ printf("%" PRcycle "\t%" PRcycle "\n", time_native, time_me);
+
+ return 0;
+}