]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Implement guest x86 fptan.
authorJulian Seward <jseward@acm.org>
Fri, 15 Oct 2004 22:09:17 +0000 (22:09 +0000)
committerJulian Seward <jseward@acm.org>
Fri, 15 Oct 2004 22:09:17 +0000 (22:09 +0000)
git-svn-id: svn://svn.valgrind.org/vex/trunk@351

VEX/priv/guest-x86/toIR.c
VEX/priv/host-x86/hdefs.c
VEX/priv/host-x86/hdefs.h
VEX/priv/host-x86/isel.c
VEX/priv/ir/irdefs.c
VEX/pub/libvex_ir.h

index fa3a3bbbc016697a3f0d58c1beef3800bc81fc0b..d1757d58b5417f67f2827597fddcae7414ca15c3 100644 (file)
@@ -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,
index a5ffeef715acc246e23809b6061111b3e9845758..c62dde02bf7dcb77539ccc9500125d20ca1ee7f2 100644 (file)
@@ -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;
index f4a25cd18d8c318817e41cee42a5e5b2e76876eb..9c474103019d311c0d25e7f4612a091ca74034c6 100644 (file)
@@ -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;
index a779a90cf2851224f3f5fc664f2f4f4d4bd39833..b302f9b2a824ab4c5e138d95dc6626d3c9d1a721 100644 (file)
@@ -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;
       }
index 8a87e8102fd833424ea3e15e8c7cccb8019be44b..2c3377e96962da20cc798b7f44298a332e7193c5 100644 (file)
@@ -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);
index ec3d57d8ba45a7cf5e7a55c26bdd85e13dc5796e..e617237b4c50537a2cf569fd3fa773eec86e02b3 100644 (file)
@@ -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: