| |
| #include <stdio.h> |
| |
| long long int arg = 0; |
| long long int res = 0; |
| |
| extern void loop_plain ( void ); |
| asm("\n" |
| ".text\n" |
| ".globl loop_plain\n" |
| "loop_plain:\n" |
| "\tpushq %rcx\n" |
| "\tmovq $999, %rax\n" |
| "\tmovq arg, %rcx\n" |
| |
| ".Lmn123plain:\n" |
| "\tdecq %rax\n" |
| "\tdecq %rax\n" |
| "\tdecq %rax\n" |
| "\tloop .Lmn123plain\n" |
| |
| "\tmovq %rax, res\n" |
| "\tpopq %rcx\n" |
| "\tret\n" |
| ); |
| |
| extern void loop_ne ( void ); |
| asm("\n" |
| ".text\n" |
| ".globl loop_ne\n" |
| "loop_ne:\n" |
| "\tpushq %rcx\n" |
| "\tmovq $999, %rax\n" |
| "\tmovq arg, %rcx\n" |
| |
| ".Lmn123ne:\n" |
| "\tdecq %rax\n" |
| "\tdecq %rax\n" |
| "\tdecq %rax\n" |
| "\tloopne .Lmn123ne\n" |
| |
| "\tmovq %rax, res\n" |
| "\tpopq %rcx\n" |
| "\tret\n" |
| ); |
| |
| extern void loop_e ( void ); |
| asm("\n" |
| ".text\n" |
| ".globl loop_e\n" |
| "loop_e:\n" |
| "\tpushq %rcx\n" |
| "\tmovq $999, %rax\n" |
| "\tmovq arg, %rcx\n" |
| |
| ".Lmn123e:\n" |
| "\tdecq %rax\n" |
| "\tdecq %rax\n" |
| "\tdecq %rax\n" |
| /* invert the Z flag */ |
| "\tpushfq\n" |
| "\txorq $64, 0(%rsp)\n" |
| "\tpopfq\n" |
| "\tloope .Lmn123e\n" |
| |
| "\tmovq %rax, res\n" |
| "\tpopq %rcx\n" |
| "\tret\n" |
| ); |
| |
| int main ( void ) |
| { |
| res = 0; arg = 10; loop_plain(); printf("res = %lld\n", res); |
| |
| res = 0; arg = 10; loop_ne(); printf("res = %lld\n", res); |
| res = 0; arg = 500; loop_ne(); printf("res = %lld\n", res); |
| |
| res = 0; arg = 10; loop_e(); printf("res = %lld\n", res); |
| res = 0; arg = 500; loop_e(); printf("res = %lld\n", res); |
| |
| return 0; |
| } |