forked from OSchip/llvm-project
[X86] Add NotMemoryFoldable to more instructions.
These include PUSH/POP instructions that don't match the manual table. This also includes CMPXCHG which we never emit in non-locked form. llvm-svn: 334479
This commit is contained in:
parent
51805de092
commit
5799e4df75
|
@ -1192,9 +1192,9 @@ def POP16r : I<0x58, AddRegFrm, (outs GR16:$reg), (ins), "pop{w}\t$reg", []>,
|
||||||
def POP32r : I<0x58, AddRegFrm, (outs GR32:$reg), (ins), "pop{l}\t$reg", []>,
|
def POP32r : I<0x58, AddRegFrm, (outs GR32:$reg), (ins), "pop{l}\t$reg", []>,
|
||||||
OpSize32, Requires<[Not64BitMode]>;
|
OpSize32, Requires<[Not64BitMode]>;
|
||||||
def POP16rmr: I<0x8F, MRM0r, (outs GR16:$reg), (ins), "pop{w}\t$reg", []>,
|
def POP16rmr: I<0x8F, MRM0r, (outs GR16:$reg), (ins), "pop{w}\t$reg", []>,
|
||||||
OpSize16;
|
OpSize16, NotMemoryFoldable;
|
||||||
def POP32rmr: I<0x8F, MRM0r, (outs GR32:$reg), (ins), "pop{l}\t$reg", []>,
|
def POP32rmr: I<0x8F, MRM0r, (outs GR32:$reg), (ins), "pop{l}\t$reg", []>,
|
||||||
OpSize32, Requires<[Not64BitMode]>;
|
OpSize32, Requires<[Not64BitMode]>, NotMemoryFoldable;
|
||||||
} // mayLoad, SchedRW
|
} // mayLoad, SchedRW
|
||||||
let mayStore = 1, mayLoad = 1, SchedRW = [WriteRMW] in {
|
let mayStore = 1, mayLoad = 1, SchedRW = [WriteRMW] in {
|
||||||
def POP16rmm: I<0x8F, MRM0m, (outs), (ins i16mem:$dst), "pop{w}\t$dst", []>,
|
def POP16rmm: I<0x8F, MRM0m, (outs), (ins i16mem:$dst), "pop{w}\t$dst", []>,
|
||||||
|
@ -1209,9 +1209,9 @@ def PUSH16r : I<0x50, AddRegFrm, (outs), (ins GR16:$reg), "push{w}\t$reg",[]>,
|
||||||
def PUSH32r : I<0x50, AddRegFrm, (outs), (ins GR32:$reg), "push{l}\t$reg",[]>,
|
def PUSH32r : I<0x50, AddRegFrm, (outs), (ins GR32:$reg), "push{l}\t$reg",[]>,
|
||||||
OpSize32, Requires<[Not64BitMode]>;
|
OpSize32, Requires<[Not64BitMode]>;
|
||||||
def PUSH16rmr: I<0xFF, MRM6r, (outs), (ins GR16:$reg), "push{w}\t$reg",[]>,
|
def PUSH16rmr: I<0xFF, MRM6r, (outs), (ins GR16:$reg), "push{w}\t$reg",[]>,
|
||||||
OpSize16;
|
OpSize16, NotMemoryFoldable;
|
||||||
def PUSH32rmr: I<0xFF, MRM6r, (outs), (ins GR32:$reg), "push{l}\t$reg",[]>,
|
def PUSH32rmr: I<0xFF, MRM6r, (outs), (ins GR32:$reg), "push{l}\t$reg",[]>,
|
||||||
OpSize32, Requires<[Not64BitMode]>;
|
OpSize32, Requires<[Not64BitMode]>, NotMemoryFoldable;
|
||||||
|
|
||||||
def PUSH16i8 : Ii8<0x6a, RawFrm, (outs), (ins i16i8imm:$imm),
|
def PUSH16i8 : Ii8<0x6a, RawFrm, (outs), (ins i16i8imm:$imm),
|
||||||
"push{w}\t$imm", []>, OpSize16;
|
"push{w}\t$imm", []>, OpSize16;
|
||||||
|
@ -1280,7 +1280,7 @@ let mayLoad = 1, SchedRW = [WriteLoad] in {
|
||||||
def POP64r : I<0x58, AddRegFrm, (outs GR64:$reg), (ins), "pop{q}\t$reg", []>,
|
def POP64r : I<0x58, AddRegFrm, (outs GR64:$reg), (ins), "pop{q}\t$reg", []>,
|
||||||
OpSize32, Requires<[In64BitMode]>;
|
OpSize32, Requires<[In64BitMode]>;
|
||||||
def POP64rmr: I<0x8F, MRM0r, (outs GR64:$reg), (ins), "pop{q}\t$reg", []>,
|
def POP64rmr: I<0x8F, MRM0r, (outs GR64:$reg), (ins), "pop{q}\t$reg", []>,
|
||||||
OpSize32, Requires<[In64BitMode]>;
|
OpSize32, Requires<[In64BitMode]>, NotMemoryFoldable;
|
||||||
} // mayLoad, SchedRW
|
} // mayLoad, SchedRW
|
||||||
let mayLoad = 1, mayStore = 1, SchedRW = [WriteRMW] in
|
let mayLoad = 1, mayStore = 1, SchedRW = [WriteRMW] in
|
||||||
def POP64rmm: I<0x8F, MRM0m, (outs), (ins i64mem:$dst), "pop{q}\t$dst", []>,
|
def POP64rmm: I<0x8F, MRM0m, (outs), (ins i64mem:$dst), "pop{q}\t$dst", []>,
|
||||||
|
@ -1289,7 +1289,7 @@ let mayStore = 1, SchedRW = [WriteStore] in {
|
||||||
def PUSH64r : I<0x50, AddRegFrm, (outs), (ins GR64:$reg), "push{q}\t$reg", []>,
|
def PUSH64r : I<0x50, AddRegFrm, (outs), (ins GR64:$reg), "push{q}\t$reg", []>,
|
||||||
OpSize32, Requires<[In64BitMode]>;
|
OpSize32, Requires<[In64BitMode]>;
|
||||||
def PUSH64rmr: I<0xFF, MRM6r, (outs), (ins GR64:$reg), "push{q}\t$reg", []>,
|
def PUSH64rmr: I<0xFF, MRM6r, (outs), (ins GR64:$reg), "push{q}\t$reg", []>,
|
||||||
OpSize32, Requires<[In64BitMode]>;
|
OpSize32, Requires<[In64BitMode]>, NotMemoryFoldable;
|
||||||
} // mayStore, SchedRW
|
} // mayStore, SchedRW
|
||||||
let mayLoad = 1, mayStore = 1, SchedRW = [WriteRMW] in {
|
let mayLoad = 1, mayStore = 1, SchedRW = [WriteRMW] in {
|
||||||
def PUSH64rmm: I<0xFF, MRM6m, (outs), (ins i64mem:$src), "push{q}\t$src", []>,
|
def PUSH64rmm: I<0xFF, MRM6m, (outs), (ins i64mem:$src), "push{q}\t$src", []>,
|
||||||
|
@ -2022,32 +2022,40 @@ def XADD64rm : RI<0xC1, MRMSrcMem, (outs GR64:$dst),
|
||||||
let SchedRW = [WriteALU], hasSideEffects = 0 in {
|
let SchedRW = [WriteALU], hasSideEffects = 0 in {
|
||||||
let Defs = [AL, EFLAGS], Uses = [AL] in
|
let Defs = [AL, EFLAGS], Uses = [AL] in
|
||||||
def CMPXCHG8rr : I<0xB0, MRMDestReg, (outs GR8:$dst), (ins GR8:$src),
|
def CMPXCHG8rr : I<0xB0, MRMDestReg, (outs GR8:$dst), (ins GR8:$src),
|
||||||
"cmpxchg{b}\t{$src, $dst|$dst, $src}", []>, TB;
|
"cmpxchg{b}\t{$src, $dst|$dst, $src}", []>, TB,
|
||||||
|
NotMemoryFoldable;
|
||||||
let Defs = [AX, EFLAGS], Uses = [AX] in
|
let Defs = [AX, EFLAGS], Uses = [AX] in
|
||||||
def CMPXCHG16rr : I<0xB1, MRMDestReg, (outs GR16:$dst), (ins GR16:$src),
|
def CMPXCHG16rr : I<0xB1, MRMDestReg, (outs GR16:$dst), (ins GR16:$src),
|
||||||
"cmpxchg{w}\t{$src, $dst|$dst, $src}", []>, TB, OpSize16;
|
"cmpxchg{w}\t{$src, $dst|$dst, $src}", []>, TB, OpSize16,
|
||||||
|
NotMemoryFoldable;
|
||||||
let Defs = [EAX, EFLAGS], Uses = [EAX] in
|
let Defs = [EAX, EFLAGS], Uses = [EAX] in
|
||||||
def CMPXCHG32rr : I<0xB1, MRMDestReg, (outs GR32:$dst), (ins GR32:$src),
|
def CMPXCHG32rr : I<0xB1, MRMDestReg, (outs GR32:$dst), (ins GR32:$src),
|
||||||
"cmpxchg{l}\t{$src, $dst|$dst, $src}", []>, TB, OpSize32;
|
"cmpxchg{l}\t{$src, $dst|$dst, $src}", []>, TB, OpSize32,
|
||||||
|
NotMemoryFoldable;
|
||||||
let Defs = [RAX, EFLAGS], Uses = [RAX] in
|
let Defs = [RAX, EFLAGS], Uses = [RAX] in
|
||||||
def CMPXCHG64rr : RI<0xB1, MRMDestReg, (outs GR64:$dst), (ins GR64:$src),
|
def CMPXCHG64rr : RI<0xB1, MRMDestReg, (outs GR64:$dst), (ins GR64:$src),
|
||||||
"cmpxchg{q}\t{$src, $dst|$dst, $src}", []>, TB;
|
"cmpxchg{q}\t{$src, $dst|$dst, $src}", []>, TB,
|
||||||
|
NotMemoryFoldable;
|
||||||
} // SchedRW, hasSideEffects
|
} // SchedRW, hasSideEffects
|
||||||
|
|
||||||
let SchedRW = [WriteALULd, WriteRMW], mayLoad = 1, mayStore = 1,
|
let SchedRW = [WriteALULd, WriteRMW], mayLoad = 1, mayStore = 1,
|
||||||
hasSideEffects = 0 in {
|
hasSideEffects = 0 in {
|
||||||
let Defs = [AL, EFLAGS], Uses = [AL] in
|
let Defs = [AL, EFLAGS], Uses = [AL] in
|
||||||
def CMPXCHG8rm : I<0xB0, MRMDestMem, (outs), (ins i8mem:$dst, GR8:$src),
|
def CMPXCHG8rm : I<0xB0, MRMDestMem, (outs), (ins i8mem:$dst, GR8:$src),
|
||||||
"cmpxchg{b}\t{$src, $dst|$dst, $src}", []>, TB;
|
"cmpxchg{b}\t{$src, $dst|$dst, $src}", []>, TB,
|
||||||
|
NotMemoryFoldable;
|
||||||
let Defs = [AX, EFLAGS], Uses = [AX] in
|
let Defs = [AX, EFLAGS], Uses = [AX] in
|
||||||
def CMPXCHG16rm : I<0xB1, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src),
|
def CMPXCHG16rm : I<0xB1, MRMDestMem, (outs), (ins i16mem:$dst, GR16:$src),
|
||||||
"cmpxchg{w}\t{$src, $dst|$dst, $src}", []>, TB, OpSize16;
|
"cmpxchg{w}\t{$src, $dst|$dst, $src}", []>, TB, OpSize16,
|
||||||
|
NotMemoryFoldable;
|
||||||
let Defs = [EAX, EFLAGS], Uses = [EAX] in
|
let Defs = [EAX, EFLAGS], Uses = [EAX] in
|
||||||
def CMPXCHG32rm : I<0xB1, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src),
|
def CMPXCHG32rm : I<0xB1, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src),
|
||||||
"cmpxchg{l}\t{$src, $dst|$dst, $src}", []>, TB, OpSize32;
|
"cmpxchg{l}\t{$src, $dst|$dst, $src}", []>, TB, OpSize32,
|
||||||
|
NotMemoryFoldable;
|
||||||
let Defs = [RAX, EFLAGS], Uses = [RAX] in
|
let Defs = [RAX, EFLAGS], Uses = [RAX] in
|
||||||
def CMPXCHG64rm : RI<0xB1, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
|
def CMPXCHG64rm : RI<0xB1, MRMDestMem, (outs), (ins i64mem:$dst, GR64:$src),
|
||||||
"cmpxchg{q}\t{$src, $dst|$dst, $src}", []>, TB;
|
"cmpxchg{q}\t{$src, $dst|$dst, $src}", []>, TB,
|
||||||
|
NotMemoryFoldable;
|
||||||
|
|
||||||
let Defs = [EAX, EDX, EFLAGS], Uses = [EAX, EBX, ECX, EDX] in
|
let Defs = [EAX, EDX, EFLAGS], Uses = [EAX, EBX, ECX, EDX] in
|
||||||
def CMPXCHG8B : I<0xC7, MRM1m, (outs), (ins i64mem:$dst),
|
def CMPXCHG8B : I<0xC7, MRM1m, (outs), (ins i64mem:$dst),
|
||||||
|
|
Loading…
Reference in New Issue