aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Target/X86/AsmParser/X86AsmParser.cpp11
-rw-r--r--test/MC/AsmParser/X86/x86_instructions.s14
2 files changed, 25 insertions, 0 deletions
diff --git a/lib/Target/X86/AsmParser/X86AsmParser.cpp b/lib/Target/X86/AsmParser/X86AsmParser.cpp
index 01ccc50adf..18fb173e1c 100644
--- a/lib/Target/X86/AsmParser/X86AsmParser.cpp
+++ b/lib/Target/X86/AsmParser/X86AsmParser.cpp
@@ -1052,6 +1052,17 @@ ParseInstruction(StringRef Name, SMLoc NameLoc,
Operands[0] = X86Operand::CreateToken("fstps", NameLoc);
}
+
+ // "clr <reg>" -> "xor <reg>, <reg>".
+ if ((Name == "clrb" || Name == "clrw" || Name == "clrl" || Name == "clrq" ||
+ Name == "clr") && Operands.size() == 2 &&
+ static_cast<X86Operand*>(Operands[1])->isReg()) {
+ unsigned RegNo = static_cast<X86Operand*>(Operands[1])->getReg();
+ Operands.push_back(X86Operand::CreateReg(RegNo, NameLoc, NameLoc));
+ delete Operands[0];
+ Operands[0] = X86Operand::CreateToken("xor", NameLoc);
+ }
+
return false;
}
diff --git a/test/MC/AsmParser/X86/x86_instructions.s b/test/MC/AsmParser/X86/x86_instructions.s
index b72374db46..9725e9dcbf 100644
--- a/test/MC/AsmParser/X86/x86_instructions.s
+++ b/test/MC/AsmParser/X86/x86_instructions.s
@@ -360,4 +360,18 @@ mov %rdx, %cr15
faddp %st, %st(1)
fmulp %st, %st(2)
+// rdar://8416805
+// CHECK: xorb %al, %al
+// CHECK: encoding: [0x30,0xc0]
+// CHECK: xorw %di, %di
+// CHECK: encoding: [0x66,0x31,0xff]
+// CHECK: xorl %esi, %esi
+// CHECK: encoding: [0x31,0xf6]
+// CHECK: xorq %rsi, %rsi
+// CHECK: encoding: [0x48,0x31,0xf6]
+clrb %al
+clr %di
+clr %esi
+clr %rsi
+