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