diff --git a/Makefile b/Makefile
index 676c098a..1179dbd1 100644
--- a/Makefile
+++ b/Makefile
@@ -350,12 +350,10 @@ tcc-doc.info: tcc-doc.texi
 export LIBTCC1
 
 %est:
-	$(MAKE) -C tests2 $@
 	$(MAKE) -C tests $@
 
 clean:
 	rm -vf $(PROGS) tcc_p$(EXESUF) tcc.pod *~ *.o *.a *.so* *.out *.exe libtcc_test$(EXESUF)
-	$(MAKE) -C tests2 $@
 	$(MAKE) -C tests $@
 ifneq ($(LIBTCC1),)
 	$(MAKE) -C lib $@
diff --git a/configure b/configure
index fa2c97dc..709f5932 100755
--- a/configure
+++ b/configure
@@ -500,7 +500,7 @@ echo "SRC_PATH=$source_path" >>config.mak
 
 # build tree in object directory if source path is different from current one
 if test "$source_path_used" = "yes" ; then
-    FILES="Makefile lib/Makefile tests/Makefile tests2/Makefile"
+    FILES="Makefile lib/Makefile tests/Makefile tests/tests2/Makefile"
     for f in $FILES ; do
         dir=`fn_dirname "$f"`
         test -d "$dir" || mkdir -p "$dir"
diff --git a/tccrun.c b/tccrun.c
index e28529b5..b647962c 100644
--- a/tccrun.c
+++ b/tccrun.c
@@ -615,8 +615,7 @@ static long __stdcall cpu_exception_handler(EXCEPTION_POINTERS *ex_info)
         rt_error(uc, "exception caught");
         break;
     }
-    exit(-1);
-    return EXCEPTION_CONTINUE_SEARCH;
+    return EXCEPTION_EXECUTE_HANDLER;
 }
 
 /* Generate a stack backtrace when a CPU exception occurs. */
diff --git a/tests/Makefile b/tests/Makefile
index 7ea9d92f..76854599 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -7,73 +7,61 @@ include $(TOP)/Makefile
 VPATH = $(top_srcdir)/tests
 
 # what tests to run
-TESTS = libtest \
-		test1 \
-		test2 \
-		test3 \
-		speedtest \
-		btest \
-		test1b\
-		test2b\
-		test3b\
-		weaktest
+TESTS = \
+ hello \
+ libtest \
+ test3 \
+ moretests
 
-		# test4 # this test does not seem to work on any platform
-		# asmtest # this test does not seem to work on any platform
+# test4 -- problem with -static
+# asmtest -- minor differences with gcc
+# btest -- works on i386 (including win32)
+# test3 -- win32 does not know how to printf long doubles
 
 # bounds-checking is supported only on i386
 ifneq ($(ARCH),i386)
-    TESTS := $(filter-out btest,$(TESTS))
-    TESTS := $(filter-out test1b,$(TESTS))
-    TESTS := $(filter-out test2b,$(TESTS))
-    TESTS := $(filter-out test3b,$(TESTS))
+ TESTS := $(filter-out btest,$(TESTS))
 endif
-
-# these should work too
-# TESTS += test1 test2 speedtest btest weaktest
-
-# some tests do not pass on all platforms, remove them for now
-ifeq ($(TARGETOS),Linux)
-    TESTS := $(filter-out weaktest,$(TESTS))
+ifdef CONFIG_WIN32
+ TESTS := $(filter-out test3,$(TESTS))
 endif
 ifeq ($(TARGETOS),Darwin)
-    TESTS := $(filter-out test1,$(TESTS))
-    TESTS := $(filter-out test2,$(TESTS))
-    TESTS := $(filter-out test3,$(TESTS))
-    TESTS := $(filter-out btest,$(TESTS))
-    TESTS := $(filter-out weaktest,$(TESTS))
+ TESTS := $(filter-out test3 btest,$(TESTS))
 endif
 
 ifdef DISABLE_STATIC
-export LD_LIBRARY_PATH:=$(CURDIR)/..
+ export LD_LIBRARY_PATH:=$(CURDIR)/..
 endif
 
 ifeq ($(TARGETOS),Darwin)
-CFLAGS+=-Wl,-flat_namespace,-undefined,warning
-export MACOSX_DEPLOYMENT_TARGET:=10.2
-NATIVE_DEFINES+=-D_ANSI_SOURCE
+ CFLAGS+=-Wl,-flat_namespace,-undefined,warning
+ export MACOSX_DEPLOYMENT_TARGET:=10.2
+ NATIVE_DEFINES+=-D_ANSI_SOURCE
 endif
 
 # run local version of tcc with local libraries and includes
-TCC = ../tcc -B.. $(NATIVE_DEFINES)
+TCCFLAGS = -B$(TOP)
 ifdef CONFIG_WIN32
-	TCC := $(TCC) -I $(top_srcdir)/win32/include -L$(top_build)
+ TCCFLAGS = -B$(top_srcdir)/win32 -I$(top_srcdir)/include -L$(TOP)
 endif
-RUN_TCC = $(NATIVE_DEFINES) -run -DONE_SOURCE ../tcc.c -B..
-DISAS=objdump -d
 
-all test : $(TESTS)
+TCC = $(TOP)/tcc $(TCCFLAGS)
+RUN_TCC = $(NATIVE_DEFINES) -DONE_SOURCE -run $(TOP)/tcc.c $(TCCFLAGS)
 
-# make sure that tcc exists
-test1 test2 test3 test4 btest speedtest asmtest weaktest : ../tcc
-../%:
-	$(MAKE) -C .. $*
+DISAS = objdump -d
 
 # libtcc test
 ifdef LIBTCC1
-LIBTCC1:=$(TOP)/$(LIBTCC1)
+ LIBTCC1:=$(TOP)/$(LIBTCC1)
 endif
 
+all test : $(TESTS)
+
+hello: ../examples/ex1.c
+	@echo ------------ $@ ------------
+	$(TCC) $< -o $@$(EXESUF) && ./$@$(EXESUF)
+	$(TCC) -run $<
+
 libtest: libtcc_test$(EXESUF) $(LIBTCC1)
 	@echo ------------ $@ ------------
 	./libtcc_test$(EXESUF) lib_path=..
@@ -81,6 +69,10 @@ libtest: libtcc_test$(EXESUF) $(LIBTCC1)
 libtcc_test$(EXESUF): libtcc_test.c $(top_builddir)/$(LIBTCC)
 	$(CC) -o $@ $^ $(CPPFLAGS) $(CFLAGS) $(NATIVE_DEFINES) $(LIBS) $(LINK_LIBTCC) $(LDFLAGS)
 
+moretests:
+	@echo ------------ $@ ------------
+	$(MAKE) -C tests2
+
 # test.ref - generate using gcc
 # copy only tcclib.h so GCC's stddef and stdarg will be used
 test.ref: tcctest.c
@@ -94,59 +86,44 @@ test1: test.ref
 	$(TCC) -run tcctest.c > test.out1
 	@if diff -u test.ref test.out1 ; then echo "Auto Test OK"; fi
 
-test1b: test.ref
-	@echo ------------ $@ ------------
-	$(TCC) -b -run tcctest.c > test.out1b
-	@if diff -u test.ref test.out1b ; then echo "Auto Test OK"; fi
-
 # iterated test2 (compile tcc then compile tcctest.c !)
 test2: test.ref
 	@echo ------------ $@ ------------
 	$(TCC) $(RUN_TCC) $(RUN_TCC) -run tcctest.c > test.out2
 	@if diff -u test.ref test.out2 ; then echo "Auto Test2 OK"; fi
 
-test2b: test.ref ../bcheck.o
-	@echo ------------ $@ ------------
-	$(TCC) -b $(RUN_TCC) $(RUN_TCC) -run tcctest.c > test.out2b
-	@if diff -u test.ref test.out2b ; then echo "Auto Test2b OK"; fi
-
 # iterated test3 (compile tcc then compile tcc then compile tcctest.c !)
 test3: test.ref
 	@echo ------------ $@ ------------
 	$(TCC) $(RUN_TCC) $(RUN_TCC) $(RUN_TCC) -run tcctest.c > test.out3
 	@if diff -u test.ref test.out3 ; then echo "Auto Test3 OK"; fi
 
-test3b: test.ref
-	@echo ------------ $@ ------------
-	$(TCC) -b $(RUN_TCC) $(RUN_TCC) $(RUN_TCC) -run tcctest.c > test.out3b
-	@if diff -u test.ref test.out3b ; then echo "Auto Test3 OK"; fi
-
 # binary output test
 test4: test.ref
 	@echo ------------ $@ ------------
-# dynamic output
-	$(TCC) -o tcctest1 tcctest.c
-	./tcctest1 > test1.out
-	@if diff -u test.ref test1.out ; then echo "Dynamic Auto Test OK"; fi
 # object + link output
 	$(TCC) -c -o tcctest3.o tcctest.c
 	$(TCC) -o tcctest3 tcctest3.o
 	./tcctest3 > test3.out
 	@if diff -u test.ref test3.out ; then echo "Object Auto Test OK"; fi
-# static output
-	$(TCC) -static -o tcctest2 tcctest.c
-	./tcctest2 > test2.out
-	@if diff -u test.ref test2.out ; then echo "Static Auto Test OK"; fi
+# dynamic output
+	$(TCC) -o tcctest1 tcctest.c
+	./tcctest1 > test1.out
+	@if diff -u test.ref test1.out ; then echo "Dynamic Auto Test OK"; fi
 # dynamic output + bound check
 	$(TCC) -b -o tcctest4 tcctest.c
 	./tcctest4 > test4.out
 	@if diff -u test.ref test4.out ; then echo "BCheck Auto Test OK"; fi
+# static output
+	$(TCC) -static -o tcctest2 tcctest.c
+	./tcctest2 > test2.out
+	@if diff -u test.ref test2.out ; then echo "Static Auto Test OK"; fi
 
 # memory and bound check auto test
 BOUNDS_OK  = 1 4 8 10 14
 BOUNDS_FAIL= 2 5 7 9 11 12 13 15
 
-btest: boundtest.c ../bcheck.o
+btest: boundtest.c
 	@echo ------------ $@ ------------
 	@for i in $(BOUNDS_OK); do \
 	   echo ; echo --- boundtest $$i ---; \
@@ -212,5 +189,6 @@ cache: tcc_g
 
 # clean
 clean:
-	rm -vf *~ *.o *.a *.bin *.i *.ref *.out *.out? *.out?b *.gcc \
-	   tcctest[1234] ex? libtcc_test$(EXESUF) tcc_g tcclib.h
+	$(MAKE) -C tests2 $@
+	rm -vf *~ *.o *.a *.bin *.i *.ref *.out *.out? *.out?b *.gcc *.exe \
+	   hello libtcc_test tcctest[1234] ex? tcc_g tcclib.h
diff --git a/tests/tcctest.c b/tests/tcctest.c
index 925418ae..8e295fd7 100644
--- a/tests/tcctest.c
+++ b/tests/tcctest.c
@@ -594,7 +594,9 @@ int main(int argc, char **argv)
     local_label_test();
     asm_test();
     builtin_test();
+#ifndef _WIN32
     weak_test();
+#endif
     global_data_test();
     cmp_comparison_test();
     math_cmp_test();
@@ -2464,7 +2466,7 @@ void builtin_test(void)
     printf("res = %d\n", __builtin_constant_p(constant_p_var));
 }
 
-
+#ifndef _WIN32
 extern int __attribute__((weak)) weak_f1(void);
 extern int __attribute__((weak)) weak_f2(void);
 extern int                       weak_f3(void);
@@ -2520,6 +2522,7 @@ int __attribute__((weak)) weak_f2() { return 222; }
 int __attribute__((weak)) weak_f3() { return 333; }
 int __attribute__((weak)) weak_v2 = 222;
 int __attribute__((weak)) weak_v3 = 333;
+#endif
 
 void const_func(const int a)
 {
diff --git a/tests/tests2/16_nesting.expect b/tests/tests2/16_nesting.expect
index 625ee130..5a3431ee 100644
--- a/tests/tests2/16_nesting.expect
+++ b/tests/tests2/16_nesting.expect
@@ -1,18 +1,18 @@
-0 0 0
-0 0 1
-0 0 2
-0 1 0
-0 1 1
-0 1 2
-0 2 0
-0 2 1
-0 2 2
-1 0 0
-1 0 1
-1 0 2
-1 1 0
-1 1 1
-1 1 2
-1 2 0
-1 2 1
-1 2 2
+0 0 0
+0 0 1
+0 0 2
+0 1 0
+0 1 1
+0 1 2
+0 2 0
+0 2 1
+0 2 2
+1 0 0
+1 0 1
+1 0 2
+1 1 0
+1 1 1
+1 1 2
+1 2 0
+1 2 1
+1 2 2
diff --git a/tests/tests2/17_enum.expect b/tests/tests2/17_enum.expect
index bef4be6d..0c4e153d 100644
--- a/tests/tests2/17_enum.expect
+++ b/tests/tests2/17_enum.expect
@@ -1,3 +1,3 @@
-0 1 2 3 54 73 74 75
-12
-54
+0 1 2 3 54 73 74 75
+12
+54
diff --git a/tests/tests2/18_include.expect b/tests/tests2/18_include.expect
index 87729dfb..58c6d29a 100644
--- a/tests/tests2/18_include.expect
+++ b/tests/tests2/18_include.expect
@@ -1,3 +1,3 @@
-including
-included
-done
+including
+included
+done
diff --git a/tests/tests2/18_include.h b/tests/tests2/18_include.h
index 01f894de..dc860802 100644
--- a/tests/tests2/18_include.h
+++ b/tests/tests2/18_include.h
@@ -1 +1 @@
-printf("included\n");
+printf("included\n");
diff --git a/tests/tests2/44_scoped_declarations.c b/tests/tests2/44_scoped_declarations.c
index 2febf987..f38664fc 100644
--- a/tests/tests2/44_scoped_declarations.c
+++ b/tests/tests2/44_scoped_declarations.c
@@ -1,17 +1,17 @@
-#include <stdio.h>
-
-int main()
-{
-   int a;
-
-   for (a = 0; a < 2; a++)
-   {
-      int b = a;
-   }
-
-   printf("it's all good\n");
-
-   return 0;
-}
-
-/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/
+#include <stdio.h>
+
+int main()
+{
+   int a;
+
+   for (a = 0; a < 2; a++)
+   {
+      int b = a;
+   }
+
+   printf("it's all good\n");
+
+   return 0;
+}
+
+/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/
diff --git a/tests/tests2/45_empty_for.c b/tests/tests2/45_empty_for.c
index b14e9d4e..7cef513f 100644
--- a/tests/tests2/45_empty_for.c
+++ b/tests/tests2/45_empty_for.c
@@ -1,18 +1,18 @@
-#include <stdio.h>
-
-int main()
-{
-   int Count = 0;
-
-   for (;;)
-   {
-      Count++;
-      printf("%d\n", Count);
-      if (Count >= 10)
-         break;
-   }
-
-   return 0;
-}
-
-/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/
+#include <stdio.h>
+
+int main()
+{
+   int Count = 0;
+
+   for (;;)
+   {
+      Count++;
+      printf("%d\n", Count);
+      if (Count >= 10)
+         break;
+   }
+
+   return 0;
+}
+
+/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/
diff --git a/tests/tests2/50_logical_second_arg.c b/tests/tests2/50_logical_second_arg.c
index 5fa0bb91..ddec08c8 100644
--- a/tests/tests2/50_logical_second_arg.c
+++ b/tests/tests2/50_logical_second_arg.c
@@ -1,29 +1,29 @@
-#include <stdio.h>
-
-int fred()
-{
-   printf("fred\n");
-   return 0;
-}
-
-int joe()
-{
-   printf("joe\n");
-   return 1;
-}
-
-int main()
-{
-   printf("%d\n", fred() && joe());
-   printf("%d\n", fred() || joe());
-   printf("%d\n", joe() && fred());
-   printf("%d\n", joe() || fred());
-   printf("%d\n", fred() && (1 + joe()));
-   printf("%d\n", fred() || (0 + joe()));
-   printf("%d\n", joe() && (0 + fred()));
-   printf("%d\n", joe() || (1 + fred()));
-
-   return 0;
-}
-
-/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/
+#include <stdio.h>
+
+int fred()
+{
+   printf("fred\n");
+   return 0;
+}
+
+int joe()
+{
+   printf("joe\n");
+   return 1;
+}
+
+int main()
+{
+   printf("%d\n", fred() && joe());
+   printf("%d\n", fred() || joe());
+   printf("%d\n", joe() && fred());
+   printf("%d\n", joe() || fred());
+   printf("%d\n", fred() && (1 + joe()));
+   printf("%d\n", fred() || (0 + joe()));
+   printf("%d\n", joe() && (0 + fred()));
+   printf("%d\n", joe() || (1 + fred()));
+
+   return 0;
+}
+
+/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/
diff --git a/tests/tests2/54_goto.c b/tests/tests2/54_goto.c
index 9509e83d..2e151bb7 100644
--- a/tests/tests2/54_goto.c
+++ b/tests/tests2/54_goto.c
@@ -1,56 +1,56 @@
-#include <stdio.h>
-
-void fred()
-{
-   printf("In fred()\n");
-   goto done;
-   printf("In middle\n");
-done:
-   printf("At end\n");
-}
-
-void joe()
-{
-   int b = 5678;
-
-   printf("In joe()\n");
-
-   {
-      int c = 1234;
-      printf("c = %d\n", c);
-      goto outer;
-      printf("uh-oh\n");
-   }
-
-outer:    
-
-   printf("done\n");
-}
-
-void henry()
-{
-   int a;
-
-   printf("In henry()\n");
-   goto inner;
-
-   {
-      int b;
-inner:    
-      b = 1234;
-      printf("b = %d\n", b);
-   }
-
-   printf("done\n");
-}
-
-int main()
-{
-   fred();
-   joe();
-   henry();
-
-   return 0;
-}
-
-/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/
+#include <stdio.h>
+
+void fred()
+{
+   printf("In fred()\n");
+   goto done;
+   printf("In middle\n");
+done:
+   printf("At end\n");
+}
+
+void joe()
+{
+   int b = 5678;
+
+   printf("In joe()\n");
+
+   {
+      int c = 1234;
+      printf("c = %d\n", c);
+      goto outer;
+      printf("uh-oh\n");
+   }
+
+outer:    
+
+   printf("done\n");
+}
+
+void henry()
+{
+   int a;
+
+   printf("In henry()\n");
+   goto inner;
+
+   {
+      int b;
+inner:    
+      b = 1234;
+      printf("b = %d\n", b);
+   }
+
+   printf("done\n");
+}
+
+int main()
+{
+   fred();
+   joe();
+   henry();
+
+   return 0;
+}
+
+/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/
diff --git a/tests/tests2/Makefile b/tests/tests2/Makefile
index d328ce7d..bf7511ff 100644
--- a/tests/tests2/Makefile
+++ b/tests/tests2/Makefile
@@ -1,103 +1,98 @@
-TOP = ..
+TOP = ../..
 include $(TOP)/Makefile
-VPATH = $(top_srcdir)/tests2
+VPATH = $(top_srcdir)/tests/tests2
+
+TCCFLAGS = -B$(TOP)
+ifdef CONFIG_WIN32
+ TCCFLAGS = -B$(top_srcdir)/win32 -I$(top_srcdir)/include -L$(TOP)
+endif
 
 ifeq ($(TARGETOS),Darwin)
-    CFLAGS+=-Wl,-flat_namespace,-undefined,warning
-    TCCFLAGS=-D_ANSI_SOURCE
-    export MACOSX_DEPLOYMENT_TARGET:=10.2
+ CFLAGS += -Wl,-flat_namespace,-undefined,warning
+ TCCFLAGS += -D_ANSI_SOURCE
+ export MACOSX_DEPLOYMENT_TARGET:=10.2
 endif
 
-ifdef CONFIG_WIN32
-    TCCFLAGS=-I $(TOP)/win32/include -L$(TOP)
-endif
+TCC_RUN = $(TOP)/tcc $(TCCFLAGS) -run
 
-TESTS=	00_assignment.test \
-		01_comment.test \
-		02_printf.test \
-		03_struct.test \
-		04_for.test \
-		05_array.test \
-		06_case.test \
-		07_function.test \
-		08_while.test \
-		09_do_while.test \
-		10_pointer.test \
-		11_precedence.test \
-		12_hashdefine.test \
-		13_integer_literals.test \
-		14_if.test \
-		15_recursion.test \
-		16_nesting.test \
-		17_enum.test \
-		18_include.test \
-		19_pointer_arithmetic.test \
-		20_pointer_comparison.test \
-		21_char_array.test \
-		22_floating_point.test \
-		23_type_coercion.test \
-		24_math_library.test \
-		25_quicksort.test \
-		26_character_constants.test \
-        27_sizeof.test \
-		28_strings.test \
-		29_array_address.test \
-		31_args.test \
-		32_led.test \
-		33_ternary_op.test \
-		35_sizeof.test \
-		36_array_initialisers.test \
-		37_sprintf.test \
-		38_multiple_array_index.test \
-		39_typedef.test \
-		40_stdio.test \
-		41_hashif.test \
-        42_function_pointer.test \
-		43_void_param.test \
-		44_scoped_declarations.test \
-		45_empty_for.test \
-		47_switch_return.test \
-		48_nested_break.test \
-		49_bracket_evaluation.test \
-		50_logical_second_arg.test \
-		51_static.test \
-		52_unnamed_enum.test \
-		54_goto.test \
-		55_lshift_type.test
+TESTS =	\
+ 00_assignment.test \
+ 01_comment.test \
+ 02_printf.test \
+ 03_struct.test \
+ 04_for.test \
+ 05_array.test \
+ 06_case.test \
+ 07_function.test \
+ 08_while.test \
+ 09_do_while.test \
+ 10_pointer.test \
+ 11_precedence.test \
+ 12_hashdefine.test \
+ 13_integer_literals.test \
+ 14_if.test \
+ 15_recursion.test \
+ 16_nesting.test \
+ 17_enum.test \
+ 18_include.test \
+ 19_pointer_arithmetic.test \
+ 20_pointer_comparison.test \
+ 21_char_array.test \
+ 22_floating_point.test \
+ 23_type_coercion.test \
+ 24_math_library.test \
+ 25_quicksort.test \
+ 26_character_constants.test \
+ 27_sizeof.test \
+ 28_strings.test \
+ 29_array_address.test \
+ 31_args.test \
+ 32_led.test \
+ 33_ternary_op.test \
+ 35_sizeof.test \
+ 36_array_initialisers.test \
+ 37_sprintf.test \
+ 38_multiple_array_index.test \
+ 39_typedef.test \
+ 40_stdio.test \
+ 41_hashif.test \
+ 42_function_pointer.test \
+ 43_void_param.test \
+ 44_scoped_declarations.test \
+ 45_empty_for.test \
+ 47_switch_return.test \
+ 48_nested_break.test \
+ 49_bracket_evaluation.test \
+ 50_logical_second_arg.test \
+ 51_static.test \
+ 52_unnamed_enum.test \
+ 54_goto.test \
+ 55_lshift_type.test
 
-		# 30_hanoi.test \ # seg fault in the code, gcc as well
-		# 34_array_assignment.test \ # array assignment is not in C standard
-        # 46_grep.test \ # does not compile even with gcc
+# 30_hanoi.test -- seg fault in the code, gcc as well
+# 34_array_assignment.test -- array assignment is not in C standard
+# 46_grep.test -- does not compile even with gcc
 
 # some tests do not pass on all platforms, remove them for now
 ifeq ($(TARGETOS),Darwin)
-    TESTS := $(filter-out 40_stdio.test,$(TESTS))
+  TESTS := $(filter-out 40_stdio.test,$(TESTS))
 endif
 ifdef CONFIG_WIN32
-    TESTS := $(filter-out 24_math_library.test,$(TESTS))
-    TESTS := $(filter-out 28_strings.test,$(TESTS))
+  TESTS := $(filter-out 24_math_library.test 28_strings.test,$(TESTS))
 endif
 
 %.test: %.c %.expect
 	@echo Test: $*...
 	@if [ "x`echo $* | grep args`" != "x" ]; \
-	then \
-		../tcc -B.. $(TCCFLAGS) -run $< - arg1 arg2 arg3 arg4 2>&1 >$*.output; \
-	else \
-		../tcc -B.. $(TCCFLAGS) -run $< 2>&1 >$*.output; \
+	then $(TCC_RUN) $< - arg1 arg2 arg3 arg4 >$*.output; \
+	else $(TCC_RUN) $< >$*.output; \
 	fi
 	@if diff -bu $(<:.c=.expect) $*.output ; \
-	then \
-        rm -f $*.output \
-	else \
-		echo "ERROR: test $*"; \
+	then rm -f $*.output; \
+	else exit 1; \
 	fi
 
-all: test
-
-test: $(TESTS)
-
-#  vim: set expandtab ts=4 sw=4 sts=4 tw=80 :
+all test: $(TESTS)
 
 clean:
-	rm -vf fred.txt
+	rm -vf fred.txt *.output