From 41208028ff52d190044ee7532bf14c5aca0f899a Mon Sep 17 00:00:00 2001 From: Cyrill Gorcunov Date: Sat, 31 Oct 2009 10:34:43 +0300 Subject: [PATCH] BR 2887108: Use overflow_ helper to catch inappropriate imm optimization We should use overflow_ helpers before check if an immediate operand fit a type range, otherwise we may loose high bits. For example when we assemble the following instruction imul eax,eax,0x10000 with -Ox passed we optimze it up to imm8 though it must be imm32. Signed-off-by: Cyrill Gorcunov --- parser.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/parser.c b/parser.c index d0d660b7..34fcf474 100644 --- a/parser.c +++ b/parser.c @@ -855,11 +855,10 @@ restart_parse: result->oprs[operand].segment = NO_SEG; /* don't care again */ result->oprs[operand].wrt = NO_SEG; /* still don't care */ + /* Be optimistic */ if(optimizing >= 0 && !(result->oprs[operand].type & STRICT)) - { - /* Be optimistic */ result->oprs[operand].type |= SBYTE16 | SBYTE32 | SBYTE64; - } + } else if (is_reloc(value)) { /* it's immediate */ result->oprs[operand].type |= IMMEDIATE; result->oprs[operand].offset = reloc_value(value); @@ -874,12 +873,14 @@ restart_parse: int32_t v32 = (int32_t)v64; int16_t v16 = (int16_t)v32; - if (v64 >= -128 && v64 <= 127) + if (v64 >= -128 && v64 <= 127) result->oprs[operand].type |= SBYTE64; - if (v32 >= -128 && v32 <= 127) - result->oprs[operand].type |= SBYTE32; - if (v16 >= -128 && v16 <= 127) - result->oprs[operand].type |= SBYTE16; + if (!overflow_signed(v64, sizeof(v32))) + if (v32 >= -128 && v32 <= 127) + result->oprs[operand].type |= SBYTE32; + if (!overflow_signed(v64, sizeof(v16))) + if (v16 >= -128 && v16 <= 127) + result->oprs[operand].type |= SBYTE16; } } } else { /* it's a register */ -- 2.11.4.GIT