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