Home | History | Annotate | Download | only in amd64
      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