add various broken forms of fnstsw. I didn't add the %rax
authorChris Lattner <sabre@nondot.org>
Wed, 15 Sep 2010 04:15:16 +0000 (04:15 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 15 Sep 2010 04:15:16 +0000 (04:15 +0000)
version because it adds a prefix and makes even less sense
than the other broken forms.  This wraps up rdar://8431422

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

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

index c21fc7ab56e173178b75461efb6dea719558ef23..7098c58cde933afdd7face3ab0a1c010834df66b 100644 (file)
@@ -943,6 +943,25 @@ ParseInstruction(StringRef Name, SMLoc NameLoc,
                                              NameLoc, NameLoc));
   }
   
+  // The assembler accepts various amounts of brokenness for fnstsw.
+  if (Name == "fnstsw") {
+    if (Operands.size() == 2 &&
+        static_cast<X86Operand*>(Operands[1])->isReg()) {
+      // "fnstsw al" and "fnstsw eax" -> "fnstw"
+      unsigned Reg = static_cast<X86Operand*>(Operands[1])->Reg.RegNo;
+      if (Reg == MatchRegisterName("eax") ||
+          Reg == MatchRegisterName("al")) {
+        delete Operands[1];
+        Operands.pop_back();
+      }
+    }
+
+    // "fnstw" -> "fnstw %ax"
+    if (Operands.size() == 1)
+      Operands.push_back(X86Operand::CreateReg(MatchRegisterName("ax"),
+                                               NameLoc, NameLoc));
+  }
+  
   return false;
 }
 
index cd7c6e117a785ea9952531d7c04501bafb42c36b..4faf2e55fe1f395afda1492d2225d4afec5ccd1e 100644 (file)
@@ -248,4 +248,12 @@ fucomi
 fucomi %st(2)
 fucomi %st(2), %st
 
-
+// CHECK: fnstsw %ax
+// CHECK: fnstsw %ax
+// CHECK: fnstsw %ax
+// CHECK: fnstsw %ax
+
+fnstsw
+fnstsw %ax
+fnstsw %eax
+fnstsw %al