mirror of
https://github.com/netwide-assembler/nasm.git
synced 2025-04-24 19:00:23 +08:00
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 <gorcunov@gmail.com>
This commit is contained in:
parent
4ea846623a
commit
41208028ff
17
parser.c
17
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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user