From b3cee5a57ab2cd0a99ad01ac9db73e31ae90d519 Mon Sep 17 00:00:00 2001 From: Victor van den Elzen Date: Sun, 7 Nov 2010 19:56:14 +0100 Subject: [PATCH] BR3058845: mostly fix bogus warning with implicit operand size override The implicit operand size override code didn't set the operand size prefix, which confused the size calculation code for the range check. The BITS 64 operand size calculation is still off, but "fixing" it by making it 32-bit unless REX.W is set breaks PUSH and maybe others. --- assemble.c | 22 ++++++++++++++++------ test/br3058845.asm | 14 ++++++++++++++ 2 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 test/br3058845.asm diff --git a/assemble.c b/assemble.c index 3aff669e..bb2911ae 100644 --- a/assemble.c +++ b/assemble.c @@ -1636,22 +1636,32 @@ static void gencode(int32_t segment, int64_t offset, int bits, break; case 0320: - if (bits != 16) { + { + enum prefixes pfx = ins->prefixes[PPS_OSIZE]; + if (pfx != P_O16 && pfx != P_none) + nasm_error(ERR_WARNING, "Invalid operand size prefix"); + if (pfx != P_O16 && bits != 16) { + ins->prefixes[PPS_OSIZE] = P_O16; *bytes = 0x66; out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG); offset += 1; - } else - offset += 0; + } break; + } case 0321: - if (bits == 16) { + { + enum prefixes pfx = ins->prefixes[PPS_OSIZE]; + if (pfx != P_O32 && pfx != P_none) + nasm_error(ERR_WARNING, "Invalid operand size prefix"); + if (pfx != P_O32 && bits == 16) { + ins->prefixes[PPS_OSIZE] = P_O32; *bytes = 0x66; out(offset, segment, bytes, OUT_RAWDATA, 1, NO_SEG, NO_SEG); offset += 1; - } else - offset += 0; + } break; + } case 0322: case 0323: diff --git a/test/br3058845.asm b/test/br3058845.asm new file mode 100644 index 00000000..b0de5607 --- /dev/null +++ b/test/br3058845.asm @@ -0,0 +1,14 @@ +;Testname=unoptimized; Arguments=-O0 -fbin -obr3058845.bin; Files=stdout stderr br3058845.bin +;Testname=optimized; Arguments=-Ox -fbin -obr3058845.bin; Files=stdout stderr br3058845.bin + +BITS 16 +cmp ax, 0xFFFF +cmp eax, 0xFFFF_FFFF + +BITS 32 +cmp ax, 0xFFFF +cmp eax, 0xFFFF_FFFF + +BITS 64 +cmp ax, 0xFFFF +cmp eax, 0xFFFF_FFFF ; shouldn't warn, but does currently -- 2.11.4.GIT