aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCyril SIX <cyril.six@kalray.eu>2019-01-17 13:45:42 +0100
committerCyril SIX <cyril.six@kalray.eu>2019-01-17 13:45:42 +0100
commit1848a8f4c08ef55a045d4dc1e78f517182a50442 (patch)
treebc1d3147c2db76b962c8fa3682ac5dd1e4e6cd3a
parent15c5ca037eabb9891f7880bc2d517982ba34e769 (diff)
parentfe3fc2fd3d5a312ac526c5596e851e315782d9f6 (diff)
downloadcompcert-kvx-1848a8f4c08ef55a045d4dc1e78f517182a50442.tar.gz
compcert-kvx-1848a8f4c08ef55a045d4dc1e78f517182a50442.zip
Merge branch 'mppa_k1c' into mppa_postpass
-rw-r--r--mppa_k1c/Asm.v2
-rw-r--r--mppa_k1c/Asmblockgen.v26
-rw-r--r--mppa_k1c/CBuiltins.ml1
-rw-r--r--mppa_k1c/TargetPrinter.ml130
-rw-r--r--runtime/mppa_k1c/Makefile2
-rw-r--r--runtime/mppa_k1c/i64_udivmod.c30
-rw-r--r--test/mppa/do_test.sh9
-rw-r--r--test/mppa/instr/Makefile56
-rw-r--r--test/mppa/instr/framework.h3
-rw-r--r--test/mppa/interop/Makefile42
-rw-r--r--test/mppa/interop/vaarg_common.c28
-rw-r--r--test/mppa/lib/Makefile133
-rw-r--r--test/mppa/lib/printf-test.c9
-rw-r--r--test/mppa/lib/printf.c9
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);
+}