X86: Implement the PUSHF, POPF, SAHF, and LAHF instructions.

--HG--
extra : convert_revision : 37c63b1133022fa3432888592f8c84785fb95091
This commit is contained in:
Gabe Black 2007-10-19 15:21:16 -07:00
parent 35a8bc56cd
commit d8494325f0
3 changed files with 53 additions and 30 deletions

View file

@ -313,17 +313,18 @@
default: WarnUnimpl::call_far_Ap();
}
0x3: WarnUnimpl::fwait(); //aka wait
0x4: WarnUnimpl::pushf_Fv();
0x5: WarnUnimpl::popf_Fv();
//Both of these should be illegal only if CPUID.AHF64=0,
//according to sandpile.org
0x4: PUSHF();
0x5: POPF();
//The 64 bit versions of both of these should be illegal only
//if CPUID says it isn't supported. For now, we'll just assume
//that it's supported.
0x6: decode MODE_SUBMODE {
0x0: UD2();
default: WarnUnimpl::sahf();
0x0: SAHF_64();
default: SAHF();
}
0x7: decode MODE_SUBMODE {
0x0: UD2();
default: WarnUnimpl::lahf();
0x0: LAHF_64();
default: LAHF();
}
}
0x14: decode OPCODE_OP_BOTTOM3 {

View file

@ -53,10 +53,28 @@
#
# Authors: Gabe Black
microcode = ""
#let {{
# class LAHF(Inst):
# "GenFault ${new UnimpInstFault}"
# class SAHF(Inst):
# "GenFault ${new UnimpInstFault}"
#}};
microcode = '''
def macroop SAHF {
# This will fold to ah since this never executes in 64 bit mode.
ruflags rsp, dataSize=1
};
# This is allows the instruction to write to ah in 64 bit mode.
def macroop SAHF_64 {
ruflags t1
slli t1, t1, 8
mov t1, t1, rax, dataSize=1
mov rax, rax, t1, dataSize=2
};
def macroop LAHF {
# This will fold to ah since this never executes in 64 bit mode.
wruflags rsp, t0, dataSize=1
};
# This is allows the instruction to read from ah in 64 bit mode.
def macroop LAHF_64 {
srli t1, rax, 8, dataSize=2
wruflags t1, t0, dataSize=1
};
'''

View file

@ -53,18 +53,22 @@
#
# Authors: Gabe Black
microcode = ""
#let {{
# class POPF(Inst):
# "GenFault ${new UnimpInstFault}"
# class POPFD(Inst):
# "GenFault ${new UnimpInstFault}"
# class POPFQ(Inst):
# "GenFault ${new UnimpInstFault}"
# class PUSHF(Inst):
# "GenFault ${new UnimpInstFault}"
# class PUSHFD(Inst):
# "GenFault ${new UnimpInstFault}"
# class pushfq(Inst):
# "GenFault ${new UnimpInstFault}"
#}};
microcode = '''
def macroop PUSHF {
.adjust_env oszIn64Override
# This should really read the whole flags register, not just user flags.
ruflags t1
st t1, ss, [1, t0, rsp], "-env.dataSize"
subi rsp, rsp, dsz
};
def macroop POPF {
.adjust_env oszIn64Override
ld t1, ss, [1, t0, rsp]
addi rsp, rsp, dsz
# This should really write the whole flags register, not just user flags.
wruflags t1, t0
};
'''