mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
[X86] Add some instruction aliases to get the assembly parser table to favor arithmetic instructions with 8-bit immediates over the forms that implicitly use the ax/eax/rax.
This allows us to remove the explicit code for working around the existing priority llvm-svn: 250011
This commit is contained in:
parent
35bfd00e5a
commit
52829a95cf
@ -2361,72 +2361,9 @@ bool X86AsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool convertToSExti8(MCInst &Inst, unsigned Opcode, unsigned Reg,
|
||||
bool isCmp) {
|
||||
MCInst TmpInst;
|
||||
TmpInst.setOpcode(Opcode);
|
||||
if (!isCmp)
|
||||
TmpInst.addOperand(MCOperand::createReg(Reg));
|
||||
TmpInst.addOperand(MCOperand::createReg(Reg));
|
||||
TmpInst.addOperand(Inst.getOperand(0));
|
||||
Inst = TmpInst;
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool convert16i16to16ri8(MCInst &Inst, unsigned Opcode,
|
||||
bool isCmp = false) {
|
||||
if (!Inst.getOperand(0).isImm() ||
|
||||
!isImmSExti16i8Value(Inst.getOperand(0).getImm()))
|
||||
return false;
|
||||
|
||||
return convertToSExti8(Inst, Opcode, X86::AX, isCmp);
|
||||
}
|
||||
|
||||
static bool convert32i32to32ri8(MCInst &Inst, unsigned Opcode,
|
||||
bool isCmp = false) {
|
||||
if (!Inst.getOperand(0).isImm() ||
|
||||
!isImmSExti32i8Value(Inst.getOperand(0).getImm()))
|
||||
return false;
|
||||
|
||||
return convertToSExti8(Inst, Opcode, X86::EAX, isCmp);
|
||||
}
|
||||
|
||||
static bool convert64i32to64ri8(MCInst &Inst, unsigned Opcode,
|
||||
bool isCmp = false) {
|
||||
if (!Inst.getOperand(0).isImm() ||
|
||||
!isImmSExti64i8Value(Inst.getOperand(0).getImm()))
|
||||
return false;
|
||||
|
||||
return convertToSExti8(Inst, Opcode, X86::RAX, isCmp);
|
||||
}
|
||||
|
||||
bool X86AsmParser::processInstruction(MCInst &Inst, const OperandVector &Ops) {
|
||||
switch (Inst.getOpcode()) {
|
||||
default: return false;
|
||||
case X86::AND16i16: return convert16i16to16ri8(Inst, X86::AND16ri8);
|
||||
case X86::AND32i32: return convert32i32to32ri8(Inst, X86::AND32ri8);
|
||||
case X86::AND64i32: return convert64i32to64ri8(Inst, X86::AND64ri8);
|
||||
case X86::XOR16i16: return convert16i16to16ri8(Inst, X86::XOR16ri8);
|
||||
case X86::XOR32i32: return convert32i32to32ri8(Inst, X86::XOR32ri8);
|
||||
case X86::XOR64i32: return convert64i32to64ri8(Inst, X86::XOR64ri8);
|
||||
case X86::OR16i16: return convert16i16to16ri8(Inst, X86::OR16ri8);
|
||||
case X86::OR32i32: return convert32i32to32ri8(Inst, X86::OR32ri8);
|
||||
case X86::OR64i32: return convert64i32to64ri8(Inst, X86::OR64ri8);
|
||||
case X86::CMP16i16: return convert16i16to16ri8(Inst, X86::CMP16ri8, true);
|
||||
case X86::CMP32i32: return convert32i32to32ri8(Inst, X86::CMP32ri8, true);
|
||||
case X86::CMP64i32: return convert64i32to64ri8(Inst, X86::CMP64ri8, true);
|
||||
case X86::ADD16i16: return convert16i16to16ri8(Inst, X86::ADD16ri8);
|
||||
case X86::ADD32i32: return convert32i32to32ri8(Inst, X86::ADD32ri8);
|
||||
case X86::ADD64i32: return convert64i32to64ri8(Inst, X86::ADD64ri8);
|
||||
case X86::SUB16i16: return convert16i16to16ri8(Inst, X86::SUB16ri8);
|
||||
case X86::SUB32i32: return convert32i32to32ri8(Inst, X86::SUB32ri8);
|
||||
case X86::SUB64i32: return convert64i32to64ri8(Inst, X86::SUB64ri8);
|
||||
case X86::ADC16i16: return convert16i16to16ri8(Inst, X86::ADC16ri8);
|
||||
case X86::ADC32i32: return convert32i32to32ri8(Inst, X86::ADC32ri8);
|
||||
case X86::ADC64i32: return convert64i32to64ri8(Inst, X86::ADC64ri8);
|
||||
case X86::SBB16i16: return convert16i16to16ri8(Inst, X86::SBB16ri8);
|
||||
case X86::SBB32i32: return convert32i32to32ri8(Inst, X86::SBB32ri8);
|
||||
case X86::SBB64i32: return convert64i32to64ri8(Inst, X86::SBB64ri8);
|
||||
case X86::VMOVAPDrr:
|
||||
case X86::VMOVAPDYrr:
|
||||
case X86::VMOVAPSrr:
|
||||
|
@ -2981,3 +2981,34 @@ def : InstAlias<"xchg{l}\t{%eax, $src|$src, eax}",
|
||||
def : InstAlias<"xchg{l}\t{%eax, $src|$src, eax}",
|
||||
(XCHG32ar64 GR32_NOAX:$src), 0>, Requires<[In64BitMode]>;
|
||||
def : InstAlias<"xchg{q}\t{%rax, $src|$src, rax}", (XCHG64ar GR64:$src), 0>;
|
||||
|
||||
// These aliases exist to get the parser to prioritize matching 8-bit
|
||||
// immediate encodings over matching the implicit ax/eax/rax encodings. By
|
||||
// explicitly mentioning the A register here, these entries will be ordered
|
||||
// first due to the more explicit immediate type.
|
||||
def : InstAlias<"adc{w}\t{$imm, %ax|ax, $imm}", (ADC16ri8 AX, i16i8imm:$imm), 0>;
|
||||
def : InstAlias<"add{w}\t{$imm, %ax|ax, $imm}", (ADD16ri8 AX, i16i8imm:$imm), 0>;
|
||||
def : InstAlias<"and{w}\t{$imm, %ax|ax, $imm}", (AND16ri8 AX, i16i8imm:$imm), 0>;
|
||||
def : InstAlias<"cmp{w}\t{$imm, %ax|ax, $imm}", (CMP16ri8 AX, i16i8imm:$imm), 0>;
|
||||
def : InstAlias<"or{w}\t{$imm, %ax|ax, $imm}", (OR16ri8 AX, i16i8imm:$imm), 0>;
|
||||
def : InstAlias<"sbb{w}\t{$imm, %ax|ax, $imm}", (SBB16ri8 AX, i16i8imm:$imm), 0>;
|
||||
def : InstAlias<"sub{w}\t{$imm, %ax|ax, $imm}", (SUB16ri8 AX, i16i8imm:$imm), 0>;
|
||||
def : InstAlias<"xor{w}\t{$imm, %ax|ax, $imm}", (XOR16ri8 AX, i16i8imm:$imm), 0>;
|
||||
|
||||
def : InstAlias<"adc{l}\t{$imm, %eax|eax, $imm}", (ADC32ri8 EAX, i32i8imm:$imm), 0>;
|
||||
def : InstAlias<"add{l}\t{$imm, %eax|eax, $imm}", (ADD32ri8 EAX, i32i8imm:$imm), 0>;
|
||||
def : InstAlias<"and{l}\t{$imm, %eax|eax, $imm}", (AND32ri8 EAX, i32i8imm:$imm), 0>;
|
||||
def : InstAlias<"cmp{l}\t{$imm, %eax|eax, $imm}", (CMP32ri8 EAX, i32i8imm:$imm), 0>;
|
||||
def : InstAlias<"or{l}\t{$imm, %eax|eax, $imm}", (OR32ri8 EAX, i32i8imm:$imm), 0>;
|
||||
def : InstAlias<"sbb{l}\t{$imm, %eax|eax, $imm}", (SBB32ri8 EAX, i32i8imm:$imm), 0>;
|
||||
def : InstAlias<"sub{l}\t{$imm, %eax|eax, $imm}", (SUB32ri8 EAX, i32i8imm:$imm), 0>;
|
||||
def : InstAlias<"xor{l}\t{$imm, %eax|eax, $imm}", (XOR32ri8 EAX, i32i8imm:$imm), 0>;
|
||||
|
||||
def : InstAlias<"adc{q}\t{$imm, %rax|rax, $imm}", (ADC64ri8 RAX, i64i8imm:$imm), 0>;
|
||||
def : InstAlias<"add{q}\t{$imm, %rax|rax, $imm}", (ADD64ri8 RAX, i64i8imm:$imm), 0>;
|
||||
def : InstAlias<"and{q}\t{$imm, %rax|rax, $imm}", (AND64ri8 RAX, i64i8imm:$imm), 0>;
|
||||
def : InstAlias<"cmp{q}\t{$imm, %rax|rax, $imm}", (CMP64ri8 RAX, i64i8imm:$imm), 0>;
|
||||
def : InstAlias<"or{q}\t{$imm, %rax|rax, $imm}", (OR64ri8 RAX, i64i8imm:$imm), 0>;
|
||||
def : InstAlias<"sbb{q}\t{$imm, %rax|rax, $imm}", (SBB64ri8 RAX, i64i8imm:$imm), 0>;
|
||||
def : InstAlias<"sub{q}\t{$imm, %rax|rax, $imm}", (SUB64ri8 RAX, i64i8imm:$imm), 0>;
|
||||
def : InstAlias<"xor{q}\t{$imm, %rax|rax, $imm}", (XOR64ri8 RAX, i64i8imm:$imm), 0>;
|
||||
|
Loading…
Reference in New Issue
Block a user