From ac732cb6a599836bf4c988e59ac6de4498758c72 Mon Sep 17 00:00:00 2001 From: Victor van den Elzen Date: Tue, 31 Mar 2009 04:59:44 +0200 Subject: Improve process_ea and introduce -OL Two fixes: 1. Optimization of [bx+0xFFFF] etc 0xFFFF is an sbyte under 16-bit semantics, so make sure to check it right. 2. Don't optimize displacements in -O0 Displacements that fit into an sbyte or can be removed should *not* be optimized in -O0. Implicit zero displacements are still optimized, e.g.: [eax] -> 0 bit displacement, [ebp] -> 8 bit displacement. However explicit displacements are not optimized: [eax+0] -> 32 bit displacement, [ebp+0] -> 32 bit displacement. Because #2 breaks compatibility with 0.98, I introduced a new optimization level: -OL, legacy. --- nasm.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) (limited to 'nasm.c') diff --git a/nasm.c b/nasm.c index 7a63afb..f6a710a 100644 --- a/nasm.c +++ b/nasm.c @@ -674,14 +674,22 @@ static bool process_arg(char *p, char *q) case '5': case '6': case '7': case '8': case '9': opt = strtoul(param, ¶m, 10); - /* -O0 -> optimizing == -1, 0.98 behaviour */ - /* -O1 -> optimizing == 0, 0.98.09 behaviour */ - if (opt < 2) - optimizing = opt - 1; + if (opt == 0) + /* no optimization */ + optimizing = -2; + else if (opt == 1) + /* 0.98.09 behaviour */ + optimizing = 0; else optimizing = opt; break; + case 'L': + /* 0.98 behaviour */ + param++; + optimizing = -1; + break; + case 'v': case '+': param++; @@ -783,10 +791,11 @@ static bool process_arg(char *p, char *q) " -F format select a debugging format\n\n" " -I adds a pathname to the include file path\n"); printf - (" -O optimize branch offsets\n" - " -O0: No optimization (default)\n" + (" -O optimize code size\n" + " -O0: No optimization\n" + " -OL: Legacy optimization\n" " -O1: Minimal optimization\n" - " -Ox: Multipass optimization (recommended)\n\n" + " -Ox: Full optimization (default)\n\n" " -P pre-includes a file\n" " -D[=] pre-defines a macro\n" " -U undefines a macro\n" -- cgit v1.2.3