1 #include "tests/asm.h"
2 #include <stdio.h>
3
4 int arg = 0;
5 int res = 0;
6
7 extern void loop_plain ( void );
8 asm("\n"
9 ".text\n"
10 VG_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
26 extern void loop_ne ( void );
27 asm("\n"
28 ".text\n"
29 VG_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
45 extern void loop_e ( void );
46 asm("\n"
47 ".text\n"
48 VG_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
main(void)68 int 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