[llvm-commits] [llvm] r148485 - in /llvm/trunk: lib/Target/X86/AsmParser/X86AsmParser.cpp test/MC/X86/intel-syntax-encoding.s

Devang Patel dpatel at apple.com
Thu Jan 19 17:37:38 PST 2012


On Jan 19, 2012, at 5:29 PM, Chris Lattner wrote:

> 
> On Jan 19, 2012, at 9:53 AM, Devang Patel wrote:
> 
>> Author: dpatel
>> Date: Thu Jan 19 11:53:25 2012
>> New Revision: 148485
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=148485&view=rev
>> Log:
>> Post process 'xor', 'or' and 'cmp' instructions and select better encoding, if available.
> 
> Hi Devang,
> 
> Why don't the normal patterns for XOR16ri8 and friends work?  This seems like it will affect a *large* number of instructions.


In these cases, multiple match entries match and assembler used to pick up first one.

  { X86::XOR16i16, "xorw", Convert__Imm1_0, { MCK_Imm, MCK_AX }, 0, 0},
  { X86::XOR16ri8, "xorw", Convert__Reg1_1__Tie0__ImmSExti16i81_0, { MCK_ImmSExti16i8, MCK_GR16 }, 0, 0},

I consulted Jim and followed the same approach he took in ARM backend in such cases.

-
Devang

> 
> -Chris
> 
>> 
>> Added:
>>   llvm/trunk/test/MC/X86/intel-syntax-encoding.s
>> Modified:
>>   llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
>> 
>> Modified: llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp?rev=148485&r1=148484&r2=148485&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp (original)
>> +++ llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp Thu Jan 19 11:53:25 2012
>> @@ -1217,6 +1217,120 @@
>>    Inst = TmpInst;
>>    return true;
>>  }
>> +  case X86::XOR16i16: {
>> +    if (!Inst.getOperand(0).isImm() ||
>> +        !isImmSExti16i8Value(Inst.getOperand(0).getImm()))
>> +      return false;
>> +
>> +    MCInst TmpInst;
>> +    TmpInst.setOpcode(X86::XOR16ri8);
>> +    TmpInst.addOperand(MCOperand::CreateReg(X86::AX));
>> +    TmpInst.addOperand(MCOperand::CreateReg(X86::AX));
>> +    TmpInst.addOperand(Inst.getOperand(0));
>> +    Inst = TmpInst;
>> +    return true;
>> +  }
>> +  case X86::XOR32i32: {
>> +    if (!Inst.getOperand(0).isImm() ||
>> +        !isImmSExti32i8Value(Inst.getOperand(0).getImm()))
>> +      return false;
>> +
>> +    MCInst TmpInst;
>> +    TmpInst.setOpcode(X86::XOR32ri8);
>> +    TmpInst.addOperand(MCOperand::CreateReg(X86::EAX));
>> +    TmpInst.addOperand(MCOperand::CreateReg(X86::EAX));
>> +    TmpInst.addOperand(Inst.getOperand(0));
>> +    Inst = TmpInst;
>> +    return true;
>> +  }
>> +  case X86::XOR64i32: {
>> +    if (!Inst.getOperand(0).isImm() ||
>> +        !isImmSExti64i8Value(Inst.getOperand(0).getImm()))
>> +      return false;
>> +
>> +    MCInst TmpInst;
>> +    TmpInst.setOpcode(X86::XOR64ri8);
>> +    TmpInst.addOperand(MCOperand::CreateReg(X86::RAX));
>> +    TmpInst.addOperand(MCOperand::CreateReg(X86::RAX));
>> +    TmpInst.addOperand(Inst.getOperand(0));
>> +    Inst = TmpInst;
>> +    return true;
>> +  }
>> +  case X86::OR16i16: {
>> +    if (!Inst.getOperand(0).isImm() ||
>> +        !isImmSExti16i8Value(Inst.getOperand(0).getImm()))
>> +      return false;
>> +
>> +    MCInst TmpInst;
>> +    TmpInst.setOpcode(X86::OR16ri8);
>> +    TmpInst.addOperand(MCOperand::CreateReg(X86::AX));
>> +    TmpInst.addOperand(MCOperand::CreateReg(X86::AX));
>> +    TmpInst.addOperand(Inst.getOperand(0));
>> +    Inst = TmpInst;
>> +    return true;
>> +  }
>> +  case X86::OR32i32: {
>> +    if (!Inst.getOperand(0).isImm() ||
>> +        !isImmSExti32i8Value(Inst.getOperand(0).getImm()))
>> +      return false;
>> +
>> +    MCInst TmpInst;
>> +    TmpInst.setOpcode(X86::OR32ri8);
>> +    TmpInst.addOperand(MCOperand::CreateReg(X86::EAX));
>> +    TmpInst.addOperand(MCOperand::CreateReg(X86::EAX));
>> +    TmpInst.addOperand(Inst.getOperand(0));
>> +    Inst = TmpInst;
>> +    return true;
>> +  }
>> +  case X86::OR64i32: {
>> +    if (!Inst.getOperand(0).isImm() ||
>> +        !isImmSExti64i8Value(Inst.getOperand(0).getImm()))
>> +      return false;
>> +
>> +    MCInst TmpInst;
>> +    TmpInst.setOpcode(X86::OR64ri8);
>> +    TmpInst.addOperand(MCOperand::CreateReg(X86::RAX));
>> +    TmpInst.addOperand(MCOperand::CreateReg(X86::RAX));
>> +    TmpInst.addOperand(Inst.getOperand(0));
>> +    Inst = TmpInst;
>> +    return true;
>> +  }
>> +  case X86::CMP16i16: {
>> +    if (!Inst.getOperand(0).isImm() ||
>> +        !isImmSExti16i8Value(Inst.getOperand(0).getImm()))
>> +      return false;
>> +
>> +    MCInst TmpInst;
>> +    TmpInst.setOpcode(X86::CMP16ri8);
>> +    TmpInst.addOperand(MCOperand::CreateReg(X86::AX));
>> +    TmpInst.addOperand(Inst.getOperand(0));
>> +    Inst = TmpInst;
>> +    return true;
>> +  }
>> +  case X86::CMP32i32: {
>> +    if (!Inst.getOperand(0).isImm() ||
>> +        !isImmSExti32i8Value(Inst.getOperand(0).getImm()))
>> +      return false;
>> +
>> +    MCInst TmpInst;
>> +    TmpInst.setOpcode(X86::CMP32ri8);
>> +    TmpInst.addOperand(MCOperand::CreateReg(X86::EAX));
>> +    TmpInst.addOperand(Inst.getOperand(0));
>> +    Inst = TmpInst;
>> +    return true;
>> +  }
>> +  case X86::CMP64i32: {
>> +    if (!Inst.getOperand(0).isImm() ||
>> +        !isImmSExti64i8Value(Inst.getOperand(0).getImm()))
>> +      return false;
>> +
>> +    MCInst TmpInst;
>> +    TmpInst.setOpcode(X86::CMP64ri8);
>> +    TmpInst.addOperand(MCOperand::CreateReg(X86::RAX));
>> +    TmpInst.addOperand(Inst.getOperand(0));
>> +    Inst = TmpInst;
>> +    return true;
>> +  }
>>  }
>>  return false;
>> }
>> 
>> Added: llvm/trunk/test/MC/X86/intel-syntax-encoding.s
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/X86/intel-syntax-encoding.s?rev=148485&view=auto
>> ==============================================================================
>> --- llvm/trunk/test/MC/X86/intel-syntax-encoding.s (added)
>> +++ llvm/trunk/test/MC/X86/intel-syntax-encoding.s Thu Jan 19 11:53:25 2012
>> @@ -0,0 +1,22 @@
>> +// RUN: llvm-mc -x86-asm-syntax=intel -triple x86_64-unknown-unknown --show-encoding %s | FileCheck %s
>> +
>> +// CHECK: encoding: [0x66,0x83,0xf0,0x0c]
>> +	xor	ax, 12
>> +// CHECK: encoding: [0x83,0xf0,0x0c]
>> +	xor	eax, 12
>> +// CHECK: encoding: [0x48,0x83,0xf0,0x0c]
>> +	xor	rax, 12
>> +
>> +// CHECK: encoding: [0x66,0x83,0xc8,0x0c]
>> +	or	ax, 12
>> +// CHECK: encoding: [0x83,0xc8,0x0c]
>> +	or	eax, 12
>> +// CHECK: encoding: [0x48,0x83,0xc8,0x0c]
>> +	or	rax, 12
>> +
>> +// CHECK: encoding: [0x66,0x83,0xf8,0x0c]
>> +	cmp	ax, 12
>> +// CHECK: encoding: [0x83,0xf8,0x0c]
>> +	cmp	eax, 12
>> +// CHECK: encoding: [0x48,0x83,0xf8,0x0c]
>> +	cmp	rax, 12
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 




More information about the llvm-commits mailing list