diff options
author | Cyril SIX <cyril.six@kalray.eu> | 2019-01-17 13:45:42 +0100 |
---|---|---|
committer | Cyril SIX <cyril.six@kalray.eu> | 2019-01-17 13:45:42 +0100 |
commit | 1848a8f4c08ef55a045d4dc1e78f517182a50442 (patch) | |
tree | bc1d3147c2db76b962c8fa3682ac5dd1e4e6cd3a | |
parent | 15c5ca037eabb9891f7880bc2d517982ba34e769 (diff) | |
parent | fe3fc2fd3d5a312ac526c5596e851e315782d9f6 (diff) | |
download | compcert-kvx-1848a8f4c08ef55a045d4dc1e78f517182a50442.tar.gz compcert-kvx-1848a8f4c08ef55a045d4dc1e78f517182a50442.zip |
Merge branch 'mppa_k1c' into mppa_postpass
-rw-r--r-- | mppa_k1c/Asm.v | 2 | ||||
-rw-r--r-- | mppa_k1c/Asmblockgen.v | 26 | ||||
-rw-r--r-- | mppa_k1c/CBuiltins.ml | 1 | ||||
-rw-r--r-- | mppa_k1c/TargetPrinter.ml | 130 | ||||
-rw-r--r-- | runtime/mppa_k1c/Makefile | 2 | ||||
-rw-r--r-- | runtime/mppa_k1c/i64_udivmod.c | 30 | ||||
-rw-r--r-- | test/mppa/do_test.sh | 9 | ||||
-rw-r--r-- | test/mppa/instr/Makefile | 56 | ||||
-rw-r--r-- | test/mppa/instr/framework.h | 3 | ||||
-rw-r--r-- | test/mppa/interop/Makefile | 42 | ||||
-rw-r--r-- | test/mppa/interop/vaarg_common.c | 28 | ||||
-rw-r--r-- | test/mppa/lib/Makefile | 133 | ||||
-rw-r--r-- | test/mppa/lib/printf-test.c | 9 | ||||
-rw-r--r-- | test/mppa/lib/printf.c | 9 |
14 files changed, 312 insertions, 168 deletions
diff --git a/mppa_k1c/Asm.v b/mppa_k1c/Asm.v index 520bc453..23b11a03 100644 --- a/mppa_k1c/Asm.v +++ b/mppa_k1c/Asm.v @@ -181,7 +181,7 @@ Definition basic_to_instruction (b: basic) := (* RR *)
| PArithRR Asmblock.Pmv rd rs => Pmv rd rs
| PArithRR Asmblock.Pnegw rd rs => Pnegw rd rs
- | PArithRR Asmblock.Pnegl rd rs => Pfnegd rd rs
+ | PArithRR Asmblock.Pnegl rd rs => Pnegl rd rs
| PArithRR Asmblock.Pcvtl2w rd rs => Pcvtl2w rd rs
| PArithRR Asmblock.Pmvw2l rd rs => Pmvw2l rd rs
| PArithRR Asmblock.Pfnegd rd rs => Pfnegd rd rs
diff --git a/mppa_k1c/Asmblockgen.v b/mppa_k1c/Asmblockgen.v index a4d0526d..9a564117 100644 --- a/mppa_k1c/Asmblockgen.v +++ b/mppa_k1c/Asmblockgen.v @@ -398,19 +398,19 @@ Definition transl_op | Omulhu, a1 :: a2 :: nil => do rd <- ireg_of res; do rs1 <- ireg_of a1; do rs2 <- ireg_of a2; OK (Pmulhuw rd rs1 rs2 :: k) - | Odiv, a1 :: a2 :: nil => - do rd <- ireg_of res; do rs1 <- ireg_of a1; do rs2 <- ireg_of a2; - OK (Pdivw rd rs1 rs2 :: k) - | Odivu, a1 :: a2 :: nil => - do rd <- ireg_of res; do rs1 <- ireg_of a1; do rs2 <- ireg_of a2; - OK (Pdivuw rd rs1 rs2 :: k) - | Omod, a1 :: a2 :: nil => - do rd <- ireg_of res; do rs1 <- ireg_of a1; do rs2 <- ireg_of a2; - OK (Premw rd rs1 rs2 :: k) - | Omodu, a1 :: a2 :: nil => - do rd <- ireg_of res; do rs1 <- ireg_of a1; do rs2 <- ireg_of a2; - OK (Premuw rd rs1 rs2 :: k) -*)| Oand, a1 :: a2 :: nil => +*)| Odiv, a1 :: a2 :: nil => Error(msg "32-bits division not supported yet. Please use 64-bits.") + (* do rd <- ireg_of res; do rs1 <- ireg_of a1; do rs2 <- ireg_of a2; + OK (Pdivw rd rs1 rs2 :: k) *) + | Odivu, a1 :: a2 :: nil => Error(msg "32-bits division not supported yet. Please use 64-bits.") + (* do rd <- ireg_of res; do rs1 <- ireg_of a1; do rs2 <- ireg_of a2; + OK (Pdivuw rd rs1 rs2 :: k) *) + | Omod, a1 :: a2 :: nil => Error(msg "32-bits modulo not supported yet. Please use 64-bits.") + (* do rd <- ireg_of res; do rs1 <- ireg_of a1; do rs2 <- ireg_of a2; + OK (Premw rd rs1 rs2 :: k) *) + | Omodu, a1 :: a2 :: nil => Error(msg "32-bits modulo not supported yet. Please use 64-bits.") + (* do rd <- ireg_of res; do rs1 <- ireg_of a1; do rs2 <- ireg_of a2; + OK (Premuw rd rs1 rs2 :: k) *) + | Oand, a1 :: a2 :: nil => do rd <- ireg_of res; do rs1 <- ireg_of a1; do rs2 <- ireg_of a2; OK (Pandw rd rs1 rs2 ::i k) | Oandimm n, a1 :: nil => diff --git a/mppa_k1c/CBuiltins.ml b/mppa_k1c/CBuiltins.ml index a5bdaa28..147bbb55 100644 --- a/mppa_k1c/CBuiltins.ml +++ b/mppa_k1c/CBuiltins.ml @@ -59,6 +59,7 @@ let builtins = { "__builtin_k1_lwzu", (TInt(IUInt, []), [TPtr(TVoid [], [])], false); (* ALU Instructions *) + "__builtin_clzll", (TInt(IULongLong, []), [TInt(IULongLong, [])], false); (* "__builtin_k1_addhp", (TInt(IInt, []), [TInt(IInt, []); TInt(IInt, [])], false); *) (* "__builtin_k1_adds", (TInt(IInt, []), [TInt(IInt, []); TInt(IInt, [])], false); *) (* "__builtin_k1_bwlu", (TInt(IUInt, []), diff --git a/mppa_k1c/TargetPrinter.ml b/mppa_k1c/TargetPrinter.ml index 7db82f6f..cd36b502 100644 --- a/mppa_k1c/TargetPrinter.ml +++ b/mppa_k1c/TargetPrinter.ml @@ -127,9 +127,9 @@ module Target (*: TARGET*) = let loadsymbol oc r id ofs = if Archi.pic_code () then begin assert (ofs = Integers.Ptrofs.zero); - fprintf oc " make %a = %s\n" ireg r (extern_atom id) + fprintf oc " make %a = %s\n;;\n" ireg r (extern_atom id) end else begin - fprintf oc " make %a = %a\n" ireg r symbol_offset (id, ofs) + fprintf oc " make %a = %a\n;;\n" ireg r symbol_offset (id, ofs) end (* Emit .file / .loc debugging directives *) @@ -221,51 +221,51 @@ module Target (*: TARGET*) = | _ -> assert false end - | Pnop -> fprintf oc " nop\n" - | Psemi -> fprintf oc ";;\n" + | Pnop -> fprintf oc " nop\n;;\n" + | Psemi -> fprintf oc "" - | Pclzll (rd, rs) -> fprintf oc " clzd %a = %a\n" ireg rd ireg rs - | Pstsud (rd, rs1, rs2) -> fprintf oc " stsud %a = %a, %a\n" ireg rd ireg rs1 ireg rs2 + | Pclzll (rd, rs) -> fprintf oc " clzd %a = %a\n;;\n" ireg rd ireg rs + | Pstsud (rd, rs1, rs2) -> fprintf oc " stsud %a = %a, %a\n;;\n" ireg rd ireg rs1 ireg rs2 (* Control flow instructions *) | Pget (rd, rs) -> - fprintf oc " get %a = %a\n" ireg rd preg rs + fprintf oc " get %a = %a\n;;\n" ireg rd preg rs | Pset (rd, rs) -> - fprintf oc " set %a = %a\n" preg rd ireg rs + fprintf oc " set %a = %a\n;;\n" preg rd ireg rs | Pret -> - fprintf oc " ret \n" + fprintf oc " ret \n;;\n" | Pcall(s) -> - fprintf oc " call %a\n" symbol s + fprintf oc " call %a\n;;\n" symbol s | Pgoto(s) -> - fprintf oc " goto %a\n" symbol s + fprintf oc " goto %a\n;;\n" symbol s | Pj_l(s) -> - fprintf oc " goto %a\n" print_label s + fprintf oc " goto %a\n;;\n" print_label s | Pcb (bt, r, lbl) | Pcbu (bt, r, lbl) -> - fprintf oc " cb.%a %a?%a\n" bcond bt ireg r print_label lbl + fprintf oc " cb.%a %a?%a\n;;\n" bcond bt ireg r print_label lbl (* Load/Store instructions *) | Plb(rd, ra, ofs) -> - fprintf oc " lbs %a = %a[%a]\n" ireg rd offset ofs ireg ra + fprintf oc " lbs %a = %a[%a]\n;;\n" ireg rd offset ofs ireg ra | Plbu(rd, ra, ofs) -> - fprintf oc " lbz %a = %a[%a]\n" ireg rd offset ofs ireg ra + fprintf oc " lbz %a = %a[%a]\n;;\n" ireg rd offset ofs ireg ra | Plh(rd, ra, ofs) -> - fprintf oc " lhs %a = %a[%a]\n" ireg rd offset ofs ireg ra + fprintf oc " lhs %a = %a[%a]\n;;\n" ireg rd offset ofs ireg ra | Plhu(rd, ra, ofs) -> - fprintf oc " lhz %a = %a[%a]\n" ireg rd offset ofs ireg ra + fprintf oc " lhz %a = %a[%a]\n;;\n" ireg rd offset ofs ireg ra | Plw(rd, ra, ofs) | Plw_a(rd, ra, ofs) | Pfls(rd, ra, ofs) -> - fprintf oc " lws %a = %a[%a]\n" ireg rd offset ofs ireg ra + fprintf oc " lws %a = %a[%a]\n;;\n" ireg rd offset ofs ireg ra | Pld(rd, ra, ofs) | Pfld(rd, ra, ofs) | Pld_a(rd, ra, ofs) -> assert Archi.ptr64; - fprintf oc " ld %a = %a[%a]\n" ireg rd offset ofs ireg ra + fprintf oc " ld %a = %a[%a]\n;;\n" ireg rd offset ofs ireg ra | Psb(rd, ra, ofs) -> - fprintf oc " sb %a[%a] = %a\n" offset ofs ireg ra ireg rd + fprintf oc " sb %a[%a] = %a\n;;\n" offset ofs ireg ra ireg rd | Psh(rd, ra, ofs) -> - fprintf oc " sh %a[%a] = %a\n" offset ofs ireg ra ireg rd + fprintf oc " sh %a[%a] = %a\n;;\n" offset ofs ireg ra ireg rd | Psw(rd, ra, ofs) | Psw_a(rd, ra, ofs) | Pfss(rd, ra, ofs) -> - fprintf oc " sw %a[%a] = %a\n" offset ofs ireg ra ireg rd + fprintf oc " sw %a[%a] = %a\n;;\n" offset ofs ireg ra ireg rd | Psd(rd, ra, ofs) | Psd_a(rd, ra, ofs) | Pfsd(rd, ra, ofs) -> assert Archi.ptr64; - fprintf oc " sd %a[%a] = %a\n" offset ofs ireg ra ireg rd + fprintf oc " sd %a[%a] = %a\n;;\n" offset ofs ireg ra ireg rd (* Arith R instructions *) | Pcvtw2l(rd) -> assert false @@ -273,102 +273,102 @@ module Target (*: TARGET*) = (* Arith RR instructions *) | Pmv(rd, rs) | Pmvw2l(rd, rs) -> - fprintf oc " addd %a = %a, 0\n" ireg rd ireg rs + fprintf oc " addd %a = %a, 0\n;;\n" ireg rd ireg rs | Pcvtl2w(rd, rs) -> assert false | Pnegl(rd, rs) -> assert Archi.ptr64; - fprintf oc " negd %a = %a\n" ireg rd ireg rs + fprintf oc " negd %a = %a\n;;\n" ireg rd ireg rs | Pnegw(rd, rs) -> - fprintf oc " negw %a = %a\n" ireg rd ireg rs + fprintf oc " negw %a = %a\n;;\n" ireg rd ireg rs | Pfnegd(rd, rs) -> - fprintf oc " fnegd %a = %a\n" ireg rs ireg rd + fprintf oc " fnegd %a = %a\n;;\n" ireg rs ireg rd (* Arith RI32 instructions *) | Pmake (rd, imm) -> - fprintf oc " make %a, %a\n" ireg rd coqint imm + fprintf oc " make %a, %a\n;;\n" ireg rd coqint imm (* Arith RI64 instructions *) | Pmakel (rd, imm) -> - fprintf oc " make %a, %a\n" ireg rd coqint64 imm + fprintf oc " make %a, %a\n;;\n" ireg rd coqint64 imm (* Arith RRR instructions *) | Pcompw (it, rd, rs1, rs2) -> - fprintf oc " compw.%a %a = %a, %a\n" icond it ireg rd ireg rs1 ireg rs2 + fprintf oc " compw.%a %a = %a, %a\n;;\n" icond it ireg rd ireg rs1 ireg rs2 | Pcompl (it, rd, rs1, rs2) -> - fprintf oc " compd.%a %a = %a, %a\n" icond it ireg rd ireg rs1 ireg rs2 + fprintf oc " compd.%a %a = %a, %a\n;;\n" icond it ireg rd ireg rs1 ireg rs2 | Paddw (rd, rs1, rs2) -> - fprintf oc " addw %a = %a, %a\n" ireg rd ireg rs1 ireg rs2 + fprintf oc " addw %a = %a, %a\n;;\n" ireg rd ireg rs1 ireg rs2 | Psubw (rd, rs1, rs2) -> - fprintf oc " sbfw %a = %a, %a\n" ireg rd ireg rs2 ireg rs1 + fprintf oc " sbfw %a = %a, %a\n;;\n" ireg rd ireg rs2 ireg rs1 | Pmulw (rd, rs1, rs2) -> - fprintf oc " mulw %a = %a, %a\n" ireg rd ireg rs1 ireg rs2 + fprintf oc " mulw %a = %a, %a\n;;\n" ireg rd ireg rs1 ireg rs2 | Pandw (rd, rs1, rs2) -> - fprintf oc " andw %a = %a, %a\n" ireg rd ireg rs1 ireg rs2 + fprintf oc " andw %a = %a, %a\n;;\n" ireg rd ireg rs1 ireg rs2 | Porw (rd, rs1, rs2) -> - fprintf oc " orw %a = %a, %a\n" ireg rd ireg rs1 ireg rs2 + fprintf oc " orw %a = %a, %a\n;;\n" ireg rd ireg rs1 ireg rs2 | Pxorw (rd, rs1, rs2) -> - fprintf oc " xorw %a = %a, %a\n" ireg rd ireg rs1 ireg rs2 + fprintf oc " xorw %a = %a, %a\n;;\n" ireg rd ireg rs1 ireg rs2 | Psraw (rd, rs1, rs2) -> - fprintf oc " sraw %a = %a, %a\n" ireg rd ireg rs1 ireg rs2 + fprintf oc " sraw %a = %a, %a\n;;\n" ireg rd ireg rs1 ireg rs2 | Psrlw (rd, rs1, rs2) -> - fprintf oc " srlw %a = %a, %a\n" ireg rd ireg rs1 ireg rs2 + fprintf oc " srlw %a = %a, %a\n;;\n" ireg rd ireg rs1 ireg rs2 | Psllw (rd, rs1, rs2) -> - fprintf oc " sllw %a = %a, %a\n" ireg rd ireg rs1 ireg rs2 + fprintf oc " sllw %a = %a, %a\n;;\n" ireg rd ireg rs1 ireg rs2 | Paddl (rd, rs1, rs2) -> assert Archi.ptr64; - fprintf oc " addd %a = %a, %a\n" ireg rd ireg rs1 ireg rs2 + fprintf oc " addd %a = %a, %a\n;;\n" ireg rd ireg rs1 ireg rs2 | Psubl (rd, rs1, rs2) -> - fprintf oc " sbfd %a = %a, %a\n" ireg rd ireg rs2 ireg rs1 + fprintf oc " sbfd %a = %a, %a\n;;\n" ireg rd ireg rs2 ireg rs1 | Pandl (rd, rs1, rs2) -> assert Archi.ptr64; - fprintf oc " andd %a = %a, %a\n" ireg rd ireg rs1 ireg rs2 + fprintf oc " andd %a = %a, %a\n;;\n" ireg rd ireg rs1 ireg rs2 | Porl (rd, rs1, rs2) -> assert Archi.ptr64; - fprintf oc " ord %a = %a, %a\n" ireg rd ireg rs1 ireg rs2 + fprintf oc " ord %a = %a, %a\n;;\n" ireg rd ireg rs1 ireg rs2 | Pxorl (rd, rs1, rs2) -> assert Archi.ptr64; - fprintf oc " xord %a = %a, %a\n" ireg rd ireg rs1 ireg rs2 + fprintf oc " xord %a = %a, %a\n;;\n" ireg rd ireg rs1 ireg rs2 | Pmull (rd, rs1, rs2) -> - fprintf oc " muld %a = %a, %a\n" ireg rd ireg rs1 ireg rs2 + fprintf oc " muld %a = %a, %a\n;;\n" ireg rd ireg rs1 ireg rs2 | Pslll (rd, rs1, rs2) -> - fprintf oc " slld %a = %a, %a\n" ireg rd ireg rs1 ireg rs2 + fprintf oc " slld %a = %a, %a\n;;\n" ireg rd ireg rs1 ireg rs2 | Psrll (rd, rs1, rs2) -> - fprintf oc " srld %a = %a, %a\n" ireg rd ireg rs1 ireg rs2 + fprintf oc " srld %a = %a, %a\n;;\n" ireg rd ireg rs1 ireg rs2 | Psral (rd, rs1, rs2) -> - fprintf oc " srad %a = %a, %a\n" ireg rd ireg rs1 ireg rs2 + fprintf oc " srad %a = %a, %a\n;;\n" ireg rd ireg rs1 ireg rs2 (* Arith RRI32 instructions *) | Pcompiw (it, rd, rs, imm) -> - fprintf oc " compw.%a %a = %a, %a\n" icond it ireg rd ireg rs coqint64 imm + fprintf oc " compw.%a %a = %a, %a\n;;\n" icond it ireg rd ireg rs coqint64 imm | Paddiw (rd, rs, imm) -> - fprintf oc " addw %a = %a, %a\n" ireg rd ireg rs coqint64 imm + fprintf oc " addw %a = %a, %a\n;;\n" ireg rd ireg rs coqint64 imm | Pandiw (rd, rs, imm) -> - fprintf oc " andw %a = %a, %a\n" ireg rd ireg rs coqint64 imm + fprintf oc " andw %a = %a, %a\n;;\n" ireg rd ireg rs coqint64 imm | Poriw (rd, rs, imm) -> - fprintf oc " orw %a = %a, %a\n" ireg rd ireg rs coqint64 imm + fprintf oc " orw %a = %a, %a\n;;\n" ireg rd ireg rs coqint64 imm | Pxoriw (rd, rs, imm) -> - fprintf oc " xorw %a = %a, %a\n" ireg rd ireg rs coqint64 imm + fprintf oc " xorw %a = %a, %a\n;;\n" ireg rd ireg rs coqint64 imm | Psraiw (rd, rs, imm) -> - fprintf oc " sraw %a = %a, %a\n" ireg rd ireg rs coqint64 imm + fprintf oc " sraw %a = %a, %a\n;;\n" ireg rd ireg rs coqint64 imm | Psrliw (rd, rs, imm) -> - fprintf oc " srlw %a = %a, %a\n" ireg rd ireg rs coqint64 imm + fprintf oc " srlw %a = %a, %a\n;;\n" ireg rd ireg rs coqint64 imm | Pslliw (rd, rs, imm) -> - fprintf oc " sllw %a = %a, %a\n" ireg rd ireg rs coqint64 imm + fprintf oc " sllw %a = %a, %a\n;;\n" ireg rd ireg rs coqint64 imm | Psllil (rd, rs, imm) -> - fprintf oc " slld %a = %a, %a\n" ireg rd ireg rs coqint64 imm + fprintf oc " slld %a = %a, %a\n;;\n" ireg rd ireg rs coqint64 imm | Psrlil (rd, rs, imm) -> - fprintf oc " srld %a = %a, %a\n" ireg rd ireg rs coqint64 imm + fprintf oc " srld %a = %a, %a\n;;\n" ireg rd ireg rs coqint64 imm | Psrail (rd, rs, imm) -> - fprintf oc " srad %a = %a, %a\n" ireg rd ireg rs coqint64 imm + fprintf oc " srad %a = %a, %a\n;;\n" ireg rd ireg rs coqint64 imm (* Arith RRI64 instructions *) | Pcompil (it, rd, rs, imm) -> - fprintf oc " compd.%a %a = %a, %a\n" icond it ireg rd ireg rs coqint64 imm + fprintf oc " compd.%a %a = %a, %a\n;;\n" icond it ireg rd ireg rs coqint64 imm | Paddil (rd, rs, imm) -> assert Archi.ptr64; - fprintf oc " addd %a = %a, %a\n" ireg rd ireg rs coqint64 imm + fprintf oc " addd %a = %a, %a\n;;\n" ireg rd ireg rs coqint64 imm | Pandil (rd, rs, imm) -> assert Archi.ptr64; - fprintf oc " andd %a = %a, %a\n" ireg rd ireg rs coqint64 imm + fprintf oc " andd %a = %a, %a\n;;\n" ireg rd ireg rs coqint64 imm | Poril (rd, rs, imm) -> assert Archi.ptr64; - fprintf oc " ord %a = %a, %a\n" ireg rd ireg rs coqint64 imm + fprintf oc " ord %a = %a, %a\n;;\n" ireg rd ireg rs coqint64 imm | Pxoril (rd, rs, imm) -> assert Archi.ptr64; - fprintf oc " xord %a = %a, %a\n" ireg rd ireg rs coqint64 imm + fprintf oc " xord %a = %a, %a\n;;\n" ireg rd ireg rs coqint64 imm let get_section_names name = let (text, lit) = diff --git a/runtime/mppa_k1c/Makefile b/runtime/mppa_k1c/Makefile index e10c5086..37e15e94 100644 --- a/runtime/mppa_k1c/Makefile +++ b/runtime/mppa_k1c/Makefile @@ -1,4 +1,4 @@ -CCOMP ?= ccomp +CCOMP ?= ../../ccomp CFLAGS ?= -O2 -D__K1_TINYK1__ CFILES=$(wildcard *.c) diff --git a/runtime/mppa_k1c/i64_udivmod.c b/runtime/mppa_k1c/i64_udivmod.c index 20d8c976..74b39874 100644 --- a/runtime/mppa_k1c/i64_udivmod.c +++ b/runtime/mppa_k1c/i64_udivmod.c @@ -1,31 +1,3 @@ -#ifdef __K1_TINYK1__ -unsigned long long -udivmoddi4(unsigned long long num, unsigned long long den, int modwanted) -{ - unsigned long long bit = 1; - unsigned long long res = 0; - - while (den < num && bit && !(den & (1L<<31))) - { - den <<=1; - bit <<=1; - } - while (bit) - { - if (num >= den) - { - num -= den; - res |= bit; - } - bit >>=1; - den >>=1; - } - if (modwanted) return num; - return res; -} - -#else - /* THIS IS THE PREVIOUS VERSION, USED ON BOSTAN AND ANDEY */ unsigned long long udivmoddi4(unsigned long long num, unsigned long long den, int modwanted) @@ -54,5 +26,3 @@ udivmoddi4(unsigned long long num, unsigned long long den, int modwanted) return modwanted ? r : q; } -#endif /* __K1_TINYK1__ */ - diff --git a/test/mppa/do_test.sh b/test/mppa/do_test.sh index bb626203..5cc23dee 100644 --- a/test/mppa/do_test.sh +++ b/test/mppa/do_test.sh @@ -38,4 +38,13 @@ cat << EOF ## EOF (cd interop && make $1 -j$2) + +cat << EOF + +## +# printf wrapper test +## +(cd lib && make $1 -j$2) +EOF + } diff --git a/test/mppa/instr/Makefile b/test/mppa/instr/Makefile index 9d1fbb5f..66e40365 100644 --- a/test/mppa/instr/Makefile +++ b/test/mppa/instr/Makefile @@ -1,15 +1,18 @@ K1CC ?= k1-mbr-gcc CC ?= gcc CCOMP ?= ccomp -CFLAGS ?= -O2 +OPTIM ?= -O2 +CFLAGS ?= $(OPTIM) -Wl,--wrap=printf SIMU ?= k1-mppa -TIMEOUT ?= --signal=SIGTERM 60s +TIMEOUT ?= --signal=SIGTERM 120s DIR=./ SRCDIR=$(DIR) OUTDIR=$(DIR)/out BINDIR=$(DIR)/bin ASMDIR=$(DIR)/asm +LIB=../lib/system.x86-gcc.a +K1LIB=../lib/system.gcc.a ## # Intended flow : .c -> .gcc.s -> .gcc.bin -> .gcc.out @@ -21,7 +24,7 @@ CCPATH=$(shell which $(CC)) CCOMPPATH=$(shell which $(CCOMP)) SIMUPATH=$(shell which $(SIMU)) -TESTNAMES=$(notdir $(subst .c,,$(wildcard $(DIR)/*.c))) +TESTNAMES?=$(notdir $(subst .c,,$(wildcard $(DIR)/*.c))) X86_GCC_OUT=$(addprefix $(OUTDIR)/,$(addsuffix .x86-gcc.out,$(TESTNAMES))) GCC_OUT=$(addprefix $(OUTDIR)/,$(addsuffix .gcc.out,$(TESTNAMES))) CCOMP_OUT=$(addprefix $(OUTDIR)/,$(addsuffix .ccomp.out,$(TESTNAMES))) @@ -37,16 +40,20 @@ BIN=$(addprefix $(BINDIR)/,$(addsuffix .x86-gcc.bin,$(TESTNAMES)))\ all: $(BIN) +GREEN=\033[0;32m +RED=\033[0;31m +NC=\033[0m + .PHONY: test: $(X86_GCC_OUT) $(GCC_OUT) @echo "Comparing x86 gcc output to k1 gcc.." @for test in $(TESTNAMES); do\ x86out=$(OUTDIR)/$$test.x86-gcc.out;\ gccout=$(OUTDIR)/$$test.gcc.out;\ - if ! diff $$x86out $$gccout; then\ - >&2 echo "ERROR: $$x86out and $$gccout differ";\ + if diff -q $$x86out $$gccout > /dev/null; test $${PIPESTATUS[0]} -ne 0; then\ + >&2 printf "$(RED)ERROR: $$x86out and $$gccout differ$(NC)\n";\ else\ - echo "GOOD: $$x86out and $$gccout concur";\ + printf "$(GREEN)GOOD: $$x86out and $$gccout concur$(NC)\n";\ fi;\ done @@ -56,10 +63,10 @@ check: $(GCC_OUT) $(CCOMP_OUT) @for test in $(TESTNAMES); do\ gccout=$(OUTDIR)/$$test.gcc.out;\ ccompout=$(OUTDIR)/$$test.ccomp.out;\ - if ! diff $$ccompout $$gccout; then\ - >&2 echo "ERROR: $$ccompout and $$gccout differ";\ + if diff -q $$ccompout $$gccout > /dev/null; test $${PIPESTATUS[0]} -ne 0; then\ + >&2 printf "$(RED)ERROR: $$ccompout and $$gccout differ$(NC)\n";\ else\ - echo "GOOD: $$ccompout and $$gccout concur";\ + printf "$(GREEN)GOOD: $$ccompout and $$gccout concur$(NC)\n";\ fi;\ done @@ -68,20 +75,13 @@ check: $(GCC_OUT) $(CCOMP_OUT) ## .SECONDARY: -# Generating output +$(LIB): + (cd $(dir $(LIB)) && make) -## Version sans les timeout -#$(OUTDIR)/%.x86-gcc.out: $(BINDIR)/%.x86-gcc.bin -# @mkdir -p $(@D) -# ./$< > $@; echo $$? >> $@ -# -#$(OUTDIR)/%.gcc.out: $(BINDIR)/%.gcc.bin $(SIMUPATH) -# @mkdir -p $(@D) -# $(SIMU) -- $< > $@ ; echo $$? >> $@ -# -#$(OUTDIR)/%.ccomp.out: $(BINDIR)/%.ccomp.bin $(SIMUPATH) -# @mkdir -p $(@D) -# $(SIMU) -- $< > $@ ; echo $$? >> $@ +$(K1LIB): + (cd $(dir $(LIB)) && make) + +# Generating output ## Version avec timeout $(OUTDIR)/%.x86-gcc.out: $(BINDIR)/%.x86-gcc.bin @@ -98,17 +98,17 @@ $(OUTDIR)/%.ccomp.out: $(BINDIR)/%.ccomp.bin $(SIMUPATH) # Assembly to binary -$(BINDIR)/%.x86-gcc.bin: $(ASMDIR)/%.x86-gcc.s $(CCPATH) +$(BINDIR)/%.x86-gcc.bin: $(ASMDIR)/%.x86-gcc.s $(LIB) $(CCPATH) @mkdir -p $(@D) - $(CC) $(CFLAGS) $< -o $@ + $(CC) $(CFLAGS) $(filter-out $(CCPATH),$^) -o $@ -$(BINDIR)/%.gcc.bin: $(ASMDIR)/%.gcc.s $(K1CCPATH) +$(BINDIR)/%.gcc.bin: $(ASMDIR)/%.gcc.s $(K1LIB) $(K1CCPATH) @mkdir -p $(@D) - $(K1CC) $(CFLAGS) $< -o $@ + $(K1CC) $(CFLAGS) $(filter-out $(K1CCPATH),$^) -o $@ -$(BINDIR)/%.ccomp.bin: $(ASMDIR)/%.ccomp.s $(CCOMPPATH) +$(BINDIR)/%.ccomp.bin: $(ASMDIR)/%.ccomp.s $(K1LIB) $(CCOMPPATH) @mkdir -p $(@D) - $(CCOMP) $(CFLAGS) $< -o $@ + $(CCOMP) $(CFLAGS) $(filter-out $(CCOMPPATH),$^) -o $@ # Source to assembly diff --git a/test/mppa/instr/framework.h b/test/mppa/instr/framework.h index 52ba97bc..f43ec616 100644 --- a/test/mppa/instr/framework.h +++ b/test/mppa/instr/framework.h @@ -3,6 +3,8 @@ #include "../prng/prng.c" +int printf(const char *, ...); + #define BEGIN_TEST_N(type, N)\ int main(void){\ type t[N], c, i, j, S;\ @@ -28,6 +30,7 @@ /* In between BEGIN_TEST and END_TEST : definition of c */ #define END_TEST()\ + printf("%llu\n", c);\ S += c;\ }\ return S;\ diff --git a/test/mppa/interop/Makefile b/test/mppa/interop/Makefile index 78271a4e..5818cbcb 100644 --- a/test/mppa/interop/Makefile +++ b/test/mppa/interop/Makefile @@ -3,7 +3,7 @@ CC ?= gcc CCOMP ?= ccomp CFLAGS ?= -O2 -Wno-varargs SIMU ?= k1-mppa -TIMEOUT ?= --signal=SIGTERM 80s +TIMEOUT ?= --signal=SIGTERM 120s DIR=./ SRCDIR=$(DIR) @@ -57,6 +57,10 @@ BIN=$(addprefix $(BINDIR)/,$(addsuffix .x86-gcc.bin,$(TESTNAMES)))\ all: $(BIN) +GREEN=\033[0;32m +RED=\033[0;31m +NC=\033[0m + .PHONY: test: $(X86_GCC_OUT) $(GCC_OUT) $(VAARG_X86_GCC_OUT) $(VAARG_GCC_OUT) @echo "Comparing x86 gcc output to k1 gcc.." @@ -65,15 +69,15 @@ test: $(X86_GCC_OUT) $(GCC_OUT) $(VAARG_X86_GCC_OUT) $(VAARG_GCC_OUT) gccout=$(OUTDIR)/$$test.gcc.out;\ vaarg_x86out=$(OUTDIR)/$$test.x86-gcc.vaarg.out;\ vaarg_gccout=$(OUTDIR)/$$test.gcc.vaarg.out;\ - if ! diff $$x86out $$gccout; then\ - >&2 echo "ERROR: $$x86out and $$gccout differ";\ + if ! diff $$x86out $$gccout > /dev/null; then\ + >&2 printf "$(RED)ERROR: $$x86out and $$gccout differ$(NC)\n";\ else\ - echo "GOOD: $$x86out and $$gccout concur";\ + printf "$(GREEN)GOOD: $$x86out and $$gccout concur$(NC)\n";\ fi;\ - if ! diff $$vaarg_x86out $$vaarg_gccout; then\ - >&2 echo "ERROR: $$vaarg_x86out and $$vaarg_gccout differ";\ + if ! diff $$vaarg_x86out $$vaarg_gccout > /dev/null; then\ + >&2 printf "$(RED)ERROR: $$vaarg_x86out and $$vaarg_gccout differ$(NC)\n";\ else\ - echo "GOOD: $$vaarg_x86out and $$vaarg_gccout concur";\ + printf "$(GREEN)GOOD: $$vaarg_x86out and $$vaarg_gccout concur$(NC)\n";\ fi;\ done @@ -87,25 +91,25 @@ check: $(GCC_OUT) $(CCOMP_OUT) $(GCC_REV_OUT) $(VAARG_GCC_OUT) $(VAARG_CCOMP_OUT vaarg_gccout=$(OUTDIR)/$$test.gcc.vaarg.out;\ vaarg_ccompout=$(OUTDIR)/$$test.ccomp.vaarg.out;\ vaarg_gccrevout=$(OUTDIR)/$$test.gcc.rev.vaarg.out;\ - if ! diff $$ccompout $$gccout; then\ - >&2 echo "ERROR: $$ccompout and $$gccout differ";\ + if ! diff $$ccompout $$gccout > /dev/null; then\ + >&2 printf "$(RED)ERROR: $$ccompout and $$gccout differ$(NC)\n";\ else\ - echo "GOOD: $$ccompout and $$gccout concur";\ + printf "$(GREEN)GOOD: $$ccompout and $$gccout concur$(NC)\n";\ fi;\ - if ! diff $$gccrevout $$gccout; then\ - >&2 echo "ERROR: $$gccrevout and $$gccout differ";\ + if ! diff $$gccrevout $$gccout > /dev/null; then\ + >&2 printf "$(RED)ERROR: $$gccrevout and $$gccout differ$(NC)\n";\ else\ - echo "GOOD: $$gccrevout and $$gccout concur";\ + printf "$(GREEN)GOOD: $$gccrevout and $$gccout concur$(NC)\n";\ fi;\ - if ! diff $$vaarg_ccompout $$vaarg_gccout; then\ - >&2 echo "ERROR: $$vaarg_ccompout and $$vaarg_gccout differ";\ + if ! diff $$vaarg_ccompout $$vaarg_gccout > /dev/null; then\ + >&2 printf "$(RED)ERROR: $$vaarg_ccompout and $$vaarg_gccout differ$(NC)\n";\ else\ - echo "GOOD: $$vaarg_ccompout and $$vaarg_gccout concur";\ + printf "$(GREEN)GOOD: $$vaarg_ccompout and $$vaarg_gccout concur$(NC)\n";\ fi;\ - if ! diff $$vaarg_gccrevout $$vaarg_gccout; then\ - >&2 echo "ERROR: $$vaarg_gccrevout and $$vaarg_gccout differ";\ + if ! diff $$vaarg_gccrevout $$vaarg_gccout > /dev/null; then\ + >&2 printf "$(RED)ERROR: $$vaarg_gccrevout and $$vaarg_gccout differ$(NC)\n";\ else\ - echo "GOOD: $$vaarg_gccrevout and $$vaarg_gccout concur";\ + printf "$(GREEN)GOOD: $$vaarg_gccrevout and $$vaarg_gccout concur$(NC)\n";\ fi;\ done diff --git a/test/mppa/interop/vaarg_common.c b/test/mppa/interop/vaarg_common.c index a04b67bf..9033893b 100644 --- a/test/mppa/interop/vaarg_common.c +++ b/test/mppa/interop/vaarg_common.c @@ -14,7 +14,7 @@ a10 + a11 - a12 ^ a13 + a14 - a15 + a16 ^ a17 + a18 + a19 +\ a20 + a21 + a22 * a23 + a24 + a25 << a26 & a27 + a28 + a29) -#define VA_START(vl, n) va_list vl; va_start(vl, n) +#define VA_START(vl, arg) va_list vl; va_start(vl, arg) #define VA_END(vl) va_end(vl) void void_void(void){ @@ -29,7 +29,7 @@ long long ll_void(void){ // int i_oneiarg(int arg){ int i_oneiarg(int arg, ...){ STACK; - VA_START(vl, 0); + VA_START(vl, arg); VA_END(vl); return ONEARG_OP(arg); } @@ -37,7 +37,7 @@ int i_oneiarg(int arg, ...){ //int i_multiiargs(int arg1, char arg2, char arg3, int arg4){ int i_multiiargs(int arg1, ...){ STACK; - VA_START(vl, 3); + VA_START(vl, arg1); char arg2 = va_arg(vl, int); char arg3 = va_arg(vl, int); int arg4 = va_arg(vl, int); @@ -51,19 +51,23 @@ int i_multiiargs(int arg1, ...){ int i_manyiargs(char a0, ...) { STACK; - VA_START(vl, 29); + VA_START(vl, a0); + VA_START(vl2, a0); int a1 = va_arg(vl, int); char a2 = va_arg(vl, int); int a3 = va_arg(vl, int); char a4 = va_arg(vl, int); char a5 = va_arg(vl, int); + char b1 = va_arg(vl2, int); int a6 = va_arg(vl, int); int a7 = va_arg(vl, int); char a8 = va_arg(vl, int); + char b2 = va_arg(vl2, int); int a9 = va_arg(vl, int); char a10 = va_arg(vl, int); int a11 = va_arg(vl, int); char a12 = va_arg(vl, int); + char b3 = va_arg(vl2, int); int a13 = va_arg(vl, int); char a14 = va_arg(vl, int); char a15 = va_arg(vl, int); @@ -78,19 +82,21 @@ int i_manyiargs(char a0, ...) char a24 = va_arg(vl, int); char a25 = va_arg(vl, int); int a26 = va_arg(vl, int); + char b4 = va_arg(vl2, int); int a27 = va_arg(vl, int); char a28 = va_arg(vl, int); int a29 = va_arg(vl, int); VA_END(vl); - return MANYARG_OP(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, - a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, - a20, a21, a22, a23, a24, a25, a26, a27, a28, a29); + VA_END(vl); + return MANYARG_OP(a0, a1, a2, a3, a4, (a5*b2), a6, a7, a8, a9, + (a10*b3), a11, a12, a13, a14, a15, a16, a17, a18, a19, + a20, (a21*b1), a22, a23, (a24*b3), a25, a26, a27, a28, a29); } //int ll_onellarg(long long arg){ int ll_onellarg(long long arg, ...){ STACK; - VA_START(vl, 0); + VA_START(vl, arg); VA_END(vl); return ONEARG_OP(arg); } @@ -98,7 +104,7 @@ int ll_onellarg(long long arg, ...){ //long long ll_multillargs(long long arg1, char arg2, char arg3, long long arg4){ long long ll_multillargs(long long arg1, ...){ STACK; - VA_START(vl, 3); + VA_START(vl, arg1); char arg2 = va_arg(vl, int); char arg3 = va_arg(vl, int); long long arg4 = va_arg(vl, long long); @@ -112,7 +118,7 @@ long long ll_multillargs(long long arg1, ...){ long long ll_manyllargs(char a0, ...) { STACK; - VA_START(vl, 29); + VA_START(vl, a0); int a1 = va_arg(vl, int); char a2 = va_arg(vl, int); long long a3 = va_arg(vl, long long); @@ -153,7 +159,7 @@ long long ll_manyllargs(char a0, ...) // char a20, int a21, char a22, long long a23, char a24, char a25, long long a26, int a27, char a28, long long a29) long long stackhell(char a0, ...) { - VA_START(vl, 29); + VA_START(vl, a0); int a1 = va_arg(vl, int); char a2 = va_arg(vl, int); long long a3 = va_arg(vl, long long); diff --git a/test/mppa/lib/Makefile b/test/mppa/lib/Makefile new file mode 100644 index 00000000..affc1afd --- /dev/null +++ b/test/mppa/lib/Makefile @@ -0,0 +1,133 @@ +K1CC ?= k1-mbr-gcc +K1AR ?= k1-mbr-ar +CC ?= gcc +AR ?= gcc-ar +CCOMP ?= ccomp +CFLAGS ?= -O1 -Wl,--wrap=printf +SIMU ?= k1-mppa +TIMEOUT ?= --signal=SIGTERM 60s + +DIR=./ +SRCDIR=$(DIR) +OUTDIR=$(DIR)/out +BINDIR=$(DIR)/bin +ASMDIR=$(DIR)/asm +OBJDIR=$(DIR)/obj + +K1CCPATH=$(shell which $(K1CC)) +K1ARPATH=$(shell which $(K1AR)) +CCPATH=$(shell which $(CC)) +ARPATH=$(shell which $(AR)) +SIMUPATH=$(shell which $(SIMU)) + +TESTNAMES=printf-test +X86_GCC_OUT=$(addprefix $(OUTDIR)/,$(addsuffix .x86-gcc.out,$(TESTNAMES))) +GCC_OUT=$(addprefix $(OUTDIR)/,$(addsuffix .gcc.out,$(TESTNAMES))) +CCOMP_OUT=$(addprefix $(OUTDIR)/,$(addsuffix .ccomp.out,$(TESTNAMES))) + +OUT=$(X86_GCC_OUT) $(GCC_OUT) $(CCOMP_OUT) +BIN=$(addprefix $(BINDIR)/,$(addsuffix .x86-gcc.bin,$(TESTNAMES)))\ + $(addprefix $(BINDIR)/,$(addsuffix .gcc.bin,$(TESTNAMES)))\ + $(addprefix $(BINDIR)/,$(addsuffix .ccomp.bin,$(TESTNAMES))) + +## +# Targets +## + +all: $(BIN) system.x86-gcc.a system.gcc.a + +.PHONY: +test: $(X86_GCC_OUT) $(GCC_OUT) + @echo "Comparing x86 gcc output to k1 gcc.." + @for test in $(TESTNAMES); do\ + x86out=$(OUTDIR)/$$test.x86-gcc.out;\ + gccout=$(OUTDIR)/$$test.gcc.out;\ + if ! diff $$x86out $$gccout; then\ + >&2 echo "ERROR: $$x86out and $$gccout differ";\ + else\ + echo "GOOD: $$x86out and $$gccout concur";\ + fi;\ + done + +.PHONY: +check: $(GCC_OUT) $(CCOMP_OUT) + @echo "Comparing k1 gcc output to ccomp.." + @for test in $(TESTNAMES); do\ + gccout=$(OUTDIR)/$$test.gcc.out;\ + ccompout=$(OUTDIR)/$$test.ccomp.out;\ + if ! diff $$ccompout $$gccout; then\ + >&2 echo "ERROR: $$ccompout and $$gccout differ";\ + else\ + echo "GOOD: $$ccompout and $$gccout concur";\ + fi;\ + done + +## +# Rules +## + +.SECONDARY: + +# Generating output + +## Version avec timeout +$(OUTDIR)/%.x86-gcc.out: $(BINDIR)/%.x86-gcc.bin + @mkdir -p $(@D) + ret=0; timeout $(TIMEOUT) ./$< > $@ || { ret=$$?; }; echo $$ret >> $@ + +$(OUTDIR)/%.gcc.out: $(BINDIR)/%.gcc.bin $(SIMUPATH) + @mkdir -p $(@D) + ret=0; timeout $(TIMEOUT) $(SIMU) -- $< > $@ || { ret=$$?; }; echo $$ret >> $@ + +$(OUTDIR)/%.ccomp.out: $(BINDIR)/%.ccomp.bin $(SIMUPATH) + @mkdir -p $(@D) + ret=0; timeout $(TIMEOUT) $(SIMU) -- $< > $@ || { ret=$$?; }; echo $$ret >> $@ + +# Object to binary + +$(BINDIR)/%.x86-gcc.bin: $(OBJDIR)/%.x86-gcc.o system.x86-gcc.a $(CCPATH) + @mkdir -p $(@D) + $(CC) $(CFLAGS) $(filter-out $(CCPATH),$^) -o $@ + +$(BINDIR)/%.gcc.bin: $(OBJDIR)/%.gcc.o system.gcc.a $(K1CCPATH) + @mkdir -p $(@D) + $(K1CC) $(CFLAGS) $(filter-out $(K1CCPATH),$^) -o $@ + +$(BINDIR)/%.ccomp.bin: $(OBJDIR)/%.ccomp.o system.gcc.a $(CCOMPPATH) + @mkdir -p $(@D) + $(CCOMP) $(CFLAGS) $(filter-out $(CCOMPPATH),$^) -o $@ + +# Generating libraries +system.x86-gcc.a: $(OBJDIR)/printf.x86-gcc.o $(ARPATH) + $(AR) rcs $@ $< + +system.gcc.a: $(OBJDIR)/printf.gcc.o $(K1ARPATH) + $(K1AR) rcs $@ $< + +# Assembly to object + +$(OBJDIR)/%.x86-gcc.o: $(ASMDIR)/%.x86-gcc.s $(CCPATH) + @mkdir -p $(@D) + $(CC) $(CFLAGS) -c $< -o $@ + +$(OBJDIR)/%.gcc.o: $(ASMDIR)/%.gcc.s $(K1CCPATH) + @mkdir -p $(@D) + $(K1CC) $(CFLAGS) -c $< -o $@ + +$(OBJDIR)/%.ccomp.o: $(ASMDIR)/%.ccomp.s $(CCOMPPATH) + $(CCOMP) $(CFLAGS) -c $< -o $@ + +# Source to assembly + +$(ASMDIR)/%.x86-gcc.s: $(SRCDIR)/%.c $(CCPATH) + @mkdir -p $(@D) + $(CC) $(CFLAGS) -S $< -o $@ + +$(ASMDIR)/%.gcc.s: $(SRCDIR)/%.c $(K1CCPATH) + @mkdir -p $(@D) + $(K1CC) $(CFLAGS) -S $< -o $@ + +$(ASMDIR)/%.ccomp.s: $(SRCDIR)/%.c $(CCOMPPATH) + @mkdir -p $(@D) + $(CCOMP) $(CFLAGS) -S $< -o $@ + diff --git a/test/mppa/lib/printf-test.c b/test/mppa/lib/printf-test.c new file mode 100644 index 00000000..25afd436 --- /dev/null +++ b/test/mppa/lib/printf-test.c @@ -0,0 +1,9 @@ +int printf(const char *, ...); + +int main(void){ + int a = 42; + char *str = "Hi there"; + printf("%s, I am %u\n", str, a); + + return 0; +} diff --git a/test/mppa/lib/printf.c b/test/mppa/lib/printf.c new file mode 100644 index 00000000..79984ef6 --- /dev/null +++ b/test/mppa/lib/printf.c @@ -0,0 +1,9 @@ +#include <stdio.h> +#include <stdarg.h> + +int __wrap_printf(const char *format, ...){ + va_list args; + va_start(args, format); + vprintf(format, args); + va_end(args); +} |