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