$(addsuffix .stdout.exp,$(INSN_TESTS)) \
$(addsuffix .vgtest,$(INSN_TESTS)) \
pushfpopf.stderr.exp pushfpopf.stdout.exp pushfpopf.vgtest \
+ pushpopmem.stderr.exp pushpopmem.stdout.exp pushpopmem.vgtest \
scalar.stderr.exp scalar.stderr.exp2 scalar.vgtest \
scalar_fork.stderr.exp scalar_fork.vgtest \
scalar_exit_group.stderr.exp scalar_exit_group.stderr.exp2 \
check_PROGRAMS = \
scalar_exit_group scalar_fork scalar_supp scalar_vfork \
- fpeflags pushfpopf scalar sse_memory tronical \
+ fpeflags pushfpopf pushpopmem scalar sse_memory tronical \
more_x86_fp fprem
AM_CPPFLAGS = -I$(top_srcdir)/include
--- /dev/null
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+unsigned int do32 ( unsigned int x )
+{
+ unsigned int* y = malloc(sizeof(unsigned int));
+ unsigned int* z = malloc(sizeof(unsigned int));
+ unsigned int t;
+ assert(y);
+ assert(z);
+ y[0] = x;
+ __asm__ __volatile__(
+ "pushl %0\n\t"
+ "pushl %1\n\t"
+ "popl %%ebx\n\t"
+ "popl %%eax\n\t"
+ "pushl 0(%%eax)\n\t"
+ "popl 0(%%ebx)"
+ : /*OUT*/
+ : /*IN*/ "r"(y), "r"(z)
+ : /*TRASH*/ "memory", "eax", "ebx"
+ );
+ t = z[0];
+ free(y);
+ free(z);
+ return t;
+}
+
+unsigned short do16 ( unsigned short x )
+{
+ unsigned short* y = malloc(sizeof(unsigned short));
+ unsigned short* z = malloc(sizeof(unsigned short));
+ unsigned short t;
+ assert(y);
+ assert(z);
+ y[0] = x;
+ __asm__ __volatile__(
+ "pushl %0\n\t"
+ "pushl %1\n\t"
+ "popl %%ebx\n\t"
+ "popl %%eax\n\t"
+ "pushw 0(%%eax)\n\t"
+ "popw 0(%%ebx)"
+ : /*OUT*/
+ : /*IN*/ "r"(y), "r"(z)
+ : /*TRASH*/ "memory", "eax", "ebx"
+ );
+ t = z[0];
+ free(y);
+ free(z);
+ return t;
+}
+
+
+int main ( void )
+{
+ printf("do32: 0x%08X\n", do32(0xCafeBabe) );
+ printf("do16: 0x%08X\n", (unsigned int)do16(0xfeBa) );
+ return 0;
+}