[llvm-commits] [llvm] r139485 - in /llvm/trunk: lib/Target/X86/X86InstrArithmetic.td test/MC/Disassembler/X86/simple-tests.txt utils/TableGen/X86RecognizableInstr.cpp
Eli Friedman
eli.friedman at gmail.com
Mon Sep 12 01:38:59 PDT 2011
On Mon, Sep 12, 2011 at 1:14 AM, Bruno Cardoso Lopes
<bruno.cardoso at gmail.com> wrote:
> Hi Craig,
>
> On Sun, Sep 11, 2011 at 2:41 PM, Craig Topper <craig.topper at gmail.com> wrote:
>> Author: ctopper
>> Date: Sun Sep 11 16:41:45 2011
>> New Revision: 139485
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=139485&view=rev
>> Log:
>> Fix disassembling of reverse register/register forms of ADD/SUB/XOR/OR/AND/SBB/ADC/CMP/MOV.
>>
>> Modified:
>> llvm/trunk/lib/Target/X86/X86InstrArithmetic.td
>> llvm/trunk/test/MC/Disassembler/X86/simple-tests.txt
>> llvm/trunk/utils/TableGen/X86RecognizableInstr.cpp
>>
>> Modified: llvm/trunk/lib/Target/X86/X86InstrArithmetic.td
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrArithmetic.td?rev=139485&r1=139484&r2=139485&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/X86/X86InstrArithmetic.td (original)
>> +++ llvm/trunk/lib/Target/X86/X86InstrArithmetic.td Sun Sep 11 16:41:45 2011
>> @@ -650,6 +650,15 @@
>> let isCodeGenOnly = 1;
>> }
>>
>> +// BinOpRR_F_Rev - Instructions like "cmp reg, reg" (reversed encoding).
>> +class BinOpRR_F_Rev<bits<8> opcode, string mnemonic, X86TypeInfo typeinfo>
>> + : ITy<opcode, MRMSrcReg, typeinfo, (outs),
>> + (ins typeinfo.RegClass:$src1, typeinfo.RegClass:$src2),
>> + mnemonic, "{$src2, $src1|$src1, $src2}", []> {
>> + // The disassembler should know about this, but not the asmparser.
>> + let isCodeGenOnly = 1;
>> +}
>> +
>> // BinOpRM - Instructions like "add reg, reg, [mem]".
>> class BinOpRM<bits<8> opcode, string mnemonic, X86TypeInfo typeinfo,
>> dag outlist, list<dag> pattern>
>> @@ -1017,10 +1026,10 @@
>> def #NAME#64rr : BinOpRR_F<BaseOpc, mnemonic, Xi64, opnode>;
>> } // isCommutable
>>
>> - def #NAME#8rr_REV : BinOpRR_Rev<BaseOpc2, mnemonic, Xi8>;
>> - def #NAME#16rr_REV : BinOpRR_Rev<BaseOpc2, mnemonic, Xi16>;
>> - def #NAME#32rr_REV : BinOpRR_Rev<BaseOpc2, mnemonic, Xi32>;
>> - def #NAME#64rr_REV : BinOpRR_Rev<BaseOpc2, mnemonic, Xi64>;
>> + def #NAME#8rr_REV : BinOpRR_F_Rev<BaseOpc2, mnemonic, Xi8>;
>> + def #NAME#16rr_REV : BinOpRR_F_Rev<BaseOpc2, mnemonic, Xi16>;
>> + def #NAME#32rr_REV : BinOpRR_F_Rev<BaseOpc2, mnemonic, Xi32>;
>> + def #NAME#64rr_REV : BinOpRR_F_Rev<BaseOpc2, mnemonic, Xi64>;
>>
>> def #NAME#8rm : BinOpRM_F<BaseOpc2, mnemonic, Xi8 , opnode>;
>> def #NAME#16rm : BinOpRM_F<BaseOpc2, mnemonic, Xi16, opnode>;
>>
>> Modified: llvm/trunk/test/MC/Disassembler/X86/simple-tests.txt
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Disassembler/X86/simple-tests.txt?rev=139485&r1=139484&r2=139485&view=diff
>> ==============================================================================
>> --- llvm/trunk/test/MC/Disassembler/X86/simple-tests.txt (original)
>> +++ llvm/trunk/test/MC/Disassembler/X86/simple-tests.txt Sun Sep 11 16:41:45 2011
>> @@ -161,3 +161,15 @@
>>
>> # CHECK: pause
>> 0xf3 0x90
>> +
>> +# CHECK: addl %eax, %edi
>> +0x01 0xc7
>> +
>> +# CHECK: addl %edi, %eax
>> +0x03 0xc7
>> +
>> +# CHECK: movl %eax, %edi
>> +0x89 0xc7
>> +
>> +# CHECK: movl %edi, %eax
>> +0x8b 0xc7
>>
>> Modified: llvm/trunk/utils/TableGen/X86RecognizableInstr.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/X86RecognizableInstr.cpp?rev=139485&r1=139484&r2=139485&view=diff
>> ==============================================================================
>> --- llvm/trunk/utils/TableGen/X86RecognizableInstr.cpp (original)
>> +++ llvm/trunk/utils/TableGen/X86RecognizableInstr.cpp Sun Sep 11 16:41:45 2011
>> @@ -345,7 +345,7 @@
>> return FILTER_STRONG;
>>
>> if (Form == X86Local::Pseudo ||
>> - IsCodeGenOnly)
>> + (IsCodeGenOnly && Name.find("_REV") == Name.npos))
>> return FILTER_STRONG;
>
> I know that the "_REV" patterns were already there before you hack
> into this code. We would like eventually to remove all logic dependent
> on name suffixes or prefixes ("_REV", "_Int", "Int_" ... ), and create
> InstAliases, patterns or even add more flags like TB, XS, and so on...
> Since you're investigating and fixing disassembler stuff, do you have
> ideas on how to achieve the same results without duplicating
> instructions and appending the _REV suffix? Would that be possible?
It's worth noting that these aren't really duplicates; unlike the Int_
and _Int cases, from the perspective of x86 encoding, the _REV
instructions are distinct instructions that happen to do the same
thing as some other instruction. Trying to merge them with the
functionally equivalent instructions would require a significant
rearchitecture which I doubt is worthwhile.
-Eli
More information about the llvm-commits
mailing list