if (miscReg == MISCREG_TSC) {
return regVal[MISCREG_TSC] + tc->getCpuPtr()->curCycle();
}
+
+ if (miscReg == MISCREG_FSW) {
+ MiscReg fsw = regVal[MISCREG_FSW];
+ MiscReg top = regVal[MISCREG_X87_TOP];
+ return (fsw & (~(7ULL << 11))) + (top << 11);
+ }
+
return readMiscRegNoEffect(miscReg);
}
0x6: fsin();
0x7: fcos();
}
- default: fnstcw_Mw();
+ default: Inst::FNSTCW(Mw);
}
}
//0x2: esc2();
}
0x7: decode MODRM_MOD {
0x3: Inst::UD2();
- default: fnstsw();
+ default: Inst::FNSTSW(Mw);
}
}
//0x6: esc6();
}
0x4: decode MODRM_MOD {
0x3: decode MODRM_RM {
- 0x0: fnstsw();
+ 0x0: Inst::FNSTSW(rAw);
default: Inst::UD2();
}
default: fbld();
microcode = '''
# FLDCW
# FSTCW
-# FNSTCW
+
+def macroop FNSTCW_M {
+ rdval t1, fcw
+ st t1, seg, sib, disp, dataSize=2
+};
+
+def macroop FNSTCW_P {
+ rdip t7
+ rdval t1, fcw
+ st t1, seg, sib, disp, dataSize=2
+};
'''
# Authors: Gabe Black
microcode = '''
+
# FSTSW
-# FNSTSW
+
+def macroop FNSTSW_R {
+ rdval t1, fsw
+ mov rax, rax, t1, dataSize=2
+};
+
+def macroop FNSTSW_M {
+ rdval t1, fsw
+ st t1, seg, sib, disp, dataSize=2
+};
+
+def macroop FNSTSW_P {
+ rdip t7
+ rdval t1, fsw
+ st t1, seg, riprel, disp, dataSize=2
+};
'''
assembler.symbols["sti"] = stack_index("env.reg")
assembler.symbols["stim"] = stack_index("env.regm")
+ def readFpReg(reg_name):
+ return regIdx("MISCREG_%s" % reg_name)
+
+ assembler.symbols["fsw"] = readFpReg("FSW")
+ assembler.symbols["fcw"] = readFpReg("FCW")
+
macroopDict = assembler.assemble(microcode)
decoder_output += mainRom.getDefinition()