1#include "tests/asm.h"
2#include <stdio.h>
3
4int arg = 0;
5int res = 0;
6
7extern void loop_plain ( void );
8asm("\n"
9".text\n"
10VG_SYM(loop_plain) ":\n"
11"\tpushl %ecx\n"
12"\tmovl $999, %eax\n"
13"\tmovl " VG_SYM(arg) ", %ecx\n"
14
15"0:\n"
16"\tdecl %eax\n"
17"\tdecl %eax\n"
18"\tdecl %eax\n"
19"\tloop 0b\n"
20
21"\tmovl %eax, " VG_SYM(res) "\n"
22"\tpopl %ecx\n"
23"\tret\n"
24);
25
26extern void loop_ne ( void );
27asm("\n"
28".text\n"
29VG_SYM(loop_ne) ":\n"
30"\tpushl %ecx\n"
31"\tmovl $999, %eax\n"
32"\tmovl " VG_SYM(arg) ", %ecx\n"
33
34"0:\n"
35"\tdecl %eax\n"
36"\tdecl %eax\n"
37"\tdecl %eax\n"
38"\tloopne 0b\n"
39
40"\tmovl %eax, " VG_SYM(res) "\n"
41"\tpopl %ecx\n"
42"\tret\n"
43);
44
45extern void loop_e ( void );
46asm("\n"
47".text\n"
48VG_SYM(loop_e) ":\n"
49"\tpushl %ecx\n"
50"\tmovl $999, %eax\n"
51"\tmovl " VG_SYM(arg) ", %ecx\n"
52
53"0:\n"
54"\tdecl %eax\n"
55"\tdecl %eax\n"
56"\tdecl %eax\n"
57/* invert the Z flag */
58"\tpushfl\n"
59"\txorl $64, 0(%esp)\n"
60"\tpopfl\n"
61"\tloope 0b\n"
62
63"\tmovl %eax, " VG_SYM(res) "\n"
64"\tpopl %ecx\n"
65"\tret\n"
66);
67
68int main ( void )
69{
70   res = 0; arg = 10;  loop_plain(); printf("res = %d\n", res);
71
72   res = 0; arg = 10;  loop_ne();    printf("res = %d\n", res);
73   res = 0; arg = 500; loop_ne();    printf("res = %d\n", res);
74
75   res = 0; arg = 10;  loop_e();    printf("res = %d\n", res);
76   res = 0; arg = 500; loop_e();    printf("res = %d\n", res);
77
78   return 0;
79}
80