From 2fac924c33ee2cf8bfe1bea918addcc18946cf9f Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Wed, 15 Aug 2018 17:19:50 +0200 Subject: [PATCH] mescc: x86_64 support: Add tests. --- .gitignore | 2 + build-aux/test64.sh | 85 ++++++++++++++++++++++++++++++++++++++ lib/x86_64-mes/x86_64.M1 | 3 ++ scaffold/tests/00-exit-0.c | 34 +++++++++++---- 4 files changed, 117 insertions(+), 7 deletions(-) create mode 100755 build-aux/test64.sh diff --git a/.gitignore b/.gitignore index da8824a8..1aa07166 100644 --- a/.gitignore +++ b/.gitignore @@ -37,8 +37,10 @@ *.x86-out *.x86_64-mes-gcc-o *.x86_64-mes-gcc-out +*.x86_64-mes-gcc-stdout *.x86_64-mes-o *.x86_64-mes-out +*.x86_64-mes-stdout *.x86_64-out /src/*.h diff --git a/build-aux/test64.sh b/build-aux/test64.sh new file mode 100755 index 00000000..4d29ca4b --- /dev/null +++ b/build-aux/test64.sh @@ -0,0 +1,85 @@ +#! /bin/sh + +# GNU Mes --- Maxwell Equations of Software +# Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen +# +# This file is part of GNU Mes. +# +# GNU Mes is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or (at +# your option) any later version. +# +# GNU Mes is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Mes. If not, see . + +set -e +. ${srcdest}build-aux/config.sh +. ${srcdest}build-aux/trace.sh + +MES_ARENA=100000000 + +GUILE=${GUILE-$MES} +DIFF=${DIFF-$(command -v diff)} || true +[ -z "$DIFF" ] && DIFF="sh scripts/diff.scm" + +t=${1-scaffold/tests/t} +o="$t" +rm -f "$o".mes-out + +rm -f "$o".gcc-out +if [ -n "$CC" ]; then + sh ${srcdest}build-aux/cc.sh "$t" + + r=0 + [ -f "$t".exit ] && r=$(cat "$t".exit) + set +e + "$o".gcc-out $ARGS > "$o".gcc-stdout + m=$? + cat "$o".gcc-stdout + set -e + + [ $m = $r ] + if [ -f "$t".expect ]; then + $DIFF -ub "$t".expect "$o".gcc-stdout; + fi +fi + +rm -f "$t".mes-gcc-out +if [ -n "$CC64" ]; then + sh ${srcdest}build-aux/cc64-mes.sh "$t" + + r=0 + [ -f "$t".exit ] && r=$(cat "$t".exit) + set +e + "$o".x86_64-mes-gcc-out $ARGS > "$o".x86_64-mes-gcc-stdout + m=$? + cat "$t".x86_64-mes-gcc-stdout + set -e + + [ $m = $r ] + if [ -f "$t".expect ]; then + $DIFF -ub "$t".expect "$o".x86_64-mes-gcc-stdout; + fi +fi + +rm -f "$o".mes-out +sh ${srcdest}build-aux/cc-x86_64-mes.sh "$t" + +r=0 +[ -f "$t".exit ] && r=$(cat "$t".exit) +set +e +"$o".x86_64-mes-out $ARGS > "$o".x86_64-mes-stdout +m=$? +cat "$o".x86_64-mes-stdout +set -e + +[ $m = $r ] +if [ -f "$t".expect ]; then + $DIFF -ub "$t".expect "$o".x86_64-mes-stdout; +fi diff --git a/lib/x86_64-mes/x86_64.M1 b/lib/x86_64-mes/x86_64.M1 index 4178160e..10e6b913 100644 --- a/lib/x86_64-mes/x86_64.M1 +++ b/lib/x86_64-mes/x86_64.M1 @@ -21,6 +21,7 @@ DEFINE add____%rbp,%rax 4801e8 DEFINE call32 e8 DEFINE hlt f4 DEFINE mov____$i32,%rax 48c7c0 +DEFINE mov____$i32,%rdi 48c7c7 DEFINE mov____$i32,0x8(%rbp) c745 DEFINE mov____$i64,%rax 48a1 DEFINE mov____%edi,0x8(%rbp) 897d @@ -48,3 +49,5 @@ DEFINE shl____$i8,%rax 48c1e0 DEFINE sub____$i32,%rsp 4881ec DEFINE syscall 0f05 DEFINE test___%rax,%rax 4885c0 + +DEFINE SYS_exit 3c000000 diff --git a/scaffold/tests/00-exit-0.c b/scaffold/tests/00-exit-0.c index 4a0072ea..6684ae47 100644 --- a/scaffold/tests/00-exit-0.c +++ b/scaffold/tests/00-exit-0.c @@ -1,6 +1,6 @@ /* -*-comment-start: "//";comment-end:""-*- * GNU Mes --- Maxwell Equations of Software - * Copyright © 2017 Jan (janneke) Nieuwenhuizen + * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen * * This file is part of GNU Mes. * @@ -21,17 +21,37 @@ int main () { +#if __i386__ + #if __MESC__ asm ("mov____$i32,%ebx %0"); asm ("mov____$i32,%eax SYS_exit"); asm ("int____$0x80"); -#else // !__MESC__ +#elif __TINYC__ asm ("mov $0,%ebx"); asm ("mov $1,%eax"); -#if !__TINYC__ - asm ("int $0x80"); -#else asm ("int $128"); -#endif -#endif +#else // !__TINYC__ + asm ("mov $0,%ebx"); + asm ("mov $1,%eax"); + asm ("int $0x80"); +#endif // !__TINYC__ + +#elif __x86_64__ + +#if __MESC__ + asm ("mov____$i32,%rdi %0"); + asm ("mov____$i32,%rax SYS_exit"); + asm ("syscall"); +#elif __TINYC__ + asm ("mov $0,%rdi"); + asm ("mov $0x3c,%rax"); + asm ("syscall"); +#else // !__TINYC__ + asm ("mov $0,%rdi"); + asm ("mov $60,%rax"); + asm ("syscall"); +#endif // !__TINYC__ + +#endif // ! __x86_64__ }