From 11cd0ace897752ef7ca33609aa1250ca1597185b Mon Sep 17 00:00:00 2001 From: David Monniaux Date: Wed, 29 May 2019 11:14:46 +0200 Subject: arranging for selection of divisor as option --- runtime/Makefile | 5 +- runtime/mppa_k1c/i32_divmod.S | 26 ++++----- runtime/mppa_k1c/i64_sdiv.c | 12 +++- runtime/mppa_k1c/i64_smod.c | 5 ++ runtime/mppa_k1c/i64_udiv.c | 6 ++ runtime/mppa_k1c/i64_udivmod.c | 2 + runtime/mppa_k1c/i64_umod.c | 6 ++ runtime/mppa_k1c/vararg.S | 125 ----------------------------------------- 8 files changed, 45 insertions(+), 142 deletions(-) (limited to 'runtime') diff --git a/runtime/Makefile b/runtime/Makefile index 2448279e..6bc3e7ea 100644 --- a/runtime/Makefile +++ b/runtime/Makefile @@ -23,8 +23,9 @@ OBJS=i64_dtou.o i64_utod.o i64_utof.o vararg.o else ifeq ($(ARCH),powerpc64) OBJS=i64_dtou.o i64_stof.o i64_utod.o i64_utof.o vararg.o else ifeq ($(ARCH),mppa_k1c) -OBJS=i64_umod.o i64_udiv.o i64_udivmod.o i64_sdiv.o i64_smod.o i32_divmod.o \ - vararg.o +OBJS=i64_umod.o i64_udiv.o i64_udivmod.o i64_sdiv.o i64_smod.o \ + i64_udivmod_stsud.o i32_divmod.o \ + vararg.o # Missing: i64_utod.o i64_utof.o i64_stod.o i64_stof.o DOMAKE:=$(shell (cd mppa_k1c && make)) else diff --git a/runtime/mppa_k1c/i32_divmod.S b/runtime/mppa_k1c/i32_divmod.S index d5a4c2ca..8dd9481c 100644 --- a/runtime/mppa_k1c/i32_divmod.S +++ b/runtime/mppa_k1c/i32_divmod.S @@ -4,8 +4,8 @@ D. Monniaux, CNRS, VERIMAG */ - .globl __compcert_i32_sdiv -__compcert_i32_sdiv: + .globl __compcert_i32_sdiv_fp +__compcert_i32_sdiv_fp: compw.lt $r2 = $r0, 0 compw.lt $r3 = $r1, 0 absw $r0 = $r0 @@ -13,27 +13,27 @@ __compcert_i32_sdiv: ;; xord $r2 = $r2, $r3 make $r3 = 0 - goto __compcert_i32_divmod + goto __compcert_i32_divmod_fp ;; - .globl __compcert_i32_smod -__compcert_i32_smod: + .globl __compcert_i32_smod_fp +__compcert_i32_smod_fp: compw.lt $r2 = $r0, 0 absw $r0 = $r0 absw $r1 = $r1 make $r3 = 1 - goto __compcert_i32_divmod + goto __compcert_i32_divmod_fp ;; - .globl __compcert_i32_umod -__compcert_i32_umod: + .globl __compcert_i32_umod_fp +__compcert_i32_umod_fp: make $r2 = 0 make $r3 = 1 - goto __compcert_i32_divmod + goto __compcert_i32_divmod_fp ;; - .globl __compcert_i32_udiv -__compcert_i32_udiv: + .globl __compcert_i32_udiv_fp +__compcert_i32_udiv_fp: make $r2 = 0 make $r3 = 0 ;; @@ -45,8 +45,8 @@ r2 : negate result? r3 : return mod? */ - .globl __compcert_i32_divmod -__compcert_i32_divmod: + .globl __compcert_i32_divmod_fp +__compcert_i32_divmod_fp: zxwd $r7 = $r1 zxwd $r1 = $r0 #ifndef NO_SHORTCUT diff --git a/runtime/mppa_k1c/i64_sdiv.c b/runtime/mppa_k1c/i64_sdiv.c index 9fac8ff9..df308736 100644 --- a/runtime/mppa_k1c/i64_sdiv.c +++ b/runtime/mppa_k1c/i64_sdiv.c @@ -1,4 +1,14 @@ +extern long __divdi3 (long a, long b); + +int i32_sdiv (int a, int b) +{ + return __divdi3 (a, b); +} + +/* #define COMPCERT_FE_EXCEPT */ +#ifdef COMPCERT_FE_EXCEPT #ifdef __K1C_COS__ + #include #define K1_SFR_CS_IO_MASK COS_SFR_CS_IO_MASK #define K1_SFR_CS_DZ_MASK COS_SFR_CS_DZ_MASK @@ -10,8 +20,6 @@ #include #endif -/* #define COMPCERT_FE_EXCEPT */ -#ifdef COMPCERT_FE_EXCEPT /* DM FIXME this is for floating point */ int fetestexcept(int excepts) { int mask = (K1_SFR_CS_IO_MASK | K1_SFR_CS_DZ_MASK | K1_SFR_CS_OV_MASK | K1_SFR_CS_UN_MASK | K1_SFR_CS_IN_MASK) & excepts; diff --git a/runtime/mppa_k1c/i64_smod.c b/runtime/mppa_k1c/i64_smod.c index e69de29b..3371eecf 100644 --- a/runtime/mppa_k1c/i64_smod.c +++ b/runtime/mppa_k1c/i64_smod.c @@ -0,0 +1,5 @@ +extern long __moddi3 (long a, long b); +int i32_smod (int a, int b) +{ + return __moddi3 (a, b); +} diff --git a/runtime/mppa_k1c/i64_udiv.c b/runtime/mppa_k1c/i64_udiv.c index e69de29b..75f4bbf5 100644 --- a/runtime/mppa_k1c/i64_udiv.c +++ b/runtime/mppa_k1c/i64_udiv.c @@ -0,0 +1,6 @@ +extern unsigned long __udivdi3 (unsigned long a, unsigned long b); + +unsigned i32_udiv (unsigned a, unsigned b) +{ + return __udivdi3 (a, b); +} diff --git a/runtime/mppa_k1c/i64_udivmod.c b/runtime/mppa_k1c/i64_udivmod.c index 74b39874..ca48cd87 100644 --- a/runtime/mppa_k1c/i64_udivmod.c +++ b/runtime/mppa_k1c/i64_udivmod.c @@ -1,3 +1,4 @@ +#if 0 /* THIS IS THE PREVIOUS VERSION, USED ON BOSTAN AND ANDEY */ unsigned long long udivmoddi4(unsigned long long num, unsigned long long den, int modwanted) @@ -26,3 +27,4 @@ udivmoddi4(unsigned long long num, unsigned long long den, int modwanted) return modwanted ? r : q; } +#endif diff --git a/runtime/mppa_k1c/i64_umod.c b/runtime/mppa_k1c/i64_umod.c index e69de29b..59e35960 100644 --- a/runtime/mppa_k1c/i64_umod.c +++ b/runtime/mppa_k1c/i64_umod.c @@ -0,0 +1,6 @@ +extern unsigned long __umoddi3 (unsigned long a, unsigned long b); + +unsigned i32_umod (unsigned a, unsigned b) +{ + return __umoddi3 (a, b); +} diff --git a/runtime/mppa_k1c/vararg.S b/runtime/mppa_k1c/vararg.S index 5804c707..9e23e0b3 100644 --- a/runtime/mppa_k1c/vararg.S +++ b/runtime/mppa_k1c/vararg.S @@ -52,128 +52,3 @@ __compcert_acswapw: sq 0[$r0] = $r2r3 ret ;; - - .globl __compcert_i32_sdiv - .globl __compcert_i32_smod - .globl __compcert_i32_udiv - .globl __compcert_i32_umod -__compcert_i32_sdiv: - sxwd $r0 = $r0 - sxwd $r1 = $r1 - make $r2 = 0x3ff0000000000000 - ;; - floatd.rn.s $r0 = $r0, 0 - ;; - floatd.rn.s $r3 = $r1, 0 - ;; - floatw.rn.s $r1 = $r1, 0 - ;; - finvw $r1=$r1 - ;; - fwidenlwd $r1 = $r1 - ;; - fmuld $r0 = $r0, $r1 - ;; - ffmsd $r2 = $r1, $r3 - copyd $r1 = $r0 - ;; - ffmad $r1 = $r2, $r0 - ;; - ffmad $r0 = $r2, $r1 - ;; - fixedd.rz $r0 = $r0, 0 - ret - ;; - -__compcert_i32_smod: - sxwd $r4 = $r0 - sxwd $r5 = $r1 - make $r2 = 0x3ff0000000000000 - ;; - copyd $r0 = $r4 - copyd $r1 = $r5 - floatd.rn.s $r4 = $r4, 0 - ;; - floatd.rn.s $r3 = $r5, 0 - ;; - floatw.rn.s $r5 = $r5, 0 - ;; - finvw $r5=$r5 - ;; - fwidenlwd $r5 = $r5 - ;; - fmuld $r4 = $r4, $r5 - ;; - ffmsd $r2 = $r5, $r3 - copyd $r5 = $r4 - ;; - ffmad $r5 = $r2, $r4 - ;; - ffmad $r4 = $r2, $r5 - ;; - fixedd.rz $r4 = $r4, 0 - ;; - msbfd $r0 = $r1, $r4 - ret - ;; - -__compcert_i32_udiv: - zxwd $r0 = $r0 - zxwd $r1 = $r1 - make $r2 = 0x3ff0000000000000 - ;; - floatud.rn.s $r0 = $r0, 0 - ;; - floatud.rn.s $r3 = $r1, 0 - ;; - floatuw.rn.s $r1 = $r1, 0 - ;; - finvw $r1=$r1 - ;; - fwidenlwd $r1 = $r1 - ;; - fmuld $r0 = $r0, $r1 - ;; - ffmsd $r2 = $r1, $r3 - copyd $r1 = $r0 - ;; - ffmad $r1 = $r2, $r0 - ;; - ffmad $r0 = $r2, $r1 - ;; - fixedud.rz $r0 = $r0, 0 - ;; - ret - ;; - -__compcert_i32_umod: - zxwd $r4 = $r0 - zxwd $r5 = $r1 - make $r2 = 0x3ff0000000000000 - ;; - copyd $r0 = $r4 - copyd $r1 = $r5 - floatud.rn.s $r4 = $r4, 0 - ;; - floatud.rn.s $r3 = $r5, 0 - ;; - floatuw.rn.s $r5 = $r5, 0 - ;; - finvw $r5=$r5 - ;; - fwidenlwd $r5 = $r5 - ;; - fmuld $r4 = $r4, $r5 - ;; - ffmsd $r2 = $r5, $r3 - copyd $r5 = $r4 - ;; - ffmad $r5 = $r2, $r4 - ;; - ffmad $r4 = $r2, $r5 - ;; - fixedud.rz $r4 = $r4, 0 - ;; - msbfd $r0 = $r1, $r4 - ret - ;; -- cgit