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 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