mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-02 10:33:53 +00:00
This patch adds X86 instruction itineraries, which were missed by the
original patch to add itineraries, to X86InstrArithmetc.td. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154320 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
92fc76c901
commit
f08c7abd15
@ -53,7 +53,7 @@ def MUL8r : I<0xF6, MRM4r, (outs), (ins GR8:$src), "mul{b}\t$src",
|
|||||||
// This probably ought to be moved to a def : Pat<> if the
|
// This probably ought to be moved to a def : Pat<> if the
|
||||||
// syntax can be accepted.
|
// syntax can be accepted.
|
||||||
[(set AL, (mul AL, GR8:$src)),
|
[(set AL, (mul AL, GR8:$src)),
|
||||||
(implicit EFLAGS)]>; // AL,AH = AL*GR8
|
(implicit EFLAGS)], IIC_MUL8>; // AL,AH = AL*GR8
|
||||||
|
|
||||||
let Defs = [AX,DX,EFLAGS], Uses = [AX], neverHasSideEffects = 1 in
|
let Defs = [AX,DX,EFLAGS], Uses = [AX], neverHasSideEffects = 1 in
|
||||||
def MUL16r : I<0xF7, MRM4r, (outs), (ins GR16:$src),
|
def MUL16r : I<0xF7, MRM4r, (outs), (ins GR16:$src),
|
||||||
@ -97,31 +97,32 @@ def MUL64m : RI<0xF7, MRM4m, (outs), (ins i64mem:$src),
|
|||||||
|
|
||||||
let neverHasSideEffects = 1 in {
|
let neverHasSideEffects = 1 in {
|
||||||
let Defs = [AL,EFLAGS,AX], Uses = [AL] in
|
let Defs = [AL,EFLAGS,AX], Uses = [AL] in
|
||||||
def IMUL8r : I<0xF6, MRM5r, (outs), (ins GR8:$src), "imul{b}\t$src", []>;
|
def IMUL8r : I<0xF6, MRM5r, (outs), (ins GR8:$src), "imul{b}\t$src", [],
|
||||||
// AL,AH = AL*GR8
|
IIC_IMUL8>; // AL,AH = AL*GR8
|
||||||
let Defs = [AX,DX,EFLAGS], Uses = [AX] in
|
let Defs = [AX,DX,EFLAGS], Uses = [AX] in
|
||||||
def IMUL16r : I<0xF7, MRM5r, (outs), (ins GR16:$src), "imul{w}\t$src", []>,
|
def IMUL16r : I<0xF7, MRM5r, (outs), (ins GR16:$src), "imul{w}\t$src", [],
|
||||||
OpSize; // AX,DX = AX*GR16
|
IIC_IMUL16_RR>, OpSize; // AX,DX = AX*GR16
|
||||||
let Defs = [EAX,EDX,EFLAGS], Uses = [EAX] in
|
let Defs = [EAX,EDX,EFLAGS], Uses = [EAX] in
|
||||||
def IMUL32r : I<0xF7, MRM5r, (outs), (ins GR32:$src), "imul{l}\t$src", []>;
|
def IMUL32r : I<0xF7, MRM5r, (outs), (ins GR32:$src), "imul{l}\t$src", [],
|
||||||
// EAX,EDX = EAX*GR32
|
IIC_IMUL32_RR>; // EAX,EDX = EAX*GR32
|
||||||
let Defs = [RAX,RDX,EFLAGS], Uses = [RAX] in
|
let Defs = [RAX,RDX,EFLAGS], Uses = [RAX] in
|
||||||
def IMUL64r : RI<0xF7, MRM5r, (outs), (ins GR64:$src), "imul{q}\t$src", []>;
|
def IMUL64r : RI<0xF7, MRM5r, (outs), (ins GR64:$src), "imul{q}\t$src", [],
|
||||||
// RAX,RDX = RAX*GR64
|
IIC_IMUL64_RR>; // RAX,RDX = RAX*GR64
|
||||||
|
|
||||||
let mayLoad = 1 in {
|
let mayLoad = 1 in {
|
||||||
let Defs = [AL,EFLAGS,AX], Uses = [AL] in
|
let Defs = [AL,EFLAGS,AX], Uses = [AL] in
|
||||||
def IMUL8m : I<0xF6, MRM5m, (outs), (ins i8mem :$src),
|
def IMUL8m : I<0xF6, MRM5m, (outs), (ins i8mem :$src),
|
||||||
"imul{b}\t$src", []>; // AL,AH = AL*[mem8]
|
"imul{b}\t$src", [], IIC_IMUL8>; // AL,AH = AL*[mem8]
|
||||||
let Defs = [AX,DX,EFLAGS], Uses = [AX] in
|
let Defs = [AX,DX,EFLAGS], Uses = [AX] in
|
||||||
def IMUL16m : I<0xF7, MRM5m, (outs), (ins i16mem:$src),
|
def IMUL16m : I<0xF7, MRM5m, (outs), (ins i16mem:$src),
|
||||||
"imul{w}\t$src", []>, OpSize; // AX,DX = AX*[mem16]
|
"imul{w}\t$src", [], IIC_IMUL16_MEM>, OpSize;
|
||||||
|
// AX,DX = AX*[mem16]
|
||||||
let Defs = [EAX,EDX,EFLAGS], Uses = [EAX] in
|
let Defs = [EAX,EDX,EFLAGS], Uses = [EAX] in
|
||||||
def IMUL32m : I<0xF7, MRM5m, (outs), (ins i32mem:$src),
|
def IMUL32m : I<0xF7, MRM5m, (outs), (ins i32mem:$src),
|
||||||
"imul{l}\t$src", []>; // EAX,EDX = EAX*[mem32]
|
"imul{l}\t$src", [], IIC_IMUL32_MEM>; // EAX,EDX = EAX*[mem32]
|
||||||
let Defs = [RAX,RDX,EFLAGS], Uses = [RAX] in
|
let Defs = [RAX,RDX,EFLAGS], Uses = [RAX] in
|
||||||
def IMUL64m : RI<0xF7, MRM5m, (outs), (ins i64mem:$src),
|
def IMUL64m : RI<0xF7, MRM5m, (outs), (ins i64mem:$src),
|
||||||
"imul{q}\t$src", []>; // RAX,RDX = RAX*[mem64]
|
"imul{q}\t$src", [], IIC_IMUL64>; // RAX,RDX = RAX*[mem64]
|
||||||
}
|
}
|
||||||
} // neverHasSideEffects
|
} // neverHasSideEffects
|
||||||
|
|
||||||
@ -639,10 +640,11 @@ class ITy<bits<8> opcode, Format f, X86TypeInfo typeinfo, dag outs, dag ins,
|
|||||||
|
|
||||||
// BinOpRR - Instructions like "add reg, reg, reg".
|
// BinOpRR - Instructions like "add reg, reg, reg".
|
||||||
class BinOpRR<bits<8> opcode, string mnemonic, X86TypeInfo typeinfo,
|
class BinOpRR<bits<8> opcode, string mnemonic, X86TypeInfo typeinfo,
|
||||||
dag outlist, list<dag> pattern, Format f = MRMDestReg>
|
dag outlist, list<dag> pattern, InstrItinClass itin,
|
||||||
|
Format f = MRMDestReg>
|
||||||
: ITy<opcode, f, typeinfo, outlist,
|
: ITy<opcode, f, typeinfo, outlist,
|
||||||
(ins typeinfo.RegClass:$src1, typeinfo.RegClass:$src2),
|
(ins typeinfo.RegClass:$src1, typeinfo.RegClass:$src2),
|
||||||
mnemonic, "{$src2, $src1|$src1, $src2}", pattern>;
|
mnemonic, "{$src2, $src1|$src1, $src2}", pattern, itin>;
|
||||||
|
|
||||||
// BinOpRR_R - Instructions like "add reg, reg, reg", where the pattern has
|
// BinOpRR_R - Instructions like "add reg, reg, reg", where the pattern has
|
||||||
// just a regclass (no eflags) as a result.
|
// just a regclass (no eflags) as a result.
|
||||||
@ -650,7 +652,8 @@ class BinOpRR_R<bits<8> opcode, string mnemonic, X86TypeInfo typeinfo,
|
|||||||
SDNode opnode>
|
SDNode opnode>
|
||||||
: BinOpRR<opcode, mnemonic, typeinfo, (outs typeinfo.RegClass:$dst),
|
: BinOpRR<opcode, mnemonic, typeinfo, (outs typeinfo.RegClass:$dst),
|
||||||
[(set typeinfo.RegClass:$dst,
|
[(set typeinfo.RegClass:$dst,
|
||||||
(opnode typeinfo.RegClass:$src1, typeinfo.RegClass:$src2))]>;
|
(opnode typeinfo.RegClass:$src1, typeinfo.RegClass:$src2))],
|
||||||
|
IIC_BIN_NONMEM>;
|
||||||
|
|
||||||
// BinOpRR_F - Instructions like "cmp reg, Reg", where the pattern has
|
// BinOpRR_F - Instructions like "cmp reg, Reg", where the pattern has
|
||||||
// just a EFLAGS as a result.
|
// just a EFLAGS as a result.
|
||||||
@ -659,7 +662,7 @@ class BinOpRR_F<bits<8> opcode, string mnemonic, X86TypeInfo typeinfo,
|
|||||||
: BinOpRR<opcode, mnemonic, typeinfo, (outs),
|
: BinOpRR<opcode, mnemonic, typeinfo, (outs),
|
||||||
[(set EFLAGS,
|
[(set EFLAGS,
|
||||||
(opnode typeinfo.RegClass:$src1, typeinfo.RegClass:$src2))],
|
(opnode typeinfo.RegClass:$src1, typeinfo.RegClass:$src2))],
|
||||||
f>;
|
IIC_BIN_NONMEM, f>;
|
||||||
|
|
||||||
// BinOpRR_RF - Instructions like "add reg, reg, reg", where the pattern has
|
// BinOpRR_RF - Instructions like "add reg, reg, reg", where the pattern has
|
||||||
// both a regclass and EFLAGS as a result.
|
// both a regclass and EFLAGS as a result.
|
||||||
@ -667,7 +670,8 @@ class BinOpRR_RF<bits<8> opcode, string mnemonic, X86TypeInfo typeinfo,
|
|||||||
SDNode opnode>
|
SDNode opnode>
|
||||||
: BinOpRR<opcode, mnemonic, typeinfo, (outs typeinfo.RegClass:$dst),
|
: BinOpRR<opcode, mnemonic, typeinfo, (outs typeinfo.RegClass:$dst),
|
||||||
[(set typeinfo.RegClass:$dst, EFLAGS,
|
[(set typeinfo.RegClass:$dst, EFLAGS,
|
||||||
(opnode typeinfo.RegClass:$src1, typeinfo.RegClass:$src2))]>;
|
(opnode typeinfo.RegClass:$src1, typeinfo.RegClass:$src2))],
|
||||||
|
IIC_BIN_NONMEM>;
|
||||||
|
|
||||||
// BinOpRR_RFF - Instructions like "adc reg, reg, reg", where the pattern has
|
// BinOpRR_RFF - Instructions like "adc reg, reg, reg", where the pattern has
|
||||||
// both a regclass and EFLAGS as a result, and has EFLAGS as input.
|
// both a regclass and EFLAGS as a result, and has EFLAGS as input.
|
||||||
@ -676,14 +680,14 @@ class BinOpRR_RFF<bits<8> opcode, string mnemonic, X86TypeInfo typeinfo,
|
|||||||
: BinOpRR<opcode, mnemonic, typeinfo, (outs typeinfo.RegClass:$dst),
|
: BinOpRR<opcode, mnemonic, typeinfo, (outs typeinfo.RegClass:$dst),
|
||||||
[(set typeinfo.RegClass:$dst, EFLAGS,
|
[(set typeinfo.RegClass:$dst, EFLAGS,
|
||||||
(opnode typeinfo.RegClass:$src1, typeinfo.RegClass:$src2,
|
(opnode typeinfo.RegClass:$src1, typeinfo.RegClass:$src2,
|
||||||
EFLAGS))]>;
|
EFLAGS))], IIC_BIN_NONMEM>;
|
||||||
|
|
||||||
// BinOpRR_Rev - Instructions like "add reg, reg, reg" (reversed encoding).
|
// BinOpRR_Rev - Instructions like "add reg, reg, reg" (reversed encoding).
|
||||||
class BinOpRR_Rev<bits<8> opcode, string mnemonic, X86TypeInfo typeinfo>
|
class BinOpRR_Rev<bits<8> opcode, string mnemonic, X86TypeInfo typeinfo>
|
||||||
: ITy<opcode, MRMSrcReg, typeinfo,
|
: ITy<opcode, MRMSrcReg, typeinfo,
|
||||||
(outs typeinfo.RegClass:$dst),
|
(outs typeinfo.RegClass:$dst),
|
||||||
(ins typeinfo.RegClass:$src1, typeinfo.RegClass:$src2),
|
(ins typeinfo.RegClass:$src1, typeinfo.RegClass:$src2),
|
||||||
mnemonic, "{$src2, $dst|$dst, $src2}", []> {
|
mnemonic, "{$src2, $dst|$dst, $src2}", [], IIC_BIN_NONMEM> {
|
||||||
// The disassembler should know about this, but not the asmparser.
|
// The disassembler should know about this, but not the asmparser.
|
||||||
let isCodeGenOnly = 1;
|
let isCodeGenOnly = 1;
|
||||||
}
|
}
|
||||||
@ -692,7 +696,7 @@ class BinOpRR_Rev<bits<8> opcode, string mnemonic, X86TypeInfo typeinfo>
|
|||||||
class BinOpRR_F_Rev<bits<8> opcode, string mnemonic, X86TypeInfo typeinfo>
|
class BinOpRR_F_Rev<bits<8> opcode, string mnemonic, X86TypeInfo typeinfo>
|
||||||
: ITy<opcode, MRMSrcReg, typeinfo, (outs),
|
: ITy<opcode, MRMSrcReg, typeinfo, (outs),
|
||||||
(ins typeinfo.RegClass:$src1, typeinfo.RegClass:$src2),
|
(ins typeinfo.RegClass:$src1, typeinfo.RegClass:$src2),
|
||||||
mnemonic, "{$src2, $src1|$src1, $src2}", []> {
|
mnemonic, "{$src2, $src1|$src1, $src2}", [], IIC_BIN_NONMEM> {
|
||||||
// The disassembler should know about this, but not the asmparser.
|
// The disassembler should know about this, but not the asmparser.
|
||||||
let isCodeGenOnly = 1;
|
let isCodeGenOnly = 1;
|
||||||
}
|
}
|
||||||
@ -702,7 +706,7 @@ class BinOpRM<bits<8> opcode, string mnemonic, X86TypeInfo typeinfo,
|
|||||||
dag outlist, list<dag> pattern>
|
dag outlist, list<dag> pattern>
|
||||||
: ITy<opcode, MRMSrcMem, typeinfo, outlist,
|
: ITy<opcode, MRMSrcMem, typeinfo, outlist,
|
||||||
(ins typeinfo.RegClass:$src1, typeinfo.MemOperand:$src2),
|
(ins typeinfo.RegClass:$src1, typeinfo.MemOperand:$src2),
|
||||||
mnemonic, "{$src2, $src1|$src1, $src2}", pattern, IIC_BIN_MEM>;
|
mnemonic, "{$src2, $src1|$src1, $src2}", pattern, IIC_BIN_NONMEM>;
|
||||||
|
|
||||||
// BinOpRM_R - Instructions like "add reg, reg, [mem]".
|
// BinOpRM_R - Instructions like "add reg, reg, [mem]".
|
||||||
class BinOpRM_R<bits<8> opcode, string mnemonic, X86TypeInfo typeinfo,
|
class BinOpRM_R<bits<8> opcode, string mnemonic, X86TypeInfo typeinfo,
|
||||||
@ -738,7 +742,7 @@ class BinOpRI<bits<8> opcode, string mnemonic, X86TypeInfo typeinfo,
|
|||||||
Format f, dag outlist, list<dag> pattern>
|
Format f, dag outlist, list<dag> pattern>
|
||||||
: ITy<opcode, f, typeinfo, outlist,
|
: ITy<opcode, f, typeinfo, outlist,
|
||||||
(ins typeinfo.RegClass:$src1, typeinfo.ImmOperand:$src2),
|
(ins typeinfo.RegClass:$src1, typeinfo.ImmOperand:$src2),
|
||||||
mnemonic, "{$src2, $src1|$src1, $src2}", pattern> {
|
mnemonic, "{$src2, $src1|$src1, $src2}", pattern, IIC_BIN_NONMEM> {
|
||||||
let ImmT = typeinfo.ImmEncoding;
|
let ImmT = typeinfo.ImmEncoding;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -762,7 +766,6 @@ class BinOpRI_RF<bits<8> opcode, string mnemonic, X86TypeInfo typeinfo,
|
|||||||
: BinOpRI<opcode, mnemonic, typeinfo, f, (outs typeinfo.RegClass:$dst),
|
: BinOpRI<opcode, mnemonic, typeinfo, f, (outs typeinfo.RegClass:$dst),
|
||||||
[(set typeinfo.RegClass:$dst, EFLAGS,
|
[(set typeinfo.RegClass:$dst, EFLAGS,
|
||||||
(opnode typeinfo.RegClass:$src1, typeinfo.ImmOperator:$src2))]>;
|
(opnode typeinfo.RegClass:$src1, typeinfo.ImmOperator:$src2))]>;
|
||||||
|
|
||||||
// BinOpRI_RFF - Instructions like "adc reg, reg, imm".
|
// BinOpRI_RFF - Instructions like "adc reg, reg, imm".
|
||||||
class BinOpRI_RFF<bits<8> opcode, string mnemonic, X86TypeInfo typeinfo,
|
class BinOpRI_RFF<bits<8> opcode, string mnemonic, X86TypeInfo typeinfo,
|
||||||
SDNode opnode, Format f>
|
SDNode opnode, Format f>
|
||||||
@ -776,7 +779,7 @@ class BinOpRI8<bits<8> opcode, string mnemonic, X86TypeInfo typeinfo,
|
|||||||
Format f, dag outlist, list<dag> pattern>
|
Format f, dag outlist, list<dag> pattern>
|
||||||
: ITy<opcode, f, typeinfo, outlist,
|
: ITy<opcode, f, typeinfo, outlist,
|
||||||
(ins typeinfo.RegClass:$src1, typeinfo.Imm8Operand:$src2),
|
(ins typeinfo.RegClass:$src1, typeinfo.Imm8Operand:$src2),
|
||||||
mnemonic, "{$src2, $src1|$src1, $src2}", pattern> {
|
mnemonic, "{$src2, $src1|$src1, $src2}", pattern, IIC_BIN_NONMEM> {
|
||||||
let ImmT = Imm8; // Always 8-bit immediate.
|
let ImmT = Imm8; // Always 8-bit immediate.
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -853,7 +856,6 @@ class BinOpMI_RMW<string mnemonic, X86TypeInfo typeinfo,
|
|||||||
[(store (opnode (typeinfo.VT (load addr:$dst)),
|
[(store (opnode (typeinfo.VT (load addr:$dst)),
|
||||||
typeinfo.ImmOperator:$src), addr:$dst),
|
typeinfo.ImmOperator:$src), addr:$dst),
|
||||||
(implicit EFLAGS)]>;
|
(implicit EFLAGS)]>;
|
||||||
|
|
||||||
// BinOpMI_RMW_FF - Instructions like "adc [mem], imm".
|
// BinOpMI_RMW_FF - Instructions like "adc [mem], imm".
|
||||||
class BinOpMI_RMW_FF<string mnemonic, X86TypeInfo typeinfo,
|
class BinOpMI_RMW_FF<string mnemonic, X86TypeInfo typeinfo,
|
||||||
SDNode opnode, Format f>
|
SDNode opnode, Format f>
|
||||||
@ -1219,12 +1221,12 @@ let neverHasSideEffects = 1 in {
|
|||||||
let isCommutable = 1 in
|
let isCommutable = 1 in
|
||||||
def rr : I<0xF6, MRMSrcReg, (outs RC:$dst1, RC:$dst2), (ins RC:$src),
|
def rr : I<0xF6, MRMSrcReg, (outs RC:$dst1, RC:$dst2), (ins RC:$src),
|
||||||
!strconcat(mnemonic, "\t{$src, $dst2, $dst1|$dst1, $dst2, $src}"),
|
!strconcat(mnemonic, "\t{$src, $dst2, $dst1|$dst1, $dst2, $src}"),
|
||||||
[]>, T8XD, VEX_4V;
|
[], IIC_MUL8>, T8XD, VEX_4V;
|
||||||
|
|
||||||
let mayLoad = 1 in
|
let mayLoad = 1 in
|
||||||
def rm : I<0xF6, MRMSrcMem, (outs RC:$dst1, RC:$dst2), (ins x86memop:$src),
|
def rm : I<0xF6, MRMSrcMem, (outs RC:$dst1, RC:$dst2), (ins x86memop:$src),
|
||||||
!strconcat(mnemonic, "\t{$src, $dst2, $dst1|$dst1, $dst2, $src}"),
|
!strconcat(mnemonic, "\t{$src, $dst2, $dst1|$dst1, $dst2, $src}"),
|
||||||
[]>, T8XD, VEX_4V;
|
[], IIC_MUL8>, T8XD, VEX_4V;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user