mescc: x86_64 support: Add tests.
authorJan Nieuwenhuizen <janneke@gnu.org>
Wed, 15 Aug 2018 15:19:50 +0000 (17:19 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Wed, 15 Aug 2018 15:19:50 +0000 (17:19 +0200)
.gitignore
build-aux/test64.sh [new file with mode: 0755]
lib/x86_64-mes/x86_64.M1
scaffold/tests/00-exit-0.c

index da8824a88ba35643533c48d4b409bb759e9569fb..1aa0716645ac38531a8c0239d0e5a6feb25cbec8 100644 (file)
 *.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 (executable)
index 0000000..4d29ca4
--- /dev/null
@@ -0,0 +1,85 @@
+#! /bin/sh
+
+# GNU Mes --- Maxwell Equations of Software
+# Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+#
+# 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 <http://www.gnu.org/licenses/>.
+
+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
index 4178160e94312bf7296ecb5d61af124d56101fe0..10e6b9131cb48af5b4a88c8611a1a40eb06a37a0 100644 (file)
@@ -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
index 4a0072ea9e640db40b30a109547dff77f141588d..6684ae4750ac43c5e703551b6aa739053fcd4b88 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-comment-start: "//";comment-end:""-*-
  * GNU Mes --- Maxwell Equations of Software
- * Copyright © 2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
  *
  * This file is part of GNU Mes.
  *
 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__
 }