OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/disassembler.h" | 5 #include "vm/disassembler.h" |
6 | 6 |
7 #include "vm/globals.h" // Needed here to get TARGET_ARCH_IA32. | 7 #include "vm/globals.h" // Needed here to get TARGET_ARCH_IA32. |
8 #if defined(TARGET_ARCH_IA32) | 8 #if defined(TARGET_ARCH_IA32) |
9 #include "platform/utils.h" | 9 #include "platform/utils.h" |
10 #include "vm/allocation.h" | 10 #include "vm/allocation.h" |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 edx = 2, | 318 edx = 2, |
319 ebx = 3, | 319 ebx = 3, |
320 esp = 4, | 320 esp = 4, |
321 ebp = 5, | 321 ebp = 5, |
322 esi = 6, | 322 esi = 6, |
323 edi = 7 | 323 edi = 7 |
324 }; | 324 }; |
325 | 325 |
326 // Bottleneck functions to print into the out_buffer. | 326 // Bottleneck functions to print into the out_buffer. |
327 void PrintInt(int value); | 327 void PrintInt(int value); |
328 void PrintHex(int value); | 328 void PrintHex(int value, bool signed_value = false); |
329 void Print(const char* str); | 329 void Print(const char* str); |
330 const char* GetBranchPrefix(uint8_t** data); | 330 const char* GetBranchPrefix(uint8_t** data); |
331 | 331 |
332 bool DecodeInstructionType(const InstructionDesc& idesc, | 332 bool DecodeInstructionType(const InstructionDesc& idesc, |
333 const char* branch_hint, | 333 const char* branch_hint, |
334 uint8_t** data); | 334 uint8_t** data); |
335 | 335 |
336 // Printing of common values. | 336 // Printing of common values. |
337 void PrintCPURegister(int reg); | 337 void PrintCPURegister(int reg); |
338 void PrintCPUByteRegister(int reg); | 338 void PrintCPUByteRegister(int reg); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
394 | 394 |
395 | 395 |
396 void X86Decoder::PrintInt(int value) { | 396 void X86Decoder::PrintInt(int value) { |
397 char int_buffer[16]; | 397 char int_buffer[16]; |
398 OS::SNPrint(int_buffer, sizeof(int_buffer), "%#x", value); | 398 OS::SNPrint(int_buffer, sizeof(int_buffer), "%#x", value); |
399 Print(int_buffer); | 399 Print(int_buffer); |
400 } | 400 } |
401 | 401 |
402 | 402 |
403 // Append the int value (printed in hex) to the output buffer. | 403 // Append the int value (printed in hex) to the output buffer. |
404 void X86Decoder::PrintHex(int value) { | 404 void X86Decoder::PrintHex(int value, bool signed_value) { |
405 char hex_buffer[16]; | 405 char hex_buffer[16]; |
406 OS::SNPrint(hex_buffer, sizeof(hex_buffer), "%#x", value); | 406 if (signed_value && value < 0) { |
| 407 OS::SNPrint(hex_buffer, sizeof(hex_buffer), "-%#x", -value); |
| 408 } else { |
| 409 OS::SNPrint(hex_buffer, sizeof(hex_buffer), "%#x", value); |
| 410 } |
407 Print(hex_buffer); | 411 Print(hex_buffer); |
408 } | 412 } |
409 | 413 |
410 | 414 |
411 // Append the str to the output buffer. | 415 // Append the str to the output buffer. |
412 void X86Decoder::Print(const char* str) { | 416 void X86Decoder::Print(const char* str) { |
413 char cur = *str++; | 417 char cur = *str++; |
414 while (cur != '\0' && (buffer_pos_ < (buffer_size_ - 1))) { | 418 while (cur != '\0' && (buffer_pos_ < (buffer_size_ - 1))) { |
415 buffer_[buffer_pos_++] = cur; | 419 buffer_[buffer_pos_++] = cur; |
416 cur = *str++; | 420 cur = *str++; |
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
678 UNIMPLEMENTED(); | 682 UNIMPLEMENTED(); |
679 } | 683 } |
680 Print(mnem); | 684 Print(mnem); |
681 Print(" "); | 685 Print(" "); |
682 int count = PrintRightOperand(data + 1); | 686 int count = PrintRightOperand(data + 1); |
683 Print(","); | 687 Print(","); |
684 if (size_override) { | 688 if (size_override) { |
685 PrintHex(*reinterpret_cast<int16_t*>(data + 1 + count)); | 689 PrintHex(*reinterpret_cast<int16_t*>(data + 1 + count)); |
686 return 1 + count + 2 /*int16_t*/; | 690 return 1 + count + 2 /*int16_t*/; |
687 } else if (sign_extension_bit) { | 691 } else if (sign_extension_bit) { |
688 PrintHex(*(data + 1 + count)); | 692 PrintHex(*reinterpret_cast<int8_t*>(data + 1 + count), sign_extension_bit); |
689 return 1 + count + 1 /*int8_t*/; | 693 return 1 + count + 1 /*int8_t*/; |
690 } else { | 694 } else { |
691 PrintHex(*reinterpret_cast<int32_t*>(data + 1 + count)); | 695 PrintHex(*reinterpret_cast<int32_t*>(data + 1 + count)); |
692 return 1 + count + 4 /*int32_t*/; | 696 return 1 + count + 4 /*int32_t*/; |
693 } | 697 } |
694 } | 698 } |
695 | 699 |
696 | 700 |
697 int X86Decoder::DecodeEnter(uint8_t* data) { | 701 int X86Decoder::DecodeEnter(uint8_t* data) { |
698 uint16_t size = *reinterpret_cast<uint16_t*>(data + 1); | 702 uint16_t size = *reinterpret_cast<uint16_t*>(data + 1); |
(...skipping 1246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1945 } | 1949 } |
1946 } | 1950 } |
1947 } | 1951 } |
1948 } | 1952 } |
1949 | 1953 |
1950 #endif // !PRODUCT | 1954 #endif // !PRODUCT |
1951 | 1955 |
1952 } // namespace dart | 1956 } // namespace dart |
1953 | 1957 |
1954 #endif // defined TARGET_ARCH_IA32 | 1958 #endif // defined TARGET_ARCH_IA32 |
OLD | NEW |