forked from OSchip/llvm-project
[X86] Add 'Requires<[In64BitMode]>' to a bunch of instructions that only have memory and immediate operands.
The asm parser wasn't preventing these from being accepted in 32-bit mode. Instructions that use a GR64 register are protected by the parser rejecting the register in 32-bit mode. llvm-svn: 320846
This commit is contained in:
parent
914b1d524c
commit
23c348850f
|
|
@ -104,7 +104,8 @@ def MUL32m : I<0xF7, MRM4m, (outs), (ins i32mem:$src),
|
|||
// RAX,RDX = RAX*[mem64]
|
||||
let Defs = [RAX,RDX,EFLAGS], Uses = [RAX] in
|
||||
def MUL64m : RI<0xF7, MRM4m, (outs), (ins i64mem:$src),
|
||||
"mul{q}\t$src", [], IIC_MUL64>, SchedLoadReg<WriteIMulLd>;
|
||||
"mul{q}\t$src", [], IIC_MUL64>, SchedLoadReg<WriteIMulLd>,
|
||||
Requires<[In64BitMode]>;
|
||||
}
|
||||
|
||||
let hasSideEffects = 0 in {
|
||||
|
|
@ -143,7 +144,8 @@ def IMUL32m : I<0xF7, MRM5m, (outs), (ins i32mem:$src),
|
|||
// RAX,RDX = RAX*[mem64]
|
||||
let Defs = [RAX,RDX,EFLAGS], Uses = [RAX] in
|
||||
def IMUL64m : RI<0xF7, MRM5m, (outs), (ins i64mem:$src),
|
||||
"imul{q}\t$src", [], IIC_IMUL64>, SchedLoadReg<WriteIMulLd>;
|
||||
"imul{q}\t$src", [], IIC_IMUL64>, SchedLoadReg<WriteIMulLd>,
|
||||
Requires<[In64BitMode]>;
|
||||
}
|
||||
} // hasSideEffects
|
||||
|
||||
|
|
@ -326,7 +328,7 @@ def DIV32m : I<0xF7, MRM6m, (outs), (ins i32mem:$src),
|
|||
let Defs = [RAX,RDX,EFLAGS], Uses = [RAX,RDX] in
|
||||
def DIV64m : RI<0xF7, MRM6m, (outs), (ins i64mem:$src),
|
||||
"div{q}\t$src", [], IIC_DIV64>,
|
||||
SchedLoadReg<WriteIDivLd>;
|
||||
SchedLoadReg<WriteIDivLd>, Requires<[In64BitMode]>;
|
||||
}
|
||||
|
||||
// Signed division/remainder.
|
||||
|
|
@ -362,7 +364,7 @@ def IDIV32m: I<0xF7, MRM7m, (outs), (ins i32mem:$src),
|
|||
let Defs = [RAX,RDX,EFLAGS], Uses = [RAX,RDX] in // RDX:RAX/[mem64] = RAX,RDX
|
||||
def IDIV64m: RI<0xF7, MRM7m, (outs), (ins i64mem:$src),
|
||||
"idiv{q}\t$src", [], IIC_IDIV64>,
|
||||
SchedLoadReg<WriteIDivLd>;
|
||||
SchedLoadReg<WriteIDivLd>, Requires<[In64BitMode]>;
|
||||
}
|
||||
} // hasSideEffects = 0
|
||||
|
||||
|
|
@ -407,7 +409,8 @@ def NEG32m : I<0xF7, MRM3m, (outs), (ins i32mem:$dst),
|
|||
(implicit EFLAGS)], IIC_UNARY_MEM>, OpSize32;
|
||||
def NEG64m : RI<0xF7, MRM3m, (outs), (ins i64mem:$dst), "neg{q}\t$dst",
|
||||
[(store (ineg (loadi64 addr:$dst)), addr:$dst),
|
||||
(implicit EFLAGS)], IIC_UNARY_MEM>;
|
||||
(implicit EFLAGS)], IIC_UNARY_MEM>,
|
||||
Requires<[In64BitMode]>;
|
||||
} // SchedRW
|
||||
} // Defs = [EFLAGS]
|
||||
|
||||
|
|
@ -444,7 +447,8 @@ def NOT32m : I<0xF7, MRM2m, (outs), (ins i32mem:$dst),
|
|||
[(store (not (loadi32 addr:$dst)), addr:$dst)], IIC_UNARY_MEM>,
|
||||
OpSize32;
|
||||
def NOT64m : RI<0xF7, MRM2m, (outs), (ins i64mem:$dst), "not{q}\t$dst",
|
||||
[(store (not (loadi64 addr:$dst)), addr:$dst)], IIC_UNARY_MEM>;
|
||||
[(store (not (loadi64 addr:$dst)), addr:$dst)], IIC_UNARY_MEM>,
|
||||
Requires<[In64BitMode]>;
|
||||
} // SchedRW
|
||||
} // CodeSize
|
||||
|
||||
|
|
@ -481,7 +485,8 @@ def INC32r_alt : I<0x40, AddRegFrm, (outs GR32:$dst), (ins GR32:$src1),
|
|||
} // CodeSize = 1, hasSideEffects = 0
|
||||
} // Constraints = "$src1 = $dst", SchedRW
|
||||
|
||||
let CodeSize = 2, SchedRW = [WriteALULd, WriteRMW], Predicates = [UseIncDec] in {
|
||||
let CodeSize = 2, SchedRW = [WriteALULd, WriteRMW] in {
|
||||
let Predicates = [UseIncDec] in {
|
||||
def INC8m : I<0xFE, MRM0m, (outs), (ins i8mem :$dst), "inc{b}\t$dst",
|
||||
[(store (add (loadi8 addr:$dst), 1), addr:$dst),
|
||||
(implicit EFLAGS)], IIC_UNARY_MEM>;
|
||||
|
|
@ -491,9 +496,12 @@ let CodeSize = 2, SchedRW = [WriteALULd, WriteRMW], Predicates = [UseIncDec] in
|
|||
def INC32m : I<0xFF, MRM0m, (outs), (ins i32mem:$dst), "inc{l}\t$dst",
|
||||
[(store (add (loadi32 addr:$dst), 1), addr:$dst),
|
||||
(implicit EFLAGS)], IIC_UNARY_MEM>, OpSize32;
|
||||
} // Predicates
|
||||
let Predicates = [UseIncDec, In64BitMode] in {
|
||||
def INC64m : RI<0xFF, MRM0m, (outs), (ins i64mem:$dst), "inc{q}\t$dst",
|
||||
[(store (add (loadi64 addr:$dst), 1), addr:$dst),
|
||||
(implicit EFLAGS)], IIC_UNARY_MEM>;
|
||||
} // Predicates
|
||||
} // CodeSize = 2, SchedRW
|
||||
|
||||
let Constraints = "$src1 = $dst", SchedRW = [WriteALU] in {
|
||||
|
|
@ -528,7 +536,8 @@ def DEC32r_alt : I<0x48, AddRegFrm, (outs GR32:$dst), (ins GR32:$src1),
|
|||
} // Constraints = "$src1 = $dst", SchedRW
|
||||
|
||||
|
||||
let CodeSize = 2, SchedRW = [WriteALULd, WriteRMW], Predicates = [UseIncDec] in {
|
||||
let CodeSize = 2, SchedRW = [WriteALULd, WriteRMW] in {
|
||||
let Predicates = [UseIncDec] in {
|
||||
def DEC8m : I<0xFE, MRM1m, (outs), (ins i8mem :$dst), "dec{b}\t$dst",
|
||||
[(store (add (loadi8 addr:$dst), -1), addr:$dst),
|
||||
(implicit EFLAGS)], IIC_UNARY_MEM>;
|
||||
|
|
@ -538,9 +547,12 @@ let CodeSize = 2, SchedRW = [WriteALULd, WriteRMW], Predicates = [UseIncDec] in
|
|||
def DEC32m : I<0xFF, MRM1m, (outs), (ins i32mem:$dst), "dec{l}\t$dst",
|
||||
[(store (add (loadi32 addr:$dst), -1), addr:$dst),
|
||||
(implicit EFLAGS)], IIC_UNARY_MEM>, OpSize32;
|
||||
} // Predicates
|
||||
let Predicates = [UseIncDec, In64BitMode] in {
|
||||
def DEC64m : RI<0xFF, MRM1m, (outs), (ins i64mem:$dst), "dec{q}\t$dst",
|
||||
[(store (add (loadi64 addr:$dst), -1), addr:$dst),
|
||||
(implicit EFLAGS)], IIC_UNARY_MEM>;
|
||||
} // Predicates
|
||||
} // CodeSize = 2, SchedRW
|
||||
} // Defs = [EFLAGS]
|
||||
|
||||
|
|
@ -992,11 +1004,13 @@ multiclass ArithBinOp_RF<bits<8> BaseOpc, bits<8> BaseOpc2, bits<8> BaseOpc4,
|
|||
// first so that they are slightly preferred to the mi forms.
|
||||
def NAME#16mi8 : BinOpMI8_RMW<mnemonic, Xi16, opnode, MemMRM>;
|
||||
def NAME#32mi8 : BinOpMI8_RMW<mnemonic, Xi32, opnode, MemMRM>;
|
||||
let Predicates = [In64BitMode] in
|
||||
def NAME#64mi8 : BinOpMI8_RMW<mnemonic, Xi64, opnode, MemMRM>;
|
||||
|
||||
def NAME#8mi : BinOpMI_RMW<0x80, mnemonic, Xi8 , opnode, MemMRM>;
|
||||
def NAME#16mi : BinOpMI_RMW<0x80, mnemonic, Xi16, opnode, MemMRM>;
|
||||
def NAME#32mi : BinOpMI_RMW<0x80, mnemonic, Xi32, opnode, MemMRM>;
|
||||
let Predicates = [In64BitMode] in
|
||||
def NAME#64mi32 : BinOpMI_RMW<0x80, mnemonic, Xi64, opnode, MemMRM>;
|
||||
|
||||
// These are for the disassembler since 0x82 opcode behaves like 0x80, but
|
||||
|
|
@ -1075,11 +1089,13 @@ multiclass ArithBinOp_RFF<bits<8> BaseOpc, bits<8> BaseOpc2, bits<8> BaseOpc4,
|
|||
// first so that they are slightly preferred to the mi forms.
|
||||
def NAME#16mi8 : BinOpMI8_RMW_FF<mnemonic, Xi16, opnode, MemMRM>;
|
||||
def NAME#32mi8 : BinOpMI8_RMW_FF<mnemonic, Xi32, opnode, MemMRM>;
|
||||
let Predicates = [In64BitMode] in
|
||||
def NAME#64mi8 : BinOpMI8_RMW_FF<mnemonic, Xi64, opnode, MemMRM>;
|
||||
|
||||
def NAME#8mi : BinOpMI_RMW_FF<0x80, mnemonic, Xi8 , opnode, MemMRM>;
|
||||
def NAME#16mi : BinOpMI_RMW_FF<0x80, mnemonic, Xi16, opnode, MemMRM>;
|
||||
def NAME#32mi : BinOpMI_RMW_FF<0x80, mnemonic, Xi32, opnode, MemMRM>;
|
||||
let Predicates = [In64BitMode] in
|
||||
def NAME#64mi32 : BinOpMI_RMW_FF<0x80, mnemonic, Xi64, opnode, MemMRM>;
|
||||
|
||||
// These are for the disassembler since 0x82 opcode behaves like 0x80, but
|
||||
|
|
@ -1154,11 +1170,13 @@ multiclass ArithBinOp_F<bits<8> BaseOpc, bits<8> BaseOpc2, bits<8> BaseOpc4,
|
|||
// first so that they are slightly preferred to the mi forms.
|
||||
def NAME#16mi8 : BinOpMI8_F<mnemonic, Xi16, opnode, MemMRM>;
|
||||
def NAME#32mi8 : BinOpMI8_F<mnemonic, Xi32, opnode, MemMRM>;
|
||||
let Predicates = [In64BitMode] in
|
||||
def NAME#64mi8 : BinOpMI8_F<mnemonic, Xi64, opnode, MemMRM>;
|
||||
|
||||
def NAME#8mi : BinOpMI_F<0x80, mnemonic, Xi8 , opnode, MemMRM>;
|
||||
def NAME#16mi : BinOpMI_F<0x80, mnemonic, Xi16, opnode, MemMRM>;
|
||||
def NAME#32mi : BinOpMI_F<0x80, mnemonic, Xi32, opnode, MemMRM>;
|
||||
let Predicates = [In64BitMode] in
|
||||
def NAME#64mi32 : BinOpMI_F<0x80, mnemonic, Xi64, opnode, MemMRM>;
|
||||
|
||||
// These are for the disassembler since 0x82 opcode behaves like 0x80, but
|
||||
|
|
@ -1231,11 +1249,13 @@ let isCompare = 1 in {
|
|||
def TEST8ri : BinOpRI_F<0xF6, "test", Xi8 , X86testpat, MRM0r>;
|
||||
def TEST16ri : BinOpRI_F<0xF6, "test", Xi16, X86testpat, MRM0r>;
|
||||
def TEST32ri : BinOpRI_F<0xF6, "test", Xi32, X86testpat, MRM0r>;
|
||||
let Predicates = [In64BitMode] in
|
||||
def TEST64ri32 : BinOpRI_F<0xF6, "test", Xi64, X86testpat, MRM0r>;
|
||||
|
||||
def TEST8mi : BinOpMI_F<0xF6, "test", Xi8 , X86testpat, MRM0m>;
|
||||
def TEST16mi : BinOpMI_F<0xF6, "test", Xi16, X86testpat, MRM0m>;
|
||||
def TEST32mi : BinOpMI_F<0xF6, "test", Xi32, X86testpat, MRM0m>;
|
||||
let Predicates = [In64BitMode] in
|
||||
def TEST64mi32 : BinOpMI_F<0xF6, "test", Xi64, X86testpat, MRM0m>;
|
||||
|
||||
// When testing the result of EXTRACT_SUBREG sub_8bit_hi, make sure the
|
||||
|
|
|
|||
|
|
@ -1124,14 +1124,16 @@ let hasSideEffects = 0, SchedRW = [WriteZero] in {
|
|||
def NOOPL : I<0x1f, MRMXm, (outs), (ins i32mem:$zero),
|
||||
"nop{l}\t$zero", [], IIC_NOP>, TB, OpSize32;
|
||||
def NOOPQ : RI<0x1f, MRMXm, (outs), (ins i64mem:$zero),
|
||||
"nop{q}\t$zero", [], IIC_NOP>, TB;
|
||||
"nop{q}\t$zero", [], IIC_NOP>, TB,
|
||||
Requires<[In64BitMode]>;
|
||||
// Also allow register so we can assemble/disassemble
|
||||
def NOOPWr : I<0x1f, MRMXr, (outs), (ins GR16:$zero),
|
||||
"nop{w}\t$zero", [], IIC_NOP>, TB, OpSize16;
|
||||
def NOOPLr : I<0x1f, MRMXr, (outs), (ins GR32:$zero),
|
||||
"nop{l}\t$zero", [], IIC_NOP>, TB, OpSize32;
|
||||
def NOOPQr : RI<0x1f, MRMXr, (outs), (ins GR64:$zero),
|
||||
"nop{q}\t$zero", [], IIC_NOP>, TB;
|
||||
"nop{q}\t$zero", [], IIC_NOP>, TB,
|
||||
Requires<[In64BitMode]>;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1486,7 +1488,8 @@ def MOV32mi : Ii32<0xC7, MRM0m, (outs), (ins i32mem:$dst, i32imm:$src),
|
|||
[(store (i32 imm32_su:$src), addr:$dst)], IIC_MOV_MEM>, OpSize32;
|
||||
def MOV64mi32 : RIi32S<0xC7, MRM0m, (outs), (ins i64mem:$dst, i64i32imm:$src),
|
||||
"mov{q}\t{$src, $dst|$dst, $src}",
|
||||
[(store i64immSExt32_su:$src, addr:$dst)], IIC_MOV_MEM>;
|
||||
[(store i64immSExt32_su:$src, addr:$dst)], IIC_MOV_MEM>,
|
||||
Requires<[In64BitMode]>;
|
||||
} // SchedRW
|
||||
|
||||
let hasSideEffects = 0 in {
|
||||
|
|
@ -1746,7 +1749,8 @@ def BT32mi8 : Ii8<0xBA, MRM4m, (outs), (ins i32mem:$src1, i32i8imm:$src2),
|
|||
def BT64mi8 : RIi8<0xBA, MRM4m, (outs), (ins i64mem:$src1, i64i8imm:$src2),
|
||||
"bt{q}\t{$src2, $src1|$src1, $src2}",
|
||||
[(set EFLAGS, (X86bt (loadi64 addr:$src1),
|
||||
i64immSExt8:$src2))], IIC_BT_MI>, TB;
|
||||
i64immSExt8:$src2))], IIC_BT_MI>, TB,
|
||||
Requires<[In64BitMode]>;
|
||||
} // SchedRW
|
||||
|
||||
let hasSideEffects = 0 in {
|
||||
|
|
@ -1793,7 +1797,8 @@ def BTC32mi8 : Ii8<0xBA, MRM7m, (outs), (ins i32mem:$src1, i32i8imm:$src2),
|
|||
"btc{l}\t{$src2, $src1|$src1, $src2}", [], IIC_BTX_MI>,
|
||||
OpSize32, TB;
|
||||
def BTC64mi8 : RIi8<0xBA, MRM7m, (outs), (ins i64mem:$src1, i64i8imm:$src2),
|
||||
"btc{q}\t{$src2, $src1|$src1, $src2}", [], IIC_BTX_MI>, TB;
|
||||
"btc{q}\t{$src2, $src1|$src1, $src2}", [], IIC_BTX_MI>, TB,
|
||||
Requires<[In64BitMode]>;
|
||||
}
|
||||
|
||||
let SchedRW = [WriteALU], Constraints = "$src1 = $dst" in {
|
||||
|
|
@ -1838,7 +1843,8 @@ def BTR32mi8 : Ii8<0xBA, MRM6m, (outs), (ins i32mem:$src1, i32i8imm:$src2),
|
|||
"btr{l}\t{$src2, $src1|$src1, $src2}", [], IIC_BTX_MI>,
|
||||
OpSize32, TB;
|
||||
def BTR64mi8 : RIi8<0xBA, MRM6m, (outs), (ins i64mem:$src1, i64i8imm:$src2),
|
||||
"btr{q}\t{$src2, $src1|$src1, $src2}", [], IIC_BTX_MI>, TB;
|
||||
"btr{q}\t{$src2, $src1|$src1, $src2}", [], IIC_BTX_MI>, TB,
|
||||
Requires<[In64BitMode]>;
|
||||
}
|
||||
|
||||
let SchedRW = [WriteALU], Constraints = "$src1 = $dst" in {
|
||||
|
|
@ -1884,7 +1890,8 @@ def BTS32mi8 : Ii8<0xBA, MRM5m, (outs), (ins i32mem:$src1, i32i8imm:$src2),
|
|||
"bts{l}\t{$src2, $src1|$src1, $src2}", [], IIC_BTX_MI>,
|
||||
OpSize32, TB;
|
||||
def BTS64mi8 : RIi8<0xBA, MRM5m, (outs), (ins i64mem:$src1, i64i8imm:$src2),
|
||||
"bts{q}\t{$src2, $src1|$src1, $src2}", [], IIC_BTX_MI>, TB;
|
||||
"bts{q}\t{$src2, $src1|$src1, $src2}", [], IIC_BTX_MI>, TB,
|
||||
Requires<[In64BitMode]>;
|
||||
}
|
||||
} // hasSideEffects = 0
|
||||
} // Defs = [EFLAGS]
|
||||
|
|
@ -2031,7 +2038,7 @@ def CMPXCHG8B : I<0xC7, MRM1m, (outs), (ins i64mem:$dst),
|
|||
let Defs = [RAX, RDX, EFLAGS], Uses = [RAX, RBX, RCX, RDX] in
|
||||
def CMPXCHG16B : RI<0xC7, MRM1m, (outs), (ins i128mem:$dst),
|
||||
"cmpxchg16b\t$dst", [], IIC_CMPXCHG_16B>,
|
||||
TB, Requires<[HasCmpxchg16b]>;
|
||||
TB, Requires<[HasCmpxchg16b, In64BitMode]>;
|
||||
} // SchedRW
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -83,7 +83,8 @@ def SHL32mCL : I<0xD3, MRM4m, (outs), (ins i32mem:$dst),
|
|||
OpSize32;
|
||||
def SHL64mCL : RI<0xD3, MRM4m, (outs), (ins i64mem:$dst),
|
||||
"shl{q}\t{%cl, $dst|$dst, cl}",
|
||||
[(store (shl (loadi64 addr:$dst), CL), addr:$dst)], IIC_SR>;
|
||||
[(store (shl (loadi64 addr:$dst), CL), addr:$dst)], IIC_SR>,
|
||||
Requires<[In64BitMode]>;
|
||||
}
|
||||
def SHL8mi : Ii8<0xC0, MRM4m, (outs), (ins i8mem :$dst, u8imm:$src),
|
||||
"shl{b}\t{$src, $dst|$dst, $src}",
|
||||
|
|
@ -100,7 +101,7 @@ def SHL32mi : Ii8<0xC1, MRM4m, (outs), (ins i32mem:$dst, u8imm:$src),
|
|||
def SHL64mi : RIi8<0xC1, MRM4m, (outs), (ins i64mem:$dst, u8imm:$src),
|
||||
"shl{q}\t{$src, $dst|$dst, $src}",
|
||||
[(store (shl (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)],
|
||||
IIC_SR>;
|
||||
IIC_SR>, Requires<[In64BitMode]>;
|
||||
|
||||
// Shift by 1
|
||||
def SHL8m1 : I<0xD0, MRM4m, (outs), (ins i8mem :$dst),
|
||||
|
|
@ -118,7 +119,7 @@ def SHL32m1 : I<0xD1, MRM4m, (outs), (ins i32mem:$dst),
|
|||
def SHL64m1 : RI<0xD1, MRM4m, (outs), (ins i64mem:$dst),
|
||||
"shl{q}\t$dst",
|
||||
[(store (shl (loadi64 addr:$dst), (i8 1)), addr:$dst)],
|
||||
IIC_SR>;
|
||||
IIC_SR>, Requires<[In64BitMode]>;
|
||||
} // SchedRW
|
||||
|
||||
let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in {
|
||||
|
|
@ -183,7 +184,8 @@ def SHR32mCL : I<0xD3, MRM5m, (outs), (ins i32mem:$dst),
|
|||
OpSize32;
|
||||
def SHR64mCL : RI<0xD3, MRM5m, (outs), (ins i64mem:$dst),
|
||||
"shr{q}\t{%cl, $dst|$dst, cl}",
|
||||
[(store (srl (loadi64 addr:$dst), CL), addr:$dst)], IIC_SR>;
|
||||
[(store (srl (loadi64 addr:$dst), CL), addr:$dst)], IIC_SR>,
|
||||
Requires<[In64BitMode]>;
|
||||
}
|
||||
def SHR8mi : Ii8<0xC0, MRM5m, (outs), (ins i8mem :$dst, u8imm:$src),
|
||||
"shr{b}\t{$src, $dst|$dst, $src}",
|
||||
|
|
@ -200,7 +202,7 @@ def SHR32mi : Ii8<0xC1, MRM5m, (outs), (ins i32mem:$dst, u8imm:$src),
|
|||
def SHR64mi : RIi8<0xC1, MRM5m, (outs), (ins i64mem:$dst, u8imm:$src),
|
||||
"shr{q}\t{$src, $dst|$dst, $src}",
|
||||
[(store (srl (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)],
|
||||
IIC_SR>;
|
||||
IIC_SR>, Requires<[In64BitMode]>;
|
||||
|
||||
// Shift by 1
|
||||
def SHR8m1 : I<0xD0, MRM5m, (outs), (ins i8mem :$dst),
|
||||
|
|
@ -218,7 +220,7 @@ def SHR32m1 : I<0xD1, MRM5m, (outs), (ins i32mem:$dst),
|
|||
def SHR64m1 : RI<0xD1, MRM5m, (outs), (ins i64mem:$dst),
|
||||
"shr{q}\t$dst",
|
||||
[(store (srl (loadi64 addr:$dst), (i8 1)), addr:$dst)],
|
||||
IIC_SR>;
|
||||
IIC_SR>, Requires<[In64BitMode]>;
|
||||
} // SchedRW
|
||||
|
||||
let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in {
|
||||
|
|
@ -296,7 +298,7 @@ def SAR32mCL : I<0xD3, MRM7m, (outs), (ins i32mem:$dst),
|
|||
def SAR64mCL : RI<0xD3, MRM7m, (outs), (ins i64mem:$dst),
|
||||
"sar{q}\t{%cl, $dst|$dst, cl}",
|
||||
[(store (sra (loadi64 addr:$dst), CL), addr:$dst)],
|
||||
IIC_SR>;
|
||||
IIC_SR>, Requires<[In64BitMode]>;
|
||||
}
|
||||
def SAR8mi : Ii8<0xC0, MRM7m, (outs), (ins i8mem :$dst, u8imm:$src),
|
||||
"sar{b}\t{$src, $dst|$dst, $src}",
|
||||
|
|
@ -313,7 +315,7 @@ def SAR32mi : Ii8<0xC1, MRM7m, (outs), (ins i32mem:$dst, u8imm:$src),
|
|||
def SAR64mi : RIi8<0xC1, MRM7m, (outs), (ins i64mem:$dst, u8imm:$src),
|
||||
"sar{q}\t{$src, $dst|$dst, $src}",
|
||||
[(store (sra (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)],
|
||||
IIC_SR>;
|
||||
IIC_SR>, Requires<[In64BitMode]>;
|
||||
|
||||
// Shift by 1
|
||||
def SAR8m1 : I<0xD0, MRM7m, (outs), (ins i8mem :$dst),
|
||||
|
|
@ -331,7 +333,7 @@ def SAR32m1 : I<0xD1, MRM7m, (outs), (ins i32mem:$dst),
|
|||
def SAR64m1 : RI<0xD1, MRM7m, (outs), (ins i64mem:$dst),
|
||||
"sar{q}\t$dst",
|
||||
[(store (sra (loadi64 addr:$dst), (i8 1)), addr:$dst)],
|
||||
IIC_SR>;
|
||||
IIC_SR>, Requires<[In64BitMode]>;
|
||||
} // SchedRW
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
@ -418,9 +420,10 @@ def RCL32m1 : I<0xD1, MRM2m, (outs), (ins i32mem:$dst),
|
|||
def RCL32mi : Ii8<0xC1, MRM2m, (outs), (ins i32mem:$dst, u8imm:$cnt),
|
||||
"rcl{l}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>, OpSize32;
|
||||
def RCL64m1 : RI<0xD1, MRM2m, (outs), (ins i64mem:$dst),
|
||||
"rcl{q}\t$dst", [], IIC_SR>;
|
||||
"rcl{q}\t$dst", [], IIC_SR>, Requires<[In64BitMode]>;
|
||||
def RCL64mi : RIi8<0xC1, MRM2m, (outs), (ins i64mem:$dst, u8imm:$cnt),
|
||||
"rcl{q}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>;
|
||||
"rcl{q}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>,
|
||||
Requires<[In64BitMode]>;
|
||||
|
||||
def RCR8m1 : I<0xD0, MRM3m, (outs), (ins i8mem:$dst),
|
||||
"rcr{b}\t$dst", [], IIC_SR>;
|
||||
|
|
@ -435,9 +438,10 @@ def RCR32m1 : I<0xD1, MRM3m, (outs), (ins i32mem:$dst),
|
|||
def RCR32mi : Ii8<0xC1, MRM3m, (outs), (ins i32mem:$dst, u8imm:$cnt),
|
||||
"rcr{l}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>, OpSize32;
|
||||
def RCR64m1 : RI<0xD1, MRM3m, (outs), (ins i64mem:$dst),
|
||||
"rcr{q}\t$dst", [], IIC_SR>;
|
||||
"rcr{q}\t$dst", [], IIC_SR>, Requires<[In64BitMode]>;
|
||||
def RCR64mi : RIi8<0xC1, MRM3m, (outs), (ins i64mem:$dst, u8imm:$cnt),
|
||||
"rcr{q}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>;
|
||||
"rcr{q}\t{$cnt, $dst|$dst, $cnt}", [], IIC_SR>,
|
||||
Requires<[In64BitMode]>;
|
||||
} // Uses = [EFLAGS]
|
||||
|
||||
let Uses = [CL, EFLAGS] in {
|
||||
|
|
@ -448,7 +452,8 @@ def RCL16mCL : I<0xD3, MRM2m, (outs), (ins i16mem:$dst),
|
|||
def RCL32mCL : I<0xD3, MRM2m, (outs), (ins i32mem:$dst),
|
||||
"rcl{l}\t{%cl, $dst|$dst, cl}", [], IIC_SR>, OpSize32;
|
||||
def RCL64mCL : RI<0xD3, MRM2m, (outs), (ins i64mem:$dst),
|
||||
"rcl{q}\t{%cl, $dst|$dst, cl}", [], IIC_SR>;
|
||||
"rcl{q}\t{%cl, $dst|$dst, cl}", [], IIC_SR>,
|
||||
Requires<[In64BitMode]>;
|
||||
|
||||
def RCR8mCL : I<0xD2, MRM3m, (outs), (ins i8mem:$dst),
|
||||
"rcr{b}\t{%cl, $dst|$dst, cl}", [], IIC_SR>;
|
||||
|
|
@ -457,7 +462,8 @@ def RCR16mCL : I<0xD3, MRM3m, (outs), (ins i16mem:$dst),
|
|||
def RCR32mCL : I<0xD3, MRM3m, (outs), (ins i32mem:$dst),
|
||||
"rcr{l}\t{%cl, $dst|$dst, cl}", [], IIC_SR>, OpSize32;
|
||||
def RCR64mCL : RI<0xD3, MRM3m, (outs), (ins i64mem:$dst),
|
||||
"rcr{q}\t{%cl, $dst|$dst, cl}", [], IIC_SR>;
|
||||
"rcr{q}\t{%cl, $dst|$dst, cl}", [], IIC_SR>,
|
||||
Requires<[In64BitMode]>;
|
||||
} // Uses = [CL, EFLAGS]
|
||||
} // SchedRW
|
||||
} // hasSideEffects = 0
|
||||
|
|
@ -532,7 +538,7 @@ def ROL32mCL : I<0xD3, MRM0m, (outs), (ins i32mem:$dst),
|
|||
def ROL64mCL : RI<0xD3, MRM0m, (outs), (ins i64mem:$dst),
|
||||
"rol{q}\t{%cl, $dst|$dst, cl}",
|
||||
[(store (rotl (loadi64 addr:$dst), CL), addr:$dst)],
|
||||
IIC_SR>;
|
||||
IIC_SR>, Requires<[In64BitMode]>;
|
||||
}
|
||||
def ROL8mi : Ii8<0xC0, MRM0m, (outs), (ins i8mem :$dst, u8imm:$src1),
|
||||
"rol{b}\t{$src1, $dst|$dst, $src1}",
|
||||
|
|
@ -549,7 +555,7 @@ def ROL32mi : Ii8<0xC1, MRM0m, (outs), (ins i32mem:$dst, u8imm:$src1),
|
|||
def ROL64mi : RIi8<0xC1, MRM0m, (outs), (ins i64mem:$dst, u8imm:$src1),
|
||||
"rol{q}\t{$src1, $dst|$dst, $src1}",
|
||||
[(store (rotl (loadi64 addr:$dst), (i8 imm:$src1)), addr:$dst)],
|
||||
IIC_SR>;
|
||||
IIC_SR>, Requires<[In64BitMode]>;
|
||||
|
||||
// Rotate by 1
|
||||
def ROL8m1 : I<0xD0, MRM0m, (outs), (ins i8mem :$dst),
|
||||
|
|
@ -567,7 +573,7 @@ def ROL32m1 : I<0xD1, MRM0m, (outs), (ins i32mem:$dst),
|
|||
def ROL64m1 : RI<0xD1, MRM0m, (outs), (ins i64mem:$dst),
|
||||
"rol{q}\t$dst",
|
||||
[(store (rotl (loadi64 addr:$dst), (i8 1)), addr:$dst)],
|
||||
IIC_SR>;
|
||||
IIC_SR>, Requires<[In64BitMode]>;
|
||||
} // SchedRW
|
||||
|
||||
let Constraints = "$src1 = $dst", SchedRW = [WriteShift] in {
|
||||
|
|
@ -640,7 +646,7 @@ def ROR32mCL : I<0xD3, MRM1m, (outs), (ins i32mem:$dst),
|
|||
def ROR64mCL : RI<0xD3, MRM1m, (outs), (ins i64mem:$dst),
|
||||
"ror{q}\t{%cl, $dst|$dst, cl}",
|
||||
[(store (rotr (loadi64 addr:$dst), CL), addr:$dst)],
|
||||
IIC_SR>;
|
||||
IIC_SR>, Requires<[In64BitMode]>;
|
||||
}
|
||||
def ROR8mi : Ii8<0xC0, MRM1m, (outs), (ins i8mem :$dst, u8imm:$src),
|
||||
"ror{b}\t{$src, $dst|$dst, $src}",
|
||||
|
|
@ -657,7 +663,7 @@ def ROR32mi : Ii8<0xC1, MRM1m, (outs), (ins i32mem:$dst, u8imm:$src),
|
|||
def ROR64mi : RIi8<0xC1, MRM1m, (outs), (ins i64mem:$dst, u8imm:$src),
|
||||
"ror{q}\t{$src, $dst|$dst, $src}",
|
||||
[(store (rotr (loadi64 addr:$dst), (i8 imm:$src)), addr:$dst)],
|
||||
IIC_SR>;
|
||||
IIC_SR>, Requires<[In64BitMode]>;
|
||||
|
||||
// Rotate by 1
|
||||
def ROR8m1 : I<0xD0, MRM1m, (outs), (ins i8mem :$dst),
|
||||
|
|
@ -675,7 +681,7 @@ def ROR32m1 : I<0xD1, MRM1m, (outs), (ins i32mem:$dst),
|
|||
def ROR64m1 : RI<0xD1, MRM1m, (outs), (ins i64mem:$dst),
|
||||
"ror{q}\t$dst",
|
||||
[(store (rotl (loadi64 addr:$dst), (i8 63)), addr:$dst)],
|
||||
IIC_SR>;
|
||||
IIC_SR>, Requires<[In64BitMode]>;
|
||||
} // SchedRW
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -563,36 +563,30 @@ def XRSTOR : I<0xAE, MRM5m, (outs), (ins opaque512mem:$dst),
|
|||
def XRSTOR64 : RI<0xAE, MRM5m, (outs), (ins opaque512mem:$dst),
|
||||
"xrstor64\t$dst",
|
||||
[(int_x86_xrstor64 addr:$dst, EDX, EAX)]>, PS, Requires<[HasXSAVE, In64BitMode]>;
|
||||
let Predicates = [HasXSAVEOPT] in {
|
||||
def XSAVEOPT : I<0xAE, MRM6m, (outs), (ins opaque512mem:$dst),
|
||||
"xsaveopt\t$dst",
|
||||
[(int_x86_xsaveopt addr:$dst, EDX, EAX)]>, PS, Requires<[HasXSAVEOPT]>;
|
||||
def XSAVEOPT64 : RI<0xAE, MRM6m, (outs), (ins opaque512mem:$dst),
|
||||
"xsaveopt64\t$dst",
|
||||
[(int_x86_xsaveopt64 addr:$dst, EDX, EAX)]>, PS, Requires<[HasXSAVEOPT, In64BitMode]>;
|
||||
}
|
||||
let Predicates = [HasXSAVEC] in {
|
||||
def XSAVEC : I<0xC7, MRM4m, (outs), (ins opaque512mem:$dst),
|
||||
"xsavec\t$dst",
|
||||
[(int_x86_xsavec addr:$dst, EDX, EAX)]>, TB, Requires<[HasXSAVEC]>;
|
||||
def XSAVEC64 : RI<0xC7, MRM4m, (outs), (ins opaque512mem:$dst),
|
||||
"xsavec64\t$dst",
|
||||
[(int_x86_xsavec64 addr:$dst, EDX, EAX)]>, TB, Requires<[HasXSAVEC, In64BitMode]>;
|
||||
}
|
||||
let Predicates = [HasXSAVES] in {
|
||||
def XSAVES : I<0xC7, MRM5m, (outs), (ins opaque512mem:$dst),
|
||||
"xsaves\t$dst",
|
||||
[(int_x86_xsaves addr:$dst, EDX, EAX)]>, TB, Requires<[HasXSAVES]>;
|
||||
def XSAVES64 : RI<0xC7, MRM5m, (outs), (ins opaque512mem:$dst),
|
||||
"xsaves64\t$dst",
|
||||
[(int_x86_xsaves64 addr:$dst, EDX, EAX)]>, TB, Requires<[HasXSAVE, In64BitMode]>;
|
||||
def XRSTORS : I<0xC7, MRM3m, (outs), (ins opaque512mem:$dst),
|
||||
"xrstors\t$dst",
|
||||
[(int_x86_xrstors addr:$dst, EDX, EAX)]>, TB, Requires<[HasXSAVES]>;
|
||||
def XRSTORS64 : RI<0xC7, MRM3m, (outs), (ins opaque512mem:$dst),
|
||||
"xrstors64\t$dst",
|
||||
[(int_x86_xrstors64 addr:$dst, EDX, EAX)]>, TB, Requires<[HasXSAVES, In64BitMode]>;
|
||||
}
|
||||
def XSAVEOPT : I<0xAE, MRM6m, (outs), (ins opaque512mem:$dst),
|
||||
"xsaveopt\t$dst",
|
||||
[(int_x86_xsaveopt addr:$dst, EDX, EAX)]>, PS, Requires<[HasXSAVEOPT]>;
|
||||
def XSAVEOPT64 : RI<0xAE, MRM6m, (outs), (ins opaque512mem:$dst),
|
||||
"xsaveopt64\t$dst",
|
||||
[(int_x86_xsaveopt64 addr:$dst, EDX, EAX)]>, PS, Requires<[HasXSAVEOPT, In64BitMode]>;
|
||||
def XSAVEC : I<0xC7, MRM4m, (outs), (ins opaque512mem:$dst),
|
||||
"xsavec\t$dst",
|
||||
[(int_x86_xsavec addr:$dst, EDX, EAX)]>, TB, Requires<[HasXSAVEC]>;
|
||||
def XSAVEC64 : RI<0xC7, MRM4m, (outs), (ins opaque512mem:$dst),
|
||||
"xsavec64\t$dst",
|
||||
[(int_x86_xsavec64 addr:$dst, EDX, EAX)]>, TB, Requires<[HasXSAVEC, In64BitMode]>;
|
||||
def XSAVES : I<0xC7, MRM5m, (outs), (ins opaque512mem:$dst),
|
||||
"xsaves\t$dst",
|
||||
[(int_x86_xsaves addr:$dst, EDX, EAX)]>, TB, Requires<[HasXSAVES]>;
|
||||
def XSAVES64 : RI<0xC7, MRM5m, (outs), (ins opaque512mem:$dst),
|
||||
"xsaves64\t$dst",
|
||||
[(int_x86_xsaves64 addr:$dst, EDX, EAX)]>, TB, Requires<[HasXSAVE, In64BitMode]>;
|
||||
def XRSTORS : I<0xC7, MRM3m, (outs), (ins opaque512mem:$dst),
|
||||
"xrstors\t$dst",
|
||||
[(int_x86_xrstors addr:$dst, EDX, EAX)]>, TB, Requires<[HasXSAVES]>;
|
||||
def XRSTORS64 : RI<0xC7, MRM3m, (outs), (ins opaque512mem:$dst),
|
||||
"xrstors64\t$dst",
|
||||
[(int_x86_xrstors64 addr:$dst, EDX, EAX)]>, TB, Requires<[HasXSAVES, In64BitMode]>;
|
||||
} // Uses
|
||||
} // SchedRW
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue