Index: third_party/tcmalloc/chromium/src/windows/mini_disassembler.cc |
diff --git a/third_party/tcmalloc/chromium/src/windows/mini_disassembler.cc b/third_party/tcmalloc/chromium/src/windows/mini_disassembler.cc |
index 30bdcc15554b83a18816cb4ae11038385431808d..9e336ba4f9a8a40d9579d88b7b8f6c8791652ce0 100644 |
--- a/third_party/tcmalloc/chromium/src/windows/mini_disassembler.cc |
+++ b/third_party/tcmalloc/chromium/src/windows/mini_disassembler.cc |
@@ -100,6 +100,12 @@ InstructionType MiniDisassembler::Disassemble( |
void MiniDisassembler::Initialize() { |
operand_is_32_bits_ = operand_default_is_32_bits_; |
address_is_32_bits_ = address_default_is_32_bits_; |
+#ifdef _M_X64 |
+ operand_default_support_64_bits_ = true; |
+#else |
+ operand_default_support_64_bits_ = false; |
+#endif |
+ operand_is_64_bits_ = false; |
operand_bytes_ = 0; |
have_modrm_ = false; |
should_decode_modrm_ = false; |
@@ -129,6 +135,8 @@ InstructionType MiniDisassembler::ProcessPrefixes(unsigned char* start_byte, |
got_f3_prefix_ = true; |
else if (0x66 == (*start_byte)) |
got_66_prefix_ = true; |
+ else if (operand_default_support_64_bits_ && (*start_byte) & 0x48) |
+ operand_is_64_bits_ = true; |
instruction_type = opcode.type_; |
size ++; |
@@ -314,8 +322,12 @@ bool MiniDisassembler::ProcessOperand(int flag_operand) { |
// floating point |
succeeded = false; |
break; |
- case OT_V: // Word or doubleword, depending on operand-size attribute. |
- if (operand_is_32_bits_) |
+ case OT_V: // Word, doubleword or quadword, depending on operand-size |
+ // attribute. |
+ if (operand_is_64_bits_ && flag_operand & AM_I && |
+ flag_operand & IOS_64) |
+ operand_bytes_ += OS_QUAD_WORD; |
+ else if (operand_is_32_bits_) |
operand_bytes_ += OS_DOUBLE_WORD; |
else |
operand_bytes_ += OS_WORD; |