From a25f933396b8408ad89218bc60b0a93f130a3ea9 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 29 Sep 2010 18:39:16 +0000 Subject: [PATCH] implement rdar://8491845 - Gas supports commuted forms of non-commutable instructions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115061 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/AsmParser/X86AsmParser.cpp | 6 ++++-- test/MC/AsmParser/X86/x86_instructions.s | 8 ++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/Target/X86/AsmParser/X86AsmParser.cpp b/lib/Target/X86/AsmParser/X86AsmParser.cpp index c8b25cea30b..3ecf273a088 100644 --- a/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -921,8 +921,10 @@ ParseInstruction(StringRef Name, SMLoc NameLoc, } // FIXME: Hack to handle "f{mulp,addp} st(0), $op" the same as - // "f{mulp,addp} $op", since they commute. - if ((Name == "fmulp" || Name == "faddp") && Operands.size() == 3 && + // "f{mulp,addp} $op", since they commute. We also allow fdivrp/fsubrp even + // though they don't commute, solely because gas does support this. + if ((Name=="fmulp" || Name=="faddp" || Name=="fsubrp" || Name=="fdivrp") && + Operands.size() == 3 && static_cast(Operands[1])->isReg() && static_cast(Operands[1])->getReg() == X86::ST0) { delete Operands[1]; diff --git a/test/MC/AsmParser/X86/x86_instructions.s b/test/MC/AsmParser/X86/x86_instructions.s index d182917d2da..6da446821d8 100644 --- a/test/MC/AsmParser/X86/x86_instructions.s +++ b/test/MC/AsmParser/X86/x86_instructions.s @@ -466,3 +466,11 @@ movmskpd %xmm6, %rax movmskpd %xmm6, %eax // CHECK: movmskpd %xmm6, %eax // CHECK: encoding: [0x66,0x0f,0x50,0xc6] + +// rdar://8491845 - Gas supports commuted forms of non-commutable instructions. +fdivrp %st(0), %st(1) // CHECK: encoding: [0xde,0xf9] +fdivrp %st(1), %st(0) // CHECK: encoding: [0xde,0xf9] + +fsubrp %ST(0), %ST(1) // CHECK: encoding: [0xde,0xe9] +fsubrp %ST(1), %ST(0) // CHECK: encoding: [0xde,0xe9] +