VG_(copy_UInstr)(cb, u_in);
break;
}
-
- /* For FPU, MMX and SSE insns not referencing memory, just
- copy thru. */
+
+ /* For MMX and SSE insns not referencing memory, just
+ make sure the eflags are defined if the instruction
+ read them, and make them defined it it writes them. */
case SSE5: case SSE4: case SSE3:
case MMX1: case MMX2: case MMX3:
- case FPU:
+ case FPU:
+ if (u_in->flags_r != FlagsEmpty) {
+ qt = create_GETVF(cb, 0);
+ uInstr1(cb, TESTV, 0, TempReg, qt);
+ /* qt should never be referred to again. Nevertheless
+ ... */
+ uInstr1(cb, SETV, 0, TempReg, qt);
+ }
+ if (u_in->flags_w != FlagsEmpty) {
+ qd = newTemp(cb);
+ uInstr2(cb, MOV, 4, Literal, 0, TempReg, qd);
+ uLiteral(cb, qd);
+ create_PUTVF(cb, 0, qd);
+ }
VG_(copy_UInstr)(cb, u_in);
break;
errs1.stderr.exp errs1.vgtest \
exitprog.stderr.exp exitprog.vgtest \
execve.stderr.exp execve.vgtest \
+ fpeflags.stderr.exp fpeflags.vgtest \
fprw.stderr.exp fprw.vgtest \
fwrite.stderr.exp fwrite.stdout.exp fwrite.vgtest \
inits.stderr.exp inits.vgtest \
badaddrvalue badfree badjump badloop badrw brk buflen_check \
clientperm custom_alloc \
doublefree error_counts errs1 exitprog execve \
- fprw fwrite inits inline \
+ fpeflags fprw fwrite inits inline \
malloc1 malloc2 malloc3 manuel1 manuel2 manuel3 \
memalign_test memcmptest mmaptest nanoleak new_nothrow null_socket \
overlap pushfpopf \
errs1_SOURCES = errs1.c
execve_SOURCES = execve.c
exitprog_SOURCES = exitprog.c
+fpeflags_SOURCES = fpeflags.c
fprw_SOURCES = fprw.c
fwrite_SOURCES = fwrite.c
inits_SOURCES = inits.c
new_nothrow_SOURCES = new_nothrow.cpp
new_override_SOURCES = new_override.cpp
+# must be built with these flags -- bug only occurred with them
+fpeflags.o: CFLAGS += -march=i686