1e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn/*
2e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
342a32a22874037bb1e4e468a2b71ab6d72722d4bsewardj2006-05-21: vex r1619 finally causes the x86->IR front end to state
442a32a22874037bb1e4e468a2b71ab6d72722d4bsewardjexactly the %eflags dataflow surrounding 'cmpb $0, ... ;  js ..'
542a32a22874037bb1e4e468a2b71ab6d72722d4bsewardjand so memcheck no longer gives a false positive on this test.
642a32a22874037bb1e4e468a2b71ab6d72722d4bsewardj
742a32a22874037bb1e4e468a2b71ab6d72722d4bsewardj-----------
842a32a22874037bb1e4e468a2b71ab6d72722d4bsewardj
942a32a22874037bb1e4e468a2b71ab6d72722d4bsewardj(original comments)
10e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnAssembly derived from the following program compiled with -O2.
11e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnThis fools Valgrind, causing it to give a false error.
12e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
13e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn#include <stdio.h>
14e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
15e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnstruct Foo
16e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn{
17e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn    int a1 : 1;
18e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn    int a2 : 1;
19e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn    int a3 : 1;
20e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn    int a4 : 1;
21e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn    int a5 : 1;
22e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn    int a6 : 1;
23e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn    int a7 : 1;
24e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn    int bleh : 1;
25e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn};
26e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
27e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnstruct Foo* foo;
28e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
29e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnvoid set()
30e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn{
31e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn    foo->bleh = 1;
32e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn}
33e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
34e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnvoid get()
35e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn{
36e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn    if ( foo->bleh == 0 )
37e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn        printf( "blieb\n" );
38e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn}
39e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
40e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnint main()
41e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn{
42e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn  foo = malloc(sizeof(struct Foo));
43e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn    set();
44e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
45e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn    get();
46e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
47e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn    return 0;
48e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn}
49e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
50e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn*/
51e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn
52b9acfbed9322db02f0a5d6171326390c730a6bd8njn#include "tests/asm.h"
53b9acfbed9322db02f0a5d6171326390c730a6bd8njn
54e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	.file	"tronical.c"
55c4fe430c41766b18dae84cea8bc8f9b8b01e378csewardj#if defined(VGO_linux)
56e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	.version	"01.01"
57c4fe430c41766b18dae84cea8bc8f9b8b01e378csewardj#endif
58e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjngcc2_compiled.:
59e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn.text
60e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	.align 4
61e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn.globl set
62e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnset:
63e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	pushl	%ebp
64e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	movl	foo, %eax
65e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	orb	$128, (%eax)
66e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	movl	%esp, %ebp
67e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	popl	%ebp
68e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	ret
69e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn.Lfe1:
70e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn.LC0:
71b9acfbed9322db02f0a5d6171326390c730a6bd8njn	.ascii	"blieb\n"
72e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn.text
73e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	.align 4
74e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn.globl get
75e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjnget:
76e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	pushl	%ebp
77e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	movl	%esp, %ebp
78e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	subl	$8, %esp
79e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	movl	foo, %eax
80e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	cmpb	$0, (%eax)
81e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	js	.L4
82e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	subl	$12, %esp
83e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	pushl	$.LC0
84b9acfbed9322db02f0a5d6171326390c730a6bd8njn	call	VG_SYM_ASM(printf)
85e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	addl	$16, %esp
86e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn.L4:
87e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	leave
88e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	ret
89e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn.Lfe2:
90e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	.align 4
91b9acfbed9322db02f0a5d6171326390c730a6bd8njn.globl VG_SYM_ASM(main)
92b9acfbed9322db02f0a5d6171326390c730a6bd8njnVG_SYM_ASM(main):
93e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	pushl	%ebp
94e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	movl	%esp, %ebp
95e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	subl	$20, %esp
96e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	pushl	$4
97b9acfbed9322db02f0a5d6171326390c730a6bd8njn	call	VG_SYM_ASM(malloc)
98e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	movl	%eax, foo
99e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	call	set
100e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	call	get
101e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	xorl	%eax, %eax
102e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	leave
103e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	ret
104e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn.Lfe3:
105e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	.comm	foo,4,4
106e49d8e7dfd3a9c96feb9935b5920973dfc0b170anjn	.ident	"GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)"
107