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,
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");
}
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;
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;
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;
}
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;
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);
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: