summaryrefslogtreecommitdiff
path: root/usr/src/lib/libdisasm/common/dis_sparc_fmt.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libdisasm/common/dis_sparc_fmt.c')
-rw-r--r--usr/src/lib/libdisasm/common/dis_sparc_fmt.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/usr/src/lib/libdisasm/common/dis_sparc_fmt.c b/usr/src/lib/libdisasm/common/dis_sparc_fmt.c
index 017c056477..ceaafa47fe 100644
--- a/usr/src/lib/libdisasm/common/dis_sparc_fmt.c
+++ b/usr/src/lib/libdisasm/common/dis_sparc_fmt.c
@@ -32,6 +32,7 @@
#include <sys/byteorder.h>
+#include <sys/debug.h>
#include <stdarg.h>
#if !defined(DIS_STANDALONE)
@@ -647,7 +648,7 @@ static const char *prefetch_str[32] = {
static void prt_field(const char *, uint32_t, int);
static const char *get_regname(dis_handle_t *, int, uint32_t);
-static int32_t sign_extend(int32_t, int32_t);
+static int32_t sign_extend(int32_t, uint32_t);
static void prt_name(dis_handle_t *, const char *, int);
@@ -2203,12 +2204,13 @@ prt_field(const char *field, uint32_t val, int len)
* integer
*/
static int32_t
-sign_extend(int32_t val, int32_t bits)
+sign_extend(int32_t val, uint32_t bits)
{
- if ((val & (1L << (bits - 1))) == 0)
- return (val);
+ uint32_t mask;
- return ((-1L << bits) | val);
+ ASSERT(bits > 0);
+ mask = 1L << (bits - 1); /* 2**(bits - 1) */
+ return (-(val & mask) + (val & ~mask));
}
/*