aboutsummaryrefslogtreecommitdiffstats
path: root/runtime
diff options
context:
space:
mode:
authorCyril SIX <cyril.six@kalray.eu>2018-05-21 17:35:38 +0200
committerCyril SIX <cyril.six@kalray.eu>2018-05-21 17:35:38 +0200
commit8acbfc64cd77d911076aec57e8e0a558b36e448f (patch)
tree23906501349aaf0f8cadeff10314ee83318c51f4 /runtime
parent479aacd0254605942a3f48c3b8053af4d07f0f6c (diff)
downloadcompcert-kvx-8acbfc64cd77d911076aec57e8e0a558b36e448f.tar.gz
compcert-kvx-8acbfc64cd77d911076aec57e8e0a558b36e448f.zip
MPPA - div and mod, replaced gcc implementation by C files + ccomp
Diffstat (limited to 'runtime')
-rw-r--r--runtime/mppa_k1c/Makefile3
-rw-r--r--runtime/mppa_k1c/i32_udivmod.S187
-rw-r--r--runtime/mppa_k1c/i32_udivmod.c89
-rw-r--r--runtime/mppa_k1c/i64_sdiv.S50
-rw-r--r--runtime/mppa_k1c/i64_sdiv.c2
-rw-r--r--runtime/mppa_k1c/i64_smod.S46
-rw-r--r--runtime/mppa_k1c/i64_smod.c2
-rw-r--r--runtime/mppa_k1c/i64_udiv.S11
-rw-r--r--runtime/mppa_k1c/i64_udiv.c3
-rw-r--r--runtime/mppa_k1c/i64_udivmod.S58
-rw-r--r--runtime/mppa_k1c/i64_udivmod.c25
-rw-r--r--runtime/mppa_k1c/i64_umod.S11
-rw-r--r--runtime/mppa_k1c/i64_umod.c2
13 files changed, 29 insertions, 460 deletions
diff --git a/runtime/mppa_k1c/Makefile b/runtime/mppa_k1c/Makefile
index d447d35b..d15928b8 100644
--- a/runtime/mppa_k1c/Makefile
+++ b/runtime/mppa_k1c/Makefile
@@ -5,4 +5,5 @@ all: $(SFILES)
.SECONDARY:
%.S: %.c
- k1-gcc -O2 -S $< -o $@
+ ccomp -O2 -S $< -o $@
+ sed -i -e 's/i64_/__compcert_i64_/g' $@
diff --git a/runtime/mppa_k1c/i32_udivmod.S b/runtime/mppa_k1c/i32_udivmod.S
deleted file mode 100644
index b2923024..00000000
--- a/runtime/mppa_k1c/i32_udivmod.S
+++ /dev/null
@@ -1,187 +0,0 @@
- .text
-
- .align 8
- .type udivmodsi4, @function
-udivmodsi4:
- zxwd $r0 = $r0
- ;; /* Can't issue next in the same bundle */
- zxwd $r1 = $r1
- ;; /* Can't issue next in the same bundle */
- sxwd $r2 = $r2
- make $r4 = 0
- ;;
- compw.ltu $r3 = $r0, $r1
- ;;
- cb.weqz $r3? .L14
- ;;
-.L2:
- cmoved.deqz $r2? $r0 = $r4
- ret
- ;;
-.L14:
- clzw $r3 = $r1
- clzw $r5 = $r0
- ;;
- sbfw $r5 = $r5, $r3
- ;;
- sllw $r1 = $r1,$r5
- zxwd $r3 = $r5
- ;;
- compw.ltu $r6 = $r0, $r1
- ;;
- cb.wnez $r6? .L3
- ;;
- make $r4 = 1
- sbfw $r0 = $r1, $r0
- ;;
- sllw $r4 = $r4,$r5
- ;;
- zxwd $r4 = $r4
- ;;
-.L3:
- cb.deqz $r3? .L2
- ;;
- srlw $r1 = $r1,1
- copyd $r3 = $r5
- ;;
- loopgtz $r3, .L15
- ;;
-.L4:
- stsuw $r0 = $r1, $r0
- ;;
- zxwd $r0 = $r0
- ;;
-.L15:
- # HW loop end
- ;;
- srlw $r1 = $r0,$r5
- addw $r4 = $r0, $r4
- ;;
- sllw $r5 = $r1,$r5
- zxwd $r0 = $r1
- ;;
- sbfw $r4 = $r5, $r4
- ;;
- cmoved.deqz $r2? $r0 = $r4
- ret
- ;;
- .size udivmodsi4, .-udivmodsi4
-
- .align 8
- .globl __udivsi3
- .type __udivsi3, @function
-__udivsi3:
- make $r2 = 0
- goto udivmodsi4
- ;;
- .size __udivsi3, .-__udivsi3
-
- .align 8
- .globl __umodsi3
- .type __umodsi3, @function
-__umodsi3:
- make $r2 = 1
- goto udivmodsi4
- ;;
- .size __umodsi3, .-__umodsi3
-
- .align 8
- .globl __divsi3
- .type __divsi3, @function
-__divsi3:
- addw $r12 = $r12, -16
- get $r8 = $ra
- sxwd $r0 = $r0
- ;;
- sxwd $r1 = $r1
- sd 20[$r12] = $r10
- make $r10 = 0
- ;;
- sw 16[$r12] = $r8
- ;;
- cb.wltz $r0? .L22
- ;;
- cb.wltz $r1? .L23
- ;;
-.L20:
- make $r2 = 0
- call udivmodsi4
- ;;
- lwz $r8 = 16[$r12]
- negw $r1 = $r10
- ;;
- xorw $r0 = $r1, $r0
- ;;
- addw $r0 = $r0, $r10
- ld $r10 = 20[$r12]
- addw $r12 = $r12, 16
- ;;
- set $ra = $r8
- ;; /* Can't issue next in the same bundle */
- ret
- ;;
-.L22:
- negw $r0 = $r0
- make $r10 = 1
- ;;
- sxwd $r0 = $r0
- ;; /* Can't issue next in the same bundle */
- cb.wgez $r1? .L20
- ;;
-.L23:
- negw $r1 = $r1
- xorw $r10 = $r10, 1
- ;;
- sxwd $r1 = $r1
- sxwd $r10 = $r10
- goto .L20
- ;;
- .size __divsi3, .-__divsi3
-
- .align 8
- .globl __modsi3
- .type __modsi3, @function
-__modsi3:
- addw $r12 = $r12, -24
- get $r8 = $ra
- sxwd $r0 = $r0
- ;;
- sd 16[$r12] = $r15
- make $r15 = 0
- sxwd $r1 = $r1
- ;;
- sd 28[$r12] = $r10
- copyd $r10 = $r15
- ;;
- sw 24[$r12] = $r8
- ;;
- cb.wltz $r0? .L27
- ;;
-.L25:
- absw $r1 = $r1
- make $r2 = 1
- call udivmodsi4
- ;;
- lwz $r8 = 24[$r12]
- xorw $r0 = $r0, $r10
- ;;
- addw $r0 = $r0, $r15
- ld $r10 = 28[$r12]
- ;;
- ld $r15 = 16[$r12]
- addw $r12 = $r12, 24
- ;;
- set $ra = $r8
- ;; /* Can't issue next in the same bundle */
- ret
- ;;
-.L27:
- negw $r2 = $r0
- make $r15 = 1
- make $r10 = -1
- ;;
- sxwd $r0 = $r2
- goto .L25
- ;;
- .size __modsi3, .-__modsi3
- .ident "GCC: (GNU) 4.9.4"
diff --git a/runtime/mppa_k1c/i32_udivmod.c b/runtime/mppa_k1c/i32_udivmod.c
deleted file mode 100644
index e66496af..00000000
--- a/runtime/mppa_k1c/i32_udivmod.c
+++ /dev/null
@@ -1,89 +0,0 @@
-
-static unsigned int
-udivmodsi4(unsigned int num, unsigned int den, int modwanted)
-{
- unsigned r = num, q = 0;
-
- if(den <= r) {
- unsigned k = __builtin_k1_clz (den) - __builtin_k1_clz (r);
- den = den << k;
- if(r >= den) {
- r = r - den;
- q = 1 << k;
- }
- if(k != 0) {
- unsigned i = k;
- den = den >> 1;
- do {
- r = __builtin_k1_stsu (den, r);
- i--;
- } while (i!= 0);
- q = q + r;
- r = r >> k;
- q = q - (r << k);
- }
- }
-
- return modwanted ? r : q;
-}
-
-unsigned int
-__udivsi3 (unsigned int a, unsigned int b)
-{
- return udivmodsi4 (a, b, 0);
-}
-
-unsigned int
-__umodsi3 (unsigned int a, unsigned int b)
-{
- return udivmodsi4 (a, b, 1);
-}
-
-int
-__divsi3 (int a, int b)
-{
- int neg = 0;
- int res;
-
- if (a < 0)
- {
- a = -a;
- neg = !neg;
- }
-
- if (b < 0)
- {
- b = -b;
- neg = !neg;
- }
-
- res = udivmodsi4 (a, b, 0);
-
- if (neg)
- res = -res;
-
- return res;
-}
-
-int
-__modsi3 (int a, int b)
-{
- int neg = 0;
- int res;
-
- if (a < 0)
- {
- a = -a;
- neg = 1;
- }
-
- if (b < 0)
- b = -b;
-
- res = udivmodsi4 (a, b, 1);
-
- if (neg)
- res = -res;
-
- return res;
-}
diff --git a/runtime/mppa_k1c/i64_sdiv.S b/runtime/mppa_k1c/i64_sdiv.S
deleted file mode 100644
index 6cc712ee..00000000
--- a/runtime/mppa_k1c/i64_sdiv.S
+++ /dev/null
@@ -1,50 +0,0 @@
- .text
-
- .align 8
- .globl __compcert_i64_sdiv
- .type __compcert_i64_sdiv, @function
-__compcert_i64_sdiv:
- addw $r12 = $r12, -16
- get $r8 = $ra
- ;;
- sd 20[$r12] = $r10
- make $r10 = 0
- ;;
- sw 16[$r12] = $r8
- ;;
- cb.dltz $r0? .L6
- ;;
- cb.dltz $r1? .L7
- ;;
-.L3:
- make $r2 = 0
- call udivmoddi4
- ;;
- lwz $r8 = 16[$r12]
- negd $r1 = $r10
- ;;
- xord $r0 = $r1, $r0
- ;;
- addd $r0 = $r0, $r10
- ld $r10 = 20[$r12]
- addw $r12 = $r12, 16
- ;;
- set $ra = $r8
- ;; /* Can't issue next in the same bundle */
- ret
- ;;
-.L6:
- negd $r0 = $r0
- make $r10 = 1
- ;; /* Can't issue next in the same bundle */
- cb.dgez $r1? .L3
- ;;
-.L7:
- xorw $r10 = $r10, 1
- negd $r1 = $r1
- ;;
- sxwd $r10 = $r10
- goto .L3
- ;;
- .size __compcert_i64_sdiv, .-__compcert_i64_sdiv
- .ident "GCC: (GNU) 4.9.4"
diff --git a/runtime/mppa_k1c/i64_sdiv.c b/runtime/mppa_k1c/i64_sdiv.c
index 97b3cd2f..9ef1a25c 100644
--- a/runtime/mppa_k1c/i64_sdiv.c
+++ b/runtime/mppa_k1c/i64_sdiv.c
@@ -2,7 +2,7 @@ unsigned long long
udivmoddi4(unsigned long long num, unsigned long long den, int modwanted);
long long
-__compcert_i64_sdiv (long long a, long long b)
+i64_sdiv (long long a, long long b)
{
int neg = 0;
long long res;
diff --git a/runtime/mppa_k1c/i64_smod.S b/runtime/mppa_k1c/i64_smod.S
deleted file mode 100644
index 9a62b63d..00000000
--- a/runtime/mppa_k1c/i64_smod.S
+++ /dev/null
@@ -1,46 +0,0 @@
- .text
-
- .align 8
- .globl __compcert_i64_smod
- .type __compcert_i64_smod, @function
-__compcert_i64_smod:
- addw $r12 = $r12, -24
- get $r8 = $ra
- ;;
- sd 16[$r12] = $r15
- make $r15 = 0
- ;;
- sd 28[$r12] = $r10
- copyd $r10 = $r15
- ;;
- sw 24[$r12] = $r8
- ;;
- cb.dltz $r0? .L5
- ;;
-.L2:
- absd $r1 = $r1
- ;; /* Can't issue next in the same bundle */
- make $r2 = 1
- call udivmoddi4
- ;;
- lwz $r8 = 24[$r12]
- xord $r0 = $r0, $r10
- ;;
- addd $r0 = $r15, $r0
- ld $r10 = 28[$r12]
- ;;
- ld $r15 = 16[$r12]
- addw $r12 = $r12, 24
- ;;
- set $ra = $r8
- ;; /* Can't issue next in the same bundle */
- ret
- ;;
-.L5:
- negd $r0 = $r0
- make $r15 = 1
- make $r10 = -1
- goto .L2
- ;;
- .size __compcert_i64_smod, .-__compcert_i64_smod
- .ident "GCC: (GNU) 4.9.4"
diff --git a/runtime/mppa_k1c/i64_smod.c b/runtime/mppa_k1c/i64_smod.c
index d48f9e19..010edd85 100644
--- a/runtime/mppa_k1c/i64_smod.c
+++ b/runtime/mppa_k1c/i64_smod.c
@@ -2,7 +2,7 @@ unsigned long long
udivmoddi4(unsigned long long num, unsigned long long den, int modwanted);
long long
-__compcert_i64_smod (long long a, long long b)
+i64_smod (long long a, long long b)
{
int neg = 0;
long long res;
diff --git a/runtime/mppa_k1c/i64_udiv.S b/runtime/mppa_k1c/i64_udiv.S
deleted file mode 100644
index f5f50ce7..00000000
--- a/runtime/mppa_k1c/i64_udiv.S
+++ /dev/null
@@ -1,11 +0,0 @@
- .text
-
- .align 8
- .globl __compcert_i64_udiv
- .type __compcert_i64_udiv, @function
-__compcert_i64_udiv:
- make $r2 = 0
- goto udivmoddi4
- ;;
- .size __compcert_i64_udiv, .-__compcert_i64_udiv
- .ident "GCC: (GNU) 4.9.4"
diff --git a/runtime/mppa_k1c/i64_udiv.c b/runtime/mppa_k1c/i64_udiv.c
index 2838f21b..2a8dcbf5 100644
--- a/runtime/mppa_k1c/i64_udiv.c
+++ b/runtime/mppa_k1c/i64_udiv.c
@@ -1,8 +1,7 @@
unsigned long long
udivmoddi4(unsigned long long num, unsigned long long den, int modwanted);
-unsigned long long
-__compcert_i64_udiv (unsigned long long a, unsigned long long b)
+unsigned long long i64_udiv (unsigned long long a, unsigned long long b)
{
return udivmoddi4 (a, b, 0);
}
diff --git a/runtime/mppa_k1c/i64_udivmod.S b/runtime/mppa_k1c/i64_udivmod.S
deleted file mode 100644
index cdb0e978..00000000
--- a/runtime/mppa_k1c/i64_udivmod.S
+++ /dev/null
@@ -1,58 +0,0 @@
- .text
-
- .align 8
- .globl udivmoddi4
- .type udivmoddi4, @function
-udivmoddi4:
- compd.ltu $r3 = $r0, $r1
- ;; /* Can't issue next in the same bundle */
- sxwd $r2 = $r2
- make $r5 = 0
- ;;
- cb.dnez $r3? .L2
- ;;
- clzd $r3 = $r1
- ;; /* Can't issue next in the same bundle */
- clzd $r4 = $r0
- ;;
- sbfw $r4 = $r4, $r3
- ;;
- slld $r1 = $r1,$r4
- zxwd $r3 = $r4
- ;;
- compd.ltu $r6 = $r0, $r1
- ;;
- cb.dnez $r6? .L3
- ;;
- make $r5 = 1
- sbfd $r0 = $r1, $r0
- ;;
- slld $r5 = $r5,$r4
- ;;
-.L3:
- cb.deqz $r3? .L2
- ;;
- srld $r1 = $r1,1
- copyd $r3 = $r4
- ;;
- loopgtz $r3, .L14
- ;;
-.L4:
- stsud $r0 = $r1, $r0
- ;;
-.L14:
- # HW loop end
- ;;
- addd $r5 = $r0, $r5
- srld $r0 = $r0,$r4
- ;;
- slld $r4 = $r0,$r4
- ;;
- sbfd $r5 = $r4, $r5
- ;;
-.L2:
- cmoved.deqz $r2? $r0 = $r5
- ret
- ;;
- .size udivmoddi4, .-udivmoddi4
- .ident "GCC: (GNU) 4.9.4"
diff --git a/runtime/mppa_k1c/i64_udivmod.c b/runtime/mppa_k1c/i64_udivmod.c
index 20d8c976..d94d3f23 100644
--- a/runtime/mppa_k1c/i64_udivmod.c
+++ b/runtime/mppa_k1c/i64_udivmod.c
@@ -26,6 +26,25 @@ udivmoddi4(unsigned long long num, unsigned long long den, int modwanted)
#else
+/* Number of leading zeroes */
+static int i64_nlzd(unsigned x)
+{
+ if (x == 0) return 64;
+ int n = 0;
+ if (x <= 0x00000000FFFFFFFFl) { n += 32; x <<= 32; }
+ if (x <= 0x0000FFFFFFFFFFFFl) { n += 16; x <<= 16; }
+ if (x <= 0x00FFFFFFFFFFFFFFl) { n += 8; x <<= 8; }
+ if (x <= 0x0FFFFFFFFFFFFFFFl) { n += 4; x <<= 4; }
+ if (x <= 0x3FFFFFFFFFFFFFFFl) { n += 2; x <<= 2; }
+ if (x <= 0x7FFFFFFFFFFFFFFFl) { n += 1; x <<= 1; }
+ return n;
+}
+
+static unsigned long long i64_stsud(unsigned rz, unsigned ry)
+{
+ return ry >= rz ? ry - rz << 1 | 1 : ry << 1;
+}
+
/* THIS IS THE PREVIOUS VERSION, USED ON BOSTAN AND ANDEY */
unsigned long long
udivmoddi4(unsigned long long num, unsigned long long den, int modwanted)
@@ -33,7 +52,8 @@ udivmoddi4(unsigned long long num, unsigned long long den, int modwanted)
unsigned long long r = num, q = 0;
if(den <= r) {
- unsigned k = __builtin_clzll (den) - __builtin_clzll (r);
+ //unsigned k = __builtin_clzll (den) - __builtin_clzll (r);
+ unsigned k = i64_nlzd(den) - i64_nlzd(r);
den = den << k;
if(r >= den) {
r = r - den;
@@ -43,7 +63,8 @@ udivmoddi4(unsigned long long num, unsigned long long den, int modwanted)
unsigned i = k;
den = den >> 1;
do {
- r = __builtin_k1_stsud (den, r);
+ r = i64_stsud(den, r);
+ //r = __builtin_k1_stsud (den, r);
i--;
} while (i!= 0);
q = q + r;
diff --git a/runtime/mppa_k1c/i64_umod.S b/runtime/mppa_k1c/i64_umod.S
deleted file mode 100644
index 63cfafc2..00000000
--- a/runtime/mppa_k1c/i64_umod.S
+++ /dev/null
@@ -1,11 +0,0 @@
- .text
-
- .align 8
- .globl __compcert_i64_umod
- .type __compcert_i64_umod, @function
-__compcert_i64_umod:
- make $r2 = 1
- goto udivmoddi4
- ;;
- .size __compcert_i64_umod, .-__compcert_i64_umod
- .ident "GCC: (GNU) 4.9.4"
diff --git a/runtime/mppa_k1c/i64_umod.c b/runtime/mppa_k1c/i64_umod.c
index 41d985a6..fc0872bb 100644
--- a/runtime/mppa_k1c/i64_umod.c
+++ b/runtime/mppa_k1c/i64_umod.c
@@ -2,7 +2,7 @@ unsigned long long
udivmoddi4(unsigned long long num, unsigned long long den, int modwanted);
unsigned long long
-__compcert_i64_umod (unsigned long long a, unsigned long long b)
+i64_umod (unsigned long long a, unsigned long long b)
{
return udivmoddi4 (a, b, 1);
}