]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/valgrind/src/valgrind-3.6.0-svn/none/tests/x86/aad_aam.c
update
[l4.git] / l4 / pkg / valgrind / src / valgrind-3.6.0-svn / none / tests / x86 / aad_aam.c
1 /* This tests the somewhat obscure 32-bit Intel aam and aad instructions */
2 /* by Vince Weaver (vince _at_ deater.net ) */
3
4 #include <stdio.h>
5
6 int parity(int v) {
7
8     int i;
9     int p = 1;
10
11     for (i = 0; i < 8; i++)
12       p ^= (1 & (v >> i));
13     return p;
14 }
15
16 int main(int argc, char **argv) {
17
18   printf("test begins\n");
19   unsigned short i,out;
20   unsigned int flags;
21   int cf __attribute__((unused)),pf,af __attribute__((unused)),zf,sf;
22   int of __attribute__((unused));
23   
24   /* test AAM */
25
26   for(i=0;i<65535;i++) {
27     // printf("%d, %d, %d\n",i,(i&0xff)/10,(i&0xff)%10);
28     out=i;
29     __asm__ __volatile__ ("mov %2 ,%%ax\n" 
30                           "aam\n"
31                           "pushf\n"
32                           "mov %%ax, %0\n"
33                           "pop %%eax\n"
34                           "mov %%eax, %1\n"
35                           :"=r"(out), "=r"(flags)  /* outputs */
36                           :"r"(out)     /* input */
37                           :"%eax"     /* clobbered */
38     );
39     cf=!!(flags&0x1);
40     pf=!!(flags&0x4);
41     af=!!(flags&0x10);
42     zf=!!(flags&0x40);
43     sf=!!(flags&0x80);
44     of=!!(flags&0x800);
45
46   //    printf("%d, %d, %d, ",i,(out>>8)&0xff,out&0xff);
47   //  printf("%x CF=%d PF=%d AF=%d ZF=%d SF=%d OF=%d\n",
48   //       flags,cf,pf,af,zf,sf,of);
49
50     if (zf && ((out&0xff)!=0)) {
51       printf("Error with aam (zf)!\n");
52     }
53     if (pf != parity(out&0xff)) {
54       printf("Error with aam (pf)!\n");
55     }
56     if (sf != !!(out&0x80)) {
57       printf("Error with aam (sf)!\n");
58     }
59
60
61     if ( ((out>>8)&0xff) != ((i&0xff)/10)) {
62       printf("Error with aam!\n");
63     }
64     if ( (out&0xff) != ((i&0xff)%10)) {
65       printf("Error with aam!\n");
66     }
67
68   }
69
70   /* test AAD */
71
72   for(i=0;i<65535;i++) {
73     //    printf("%x, %d\n",i, ((((i>>8)&0xff)*10)+(i&0xff))&0xff );
74     out=i;
75     __asm__ __volatile__ ("mov %2 ,%%ax\n" 
76                           "aad\n"
77                           "pushf\n"
78                           "mov %%ax, %0\n"
79                           "pop %%eax\n"
80                           "mov %%eax, %1\n"
81                           :"=r"(out), "=r"(flags)  /* outputs */
82                           :"r"(out)     /* input */
83                           :"%eax"     /* clobbered */
84 );
85
86     cf=!!(flags&0x1);
87     pf=!!(flags&0x4);
88     af=!!(flags&0x10);
89     zf=!!(flags&0x40);
90     sf=!!(flags&0x80);
91     of=!!(flags&0x800);
92
93     //       printf("%x, %d ",i,out);
94     //   printf("%x CF=%d PF=%d AF=%d ZF=%d SF=%d OF=%d\n",
95     //     flags,cf,pf,af,zf,sf,of);
96
97     if (zf && ((out&0xff)!=0)) {
98       printf("Error with aad (zf)!\n");
99     }
100     if (pf != parity(out&0xff)) {
101       printf("Error with aad (pf)!\n");
102     }
103     if (sf != !!(out&0x80)) {
104       printf("Error with aad (sf) %d %d!\n",sf,!!(out&0x80));
105     }
106
107     if ( out != ( ((((i>>8)&0xff)*10)+(i&0xff))&0xff) ) {
108        printf("Error with aad!\n");
109     }
110   }
111
112   printf("test completed\n");
113   return 0;
114
115 }