From: Julian Seward Date: Fri, 15 Oct 2004 22:09:17 +0000 (+0000) Subject: Implement guest x86 fptan. X-Git-Tag: svn/VALGRIND_3_0_1^2~983 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=353aa6b158e26ae028f751099448c6dae0debc1d;p=thirdparty%2Fvalgrind.git Implement guest x86 fptan. git-svn-id: svn://svn.valgrind.org/vex/trunk@351 --- diff --git a/VEX/priv/guest-x86/toIR.c b/VEX/priv/guest-x86/toIR.c index fa3a3bbbc0..d1757d58b5 100644 --- a/VEX/priv/guest-x86/toIR.c +++ b/VEX/priv/guest-x86/toIR.c @@ -3513,6 +3513,15 @@ UInt dis_FPU ( Bool* decode_ok, UChar sorb, UInt delta ) fp_pop(); break; + case 0xF2: /* FPTAN */ + DIP("ftan\n"); + put_ST_UNCHECKED(0, unop(Iop_TanF64, get_ST(0))); + fp_push(); + put_ST(0, IRExpr_Const(IRConst_F64(1.0))); + /* Should we mess with C3210 here? The fact that we + don't is a hack. */ + break; + case 0xF3: /* FPATAN */ DIP("fpatan\n"); put_ST_UNCHECKED(1, binop(Iop_AtanF64, diff --git a/VEX/priv/host-x86/hdefs.c b/VEX/priv/host-x86/hdefs.c index a5ffeef715..c62dde02bf 100644 --- a/VEX/priv/host-x86/hdefs.c +++ b/VEX/priv/host-x86/hdefs.c @@ -424,6 +424,7 @@ Char* showX86FpOp ( X86FpOp op ) { case Xfp_MOV: return "mov"; case Xfp_SIN: return "sin"; case Xfp_COS: return "cos"; + case Xfp_TAN: return "tan"; case Xfp_2XM1: return "2xm1"; default: vpanic("showX86FpOp"); } @@ -1288,6 +1289,10 @@ static UChar* do_fop1_st ( UChar* p, X86FpOp op ) case Xfp_COS: *p++ = 0xD9; *p++ = 0xFF; break; case Xfp_2XM1: *p++ = 0xD9; *p++ = 0xF0; break; case Xfp_MOV: break; + case Xfp_TAN: p = do_ffree_st7(p); /* since fptan pushes 1.0 */ + *p++ = 0xD9; *p++ = 0xF2; /* fptan */ + *p++ = 0xD9; *p++ = 0xF7; /* fincstp */ + break; default: vpanic("do_fop1_st: unknown op"); } return p; diff --git a/VEX/priv/host-x86/hdefs.h b/VEX/priv/host-x86/hdefs.h index f4a25cd18d..9c47410301 100644 --- a/VEX/priv/host-x86/hdefs.h +++ b/VEX/priv/host-x86/hdefs.h @@ -250,7 +250,7 @@ typedef Xfp_ADD, Xfp_SUB, Xfp_MUL, Xfp_DIV, Xfp_SCALE, Xfp_ATAN, Xfp_YL2X, Xfp_YL2XP1, Xfp_PREM, /* Unary */ - Xfp_SQRT, Xfp_ABS, Xfp_NEG, Xfp_MOV, Xfp_SIN, Xfp_COS, + Xfp_SQRT, Xfp_ABS, Xfp_NEG, Xfp_MOV, Xfp_SIN, Xfp_COS, Xfp_TAN, Xfp_ROUND, Xfp_2XM1 } X86FpOp; diff --git a/VEX/priv/host-x86/isel.c b/VEX/priv/host-x86/isel.c index a779a90cf2..b302f9b2a8 100644 --- a/VEX/priv/host-x86/isel.c +++ b/VEX/priv/host-x86/isel.c @@ -1856,6 +1856,7 @@ static HReg iselDblExpr ( ISelEnv* env, IRExpr* e ) case Iop_SqrtF64: fpop = Xfp_SQRT; break; case Iop_SinF64: fpop = Xfp_SIN; break; case Iop_CosF64: fpop = Xfp_COS; break; + case Iop_TanF64: fpop = Xfp_TAN; break; case Iop_2xm1F64: fpop = Xfp_2XM1; break; default: break; } diff --git a/VEX/priv/ir/irdefs.c b/VEX/priv/ir/irdefs.c index 8a87e8102f..2c3377e969 100644 --- a/VEX/priv/ir/irdefs.c +++ b/VEX/priv/ir/irdefs.c @@ -157,6 +157,7 @@ void ppIROp ( IROp op ) case Iop_AbsF64: vex_printf("AbsF64"); return; case Iop_SinF64: vex_printf("SinF64"); return; case Iop_CosF64: vex_printf("CosF64"); return; + case Iop_TanF64: vex_printf("TanF64"); return; case Iop_2xm1F64: vex_printf("2xm1F64"); return; case Iop_CmpF64: vex_printf("CmpF64"); return; @@ -910,7 +911,7 @@ void typeOfPrimop ( IROp op, IRType* t_dst, IRType* t_arg1, IRType* t_arg2 ) case Iop_CmpF64: BINARY(Ity_I32,Ity_F64,Ity_F64); case Iop_NegF64: case Iop_AbsF64: case Iop_SqrtF64: - case Iop_SinF64: case Iop_CosF64: case Iop_2xm1F64: + case Iop_SinF64: case Iop_CosF64: case Iop_TanF64: case Iop_2xm1F64: UNARY(Ity_F64,Ity_F64); case Iop_I32toF64: UNARY(Ity_F64,Ity_I32); diff --git a/VEX/pub/libvex_ir.h b/VEX/pub/libvex_ir.h index ec3d57d8ba..e617237b4c 100644 --- a/VEX/pub/libvex_ir.h +++ b/VEX/pub/libvex_ir.h @@ -187,6 +187,7 @@ typedef Iop_AbsF64, /* FABS */ Iop_SinF64, /* FSIN */ Iop_CosF64, /* FCOS */ + Iop_TanF64, /* FTAN */ Iop_2xm1F64, /* (2^arg - 1.0) */ /* Comparison, yielding GT/LT/EQ/UN(ordered), as per the following: