mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-24 04:45:00 +00:00
[X86] Convert all the i8imm used by SSE and AVX instructions to u8imm.
This makes the assembler check their size and removes a hack from the disassembler to avoid sign extending the immediate. llvm-svn: 226645
This commit is contained in:
parent
8282659ccb
commit
39f463653a
@ -320,24 +320,12 @@ static void translateImmediate(MCInst &mcInst, uint64_t immediate,
|
||||
// By default sign-extend all X86 immediates based on their encoding.
|
||||
else if (type == TYPE_IMM8 || type == TYPE_IMM16 || type == TYPE_IMM32 ||
|
||||
type == TYPE_IMM64 || type == TYPE_IMMv) {
|
||||
uint32_t Opcode = mcInst.getOpcode();
|
||||
switch (operand.encoding) {
|
||||
default:
|
||||
break;
|
||||
case ENCODING_IB:
|
||||
// Special case those X86 instructions that use the imm8 as a set of
|
||||
// bits, bit count, etc. and are not sign-extend.
|
||||
if (Opcode != X86::BLENDPSrri && Opcode != X86::BLENDPDrri &&
|
||||
Opcode != X86::PBLENDWrri && Opcode != X86::MPSADBWrri &&
|
||||
Opcode != X86::DPPSrri && Opcode != X86::DPPDrri &&
|
||||
Opcode != X86::INSERTPSrr && Opcode != X86::VBLENDPSYrri &&
|
||||
Opcode != X86::VBLENDPSYrmi && Opcode != X86::VBLENDPDYrri &&
|
||||
Opcode != X86::VBLENDPDYrmi && Opcode != X86::VPBLENDWrri &&
|
||||
Opcode != X86::VMPSADBWrri && Opcode != X86::VDPPSYrri &&
|
||||
Opcode != X86::VDPPSYrmi && Opcode != X86::VDPPDrri &&
|
||||
Opcode != X86::VINSERTPSrr)
|
||||
if(immediate & 0x80)
|
||||
immediate |= ~(0xffull);
|
||||
if(immediate & 0x80)
|
||||
immediate |= ~(0xffull);
|
||||
break;
|
||||
case ENCODING_IW:
|
||||
if(immediate & 0x8000)
|
||||
|
@ -406,6 +406,7 @@ enum OperandEncoding {
|
||||
ENUM_ENTRY(TYPE_IMM64, "8-byte") \
|
||||
ENUM_ENTRY(TYPE_IMM3, "1-byte immediate operand between 0 and 7") \
|
||||
ENUM_ENTRY(TYPE_IMM5, "1-byte immediate operand between 0 and 31") \
|
||||
ENUM_ENTRY(TYPE_UIMM8, "1-byte unsigned immediate operand") \
|
||||
ENUM_ENTRY(TYPE_RM8, "1-byte register or memory operand") \
|
||||
ENUM_ENTRY(TYPE_RM16, "2-byte") \
|
||||
ENUM_ENTRY(TYPE_RM32, "4-byte") \
|
||||
|
@ -2582,12 +2582,12 @@ multiclass sse12_shuffle<RegisterClass RC, X86MemOperand x86memop,
|
||||
ValueType vt, string asm, PatFrag mem_frag,
|
||||
Domain d> {
|
||||
def rmi : PIi8<0xC6, MRMSrcMem, (outs RC:$dst),
|
||||
(ins RC:$src1, x86memop:$src2, i8imm:$src3), asm,
|
||||
(ins RC:$src1, x86memop:$src2, u8imm:$src3), asm,
|
||||
[(set RC:$dst, (vt (X86Shufp RC:$src1, (mem_frag addr:$src2),
|
||||
(i8 imm:$src3))))], IIC_SSE_SHUFP, d>,
|
||||
Sched<[WriteFShuffleLd, ReadAfterLd]>;
|
||||
def rri : PIi8<0xC6, MRMSrcReg, (outs RC:$dst),
|
||||
(ins RC:$src1, RC:$src2, i8imm:$src3), asm,
|
||||
(ins RC:$src1, RC:$src2, u8imm:$src3), asm,
|
||||
[(set RC:$dst, (vt (X86Shufp RC:$src1, RC:$src2,
|
||||
(i8 imm:$src3))))], IIC_SSE_SHUFP, d>,
|
||||
Sched<[WriteFShuffle]>;
|
||||
@ -4204,7 +4204,7 @@ multiclass PDI_binop_rmi<bits<8> opc, bits<8> opc2, Format ImmForm,
|
||||
(bc_frag (memopv2i64 addr:$src2)))))], itins.rm>,
|
||||
Sched<[WriteVecShiftLd, ReadAfterLd]>;
|
||||
def ri : PDIi8<opc2, ImmForm, (outs RC:$dst),
|
||||
(ins RC:$src1, i8imm:$src2),
|
||||
(ins RC:$src1, u8imm:$src2),
|
||||
!if(Is2Addr,
|
||||
!strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
|
||||
!strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}")),
|
||||
@ -4511,14 +4511,14 @@ multiclass sse2_pshuffle<string OpcodeStr, ValueType vt128, ValueType vt256,
|
||||
SDNode OpNode> {
|
||||
let Predicates = [HasAVX] in {
|
||||
def V#NAME#ri : Ii8<0x70, MRMSrcReg, (outs VR128:$dst),
|
||||
(ins VR128:$src1, i8imm:$src2),
|
||||
(ins VR128:$src1, u8imm:$src2),
|
||||
!strconcat("v", OpcodeStr,
|
||||
"\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
|
||||
[(set VR128:$dst,
|
||||
(vt128 (OpNode VR128:$src1, (i8 imm:$src2))))],
|
||||
IIC_SSE_PSHUF_RI>, VEX, Sched<[WriteShuffle]>;
|
||||
def V#NAME#mi : Ii8<0x70, MRMSrcMem, (outs VR128:$dst),
|
||||
(ins i128mem:$src1, i8imm:$src2),
|
||||
(ins i128mem:$src1, u8imm:$src2),
|
||||
!strconcat("v", OpcodeStr,
|
||||
"\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
|
||||
[(set VR128:$dst,
|
||||
@ -4529,14 +4529,14 @@ let Predicates = [HasAVX] in {
|
||||
|
||||
let Predicates = [HasAVX2] in {
|
||||
def V#NAME#Yri : Ii8<0x70, MRMSrcReg, (outs VR256:$dst),
|
||||
(ins VR256:$src1, i8imm:$src2),
|
||||
(ins VR256:$src1, u8imm:$src2),
|
||||
!strconcat("v", OpcodeStr,
|
||||
"\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
|
||||
[(set VR256:$dst,
|
||||
(vt256 (OpNode VR256:$src1, (i8 imm:$src2))))],
|
||||
IIC_SSE_PSHUF_RI>, VEX, VEX_L, Sched<[WriteShuffle]>;
|
||||
def V#NAME#Ymi : Ii8<0x70, MRMSrcMem, (outs VR256:$dst),
|
||||
(ins i256mem:$src1, i8imm:$src2),
|
||||
(ins i256mem:$src1, u8imm:$src2),
|
||||
!strconcat("v", OpcodeStr,
|
||||
"\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
|
||||
[(set VR256:$dst,
|
||||
@ -4547,14 +4547,14 @@ let Predicates = [HasAVX2] in {
|
||||
|
||||
let Predicates = [UseSSE2] in {
|
||||
def ri : Ii8<0x70, MRMSrcReg,
|
||||
(outs VR128:$dst), (ins VR128:$src1, i8imm:$src2),
|
||||
(outs VR128:$dst), (ins VR128:$src1, u8imm:$src2),
|
||||
!strconcat(OpcodeStr,
|
||||
"\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
|
||||
[(set VR128:$dst,
|
||||
(vt128 (OpNode VR128:$src1, (i8 imm:$src2))))],
|
||||
IIC_SSE_PSHUF_RI>, Sched<[WriteShuffle]>;
|
||||
def mi : Ii8<0x70, MRMSrcMem,
|
||||
(outs VR128:$dst), (ins i128mem:$src1, i8imm:$src2),
|
||||
(outs VR128:$dst), (ins i128mem:$src1, u8imm:$src2),
|
||||
!strconcat(OpcodeStr,
|
||||
"\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
|
||||
[(set VR128:$dst,
|
||||
@ -5963,7 +5963,7 @@ defm PMULHRSW : SS3I_binop_rm_int<0x0B, "pmulhrsw",
|
||||
multiclass ssse3_palignr<string asm, bit Is2Addr = 1> {
|
||||
let hasSideEffects = 0 in {
|
||||
def R128rr : SS3AI<0x0F, MRMSrcReg, (outs VR128:$dst),
|
||||
(ins VR128:$src1, VR128:$src2, i8imm:$src3),
|
||||
(ins VR128:$src1, VR128:$src2, u8imm:$src3),
|
||||
!if(Is2Addr,
|
||||
!strconcat(asm, "\t{$src3, $src2, $dst|$dst, $src2, $src3}"),
|
||||
!strconcat(asm,
|
||||
@ -5971,7 +5971,7 @@ multiclass ssse3_palignr<string asm, bit Is2Addr = 1> {
|
||||
[], IIC_SSE_PALIGNRR>, Sched<[WriteShuffle]>;
|
||||
let mayLoad = 1 in
|
||||
def R128rm : SS3AI<0x0F, MRMSrcMem, (outs VR128:$dst),
|
||||
(ins VR128:$src1, i128mem:$src2, i8imm:$src3),
|
||||
(ins VR128:$src1, i128mem:$src2, u8imm:$src3),
|
||||
!if(Is2Addr,
|
||||
!strconcat(asm, "\t{$src3, $src2, $dst|$dst, $src2, $src3}"),
|
||||
!strconcat(asm,
|
||||
@ -5983,13 +5983,13 @@ multiclass ssse3_palignr<string asm, bit Is2Addr = 1> {
|
||||
multiclass ssse3_palignr_y<string asm, bit Is2Addr = 1> {
|
||||
let hasSideEffects = 0 in {
|
||||
def R256rr : SS3AI<0x0F, MRMSrcReg, (outs VR256:$dst),
|
||||
(ins VR256:$src1, VR256:$src2, i8imm:$src3),
|
||||
(ins VR256:$src1, VR256:$src2, u8imm:$src3),
|
||||
!strconcat(asm,
|
||||
"\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
|
||||
[]>, Sched<[WriteShuffle]>;
|
||||
let mayLoad = 1 in
|
||||
def R256rm : SS3AI<0x0F, MRMSrcMem, (outs VR256:$dst),
|
||||
(ins VR256:$src1, i256mem:$src2, i8imm:$src3),
|
||||
(ins VR256:$src1, i256mem:$src2, u8imm:$src3),
|
||||
!strconcat(asm,
|
||||
"\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
|
||||
[]>, Sched<[WriteShuffleLd, ReadAfterLd]>;
|
||||
@ -6531,7 +6531,7 @@ let Constraints = "$src1 = $dst" in
|
||||
multiclass SS41I_insertf32<bits<8> opc, string asm, bit Is2Addr = 1,
|
||||
OpndItins itins = DEFAULT_ITINS> {
|
||||
def rr : SS4AIi8<opc, MRMSrcReg, (outs VR128:$dst),
|
||||
(ins VR128:$src1, VR128:$src2, i8imm:$src3),
|
||||
(ins VR128:$src1, VR128:$src2, u8imm:$src3),
|
||||
!if(Is2Addr,
|
||||
!strconcat(asm, "\t{$src3, $src2, $dst|$dst, $src2, $src3}"),
|
||||
!strconcat(asm,
|
||||
@ -6540,7 +6540,7 @@ multiclass SS41I_insertf32<bits<8> opc, string asm, bit Is2Addr = 1,
|
||||
(X86insertps VR128:$src1, VR128:$src2, imm:$src3))], itins.rr>,
|
||||
Sched<[WriteFShuffle]>;
|
||||
def rm : SS4AIi8<opc, MRMSrcMem, (outs VR128:$dst),
|
||||
(ins VR128:$src1, f32mem:$src2, i8imm:$src3),
|
||||
(ins VR128:$src1, f32mem:$src2, u8imm:$src3),
|
||||
!if(Is2Addr,
|
||||
!strconcat(asm, "\t{$src3, $src2, $dst|$dst, $src2, $src3}"),
|
||||
!strconcat(asm,
|
||||
@ -7176,7 +7176,7 @@ multiclass SS41I_binop_rmi_int<bits<8> opc, string OpcodeStr,
|
||||
OpndItins itins = DEFAULT_ITINS> {
|
||||
let isCommutable = 1 in
|
||||
def rri : SS4AIi8<opc, MRMSrcReg, (outs RC:$dst),
|
||||
(ins RC:$src1, RC:$src2, i8imm:$src3),
|
||||
(ins RC:$src1, RC:$src2, u8imm:$src3),
|
||||
!if(Is2Addr,
|
||||
!strconcat(OpcodeStr,
|
||||
"\t{$src3, $src2, $dst|$dst, $src2, $src3}"),
|
||||
@ -7185,7 +7185,7 @@ multiclass SS41I_binop_rmi_int<bits<8> opc, string OpcodeStr,
|
||||
[(set RC:$dst, (IntId RC:$src1, RC:$src2, imm:$src3))], itins.rr>,
|
||||
Sched<[itins.Sched]>;
|
||||
def rmi : SS4AIi8<opc, MRMSrcMem, (outs RC:$dst),
|
||||
(ins RC:$src1, x86memop:$src2, i8imm:$src3),
|
||||
(ins RC:$src1, x86memop:$src2, u8imm:$src3),
|
||||
!if(Is2Addr,
|
||||
!strconcat(OpcodeStr,
|
||||
"\t{$src3, $src2, $dst|$dst, $src2, $src3}"),
|
||||
@ -7573,11 +7573,11 @@ let Constraints = "$src1 = $dst" in
|
||||
// Packed Compare Implicit Length Strings, Return Mask
|
||||
multiclass pseudo_pcmpistrm<string asm> {
|
||||
def REG : PseudoI<(outs VR128:$dst),
|
||||
(ins VR128:$src1, VR128:$src2, i8imm:$src3),
|
||||
(ins VR128:$src1, VR128:$src2, u8imm:$src3),
|
||||
[(set VR128:$dst, (int_x86_sse42_pcmpistrm128 VR128:$src1, VR128:$src2,
|
||||
imm:$src3))]>;
|
||||
def MEM : PseudoI<(outs VR128:$dst),
|
||||
(ins VR128:$src1, i128mem:$src2, i8imm:$src3),
|
||||
(ins VR128:$src1, i128mem:$src2, u8imm:$src3),
|
||||
[(set VR128:$dst, (int_x86_sse42_pcmpistrm128 VR128:$src1,
|
||||
(bc_v16i8 (memopv2i64 addr:$src2)), imm:$src3))]>;
|
||||
}
|
||||
@ -7589,12 +7589,12 @@ let Defs = [EFLAGS], usesCustomInserter = 1 in {
|
||||
|
||||
multiclass pcmpistrm_SS42AI<string asm> {
|
||||
def rr : SS42AI<0x62, MRMSrcReg, (outs),
|
||||
(ins VR128:$src1, VR128:$src2, i8imm:$src3),
|
||||
(ins VR128:$src1, VR128:$src2, u8imm:$src3),
|
||||
!strconcat(asm, "\t{$src3, $src2, $src1|$src1, $src2, $src3}"),
|
||||
[]>, Sched<[WritePCmpIStrM]>;
|
||||
let mayLoad = 1 in
|
||||
def rm :SS42AI<0x62, MRMSrcMem, (outs),
|
||||
(ins VR128:$src1, i128mem:$src2, i8imm:$src3),
|
||||
(ins VR128:$src1, i128mem:$src2, u8imm:$src3),
|
||||
!strconcat(asm, "\t{$src3, $src2, $src1|$src1, $src2, $src3}"),
|
||||
[]>, Sched<[WritePCmpIStrMLd, ReadAfterLd]>;
|
||||
}
|
||||
@ -7608,11 +7608,11 @@ let Defs = [XMM0, EFLAGS], hasSideEffects = 0 in {
|
||||
// Packed Compare Explicit Length Strings, Return Mask
|
||||
multiclass pseudo_pcmpestrm<string asm> {
|
||||
def REG : PseudoI<(outs VR128:$dst),
|
||||
(ins VR128:$src1, VR128:$src3, i8imm:$src5),
|
||||
(ins VR128:$src1, VR128:$src3, u8imm:$src5),
|
||||
[(set VR128:$dst, (int_x86_sse42_pcmpestrm128
|
||||
VR128:$src1, EAX, VR128:$src3, EDX, imm:$src5))]>;
|
||||
def MEM : PseudoI<(outs VR128:$dst),
|
||||
(ins VR128:$src1, i128mem:$src3, i8imm:$src5),
|
||||
(ins VR128:$src1, i128mem:$src3, u8imm:$src5),
|
||||
[(set VR128:$dst, (int_x86_sse42_pcmpestrm128 VR128:$src1, EAX,
|
||||
(bc_v16i8 (memopv2i64 addr:$src3)), EDX, imm:$src5))]>;
|
||||
}
|
||||
@ -7624,12 +7624,12 @@ let Defs = [EFLAGS], Uses = [EAX, EDX], usesCustomInserter = 1 in {
|
||||
|
||||
multiclass SS42AI_pcmpestrm<string asm> {
|
||||
def rr : SS42AI<0x60, MRMSrcReg, (outs),
|
||||
(ins VR128:$src1, VR128:$src3, i8imm:$src5),
|
||||
(ins VR128:$src1, VR128:$src3, u8imm:$src5),
|
||||
!strconcat(asm, "\t{$src5, $src3, $src1|$src1, $src3, $src5}"),
|
||||
[]>, Sched<[WritePCmpEStrM]>;
|
||||
let mayLoad = 1 in
|
||||
def rm : SS42AI<0x60, MRMSrcMem, (outs),
|
||||
(ins VR128:$src1, i128mem:$src3, i8imm:$src5),
|
||||
(ins VR128:$src1, i128mem:$src3, u8imm:$src5),
|
||||
!strconcat(asm, "\t{$src5, $src3, $src1|$src1, $src3, $src5}"),
|
||||
[]>, Sched<[WritePCmpEStrMLd, ReadAfterLd]>;
|
||||
}
|
||||
@ -7643,11 +7643,11 @@ let Defs = [XMM0, EFLAGS], Uses = [EAX, EDX], hasSideEffects = 0 in {
|
||||
// Packed Compare Implicit Length Strings, Return Index
|
||||
multiclass pseudo_pcmpistri<string asm> {
|
||||
def REG : PseudoI<(outs GR32:$dst),
|
||||
(ins VR128:$src1, VR128:$src2, i8imm:$src3),
|
||||
(ins VR128:$src1, VR128:$src2, u8imm:$src3),
|
||||
[(set GR32:$dst, EFLAGS,
|
||||
(X86pcmpistri VR128:$src1, VR128:$src2, imm:$src3))]>;
|
||||
def MEM : PseudoI<(outs GR32:$dst),
|
||||
(ins VR128:$src1, i128mem:$src2, i8imm:$src3),
|
||||
(ins VR128:$src1, i128mem:$src2, u8imm:$src3),
|
||||
[(set GR32:$dst, EFLAGS, (X86pcmpistri VR128:$src1,
|
||||
(bc_v16i8 (memopv2i64 addr:$src2)), imm:$src3))]>;
|
||||
}
|
||||
@ -7659,12 +7659,12 @@ let Defs = [EFLAGS], usesCustomInserter = 1 in {
|
||||
|
||||
multiclass SS42AI_pcmpistri<string asm> {
|
||||
def rr : SS42AI<0x63, MRMSrcReg, (outs),
|
||||
(ins VR128:$src1, VR128:$src2, i8imm:$src3),
|
||||
(ins VR128:$src1, VR128:$src2, u8imm:$src3),
|
||||
!strconcat(asm, "\t{$src3, $src2, $src1|$src1, $src2, $src3}"),
|
||||
[]>, Sched<[WritePCmpIStrI]>;
|
||||
let mayLoad = 1 in
|
||||
def rm : SS42AI<0x63, MRMSrcMem, (outs),
|
||||
(ins VR128:$src1, i128mem:$src2, i8imm:$src3),
|
||||
(ins VR128:$src1, i128mem:$src2, u8imm:$src3),
|
||||
!strconcat(asm, "\t{$src3, $src2, $src1|$src1, $src2, $src3}"),
|
||||
[]>, Sched<[WritePCmpIStrILd, ReadAfterLd]>;
|
||||
}
|
||||
@ -7678,11 +7678,11 @@ let Defs = [ECX, EFLAGS], hasSideEffects = 0 in {
|
||||
// Packed Compare Explicit Length Strings, Return Index
|
||||
multiclass pseudo_pcmpestri<string asm> {
|
||||
def REG : PseudoI<(outs GR32:$dst),
|
||||
(ins VR128:$src1, VR128:$src3, i8imm:$src5),
|
||||
(ins VR128:$src1, VR128:$src3, u8imm:$src5),
|
||||
[(set GR32:$dst, EFLAGS,
|
||||
(X86pcmpestri VR128:$src1, EAX, VR128:$src3, EDX, imm:$src5))]>;
|
||||
def MEM : PseudoI<(outs GR32:$dst),
|
||||
(ins VR128:$src1, i128mem:$src3, i8imm:$src5),
|
||||
(ins VR128:$src1, i128mem:$src3, u8imm:$src5),
|
||||
[(set GR32:$dst, EFLAGS,
|
||||
(X86pcmpestri VR128:$src1, EAX, (bc_v16i8 (memopv2i64 addr:$src3)), EDX,
|
||||
imm:$src5))]>;
|
||||
@ -7695,12 +7695,12 @@ let Defs = [EFLAGS], Uses = [EAX, EDX], usesCustomInserter = 1 in {
|
||||
|
||||
multiclass SS42AI_pcmpestri<string asm> {
|
||||
def rr : SS42AI<0x61, MRMSrcReg, (outs),
|
||||
(ins VR128:$src1, VR128:$src3, i8imm:$src5),
|
||||
(ins VR128:$src1, VR128:$src3, u8imm:$src5),
|
||||
!strconcat(asm, "\t{$src5, $src3, $src1|$src1, $src3, $src5}"),
|
||||
[]>, Sched<[WritePCmpEStrI]>;
|
||||
let mayLoad = 1 in
|
||||
def rm : SS42AI<0x61, MRMSrcMem, (outs),
|
||||
(ins VR128:$src1, i128mem:$src3, i8imm:$src5),
|
||||
(ins VR128:$src1, i128mem:$src3, u8imm:$src5),
|
||||
!strconcat(asm, "\t{$src5, $src3, $src1|$src1, $src3, $src5}"),
|
||||
[]>, Sched<[WritePCmpEStrILd, ReadAfterLd]>;
|
||||
}
|
||||
@ -7785,13 +7785,13 @@ multiclass SHAI_binop<bits<8> Opc, string OpcodeStr, Intrinsic IntId,
|
||||
|
||||
let Constraints = "$src1 = $dst", Predicates = [HasSHA] in {
|
||||
def SHA1RNDS4rri : Ii8<0xCC, MRMSrcReg, (outs VR128:$dst),
|
||||
(ins VR128:$src1, VR128:$src2, i8imm:$src3),
|
||||
(ins VR128:$src1, VR128:$src2, u8imm:$src3),
|
||||
"sha1rnds4\t{$src3, $src2, $dst|$dst, $src2, $src3}",
|
||||
[(set VR128:$dst,
|
||||
(int_x86_sha1rnds4 VR128:$src1, VR128:$src2,
|
||||
(i8 imm:$src3)))]>, TA;
|
||||
def SHA1RNDS4rmi : Ii8<0xCC, MRMSrcMem, (outs VR128:$dst),
|
||||
(ins VR128:$src1, i128mem:$src2, i8imm:$src3),
|
||||
(ins VR128:$src1, i128mem:$src2, u8imm:$src3),
|
||||
"sha1rnds4\t{$src3, $src2, $dst|$dst, $src2, $src3}",
|
||||
[(set VR128:$dst,
|
||||
(int_x86_sha1rnds4 VR128:$src1,
|
||||
@ -7889,26 +7889,26 @@ def AESIMCrm : AES8I<0xDB, MRMSrcMem, (outs VR128:$dst),
|
||||
// AES Round Key Generation Assist
|
||||
let Predicates = [HasAVX, HasAES] in {
|
||||
def VAESKEYGENASSIST128rr : AESAI<0xDF, MRMSrcReg, (outs VR128:$dst),
|
||||
(ins VR128:$src1, i8imm:$src2),
|
||||
(ins VR128:$src1, u8imm:$src2),
|
||||
"vaeskeygenassist\t{$src2, $src1, $dst|$dst, $src1, $src2}",
|
||||
[(set VR128:$dst,
|
||||
(int_x86_aesni_aeskeygenassist VR128:$src1, imm:$src2))]>,
|
||||
Sched<[WriteAESKeyGen]>, VEX;
|
||||
def VAESKEYGENASSIST128rm : AESAI<0xDF, MRMSrcMem, (outs VR128:$dst),
|
||||
(ins i128mem:$src1, i8imm:$src2),
|
||||
(ins i128mem:$src1, u8imm:$src2),
|
||||
"vaeskeygenassist\t{$src2, $src1, $dst|$dst, $src1, $src2}",
|
||||
[(set VR128:$dst,
|
||||
(int_x86_aesni_aeskeygenassist (loadv2i64 addr:$src1), imm:$src2))]>,
|
||||
Sched<[WriteAESKeyGenLd]>, VEX;
|
||||
}
|
||||
def AESKEYGENASSIST128rr : AESAI<0xDF, MRMSrcReg, (outs VR128:$dst),
|
||||
(ins VR128:$src1, i8imm:$src2),
|
||||
(ins VR128:$src1, u8imm:$src2),
|
||||
"aeskeygenassist\t{$src2, $src1, $dst|$dst, $src1, $src2}",
|
||||
[(set VR128:$dst,
|
||||
(int_x86_aesni_aeskeygenassist VR128:$src1, imm:$src2))]>,
|
||||
Sched<[WriteAESKeyGen]>;
|
||||
def AESKEYGENASSIST128rm : AESAI<0xDF, MRMSrcMem, (outs VR128:$dst),
|
||||
(ins i128mem:$src1, i8imm:$src2),
|
||||
(ins i128mem:$src1, u8imm:$src2),
|
||||
"aeskeygenassist\t{$src2, $src1, $dst|$dst, $src1, $src2}",
|
||||
[(set VR128:$dst,
|
||||
(int_x86_aesni_aeskeygenassist (memopv2i64 addr:$src1), imm:$src2))]>,
|
||||
@ -7920,14 +7920,14 @@ def AESKEYGENASSIST128rm : AESAI<0xDF, MRMSrcMem, (outs VR128:$dst),
|
||||
|
||||
// AVX carry-less Multiplication instructions
|
||||
def VPCLMULQDQrr : AVXPCLMULIi8<0x44, MRMSrcReg, (outs VR128:$dst),
|
||||
(ins VR128:$src1, VR128:$src2, i8imm:$src3),
|
||||
(ins VR128:$src1, VR128:$src2, u8imm:$src3),
|
||||
"vpclmulqdq\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}",
|
||||
[(set VR128:$dst,
|
||||
(int_x86_pclmulqdq VR128:$src1, VR128:$src2, imm:$src3))]>,
|
||||
Sched<[WriteCLMul]>;
|
||||
|
||||
def VPCLMULQDQrm : AVXPCLMULIi8<0x44, MRMSrcMem, (outs VR128:$dst),
|
||||
(ins VR128:$src1, i128mem:$src2, i8imm:$src3),
|
||||
(ins VR128:$src1, i128mem:$src2, u8imm:$src3),
|
||||
"vpclmulqdq\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}",
|
||||
[(set VR128:$dst, (int_x86_pclmulqdq VR128:$src1,
|
||||
(loadv2i64 addr:$src2), imm:$src3))]>,
|
||||
@ -7936,14 +7936,14 @@ def VPCLMULQDQrm : AVXPCLMULIi8<0x44, MRMSrcMem, (outs VR128:$dst),
|
||||
// Carry-less Multiplication instructions
|
||||
let Constraints = "$src1 = $dst" in {
|
||||
def PCLMULQDQrr : PCLMULIi8<0x44, MRMSrcReg, (outs VR128:$dst),
|
||||
(ins VR128:$src1, VR128:$src2, i8imm:$src3),
|
||||
(ins VR128:$src1, VR128:$src2, u8imm:$src3),
|
||||
"pclmulqdq\t{$src3, $src2, $dst|$dst, $src2, $src3}",
|
||||
[(set VR128:$dst,
|
||||
(int_x86_pclmulqdq VR128:$src1, VR128:$src2, imm:$src3))],
|
||||
IIC_SSE_PCLMULQDQ_RR>, Sched<[WriteCLMul]>;
|
||||
|
||||
def PCLMULQDQrm : PCLMULIi8<0x44, MRMSrcMem, (outs VR128:$dst),
|
||||
(ins VR128:$src1, i128mem:$src2, i8imm:$src3),
|
||||
(ins VR128:$src1, i128mem:$src2, u8imm:$src3),
|
||||
"pclmulqdq\t{$src3, $src2, $dst|$dst, $src2, $src3}",
|
||||
[(set VR128:$dst, (int_x86_pclmulqdq VR128:$src1,
|
||||
(memopv2i64 addr:$src2), imm:$src3))],
|
||||
@ -7982,7 +7982,7 @@ let Predicates = [HasSSE4A] in {
|
||||
|
||||
let Constraints = "$src = $dst" in {
|
||||
def EXTRQI : Ii8<0x78, MRMXr, (outs VR128:$dst),
|
||||
(ins VR128:$src, i8imm:$len, i8imm:$idx),
|
||||
(ins VR128:$src, u8imm:$len, u8imm:$idx),
|
||||
"extrq\t{$idx, $len, $src|$src, $len, $idx}",
|
||||
[(set VR128:$dst, (int_x86_sse4a_extrqi VR128:$src, imm:$len,
|
||||
imm:$idx))]>, PD;
|
||||
@ -7993,7 +7993,7 @@ def EXTRQ : I<0x79, MRMSrcReg, (outs VR128:$dst),
|
||||
VR128:$mask))]>, PD;
|
||||
|
||||
def INSERTQI : Ii8<0x78, MRMSrcReg, (outs VR128:$dst),
|
||||
(ins VR128:$src, VR128:$src2, i8imm:$len, i8imm:$idx),
|
||||
(ins VR128:$src, VR128:$src2, u8imm:$len, u8imm:$idx),
|
||||
"insertq\t{$idx, $len, $src2, $src|$src, $src2, $len, $idx}",
|
||||
[(set VR128:$dst, (int_x86_sse4a_insertqi VR128:$src,
|
||||
VR128:$src2, imm:$len, imm:$idx))]>, XD;
|
||||
@ -8086,12 +8086,12 @@ def : Pat<(int_x86_avx_vbroadcastf128_ps_256 addr:$src),
|
||||
//
|
||||
let hasSideEffects = 0, ExeDomain = SSEPackedSingle in {
|
||||
def VINSERTF128rr : AVXAIi8<0x18, MRMSrcReg, (outs VR256:$dst),
|
||||
(ins VR256:$src1, VR128:$src2, i8imm:$src3),
|
||||
(ins VR256:$src1, VR128:$src2, u8imm:$src3),
|
||||
"vinsertf128\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}",
|
||||
[]>, Sched<[WriteFShuffle]>, VEX_4V, VEX_L;
|
||||
let mayLoad = 1 in
|
||||
def VINSERTF128rm : AVXAIi8<0x18, MRMSrcMem, (outs VR256:$dst),
|
||||
(ins VR256:$src1, f128mem:$src2, i8imm:$src3),
|
||||
(ins VR256:$src1, f128mem:$src2, u8imm:$src3),
|
||||
"vinsertf128\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}",
|
||||
[]>, Sched<[WriteFShuffleLd, ReadAfterLd]>, VEX_4V, VEX_L;
|
||||
}
|
||||
@ -8203,12 +8203,12 @@ def : Pat<(vinsert128_insert:$ins (v16i16 VR256:$src1),
|
||||
//
|
||||
let hasSideEffects = 0, ExeDomain = SSEPackedSingle in {
|
||||
def VEXTRACTF128rr : AVXAIi8<0x19, MRMDestReg, (outs VR128:$dst),
|
||||
(ins VR256:$src1, i8imm:$src2),
|
||||
(ins VR256:$src1, u8imm:$src2),
|
||||
"vextractf128\t{$src2, $src1, $dst|$dst, $src1, $src2}",
|
||||
[]>, Sched<[WriteFShuffle]>, VEX, VEX_L;
|
||||
let mayStore = 1 in
|
||||
def VEXTRACTF128mr : AVXAIi8<0x19, MRMDestMem, (outs),
|
||||
(ins f128mem:$dst, VR256:$src1, i8imm:$src2),
|
||||
(ins f128mem:$dst, VR256:$src1, u8imm:$src2),
|
||||
"vextractf128\t{$src2, $src1, $dst|$dst, $src1, $src2}",
|
||||
[]>, Sched<[WriteStore]>, VEX, VEX_L;
|
||||
}
|
||||
@ -8329,12 +8329,12 @@ multiclass avx_permil<bits<8> opc_rm, bits<8> opc_rmi, string OpcodeStr,
|
||||
Sched<[WriteFShuffleLd, ReadAfterLd]>;
|
||||
|
||||
def ri : AVXAIi8<opc_rmi, MRMSrcReg, (outs RC:$dst),
|
||||
(ins RC:$src1, i8imm:$src2),
|
||||
(ins RC:$src1, u8imm:$src2),
|
||||
!strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
|
||||
[(set RC:$dst, (vt (X86VPermilpi RC:$src1, (i8 imm:$src2))))]>, VEX,
|
||||
Sched<[WriteFShuffle]>;
|
||||
def mi : AVXAIi8<opc_rmi, MRMSrcMem, (outs RC:$dst),
|
||||
(ins x86memop_f:$src1, i8imm:$src2),
|
||||
(ins x86memop_f:$src1, u8imm:$src2),
|
||||
!strconcat(OpcodeStr, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
|
||||
[(set RC:$dst,
|
||||
(vt (X86VPermilpi (memop addr:$src1), (i8 imm:$src2))))]>, VEX,
|
||||
@ -8394,13 +8394,13 @@ def : Pat<(v2i64 (X86VPermilpi (loadv2i64 addr:$src1), (i8 imm:$imm))),
|
||||
//
|
||||
let ExeDomain = SSEPackedSingle in {
|
||||
def VPERM2F128rr : AVXAIi8<0x06, MRMSrcReg, (outs VR256:$dst),
|
||||
(ins VR256:$src1, VR256:$src2, i8imm:$src3),
|
||||
(ins VR256:$src1, VR256:$src2, u8imm:$src3),
|
||||
"vperm2f128\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}",
|
||||
[(set VR256:$dst, (v8f32 (X86VPerm2x128 VR256:$src1, VR256:$src2,
|
||||
(i8 imm:$src3))))]>, VEX_4V, VEX_L,
|
||||
Sched<[WriteFShuffle]>;
|
||||
def VPERM2F128rm : AVXAIi8<0x06, MRMSrcMem, (outs VR256:$dst),
|
||||
(ins VR256:$src1, f256mem:$src2, i8imm:$src3),
|
||||
(ins VR256:$src1, f256mem:$src2, u8imm:$src3),
|
||||
"vperm2f128\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}",
|
||||
[(set VR256:$dst, (X86VPerm2x128 VR256:$src1, (loadv8f32 addr:$src2),
|
||||
(i8 imm:$src3)))]>, VEX_4V, VEX_L,
|
||||
@ -8519,13 +8519,13 @@ multiclass AVX2_binop_rmi_int<bits<8> opc, string OpcodeStr,
|
||||
X86MemOperand x86memop> {
|
||||
let isCommutable = 1 in
|
||||
def rri : AVX2AIi8<opc, MRMSrcReg, (outs RC:$dst),
|
||||
(ins RC:$src1, RC:$src2, i8imm:$src3),
|
||||
(ins RC:$src1, RC:$src2, u8imm:$src3),
|
||||
!strconcat(OpcodeStr,
|
||||
"\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
|
||||
[(set RC:$dst, (IntId RC:$src1, RC:$src2, imm:$src3))]>,
|
||||
Sched<[WriteBlend]>, VEX_4V;
|
||||
def rmi : AVX2AIi8<opc, MRMSrcMem, (outs RC:$dst),
|
||||
(ins RC:$src1, x86memop:$src2, i8imm:$src3),
|
||||
(ins RC:$src1, x86memop:$src2, u8imm:$src3),
|
||||
!strconcat(OpcodeStr,
|
||||
"\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
|
||||
[(set RC:$dst,
|
||||
@ -8766,14 +8766,14 @@ defm VPERMPS : avx2_perm<0x16, "vpermps", loadv8f32, v8f32, WriteFShuffle256>;
|
||||
multiclass avx2_perm_imm<bits<8> opc, string OpcodeStr, PatFrag mem_frag,
|
||||
ValueType OpVT, X86FoldableSchedWrite Sched> {
|
||||
def Yri : AVX2AIi8<opc, MRMSrcReg, (outs VR256:$dst),
|
||||
(ins VR256:$src1, i8imm:$src2),
|
||||
(ins VR256:$src1, u8imm:$src2),
|
||||
!strconcat(OpcodeStr,
|
||||
"\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
|
||||
[(set VR256:$dst,
|
||||
(OpVT (X86VPermi VR256:$src1, (i8 imm:$src2))))]>,
|
||||
Sched<[Sched]>, VEX, VEX_L;
|
||||
def Ymi : AVX2AIi8<opc, MRMSrcMem, (outs VR256:$dst),
|
||||
(ins i256mem:$src1, i8imm:$src2),
|
||||
(ins i256mem:$src1, u8imm:$src2),
|
||||
!strconcat(OpcodeStr,
|
||||
"\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
|
||||
[(set VR256:$dst,
|
||||
@ -8792,13 +8792,13 @@ defm VPERMPD : avx2_perm_imm<0x01, "vpermpd", loadv4f64, v4f64,
|
||||
// VPERM2I128 - Permute Floating-Point Values in 128-bit chunks
|
||||
//
|
||||
def VPERM2I128rr : AVX2AIi8<0x46, MRMSrcReg, (outs VR256:$dst),
|
||||
(ins VR256:$src1, VR256:$src2, i8imm:$src3),
|
||||
(ins VR256:$src1, VR256:$src2, u8imm:$src3),
|
||||
"vperm2i128\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}",
|
||||
[(set VR256:$dst, (v4i64 (X86VPerm2x128 VR256:$src1, VR256:$src2,
|
||||
(i8 imm:$src3))))]>, Sched<[WriteShuffle256]>,
|
||||
VEX_4V, VEX_L;
|
||||
def VPERM2I128rm : AVX2AIi8<0x46, MRMSrcMem, (outs VR256:$dst),
|
||||
(ins VR256:$src1, f256mem:$src2, i8imm:$src3),
|
||||
(ins VR256:$src1, f256mem:$src2, u8imm:$src3),
|
||||
"vperm2i128\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}",
|
||||
[(set VR256:$dst, (X86VPerm2x128 VR256:$src1, (loadv4i64 addr:$src2),
|
||||
(i8 imm:$src3)))]>,
|
||||
@ -8829,12 +8829,12 @@ def : Pat<(v8i32 (X86VPerm2x128 VR256:$src1, (bc_v8i32 (loadv4i64 addr:$src2)),
|
||||
//
|
||||
let hasSideEffects = 0 in {
|
||||
def VINSERTI128rr : AVX2AIi8<0x38, MRMSrcReg, (outs VR256:$dst),
|
||||
(ins VR256:$src1, VR128:$src2, i8imm:$src3),
|
||||
(ins VR256:$src1, VR128:$src2, u8imm:$src3),
|
||||
"vinserti128\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}",
|
||||
[]>, Sched<[WriteShuffle256]>, VEX_4V, VEX_L;
|
||||
let mayLoad = 1 in
|
||||
def VINSERTI128rm : AVX2AIi8<0x38, MRMSrcMem, (outs VR256:$dst),
|
||||
(ins VR256:$src1, i128mem:$src2, i8imm:$src3),
|
||||
(ins VR256:$src1, i128mem:$src2, u8imm:$src3),
|
||||
"vinserti128\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}",
|
||||
[]>, Sched<[WriteShuffle256Ld, ReadAfterLd]>, VEX_4V, VEX_L;
|
||||
}
|
||||
@ -8882,14 +8882,14 @@ def : Pat<(vinsert128_insert:$ins (v16i16 VR256:$src1),
|
||||
// VEXTRACTI128 - Extract packed integer values
|
||||
//
|
||||
def VEXTRACTI128rr : AVX2AIi8<0x39, MRMDestReg, (outs VR128:$dst),
|
||||
(ins VR256:$src1, i8imm:$src2),
|
||||
(ins VR256:$src1, u8imm:$src2),
|
||||
"vextracti128\t{$src2, $src1, $dst|$dst, $src1, $src2}",
|
||||
[(set VR128:$dst,
|
||||
(int_x86_avx2_vextracti128 VR256:$src1, imm:$src2))]>,
|
||||
Sched<[WriteShuffle256]>, VEX, VEX_L;
|
||||
let hasSideEffects = 0, mayStore = 1 in
|
||||
def VEXTRACTI128mr : AVX2AIi8<0x39, MRMDestMem, (outs),
|
||||
(ins i128mem:$dst, VR256:$src1, i8imm:$src2),
|
||||
(ins i128mem:$dst, VR256:$src1, u8imm:$src2),
|
||||
"vextracti128\t{$src2, $src1, $dst|$dst, $src1, $src2}", []>,
|
||||
Sched<[WriteStore]>, VEX, VEX_L;
|
||||
|
||||
|
@ -712,7 +712,7 @@
|
||||
# CHECK: movq %mm0, %mm1
|
||||
0x0f 0x7f 0xc1
|
||||
|
||||
# CHECK: vpermq $-18, %ymm2, %ymm2
|
||||
# CHECK: vpermq $238, %ymm2, %ymm2
|
||||
0xc4 0xe3 0xfd 0x00 0xd2 0xee
|
||||
|
||||
# CHECK: cmpps $8, %xmm7, %xmm0
|
||||
|
@ -932,6 +932,7 @@ OperandType RecognizableInstr::typeFromString(const std::string &s,
|
||||
TYPE("GR64", TYPE_R64)
|
||||
TYPE("i8mem", TYPE_M8)
|
||||
TYPE("i8imm", TYPE_IMM8)
|
||||
TYPE("u8imm", TYPE_UIMM8)
|
||||
TYPE("GR8", TYPE_R8)
|
||||
TYPE("VR128", TYPE_XMM128)
|
||||
TYPE("VR128X", TYPE_XMM128)
|
||||
@ -1042,6 +1043,7 @@ RecognizableInstr::immediateEncodingFromString(const std::string &s,
|
||||
ENCODING("i64i32imm", ENCODING_ID)
|
||||
ENCODING("i64i8imm", ENCODING_IB)
|
||||
ENCODING("i8imm", ENCODING_IB)
|
||||
ENCODING("u8imm", ENCODING_IB)
|
||||
// This is not a typo. Instructions like BLENDVPD put
|
||||
// register IDs in 8-bit immediates nowadays.
|
||||
ENCODING("FR32", ENCODING_IB)
|
||||
@ -1210,6 +1212,7 @@ RecognizableInstr::relocationEncodingFromString(const std::string &s,
|
||||
ENCODING("i64i32imm", ENCODING_ID)
|
||||
ENCODING("i64i8imm", ENCODING_IB)
|
||||
ENCODING("i8imm", ENCODING_IB)
|
||||
ENCODING("u8imm", ENCODING_IB)
|
||||
ENCODING("i64i32imm_pcrel", ENCODING_ID)
|
||||
ENCODING("i16imm_pcrel", ENCODING_IW)
|
||||
ENCODING("i32imm_pcrel", ENCODING_ID)
|
||||
|
Loading…
x
Reference in New Issue
Block a user