summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2010-11-16 09:36:58 -0800
committerH. Peter Anvin <hpa@zytor.com>2010-11-16 09:39:32 -0800
commit3cb0e8c052a672424eaf59a021f0dbfb6ef205b8 (patch)
tree5c826406fbab248d2bed92c94179c95e11d5b5bd
parent4794de2f5b1850d5b456d903bead541fee351566 (diff)
downloadnasm-3cb0e8c052a672424eaf59a021f0dbfb6ef205b8.tar.gz
nasm-3cb0e8c052a672424eaf59a021f0dbfb6ef205b8.tar.bz2
nasm-3cb0e8c052a672424eaf59a021f0dbfb6ef205b8.zip
BR 3109604: Fix C4 vs C5 VEX form selection in calcsize()
calcsize() had the wrong criterion for when C5 prefixes are permitted (REX.R is permitted, REX.X is forbidden.) assemble() had the right test already. This caused symbol value errors.
-rw-r--r--assemble.c2
-rw-r--r--test/br3109604.asm9
2 files changed, 10 insertions, 1 deletions
diff --git a/assemble.c b/assemble.c
index 6fb5de9..99b833c 100644
--- a/assemble.c
+++ b/assemble.c
@@ -1152,7 +1152,7 @@ static int64_t calcsize(int32_t segment, int64_t offset, int bits,
errfunc(ERR_NONFATAL, "invalid operands in non-64-bit mode");
return -1;
}
- if (ins->vex_cm != 1 || (ins->rex & (REX_W|REX_R|REX_B)))
+ if (ins->vex_cm != 1 || (ins->rex & (REX_W|REX_X|REX_B)))
length += 3;
else
length += 2;
diff --git a/test/br3109604.asm b/test/br3109604.asm
new file mode 100644
index 0000000..9032e8d
--- /dev/null
+++ b/test/br3109604.asm
@@ -0,0 +1,9 @@
+;Testname=unoptimized; Arguments=-O0 -fbin -obr3109604.bin; Files=stdout stderr br3109604.bin
+;Testname=optimized; Arguments=-Ox -fbin -obr3109604.bin; Files=stdout stderr br3109604.bin
+
+ bits 64
+b0: vmovd xmm2, [rdx+r9]
+e0:
+
+ section .data
+len: dd e0 - b0 ; Should be 6