1 
2 #include <stdio.h>
3 
do_pushb_pos(void)4 void do_pushb_pos ( void )
5 {
6    unsigned long long int block[3];
7    __asm__ __volatile__ (
8       "movq  %0, %%rdx\n\t"
9       "pushq $0x55555555\n\t"
10       "movq  %%rsp, 0(%%rdx)\n\t"
11       ".byte 0x6A,0x22\n\t"
12       "movq  %%rsp, 8(%%rdx)\n\t"
13       "popq  %%rax\n\t"
14       "movq  %%rax,16(%%rdx)\n\t"
15       "movq  0(%%rdx),%%rsp\n\t"
16       "addq  $8, %%rsp"
17       : : "r"(&block) : "rax","rdx","cc","memory"
18     );
19     printf("  pushb_pos: delta %lld, top64 0x%016llx\n",
20            block[0] - block[1], block[2]);
21 }
22 
do_pushb_neg(void)23 void do_pushb_neg ( void )
24 {
25    unsigned long long int block[3];
26    __asm__ __volatile__ (
27       "movq  %0, %%rdx\n\t"
28       "pushq $0x55555555\n\t"
29       "movq  %%rsp, 0(%%rdx)\n\t"
30       ".byte 0x6A,0xEE\n\t"
31       "movq  %%rsp, 8(%%rdx)\n\t"
32       "popq  %%rax\n\t"
33       "movq  %%rax,16(%%rdx)\n\t"
34       "movq  0(%%rdx),%%rsp\n\t"
35       "addq  $8, %%rsp"
36       : : "r"(&block) : "rax","rdx","cc","memory"
37     );
38     printf("  pushb_neg: delta %lld, top64 0x%016llx\n",
39            block[0] - block[1], block[2]);
40 }
41 
do_pushw_pos(void)42 void do_pushw_pos ( void )
43 {
44    unsigned long long int block[3];
45    __asm__ __volatile__ (
46       "movq  %0, %%rdx\n\t"
47       "pushq $0x55555555\n\t"
48       "movq  %%rsp, 0(%%rdx)\n\t"
49       "pushw $0x3344\n\t"
50       "movq  %%rsp, 8(%%rdx)\n\t"
51       "popq  %%rax\n\t"
52       "movq  %%rax,16(%%rdx)\n\t"
53       "movq  0(%%rdx),%%rsp\n\t"
54       "addq  $8, %%rsp"
55       : : "r"(&block) : "rax","rdx","cc","memory"
56     );
57     printf("  pushw_neg: delta %lld, top64 0x%016llx\n",
58            block[0] - block[1], block[2]);
59 }
60 
do_pushw_neg(void)61 void do_pushw_neg ( void )
62 {
63    unsigned long long int block[3];
64    __asm__ __volatile__ (
65       "movq  %0, %%rdx\n\t"
66       "pushq $0x55555555\n\t"
67       "movq  %%rsp, 0(%%rdx)\n\t"
68       "pushw $0xDDCC\n\t"
69       "movq  %%rsp, 8(%%rdx)\n\t"
70       "popq  %%rax\n\t"
71       "movq  %%rax,16(%%rdx)\n\t"
72       "movq  0(%%rdx),%%rsp\n\t"
73       "addq  $8, %%rsp"
74       : : "r"(&block) : "rax","rdx","cc","memory"
75     );
76     printf("  pushw_pos: delta %lld, top64 0x%016llx\n",
77            block[0] - block[1], block[2]);
78 }
79 
do_pushq_pos(void)80 void do_pushq_pos ( void )
81 {
82    unsigned long long int block[3];
83    __asm__ __volatile__ (
84       "movq  %0, %%rdx\n\t"
85       "pushq $0x55555555\n\t"
86       "movq  %%rsp, 0(%%rdx)\n\t"
87       "pushq $0x67675656\n\t"
88       "movq  %%rsp, 8(%%rdx)\n\t"
89       "popq  %%rax\n\t"
90       "movq  %%rax,16(%%rdx)\n\t"
91       "movq  0(%%rdx),%%rsp\n\t"
92       "addq  $8, %%rsp"
93       : : "r"(&block) : "rax","rdx","cc","memory"
94     );
95     printf("  pushq_pos: delta %lld, top64 0x%016llx\n",
96            block[0] - block[1], block[2]);
97 }
98 
do_pushq_neg(void)99 void do_pushq_neg ( void )
100 {
101    unsigned long long int block[3];
102    __asm__ __volatile__ (
103       "movq  %0, %%rdx\n\t"
104       "pushq $0x55555555\n\t"
105       "movq  %%rsp, 0(%%rdx)\n\t"
106       "pushq $0x78988787\n\t"
107       "movq  %%rsp, 8(%%rdx)\n\t"
108       "popq  %%rax\n\t"
109       "movq  %%rax,16(%%rdx)\n\t"
110       "movq  0(%%rdx),%%rsp\n\t"
111       "addq  $8, %%rsp"
112       : : "r"(&block) : "rax","rdx","cc","memory"
113     );
114     printf("  pushq_neg: delta %lld, top64 0x%016llx\n",
115            block[0] - block[1], block[2]);
116 }
117 
118 
do_66pushb_pos(void)119 void do_66pushb_pos ( void )
120 {
121    unsigned long long int block[3];
122    __asm__ __volatile__ (
123       "movq  %0, %%rdx\n\t"
124       "pushq $0x55555555\n\t"
125       "movq  %%rsp, 0(%%rdx)\n\t"
126       ".byte 0x66,0x6A,0x22\n\t"
127       "movq  %%rsp, 8(%%rdx)\n\t"
128       "popq  %%rax\n\t"
129       "movq  %%rax,16(%%rdx)\n\t"
130       "movq  0(%%rdx),%%rsp\n\t"
131       "addq  $8, %%rsp"
132       : : "r"(&block) : "rax","rdx","cc","memory"
133     );
134     printf("66pushb_pos: delta %lld, top64 0x%016llx\n",
135            block[0] - block[1], block[2]);
136 }
137 
do_66pushb_neg(void)138 void do_66pushb_neg ( void )
139 {
140    unsigned long long int block[3];
141    __asm__ __volatile__ (
142       "movq  %0, %%rdx\n\t"
143       "pushq $0x55555555\n\t"
144       "movq  %%rsp, 0(%%rdx)\n\t"
145       ".byte 0x66,0x6A,0xEE\n\t"
146       "movq  %%rsp, 8(%%rdx)\n\t"
147       "popq  %%rax\n\t"
148       "movq  %%rax,16(%%rdx)\n\t"
149       "movq  0(%%rdx),%%rsp\n\t"
150       "addq  $8, %%rsp"
151       : : "r"(&block) : "rax","rdx","cc","memory"
152     );
153     printf("66pushb_neg: delta %lld, top64 0x%016llx\n",
154            block[0] - block[1], block[2]);
155 }
156 
157 
main(void)158 int main ( void )
159 {
160   do_pushb_pos();
161   do_pushb_neg();
162   do_pushw_pos();
163   do_pushw_neg();
164   do_pushq_pos();
165   do_pushq_neg();
166 
167   do_66pushb_pos();
168   do_66pushb_neg();
169   return 0;
170 }
171