]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add regtest for x86 LOOP{,E,NE} insns.
authorJulian Seward <jseward@acm.org>
Tue, 23 Aug 2005 18:06:01 +0000 (18:06 +0000)
committerJulian Seward <jseward@acm.org>
Tue, 23 Aug 2005 18:06:01 +0000 (18:06 +0000)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@4479

none/tests/x86/Makefile.am
none/tests/x86/looper.c [new file with mode: 0644]
none/tests/x86/looper.stderr.exp [new file with mode: 0644]
none/tests/x86/looper.stdout.exp [new file with mode: 0644]
none/tests/x86/looper.vgtest [new file with mode: 0644]

index 855fee38147ed28c9218d73ab436ba52baea55b5..a36bd192ff63a41451bc76e4fb17d1338d9edabc 100644 (file)
@@ -16,6 +16,7 @@ EXTRA_DIST = $(noinst_SCRIPTS) \
        $(addsuffix .stderr.exp,$(INSN_TESTS)) \
        $(addsuffix .stdout.exp,$(INSN_TESTS)) \
        $(addsuffix .vgtest,$(INSN_TESTS)) \
+       looper.stderr.exp looper.stdout.exp looper.vgtest \
        pushpopseg.stderr.exp pushpopseg.stdout.exp pushpopseg.vgtest \
        seg_override.stderr.exp seg_override.stdout.exp seg_override.vgtest \
        sigcontext.stdout.exp sigcontext.stderr.exp sigcontext.vgtest \
@@ -25,7 +26,7 @@ EXTRA_DIST = $(noinst_SCRIPTS) \
 check_PROGRAMS = \
        badseg bt_everything bt_literal cmpxchg8b cpuid fpu_lazy_eflags \
        getseg $(INSN_TESTS) \
-       int pushpopseg seg_override sigcontext smc1 yield
+       looper int pushpopseg seg_override sigcontext smc1 yield
 
 AM_CFLAGS   = $(WERROR) -Winline -Wall -Wshadow \
                -g -I$(top_srcdir)/include \
diff --git a/none/tests/x86/looper.c b/none/tests/x86/looper.c
new file mode 100644 (file)
index 0000000..6691ea1
--- /dev/null
@@ -0,0 +1,82 @@
+
+#include <stdio.h>
+
+int arg = 0;
+int res = 0;
+
+extern void loop_plain ( void );
+asm("\n"
+".text\n"
+".globl loop_plain\n"
+"loop_plain:\n"
+"\tpushl %ecx\n"
+"\tmovl $999, %eax\n"
+"\tmovl arg, %ecx\n"
+
+".Lmn123plain:\n"
+"\tdecl %eax\n"
+"\tdecl %eax\n"
+"\tdecl %eax\n"
+"\tloop .Lmn123plain\n"
+
+"\tmovl %eax, res\n"
+"\tpopl %ecx\n"
+"\tret\n"
+);
+
+extern void loop_ne ( void );
+asm("\n"
+".text\n"
+".globl loop_ne\n"
+"loop_ne:\n"
+"\tpushl %ecx\n"
+"\tmovl $999, %eax\n"
+"\tmovl arg, %ecx\n"
+
+".Lmn123ne:\n"
+"\tdecl %eax\n"
+"\tdecl %eax\n"
+"\tdecl %eax\n"
+"\tloopne .Lmn123ne\n"
+
+"\tmovl %eax, res\n"
+"\tpopl %ecx\n"
+"\tret\n"
+);
+
+extern void loop_e ( void );
+asm("\n"
+".text\n"
+".globl loop_e\n"
+"loop_e:\n"
+"\tpushl %ecx\n"
+"\tmovl $999, %eax\n"
+"\tmovl arg, %ecx\n"
+
+".Lmn123e:\n"
+"\tdecl %eax\n"
+"\tdecl %eax\n"
+"\tdecl %eax\n"
+/* invert the Z flag */
+"\tpushfl\n"
+"\txorl $64, 0(%esp)\n"
+"\tpopfl\n"
+"\tloope .Lmn123e\n"
+
+"\tmovl %eax, res\n"
+"\tpopl %ecx\n"
+"\tret\n"
+);
+
+int main ( void )
+{
+   res = 0; arg = 10;  loop_plain(); printf("res = %d\n", res);
+
+   res = 0; arg = 10;  loop_ne();    printf("res = %d\n", res);
+   res = 0; arg = 500; loop_ne();    printf("res = %d\n", res);
+
+   res = 0; arg = 10;  loop_e();    printf("res = %d\n", res);
+   res = 0; arg = 500; loop_e();    printf("res = %d\n", res);
+
+   return 0;
+}
diff --git a/none/tests/x86/looper.stderr.exp b/none/tests/x86/looper.stderr.exp
new file mode 100644 (file)
index 0000000..139597f
--- /dev/null
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/x86/looper.stdout.exp b/none/tests/x86/looper.stdout.exp
new file mode 100644 (file)
index 0000000..d57e264
--- /dev/null
@@ -0,0 +1,5 @@
+res = 969
+res = 969
+res = 0
+res = 969
+res = 0
diff --git a/none/tests/x86/looper.vgtest b/none/tests/x86/looper.vgtest
new file mode 100644 (file)
index 0000000..25f35c1
--- /dev/null
@@ -0,0 +1 @@
+prog: looper