This patch implements ftan, fprem, fyl2x, fld* floating-point instructions.
// Copyright (c) 2007 The Hewlett-Packard Development Company
+// Copyright (c) 2012-13 Mark D. Hill and David A. Wood
// All rights reserved.
//
// The license below extends only to copyright in the software and shall
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Authors: Gabe Black
+// Nilay Vaish
format WarnUnimpl {
0x1B: decode OPCODE_OP_BOTTOM3 {
//0x0: esc0();
0x0: decode MODRM_REG {
+ // ST(0) = ST(0) + 32-bit Mem
0x0: fadd();
0x1: fmul();
0x2: fcom();
}
//0x1: esc1();
0x1: decode MODRM_REG {
- 0x0: fld();
+ 0x0: decode MODRM_MOD {
+ 0x3: Inst::FLD(Eq);
+ // 32-bit load
+ default: Inst::FLD(Md);
+ }
0x1: decode MODRM_MOD {
0x3: fxch();
default: Inst::UD2();
}
0x5: decode MODRM_MOD {
0x3: decode MODRM_RM {
- 0x0: fld1();
- 0x1: fldl2t();
- 0x2: fldl2e();
- 0x3: fldpi();
- 0x4: fldlg2();
- 0x5: fldln2();
- 0x6: fldz();
+ 0x0: Inst::FLD1();
+ 0x1: Inst::FLDL2T();
+ 0x2: Inst::FLDL2E();
+ 0x3: Inst::FLDPI();
+ 0x4: Inst::FLDLG2();
+ 0x5: Inst::FLDLN2();
+ 0x6: Inst::FLDZ();
}
- default: fldcw_Mw();
+ default: Inst::FLDCW(Mw);
}
0x6: decode MODRM_MOD {
0x3: decode MODRM_RM {
0x0: f2xm1();
- 0x1: fyl2x();
- 0x2: fptan();
+ 0x1: Inst::FYL2X();
+ 0x2: Inst::FPTAN();
0x3: fpatan();
0x4: fxtract();
- 0x5: fprem1();
+ 0x5: Inst::FPREM1();
0x6: fdecstp();
0x7: fincstp();
}
}
0x7: decode MODRM_MOD {
0x3: decode MODRM_RM {
- 0x0: fprem();
+ 0x0: Inst::FPREM();
0x1: fyl2xp1();
0x2: fsqrt();
0x3: Inst::FSINCOS();
}
0x5: decode MODRM_MOD {
0x3: fucomi();
+ // 80-bit load
default: fld();
}
0x6: decode MODRM_MOD {
0x5: decode MODRM_REG {
0x0: decode MODRM_MOD {
0x3: ffree();
+ // 64-bit load
default: Inst::FLD(Mq);
}
0x1: decode MODRM_MOD {
# Authors: Gabe Black
microcode = '''
-# FPREM
-# FPREM1
+def macroop FPREM {
+ premfp st(0), st(1), st(0)
+};
+
+def macroop FPREM1 {
+ premfp st(0), st(1), st(0)
+};
'''
# Authors: Gabe Black
microcode = '''
-# FLDCW
+
+def macroop FLDCW_M {
+ ld t1, seg, sib, disp, dataSize=2
+ wrval fcw, t1
+};
+
+def macroop FLDCW_P {
+ ld t1, seg, sib, disp, dataSize=2
+ wrval fcw, t1
+};
+
# FSTCW
def macroop FNSTCW_M {
movfp st(-1), ufp1, spm=-1
};
+def macroop FLD_R {
+ movfp st(-1), sti, spm=-1
+};
+
def macroop FST_R {
movfp sti, st(0)
};
# Copyright (c) 2007 The Hewlett-Packard Development Company
+# Copyright (c) 2013 Mark D. Hill and David A. Wood
# All rights reserved.
#
# The license below extends only to copyright in the software and shall
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# Authors: Gabe Black
+# Nilay Vaish
microcode = '''
-# FLDZ
-# FLD1
-# FLDPI
+
+def macroop FLDZ {
+ limm ufp1, "double(0)"
+ movfp st(-1), ufp1, spm=-1
+};
+
+def macroop FLD1 {
+ limm ufp1, "double(1)"
+ movfp st(-1), ufp1, spm=-1
+};
+
+def macroop FLDPI {
+ limm ufp1, "double(3.14159265359)"
+ movfp st(-1), ufp1, spm=-1
+};
+
'''
# Copyright (c) 2007 The Hewlett-Packard Development Company
+# Copyright (c) 2013 Mark D. Hill and David A. Wood
# All rights reserved.
#
# The license below extends only to copyright in the software and shall
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# Authors: Gabe Black
+# Nilay Vaish
microcode = '''
-# FLDL2E
-# FLDL2T
-# FLDLG2
-# FLDLN2
+
+def macroop FLDL2E {
+ limm ufp1, "double(1.44269504089)"
+ movfp st(-1), ufp1, spm=-1
+};
+
+def macroop FLDL2T {
+ limm ufp1, "double(3.32192809489)"
+ movfp st(-1), ufp1, spm=-1
+};
+
+def macroop FLDLG2 {
+ limm ufp1, "double(0.30102999566)"
+ movfp st(-1), ufp1, spm=-1
+};
+
+def macroop FLDLN2 {
+ limm ufp1, "double(0.69314718056)"
+ movfp st(-1), ufp1, spm=-1
+};
+
'''
microcode = '''
# F2XM1
# FSCALE
-# FYL2X
+
+def macroop FYL2X {
+ yl2xfp st(1), st(0), st(1), spm=1
+};
+
# FYL2XP1
'''
# Copyright (c) 2007 The Hewlett-Packard Development Company
+# Copyright (c) 2012-13 Mark D. Hill and David A. Wood
# All rights reserved.
#
# The license below extends only to copyright in the software and shall
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# Authors: Gabe Black
+# Nilay Vaish
microcode = '''
def macroop FSIN {
movfp st(-1), ufp2, spm=-1
};
-# FPTAN
+def macroop FPTAN {
+ tanfp st(0), st(0)
+ limm ufp1, "double(1)"
+ movfp st(-1), ufp1, spm=-1
+};
+
# FPATAN
'''
// Copyright (c) 2007 The Hewlett-Packard Development Company
+// Copyright (c) 2012-2013 Mark D. Hill and David A. Wood
// All rights reserved.
//
// The license below extends only to copyright in the software and shall
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Authors: Gabe Black
+// Nilay Vaish
//////////////////////////////////////////////////////////////////////////
//
class Sinfp(FpUnaryOp):
code = 'FpDestReg = sin(FpSrcReg1);'
+ class Tanfp(FpUnaryOp):
+ code = 'FpDestReg = tan(FpSrcReg1);'
+
# Conversion microops
class ConvOp(FpBinaryOp):
class subfp(FpBinaryOp):
code = 'FpDestReg = FpSrcReg1 - FpSrcReg2;'
+ class Yl2xFp(FpBinaryOp):
+ code = '''
+ FpDestReg = FpSrcReg2 * (log(FpSrcReg1) / log(2));
+ '''
+
+ class PremFp(FpBinaryOp):
+ code = '''
+ FpDestReg = fmod(FpSrcReg1, FpSrcReg2);
+ DPRINTF(X86, "src1: %lf, src2: %lf, dest: %lf\\n", FpSrcReg1, FpSrcReg2, FpDestReg);
+ '''
+
class Compfp(FpBinaryOp):
def __init__(self, src1, src2, spm=0, setStatus=False, \
dataSize="env.dataSize"):
'TOP': controlReg('MISCREG_X87_TOP', 66, ctype='ub'),
'FSW': controlReg('MISCREG_FSW', 67, ctype='uw'),
'FTW': controlReg('MISCREG_FTW', 68, ctype='uw'),
+ 'FCW': controlReg('MISCREG_FCW', 69, ctype='uw'),
# The segment base as used by memory instructions.
'SegBase': controlReg('MISCREG_SEG_EFF_BASE(segment)', 70),