Implemented missing instructions in ia32 and x64 disassembler.
ia32: fld(i), fldpi x64: fld(i), fldpi, cvtsd2si, cvttsd2si Review URL: http://codereview.chromium.org/3471011 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@5525 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
0a539dc181
commit
c39194e06f
@ -718,6 +718,10 @@ int DisassemblerIA32::RegisterFPUInstruction(int escape_opcode,
|
||||
|
||||
case 0xD9:
|
||||
switch (modrm_byte & 0xF8) {
|
||||
case 0xC0:
|
||||
mnem = "fld";
|
||||
has_register = true;
|
||||
break;
|
||||
case 0xC8:
|
||||
mnem = "fxch";
|
||||
has_register = true;
|
||||
|
@ -891,6 +891,10 @@ int DisassemblerX64::RegisterFPUInstruction(int escape_opcode,
|
||||
|
||||
case 0xD9:
|
||||
switch (modrm_byte & 0xF8) {
|
||||
case 0xC0:
|
||||
mnem = "fld";
|
||||
has_register = true;
|
||||
break;
|
||||
case 0xC8:
|
||||
mnem = "fxch";
|
||||
has_register = true;
|
||||
@ -901,6 +905,7 @@ int DisassemblerX64::RegisterFPUInstruction(int escape_opcode,
|
||||
case 0xE1: mnem = "fabs"; break;
|
||||
case 0xE4: mnem = "ftst"; break;
|
||||
case 0xE8: mnem = "fld1"; break;
|
||||
case 0xEB: mnem = "fldpi"; break;
|
||||
case 0xEE: mnem = "fldz"; break;
|
||||
case 0xF5: mnem = "fprem1"; break;
|
||||
case 0xF7: mnem = "fincstp"; break;
|
||||
@ -1059,6 +1064,21 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) {
|
||||
get_modrm(*current, &mod, ®op, &rm);
|
||||
AppendToBuffer("%sd %s,", mnemonic, NameOfXMMRegister(regop));
|
||||
current += PrintRightOperand(current);
|
||||
} else if (opcode == 0x2C) {
|
||||
// CVTTSD2SI:
|
||||
// Convert with truncation scalar double-precision FP to integer.
|
||||
int mod, regop, rm;
|
||||
get_modrm(*current, &mod, ®op, &rm);
|
||||
AppendToBuffer("cvttsd2si%c %s,",
|
||||
operand_size_code(), NameOfCPURegister(regop));
|
||||
current += PrintRightXMMOperand(current);
|
||||
} else if (opcode == 0x2D) {
|
||||
// CVTSD2SI: Convert scalar double-precision FP to integer.
|
||||
int mod, regop, rm;
|
||||
get_modrm(*current, &mod, ®op, &rm);
|
||||
AppendToBuffer("cvtsd2si%c %s,",
|
||||
operand_size_code(), NameOfCPURegister(regop));
|
||||
current += PrintRightXMMOperand(current);
|
||||
} else if ((opcode & 0xF8) == 0x58 || opcode == 0x51) {
|
||||
// XMM arithmetic. Mnemonic was retrieved at the start of this function.
|
||||
int mod, regop, rm;
|
||||
@ -1089,11 +1109,14 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) {
|
||||
AppendToBuffer("%ss %s,", mnemonic, NameOfXMMRegister(regop));
|
||||
current += PrintRightOperand(current);
|
||||
} else if (opcode == 0x2C) {
|
||||
// CVTTSS2SI: Convert scalar single-precision FP to dword integer.
|
||||
// CVTTSS2SI:
|
||||
// Convert with truncation scalar single-precision FP to dword integer.
|
||||
// Assert that mod is not 3, so source is memory, not an XMM register.
|
||||
ASSERT_NE(0xC0, *current & 0xC0);
|
||||
current += PrintOperands("cvttss2si", REG_OPER_OP_ORDER, current);
|
||||
} else if (opcode == 0x5A) {
|
||||
// CVTSS2SD:
|
||||
// Convert scalar single-precision FP to scalar double-precision FP.
|
||||
int mod, regop, rm;
|
||||
get_modrm(*current, &mod, ®op, &rm);
|
||||
AppendToBuffer("cvtss2sd %s,", NameOfXMMRegister(regop));
|
||||
|
@ -336,8 +336,10 @@ TEST(DisasmIa320) {
|
||||
// 0xD9 instructions
|
||||
__ nop();
|
||||
|
||||
__ fld(1);
|
||||
__ fld1();
|
||||
__ fldz();
|
||||
__ fldpi();
|
||||
__ fabs();
|
||||
__ fchs();
|
||||
__ fprem();
|
||||
|
Loading…
Reference in New Issue
Block a user