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