"sldt <mem>" is ambiguous in 64-bit mode, but should
authorChris Lattner <sabre@nondot.org>
Mon, 6 Sep 2010 23:51:44 +0000 (23:51 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 6 Sep 2010 23:51:44 +0000 (23:51 +0000)
always be disambiguated as sldtw.  sldtw and sldtq with
a mem operands have the same effect, but sldtw is more
compact.  Force it to sldtw, resolving rdar://8017530

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@113186 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/AsmParser/X86AsmParser.cpp
test/MC/AsmParser/X86/x86_instructions.s

index 19d9470639d7edcc39c64df3d2186cba6afd20c5..e20f1e3895acf4ca4201fb501cec4f7fe70e000d 100644 (file)
@@ -819,6 +819,13 @@ ParseInstruction(StringRef Name, SMLoc NameLoc,
     Operands.push_back(X86Operand::CreateReg(Op->getReg(), Op->getStartLoc(),
                                              Op->getEndLoc()));
   }
+  
+  // 'sldt <mem>' can be encoded with either sldtw or sldtq with the same
+  // effect (both store to a 16-bit mem).  Force to sldtw to avoid ambiguity
+  // errors, since its encoding is the most compact.
+  if (Name == "sldt" && Operands.size() == 2 &&
+      static_cast<X86Operand*>(Operands[1])->isMem())
+    Operands[0] = X86Operand::CreateToken("sldtw", NameLoc);
 
   return false;
 }
index 308dc09586daeee1c841776e996425311bfc7d99..f27f2433d3cf757498a623a7efded09670596ab1 100644 (file)
@@ -178,3 +178,6 @@ inb $161, %al
 // CHECK: pushq        $1
 push $1
 
+// rdar://8017530
+// CHECK: sldtw        4
+sldt   4