OPERAND_QUADWORD_SIZE = 3
};
- enum {
- rax = 0,
- rcx = 1,
- rdx = 2,
- rbx = 3,
- rsp = 4,
- rbp = 5,
- rsi = 6,
- rdi = 7
- };
-
const NameConverter& converter_;
v8::internal::EmbeddedVector<char, 128> tmp_buffer_;
unsigned int tmp_buffer_pos_;
current += PrintRightOperand(current);
AppendToBuffer(",%s,%d", NameOfXMMRegister(regop), (*current) & 3);
current += 1;
- } else if (third_byte == 0x21) {
- get_modrm(*current, &mod, ®op, &rm);
- // insertps xmm, xmm, imm8
- AppendToBuffer("insertps %s,%s,%d",
- NameOfXMMRegister(regop),
- NameOfXMMRegister(rm),
- (*(current + 1)) & 3);
- current += 2;
- } else if (third_byte == 0x22) {
- get_modrm(*current, &mod, ®op, &rm);
- // pinsrd xmm, reg32, imm8
- AppendToBuffer("pinsrd %s,%s,%d",
- NameOfXMMRegister(regop),
- NameOfCPURegister(rm),
- (*(current + 1)) & 3);
- current += 2;
} else if (third_byte == 0x0b) {
get_modrm(*current, &mod, ®op, &rm);
// roundsd xmm, xmm/m64, imm8
} else {
UnimplementedInstruction();
}
- } else if (opcode == 0x38) {
- byte third_byte = *current;
- current = data + 3;
- if (third_byte == 0x40) {
- get_modrm(*current, &mod, ®op, &rm);
- AppendToBuffer("pmulld %s, ", NameOfXMMRegister(regop));
- current += PrintRightXMMOperand(current);
- } else {
- UnimplementedInstruction();
- }
} else {
get_modrm(*current, &mod, ®op, &rm);
if (opcode == 0x1f) {
AppendToBuffer("movdqa %s,",
NameOfXMMRegister(regop));
current += PrintRightXMMOperand(current);
- } else if (opcode == 0x70) {
- AppendToBuffer("pshufd %s,",
- NameOfXMMRegister(regop));
- current += PrintRightXMMOperand(current);
- AppendToBuffer(",0x%x", (*current) & 0xff);
- current += 1;
- } else if (opcode == 0x5B) {
- AppendToBuffer("cvtps2dq %s,",
- NameOfXMMRegister(regop));
- current += PrintRightXMMOperand(current);
- } else if (opcode == 0xFE) {
- AppendToBuffer("paddd %s,",
- NameOfXMMRegister(regop));
- current += PrintRightXMMOperand(current);
- } else if (opcode == 0xFA) {
- AppendToBuffer("psubd %s,",
- NameOfXMMRegister(regop));
- current += PrintRightXMMOperand(current);
} else if (opcode == 0x7E) {
AppendToBuffer("mov%c ",
rex_w() ? 'q' : 'd');
DCHECK(regop == 6);
AppendToBuffer("psllq,%s,%d", NameOfXMMRegister(rm), *current & 0x7f);
current += 1;
- } else if (opcode == 0x62) {
- AppendToBuffer("punpackldq %s,", NameOfXMMRegister(regop));
- current += PrintRightXMMOperand(current);
- } else if (opcode == 0x72) {
- AppendToBuffer(regop == rsi ? "pslld "
- : regop == rdx ? "psrld" : "psrad");
- current += PrintRightXMMOperand(current);
- AppendToBuffer(",0x%x", (*current) & 0xff);
- current += 1;
- } else if (opcode == 0xC6) {
- AppendToBuffer("shufpd %s,", NameOfXMMRegister(regop));
- current += PrintRightXMMOperand(current);
- AppendToBuffer(",0x%x", (*current) & 0xff);
- current += 1;
- } else if (opcode == 0xF4) {
- AppendToBuffer("pmuludq %s,", NameOfXMMRegister(regop));
- current += PrintRightXMMOperand(current);
} else {
const char* mnemonic = "?";
- if (opcode == 0x51) {
- mnemonic = "sqrtpd";
- } else if (opcode == 0x54) {
+ if (opcode == 0x54) {
mnemonic = "andpd";
} else if (opcode == 0x56) {
mnemonic = "orpd";
} else if (opcode == 0x57) {
mnemonic = "xorpd";
- } else if (opcode == 0x58) {
- mnemonic = "addpd";
- } else if (opcode == 0x59) {
- mnemonic = "mulpd";
- } else if (opcode == 0x5C) {
- mnemonic = "subpd";
- } else if (opcode == 0x5D) {
- mnemonic = "minpd";
- } else if (opcode == 0x5E) {
- mnemonic = "divpd";
- } else if (opcode == 0x5F) {
- mnemonic = "maxpd";
} else if (opcode == 0x2E) {
mnemonic = "ucomisd";
} else if (opcode == 0x2F) {
mnemonic = "comisd";
- } else if (opcode == 0x66) {
- mnemonic = "pcmpgtd";
- } else if (opcode == 0x76) {
- mnemonic = "pcmpeqd";
- } else if (opcode == 0xD2) {
- mnemonic = "psrld";
- } else if (opcode == 0xE2) {
- mnemonic = "psrad";
- } else if (opcode == 0xF2) {
- mnemonic = "pslld";
} else {
UnimplementedInstruction();
}
current += PrintRightXMMOperand(current);
AppendToBuffer(",%s", NameOfXMMRegister(regop));
- } else if (opcode == 0x10) {
- // movups xmm, xmm/m128
- int mod, regop, rm;
- get_modrm(*current, &mod, ®op, &rm);
- AppendToBuffer("movups %s, ", NameOfXMMRegister(regop));
- current += PrintRightXMMOperand(current);
-
- } else if (opcode == 0x11) {
- // movups xmm/m128, xmm
- int mod, regop, rm;
- get_modrm(*current, &mod, ®op, &rm);
- AppendToBuffer("movups ");
- current += PrintRightXMMOperand(current);
- AppendToBuffer(", %s", NameOfXMMRegister(regop));
-
} else if (opcode == 0xA2) {
// CPUID
AppendToBuffer("%s", mnemonic);
AppendToBuffer(", %d", (*current) & 3);
current += 1;
- } else if (opcode == 0xC6) {
- // shufps xmm, xmm/m128, imm8
- int mod, regop, rm;
- get_modrm(*current, &mod, ®op, &rm);
- AppendToBuffer("shufps %s, ", NameOfXMMRegister(regop));
- current += PrintRightXMMOperand(current);
- AppendToBuffer(", %d", (*current) & 3);
- current += 1;
-
- } else if (opcode == 0x54) {
- // andps xmm, xmm/m128
- int mod, regop, rm;
- get_modrm(*current, &mod, ®op, &rm);
- AppendToBuffer("andps %s, ", NameOfXMMRegister(regop));
- current += PrintRightXMMOperand(current);
-
- } else if (opcode == 0x56) {
- // orps xmm, xmm/m128
- int mod, regop, rm;
- get_modrm(*current, &mod, ®op, &rm);
- AppendToBuffer("orps %s, ", NameOfXMMRegister(regop));
- current += PrintRightXMMOperand(current);
-
- } else if (opcode == 0x58) {
- // addps xmm, xmm/m128
- int mod, regop, rm;
- get_modrm(*current, &mod, ®op, &rm);
- AppendToBuffer("addps %s, ", NameOfXMMRegister(regop));
- current += PrintRightXMMOperand(current);
-
- } else if (opcode == 0x59) {
- // mulps xmm, xmm/m128
- int mod, regop, rm;
- get_modrm(*current, &mod, ®op, &rm);
- AppendToBuffer("mulps %s, ", NameOfXMMRegister(regop));
- current += PrintRightXMMOperand(current);
-
- } else if (opcode == 0x5C) {
- // subps xmm, xmm/m128
- int mod, regop, rm;
- get_modrm(*current, &mod, ®op, &rm);
- AppendToBuffer("subps %s, ", NameOfXMMRegister(regop));
- current += PrintRightXMMOperand(current);
-
- } else if (opcode == 0x5E) {
- // divps xmm, xmm/m128
- int mod, regop, rm;
- get_modrm(*current, &mod, ®op, &rm);
- AppendToBuffer("divps %s, ", NameOfXMMRegister(regop));
- current += PrintRightXMMOperand(current);
-
- } else if (opcode == 0x5D) {
- // minps xmm, xmm/m128
- int mod, regop, rm;
- get_modrm(*current, &mod, ®op, &rm);
- AppendToBuffer("minps %s, ", NameOfXMMRegister(regop));
- current += PrintRightXMMOperand(current);
-
- } else if (opcode == 0x5F) {
- // maxps xmm, xmm/m128
- int mod, regop, rm;
- get_modrm(*current, &mod, ®op, &rm);
- AppendToBuffer("maxps %s, ", NameOfXMMRegister(regop));
- current += PrintRightXMMOperand(current);
-
- } else if (opcode == 0x5B) {
- // cvtdq2ps xmm, xmm/m128
- int mod, regop, rm;
- get_modrm(*current, &mod, ®op, &rm);
- AppendToBuffer("cvtdq2ps %s, ", NameOfXMMRegister(regop));
- current += PrintRightXMMOperand(current);
-
-
- } else if (opcode == 0x53) {
- // rcpps xmm, xmm/m128
- int mod, regop, rm;
- get_modrm(*current, &mod, ®op, &rm);
- AppendToBuffer("rcpps %s, ", NameOfXMMRegister(regop));
- current += PrintRightXMMOperand(current);
-
- } else if (opcode == 0x52) {
- // rsqrtps xmm, xmm/m128
- int mod, regop, rm;
- get_modrm(*current, &mod, ®op, &rm);
- AppendToBuffer("rsqrtps %s, ", NameOfXMMRegister(regop));
- current += PrintRightXMMOperand(current);
-
- } else if (opcode == 0x51) {
- // sqrtps xmm, xmm/m128
- int mod, regop, rm;
- get_modrm(*current, &mod, ®op, &rm);
- AppendToBuffer("sqrtps %s, ", NameOfXMMRegister(regop));
- current += PrintRightXMMOperand(current);
-
} else if (opcode == 0x50) {
// movmskps reg, xmm
int mod, regop, rm;
AppendToBuffer("movmskps %s,", NameOfCPURegister(regop));
current += PrintRightXMMOperand(current);
- } else if (opcode == 0xC2) {
- // Intel manual 2A, Table 3-11.
- int mod, regop, rm;
- get_modrm(*current, &mod, ®op, &rm);
- const char* const pseudo_op[] = {
- "cmpeqps",
- "cmpltps",
- "cmpleps",
- "cmpunordps",
- "cmpneqps",
- "cmpnltps",
- "cmpnleps",
- "cmpordps"
- };
- AppendToBuffer("%s %s,%s",
- pseudo_op[current[1]],
- NameOfXMMRegister(regop),
- NameOfXMMRegister(rm));
- current += 2;
-
} else if ((opcode & 0xF0) == 0x80) {
// Jcc: Conditional jump (branch).
current = data + JumpConditional(data);