1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownlong long int arg = 0;
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownlong long int res = 0;
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void loop_plain ( void );
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownasm("\n"
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".text\n"
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".globl loop_plain\n"
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"loop_plain:\n"
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tpushq %rcx\n"
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tmovq $999, %rax\n"
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tmovq arg, %rcx\n"
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".Lmn123plain:\n"
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tdecq %rax\n"
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tdecq %rax\n"
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tdecq %rax\n"
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tloop .Lmn123plain\n"
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tmovq %rax, res\n"
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tpopq %rcx\n"
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tret\n"
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown);
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void loop_ne ( void );
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownasm("\n"
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".text\n"
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".globl loop_ne\n"
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"loop_ne:\n"
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tpushq %rcx\n"
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tmovq $999, %rax\n"
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tmovq arg, %rcx\n"
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".Lmn123ne:\n"
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tdecq %rax\n"
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tdecq %rax\n"
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tdecq %rax\n"
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tloopne .Lmn123ne\n"
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tmovq %rax, res\n"
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tpopq %rcx\n"
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tret\n"
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown);
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void loop_e ( void );
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownasm("\n"
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".text\n"
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".globl loop_e\n"
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"loop_e:\n"
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tpushq %rcx\n"
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tmovq $999, %rax\n"
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tmovq arg, %rcx\n"
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown".Lmn123e:\n"
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tdecq %rax\n"
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tdecq %rax\n"
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tdecq %rax\n"
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* invert the Z flag */
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tpushfq\n"
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\txorq $64, 0(%rsp)\n"
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tpopfq\n"
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tloope .Lmn123e\n"
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tmovq %rax, res\n"
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tpopq %rcx\n"
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown"\tret\n"
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown);
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main ( void )
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   res = 0; arg = 10;  loop_plain(); printf("res = %lld\n", res);
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   res = 0; arg = 10;  loop_ne();    printf("res = %lld\n", res);
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   res = 0; arg = 500; loop_ne();    printf("res = %lld\n", res);
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   res = 0; arg = 10;  loop_e();     printf("res = %lld\n", res);
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   res = 0; arg = 500; loop_e();     printf("res = %lld\n", res);
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return 0;
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
83