2002-03-24 Julian Seward <sewardj@localhost.localdomain>
+ * vg_to_ucode.c (disInstr): Implement DAA as well as DAS.
+ Byrial Jensen <byrial@image.dk>
+
* vg_errcontext.c (pp_ErrContext): Change message "Use of
uninitialized CPU condition code" to "Conditional jump or move
depends on uninitialised value(s)", since that will be more
ret
+/* Similarly, do %al = DAA(%al). */
+.global VG_(helper_DAA)
+VG_(helper_DAA):
+ pushl %eax
+ movl 8(%esp), %eax
+ daa
+ movl %eax, 8(%esp)
+ popl %eax
+ ret
+
/* Bit scan forwards/reverse. Sets flags (??).
On entry:
extern void VG_(helper_fstsw_AX);
extern void VG_(helper_SAHF);
extern void VG_(helper_DAS);
+extern void VG_(helper_DAA);
extern void VG_(helper_value_check4_fail);
extern void VG_(helper_value_check2_fail);
extern Int VGOFF_(helper_fstsw_AX);
extern Int VGOFF_(helper_SAHF);
extern Int VGOFF_(helper_DAS);
+extern Int VGOFF_(helper_DAA);
extern Int VGOFF_(helper_value_check4_fail);
extern Int VGOFF_(helper_value_check2_fail);
Int VGOFF_(helper_fstsw_AX) = INVALID_OFFSET;
Int VGOFF_(helper_SAHF) = INVALID_OFFSET;
Int VGOFF_(helper_DAS) = INVALID_OFFSET;
+Int VGOFF_(helper_DAA) = INVALID_OFFSET;
Int VGOFF_(helper_value_check4_fail) = INVALID_OFFSET;
Int VGOFF_(helper_value_check2_fail) = INVALID_OFFSET;
Int VGOFF_(helper_value_check1_fail) = INVALID_OFFSET;
= alloc_BaB_1_set( (Addr) & VG_(helper_SAHF) );
VGOFF_(helper_DAS)
= alloc_BaB_1_set( (Addr) & VG_(helper_DAS) );
+ VGOFF_(helper_DAA)
+ = alloc_BaB_1_set( (Addr) & VG_(helper_DAA) );
VGOFF_(helper_request_normal_exit)
= alloc_BaB_1_set( (Addr) & VG_(helper_request_normal_exit) );
/* ---------------- Misc wierd-ass insns --------------- */
+ case 0x27: /* DAA */
case 0x2F: /* DAS */
t1 = newTemp(cb);
uInstr2(cb, GET, 1, ArchReg, R_AL, TempReg, t1);
LAST_UINSTR(cb).signed_widen = False;
uInstr0(cb, CALLM_S, 0);
uInstr1(cb, PUSH, 4, TempReg, t1);
- uInstr1(cb, CALLM, 0, Lit16, VGOFF_(helper_DAS) );
+ uInstr1(cb, CALLM, 0, Lit16,
+ opc == 0x27 ? VGOFF_(helper_DAA) : VGOFF_(helper_DAS) );
uFlagsRWU(cb, FlagsAC, FlagsOSZACP, FlagsEmpty);
uInstr1(cb, POP, 4, TempReg, t1);
uInstr0(cb, CALLM_E, 0);
uInstr2(cb, PUT, 1, TempReg, t1, ArchReg, R_AL);
- if (dis) VG_(printf)("das\n");
+ if (dis) VG_(printf)(opc == 0x27 ? "daa\n" : "das\n");
+ break;
/* ------------------------ CWD/CDQ -------------------- */
--- /dev/null
+
+/* general simple function to use as a template for assembly hacks */
+
+ .file "oneparam.c"
+ .version "01.01"
+gcc2_compiled.:
+.text
+ .align 4
+.globl dastest
+ .type dastest,@function
+dastest:
+ pushl %ebp
+ movl %esp, %ebp
+ movl 8(%ebp), %eax
+ das
+ daa
+ popl %ebp
+ ret
+.Lfe1:
+ .size dastest,.Lfe1-dastest
+ .ident "GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-98)"
--- /dev/null
+
+#include <stdio.h>
+
+// dastest.s
+extern int dastest ( int );
+
+int main ( void )
+{
+ int x = 49;
+ printf("dastest: x = %d\n", x);
+ printf("dastest: das(x) = %d\n", dastest(x));
+ return 0;
+}
ret
+/* Similarly, do %al = DAA(%al). */
+.global VG_(helper_DAA)
+VG_(helper_DAA):
+ pushl %eax
+ movl 8(%esp), %eax
+ daa
+ movl %eax, 8(%esp)
+ popl %eax
+ ret
+
/* Bit scan forwards/reverse. Sets flags (??).
On entry:
extern void VG_(helper_fstsw_AX);
extern void VG_(helper_SAHF);
extern void VG_(helper_DAS);
+extern void VG_(helper_DAA);
extern void VG_(helper_value_check4_fail);
extern void VG_(helper_value_check2_fail);
extern Int VGOFF_(helper_fstsw_AX);
extern Int VGOFF_(helper_SAHF);
extern Int VGOFF_(helper_DAS);
+extern Int VGOFF_(helper_DAA);
extern Int VGOFF_(helper_value_check4_fail);
extern Int VGOFF_(helper_value_check2_fail);
Int VGOFF_(helper_fstsw_AX) = INVALID_OFFSET;
Int VGOFF_(helper_SAHF) = INVALID_OFFSET;
Int VGOFF_(helper_DAS) = INVALID_OFFSET;
+Int VGOFF_(helper_DAA) = INVALID_OFFSET;
Int VGOFF_(helper_value_check4_fail) = INVALID_OFFSET;
Int VGOFF_(helper_value_check2_fail) = INVALID_OFFSET;
Int VGOFF_(helper_value_check1_fail) = INVALID_OFFSET;
= alloc_BaB_1_set( (Addr) & VG_(helper_SAHF) );
VGOFF_(helper_DAS)
= alloc_BaB_1_set( (Addr) & VG_(helper_DAS) );
+ VGOFF_(helper_DAA)
+ = alloc_BaB_1_set( (Addr) & VG_(helper_DAA) );
VGOFF_(helper_request_normal_exit)
= alloc_BaB_1_set( (Addr) & VG_(helper_request_normal_exit) );
/* ---------------- Misc wierd-ass insns --------------- */
+ case 0x27: /* DAA */
case 0x2F: /* DAS */
t1 = newTemp(cb);
uInstr2(cb, GET, 1, ArchReg, R_AL, TempReg, t1);
LAST_UINSTR(cb).signed_widen = False;
uInstr0(cb, CALLM_S, 0);
uInstr1(cb, PUSH, 4, TempReg, t1);
- uInstr1(cb, CALLM, 0, Lit16, VGOFF_(helper_DAS) );
+ uInstr1(cb, CALLM, 0, Lit16,
+ opc == 0x27 ? VGOFF_(helper_DAA) : VGOFF_(helper_DAS) );
uFlagsRWU(cb, FlagsAC, FlagsOSZACP, FlagsEmpty);
uInstr1(cb, POP, 4, TempReg, t1);
uInstr0(cb, CALLM_E, 0);
uInstr2(cb, PUT, 1, TempReg, t1, ArchReg, R_AL);
- if (dis) VG_(printf)("das\n");
+ if (dis) VG_(printf)(opc == 0x27 ? "daa\n" : "das\n");
+ break;
/* ------------------------ CWD/CDQ -------------------- */