diff --git a/SStream.c b/SStream.c index 43696c0c4f..4e3fac5c23 100644 --- a/SStream.c +++ b/SStream.c @@ -209,20 +209,58 @@ void printInt32Bang(SStream *O, int32_t val) } } +void printInt8(SStream *O, int8_t val) +{ + SSTREAM_RETURN_IF_CLOSED(O); + if (val >= 0) { + if (val > HEX_THRESHOLD) + SStream_concat(O, "0x%" PRIx8, val); + else + SStream_concat(O, "%" PRId8, val); + } else { + if (val <- HEX_THRESHOLD) { + if (val == INT8_MIN) + SStream_concat(O, "-0x%" PRIx8, (int8_t)val); + else + SStream_concat(O, "-0x%" PRIx8, (int8_t)-val); + } else + SStream_concat(O, "-%u", -val); + } +} + +void printInt16(SStream *O, int16_t val) +{ + SSTREAM_RETURN_IF_CLOSED(O); + if (val >= 0) { + if (val > HEX_THRESHOLD) + SStream_concat(O, "0x%" PRIx16, val); + else + SStream_concat(O, "%" PRId16, val); + } else { + if (val <- HEX_THRESHOLD) { + if (val == INT16_MIN) + SStream_concat(O, "-0x%" PRIx16, (int16_t)val); + else + SStream_concat(O, "-0x%" PRIx16, (int16_t)-val); + } else + SStream_concat(O, "-%u", -val); + } +} + void printInt32(SStream *O, int32_t val) { SSTREAM_RETURN_IF_CLOSED(O); if (val >= 0) { if (val > HEX_THRESHOLD) - SStream_concat(O, "0x%x", val); + SStream_concat(O, "0x%" PRIx32, val); else - SStream_concat(O, "%u", val); + SStream_concat(O, "%" PRId32, val); } else { if (val <- HEX_THRESHOLD) { - if (val == INT_MIN) - SStream_concat(O, "-0x%x", (uint32_t)val); + if (val == INT32_MIN) + SStream_concat(O, "-0x%" PRIx32, (int32_t)val); else - SStream_concat(O, "-0x%x", (uint32_t)-val); + SStream_concat(O, "-0x%" PRIx32, (int32_t)-val); } else SStream_concat(O, "-%u", -val); } diff --git a/SStream.h b/SStream.h index f042c16b9a..fb3cee0e74 100644 --- a/SStream.h +++ b/SStream.h @@ -58,6 +58,8 @@ void printUInt64(SStream *O, uint64_t val); void printInt32Bang(SStream *O, int32_t val); +void printInt8(SStream *O, int8_t val); +void printInt16(SStream *O, int16_t val); void printInt32(SStream *O, int32_t val); void printUInt32Bang(SStream *O, uint32_t val); diff --git a/arch/SystemZ/SystemZInstPrinter.c b/arch/SystemZ/SystemZInstPrinter.c index b42a7a79bc..c0dc60c437 100644 --- a/arch/SystemZ/SystemZInstPrinter.c +++ b/arch/SystemZ/SystemZInstPrinter.c @@ -194,7 +194,14 @@ DEFINE_printUImmOperand(48); MCOperand_getImm(MCInst_getOperand(MI, (OpNum))); \ CS_ASSERT( \ (CONCAT(isInt, N)(Value) && "Invalid simm argument")); \ - printInt64(markup_OS(O, Markup_Immediate), Value); \ + if (N == 8) \ + printInt8(markup_OS(O, Markup_Immediate), Value); \ + else if (N == 16) \ + printInt16(markup_OS(O, Markup_Immediate), Value); \ + else if (N == 32) \ + printInt32(markup_OS(O, Markup_Immediate), Value); \ + else \ + CS_ASSERT(0 && "Unreachable"); \ } DEFINE_printSImmOperand(8); DEFINE_printSImmOperand(16);