--- /dev/null
+
+#include <stdio.h>
+
+void do_pushb_pos ( void )
+{
+ unsigned int block[3];
+ __asm__ __volatile__ (
+ "movl %0, %%edx\n\t"
+ "pushl $0x55555555\n\t"
+ "movl %%esp, 0(%%edx)\n\t"
+ ".byte 0x6A,0x22\n\t"
+ "movl %%esp, 4(%%edx)\n\t"
+ "popl %%eax\n\t"
+ "movl %%eax,8(%%edx)\n\t"
+ "movl 0(%%edx),%%esp\n\t"
+ "addl $4, %%esp"
+ : : "r"(&block) : "eax","edx","cc","memory"
+ );
+ printf(" pushb_pos: delta %d, top32 0x%08x\n",
+ block[0] - block[1], block[2]);
+}
+
+void do_pushb_neg ( void )
+{
+ unsigned int block[3];
+ __asm__ __volatile__ (
+ "movl %0, %%edx\n\t"
+ "pushl $0x55555555\n\t"
+ "movl %%esp, 0(%%edx)\n\t"
+ ".byte 0x6A,0xEE\n\t"
+ "movl %%esp, 4(%%edx)\n\t"
+ "popl %%eax\n\t"
+ "movl %%eax,8(%%edx)\n\t"
+ "movl 0(%%edx),%%esp\n\t"
+ "addl $4, %%esp"
+ : : "r"(&block) : "eax","edx","cc","memory"
+ );
+ printf(" pushb_neg: delta %d, top32 0x%08x\n",
+ block[0] - block[1], block[2]);
+}
+
+void do_pushw_pos ( void )
+{
+ unsigned int block[3];
+ __asm__ __volatile__ (
+ "movl %0, %%edx\n\t"
+ "pushl $0x55555555\n\t"
+ "movl %%esp, 0(%%edx)\n\t"
+ "pushw $0x3344\n\t"
+ "movl %%esp, 4(%%edx)\n\t"
+ "popl %%eax\n\t"
+ "movl %%eax,8(%%edx)\n\t"
+ "movl 0(%%edx),%%esp\n\t"
+ "addl $4, %%esp"
+ : : "r"(&block) : "eax","edx","cc","memory"
+ );
+ printf(" pushw_neg: delta %d, top32 0x%08x\n",
+ block[0] - block[1], block[2]);
+}
+
+void do_pushw_neg ( void )
+{
+ unsigned int block[3];
+ __asm__ __volatile__ (
+ "movl %0, %%edx\n\t"
+ "pushl $0x55555555\n\t"
+ "movl %%esp, 0(%%edx)\n\t"
+ "pushw $0xDDCC\n\t"
+ "movl %%esp, 4(%%edx)\n\t"
+ "popl %%eax\n\t"
+ "movl %%eax,8(%%edx)\n\t"
+ "movl 0(%%edx),%%esp\n\t"
+ "addl $4, %%esp"
+ : : "r"(&block) : "eax","edx","cc","memory"
+ );
+ printf(" pushw_pos: delta %d, top32 0x%08x\n",
+ block[0] - block[1], block[2]);
+}
+
+void do_pushl_pos ( void )
+{
+ unsigned int block[3];
+ __asm__ __volatile__ (
+ "movl %0, %%edx\n\t"
+ "pushl $0x55555555\n\t"
+ "movl %%esp, 0(%%edx)\n\t"
+ "pushl $0x67675656\n\t"
+ "movl %%esp, 4(%%edx)\n\t"
+ "popl %%eax\n\t"
+ "movl %%eax,8(%%edx)\n\t"
+ "movl 0(%%edx),%%esp\n\t"
+ "addl $4, %%esp"
+ : : "r"(&block) : "eax","edx","cc","memory"
+ );
+ printf(" pushl_pos: delta %d, top32 0x%08x\n",
+ block[0] - block[1], block[2]);
+}
+
+void do_pushl_neg ( void )
+{
+ unsigned int block[3];
+ __asm__ __volatile__ (
+ "movl %0, %%edx\n\t"
+ "pushl $0x55555555\n\t"
+ "movl %%esp, 0(%%edx)\n\t"
+ "pushl $0x98988787\n\t"
+ "movl %%esp, 4(%%edx)\n\t"
+ "popl %%eax\n\t"
+ "movl %%eax,8(%%edx)\n\t"
+ "movl 0(%%edx),%%esp\n\t"
+ "addl $4, %%esp"
+ : : "r"(&block) : "eax","edx","cc","memory"
+ );
+ printf(" pushl_neg: delta %d, top32 0x%08x\n",
+ block[0] - block[1], block[2]);
+}
+
+
+void do_66pushb_pos ( void )
+{
+ unsigned int block[3];
+ __asm__ __volatile__ (
+ "movl %0, %%edx\n\t"
+ "pushl $0x55555555\n\t"
+ "movl %%esp, 0(%%edx)\n\t"
+ ".byte 0x66,0x6A,0x22\n\t"
+ "movl %%esp, 4(%%edx)\n\t"
+ "popl %%eax\n\t"
+ "movl %%eax,8(%%edx)\n\t"
+ "movl 0(%%edx),%%esp\n\t"
+ "addl $4, %%esp"
+ : : "r"(&block) : "eax","edx","cc","memory"
+ );
+ printf("66pushb_pos: delta %d, top32 0x%08x\n",
+ block[0] - block[1], block[2]);
+}
+
+void do_66pushb_neg ( void )
+{
+ unsigned int block[3];
+ __asm__ __volatile__ (
+ "movl %0, %%edx\n\t"
+ "pushl $0x55555555\n\t"
+ "movl %%esp, 0(%%edx)\n\t"
+ ".byte 0x66,0x6A,0xEE\n\t"
+ "movl %%esp, 4(%%edx)\n\t"
+ "popl %%eax\n\t"
+ "movl %%eax,8(%%edx)\n\t"
+ "movl 0(%%edx),%%esp\n\t"
+ "addl $4, %%esp"
+ : : "r"(&block) : "eax","edx","cc","memory"
+ );
+ printf("66pushb_neg: delta %d, top32 0x%08x\n",
+ block[0] - block[1], block[2]);
+}
+
+
+int main ( void )
+{
+ do_pushb_pos();
+ do_pushb_neg();
+ do_pushw_pos();
+ do_pushw_neg();
+ do_pushl_pos();
+ do_pushl_neg();
+
+ do_66pushb_pos();
+ do_66pushb_neg();
+ return 0;
+}