aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorDavid Monniaux <david.monniaux@univ-grenoble-alpes.fr>2021-06-07 14:42:48 +0200
committerDavid Monniaux <david.monniaux@univ-grenoble-alpes.fr>2021-06-07 14:42:48 +0200
commitc21c794ec0abb307ff4d0948e2a504da936ea602 (patch)
tree533c0f9757e7d082def9760d163d001c723648b1 /test
parent24b7c69666f800857f9620b8dc83bdc92792f7d3 (diff)
downloadcompcert-kvx-c21c794ec0abb307ff4d0948e2a504da936ea602.tar.gz
compcert-kvx-c21c794ec0abb307ff4d0948e2a504da936ea602.zip
timing
Diffstat (limited to 'test')
-rw-r--r--test/monniaux/division/harness.c81
-rw-r--r--test/monniaux/division/my_udiv32.s36
2 files changed, 117 insertions, 0 deletions
diff --git a/test/monniaux/division/harness.c b/test/monniaux/division/harness.c
new file mode 100644
index 00000000..8d7e7d13
--- /dev/null
+++ b/test/monniaux/division/harness.c
@@ -0,0 +1,81 @@
+#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();
+
+ 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("%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;
+}
diff --git a/test/monniaux/division/my_udiv32.s b/test/monniaux/division/my_udiv32.s
new file mode 100644
index 00000000..0f4fd127
--- /dev/null
+++ b/test/monniaux/division/my_udiv32.s
@@ -0,0 +1,36 @@
+ .align 8
+ .global my_udiv32
+ .type my_udiv32, @function
+my_udiv32:
+ zxwd $r1 = $r1
+ make $r3 = 0x3ff0000000000000 # 1.0
+ zxwd $r0 = $r0
+ ;;
+ floatud.rn $r5 = $r1, 0
+ ;;
+ floatuw.rn $r2 = $r1, 0
+ ;;
+ finvw $r2 = $r2
+ ;;
+
+ fwidenlwd $r2 = $r2
+ floatud.rn $r4 = $r0, 0
+ ;;
+ ffmsd $r3 = $r2, $r5
+ ;;
+ ffmad $r2 = $r2, $r3
+ ;;
+ fmuld $r2 = $r2, $r4
+ ;;
+ fixedud.rn $r2 = $r2, 0
+ ;;
+ msbfw $r0 = $r2, $r1
+ zxwd $r1 = $r2
+ addw $r2 = $r2, -1
+ ;;
+ cmoved.wltz $r0? $r1 = $r2
+ ;;
+ copyd $r0 = $r1
+ ret
+ ;;
+ .size my_udiv32, .-my_udiv32