summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Enderby <enderby@apple.com>2010-06-08 23:48:44 +0000
committerKevin Enderby <enderby@apple.com>2010-06-08 23:48:44 +0000
commit0de0f3fc02abb4f3576f94c5ec8da8f0ccf7d3e5 (patch)
tree9bbe82b3ff85a6801b7d7b1e8b7eb962b62c8020
parent642da419a60710c57bd2a3eefb2ecdf055af6778 (diff)
downloadbcm5719-llvm-0de0f3fc02abb4f3576f94c5ec8da8f0ccf7d3e5.tar.gz
bcm5719-llvm-0de0f3fc02abb4f3576f94c5ec8da8f0ccf7d3e5.zip
Incremental improvement to the handling of the x86 "Jump if rCX Zero"
instruction. Added the 64-bit version "jrcxz" so it is recognized and also added the checks for incorrect uses of "jcxz" in 64-bit mode and "jrcxz" in 32-bit mode. Still to do is to correctly handle the encoding of the instruction adding the Address-size override prefix byte, 0x67, when the width of the count register is not the same as the mode the machine is running in. Which for example means the encoding of "jecxz" depends if you are assembling as a 32-bit target or a 64-bit target. llvm-svn: 105661
-rw-r--r--llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
index ac4d4e90d11..7037796124c 100644
--- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
+++ b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
@@ -597,6 +597,16 @@ ParseInstruction(const StringRef &Name, SMLoc NameLoc,
return Error(NameLoc, "pushfq cannot be encoded in 32-bit mode");
}
+ // The "Jump if rCX Zero" form jcxz is not allowed in 64-bit mode and
+ // the form jrcxz is not allowed in 32-bit mode.
+ if (Is64Bit) {
+ if (Name == "jcxz")
+ return Error(NameLoc, "jcxz cannot be encoded in 64-bit mode");
+ } else {
+ if (Name == "jrcxz")
+ return Error(NameLoc, "jrcxz cannot be encoded in 32-bit mode");
+ }
+
// FIXME: Hack to recognize "sal..." and "rep..." for now. We need a way to
// represent alternative syntaxes in the .td file, without requiring
// instruction duplication.
@@ -618,7 +628,11 @@ ParseInstruction(const StringRef &Name, SMLoc NameLoc,
.Case("jz", "je")
.Case("jnz", "jne")
.Case("jc", "jb")
+ // FIXME: in 32-bit mode jcxz requires an AdSize prefix. In 64-bit mode
+ // jecxz requires an AdSize prefix but jecxz does not have a prefix in
+ // 32-bit mode.
.Case("jecxz", "jcxz")
+ .Case("jrcxz", "jcxz")
.Case("jna", "jbe")
.Case("jnae", "jb")
.Case("jnb", "jae")
OpenPOWER on IntegriCloud