From 09438f36ec7e1a42f71f9032edfb2e042d73bb7f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 1 Oct 2010 08:45:27 +0200 Subject: [PATCH] Mask lower bits of merge opcodes to prevent signedness problems --- orc/opcodes.h | 4 ++-- orc/orcemulateopcodes.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/orc/opcodes.h b/orc/opcodes.h index f411f00..4956a2e 100644 --- a/orc/opcodes.h +++ b/orc/opcodes.h @@ -127,8 +127,8 @@ BINARY_WL(mulswl, "%s * %s") BINARY_WL(muluwl, "(orc_uint16)%s * (orc_uint16)%s") BINARY_LQ(mergelq, "((orc_uint64)%s & ORC_UINT64_C(0xffffffff)) | ((orc_uint64)%s << 32)") -BINARY_WL(mergewl, "((orc_uint16)%s) | ((orc_uint16)%s << 16)") -BINARY_BW(mergebw, "((orc_uint8)%s) | ((orc_uint8)%s << 8)") +BINARY_WL(mergewl, "((orc_uint16)%s & 0x0000ffff) | ((orc_uint16)%s << 16)") +BINARY_BW(mergebw, "((orc_uint8)%s & 0x00ff) | ((orc_uint8)%s << 8)") UNARY_WB(select0wb, "(orc_uint16)%s & 0xff") UNARY_WB(select1wb, "((orc_uint16)%s >> 8)&0xff") UNARY_LW(select0lw, "(orc_uint32)%s & 0xffff") diff --git a/orc/orcemulateopcodes.c b/orc/orcemulateopcodes.c index 3022304..7a25339 100644 --- a/orc/orcemulateopcodes.c +++ b/orc/orcemulateopcodes.c @@ -4256,7 +4256,7 @@ emulate_mergewl (OrcOpcodeExecutor *ex, int offset, int n) /* 1: loadw */ var33 = ptr5[i]; /* 2: mergewl */ - var34.i = ((orc_uint16)var32.i) | ((orc_uint16)var33.i << 16); + var34.i = ((orc_uint16)var32.i & 0x0000ffff) | ((orc_uint16)var33.i << 16); /* 3: storel */ ptr0[i] = var34; } @@ -4285,7 +4285,7 @@ emulate_mergebw (OrcOpcodeExecutor *ex, int offset, int n) /* 1: loadb */ var33 = ptr5[i]; /* 2: mergebw */ - var34.i = ((orc_uint8)var32) | ((orc_uint8)var33 << 8); + var34.i = ((orc_uint8)var32 & 0x00ff) | ((orc_uint8)var33 << 8); /* 3: storew */ ptr0[i] = var34; } -- 2.7.4