forked from OSchip/llvm-project
add basic avx support to the disassembler, also teach it about ssmem/sdmem
operands. With this done, we can remove the _Int suffixes from the round instructions without the disassembler blowing up. This allows the assembler to support them, implementing rdar://8456376 - llvm-mc rejects 'roundss' llvm-svn: 115019
This commit is contained in:
parent
ff3a3930a0
commit
f60062fd55
|
@ -248,6 +248,7 @@ struct ContextDecision {
|
|||
ENUM_ENTRY(TYPE_M64, "8-byte") \
|
||||
ENUM_ENTRY(TYPE_LEA, "Effective address") \
|
||||
ENUM_ENTRY(TYPE_M128, "16-byte (SSE/SSE2)") \
|
||||
ENUM_ENTRY(TYPE_M256, "256-byte (AVX)") \
|
||||
ENUM_ENTRY(TYPE_M1616, "2+2-byte segment+offset address") \
|
||||
ENUM_ENTRY(TYPE_M1632, "2+4-byte") \
|
||||
ENUM_ENTRY(TYPE_M1664, "2+8-byte") \
|
||||
|
|
|
@ -2343,8 +2343,8 @@ MachineInstr* X86InstrInfo::foldMemoryOperandImpl(MachineFunction &MF,
|
|||
case X86::Int_CVTSS2SDrr:
|
||||
case X86::RCPSSr:
|
||||
case X86::RCPSSr_Int:
|
||||
case X86::ROUNDSDr_Int:
|
||||
case X86::ROUNDSSr_Int:
|
||||
case X86::ROUNDSDr:
|
||||
case X86::ROUNDSSr:
|
||||
case X86::RSQRTSSr:
|
||||
case X86::RSQRTSSr_Int:
|
||||
case X86::SQRTSSr:
|
||||
|
@ -2395,8 +2395,8 @@ MachineInstr* X86InstrInfo::foldMemoryOperandImpl(MachineFunction &MF,
|
|||
case X86::Int_CVTSS2SDrr:
|
||||
case X86::RCPSSr:
|
||||
case X86::RCPSSr_Int:
|
||||
case X86::ROUNDSDr_Int:
|
||||
case X86::ROUNDSSr_Int:
|
||||
case X86::ROUNDSDr:
|
||||
case X86::ROUNDSSr:
|
||||
case X86::RSQRTSSr:
|
||||
case X86::RSQRTSSr_Int:
|
||||
case X86::SQRTSSr:
|
||||
|
|
|
@ -4365,7 +4365,7 @@ multiclass sse41_fp_unop_rm<bits<8> opcps, bits<8> opcpd, string OpcodeStr,
|
|||
Intrinsic V4F32Int, Intrinsic V2F64Int> {
|
||||
// Intrinsic operation, reg.
|
||||
// Vector intrinsic operation, reg
|
||||
def PSr_Int : SS4AIi8<opcps, MRMSrcReg,
|
||||
def PSr : SS4AIi8<opcps, MRMSrcReg,
|
||||
(outs RC:$dst), (ins RC:$src1, i32i8imm:$src2),
|
||||
!strconcat(OpcodeStr,
|
||||
"ps\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
|
||||
|
@ -4373,7 +4373,7 @@ multiclass sse41_fp_unop_rm<bits<8> opcps, bits<8> opcpd, string OpcodeStr,
|
|||
OpSize;
|
||||
|
||||
// Vector intrinsic operation, mem
|
||||
def PSm_Int : Ii8<opcps, MRMSrcMem,
|
||||
def PSm : Ii8<opcps, MRMSrcMem,
|
||||
(outs RC:$dst), (ins f256mem:$src1, i32i8imm:$src2),
|
||||
!strconcat(OpcodeStr,
|
||||
"ps\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
|
||||
|
@ -4383,7 +4383,7 @@ multiclass sse41_fp_unop_rm<bits<8> opcps, bits<8> opcpd, string OpcodeStr,
|
|||
Requires<[HasSSE41]>;
|
||||
|
||||
// Vector intrinsic operation, reg
|
||||
def PDr_Int : SS4AIi8<opcpd, MRMSrcReg,
|
||||
def PDr : SS4AIi8<opcpd, MRMSrcReg,
|
||||
(outs RC:$dst), (ins RC:$src1, i32i8imm:$src2),
|
||||
!strconcat(OpcodeStr,
|
||||
"pd\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
|
||||
|
@ -4391,7 +4391,7 @@ multiclass sse41_fp_unop_rm<bits<8> opcps, bits<8> opcpd, string OpcodeStr,
|
|||
OpSize;
|
||||
|
||||
// Vector intrinsic operation, mem
|
||||
def PDm_Int : SS4AIi8<opcpd, MRMSrcMem,
|
||||
def PDm : SS4AIi8<opcpd, MRMSrcMem,
|
||||
(outs RC:$dst), (ins f256mem:$src1, i32i8imm:$src2),
|
||||
!strconcat(OpcodeStr,
|
||||
"pd\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
|
||||
|
@ -4404,28 +4404,28 @@ multiclass sse41_fp_unop_rm_avx_p<bits<8> opcps, bits<8> opcpd,
|
|||
RegisterClass RC, X86MemOperand x86memop, string OpcodeStr> {
|
||||
// Intrinsic operation, reg.
|
||||
// Vector intrinsic operation, reg
|
||||
def PSr : SS4AIi8<opcps, MRMSrcReg,
|
||||
def PSr_AVX : SS4AIi8<opcps, MRMSrcReg,
|
||||
(outs RC:$dst), (ins RC:$src1, i32i8imm:$src2),
|
||||
!strconcat(OpcodeStr,
|
||||
"ps\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
|
||||
[]>, OpSize;
|
||||
|
||||
// Vector intrinsic operation, mem
|
||||
def PSm : Ii8<opcps, MRMSrcMem,
|
||||
def PSm_AVX : Ii8<opcps, MRMSrcMem,
|
||||
(outs RC:$dst), (ins x86memop:$src1, i32i8imm:$src2),
|
||||
!strconcat(OpcodeStr,
|
||||
"ps\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
|
||||
[]>, TA, OpSize, Requires<[HasSSE41]>;
|
||||
|
||||
// Vector intrinsic operation, reg
|
||||
def PDr : SS4AIi8<opcpd, MRMSrcReg,
|
||||
def PDr_AVX : SS4AIi8<opcpd, MRMSrcReg,
|
||||
(outs RC:$dst), (ins RC:$src1, i32i8imm:$src2),
|
||||
!strconcat(OpcodeStr,
|
||||
"pd\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
|
||||
[]>, OpSize;
|
||||
|
||||
// Vector intrinsic operation, mem
|
||||
def PDm : SS4AIi8<opcpd, MRMSrcMem,
|
||||
def PDm_AVX : SS4AIi8<opcpd, MRMSrcMem,
|
||||
(outs RC:$dst), (ins x86memop:$src1, i32i8imm:$src2),
|
||||
!strconcat(OpcodeStr,
|
||||
"pd\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
|
||||
|
@ -4437,7 +4437,7 @@ multiclass sse41_fp_binop_rm<bits<8> opcss, bits<8> opcsd,
|
|||
Intrinsic F32Int,
|
||||
Intrinsic F64Int, bit Is2Addr = 1> {
|
||||
// Intrinsic operation, reg.
|
||||
def SSr_Int : SS4AIi8<opcss, MRMSrcReg,
|
||||
def SSr : SS4AIi8<opcss, MRMSrcReg,
|
||||
(outs VR128:$dst), (ins VR128:$src1, VR128:$src2, i32i8imm:$src3),
|
||||
!if(Is2Addr,
|
||||
!strconcat(OpcodeStr,
|
||||
|
@ -4448,7 +4448,7 @@ multiclass sse41_fp_binop_rm<bits<8> opcss, bits<8> opcsd,
|
|||
OpSize;
|
||||
|
||||
// Intrinsic operation, mem.
|
||||
def SSm_Int : SS4AIi8<opcss, MRMSrcMem,
|
||||
def SSm : SS4AIi8<opcss, MRMSrcMem,
|
||||
(outs VR128:$dst), (ins VR128:$src1, ssmem:$src2, i32i8imm:$src3),
|
||||
!if(Is2Addr,
|
||||
!strconcat(OpcodeStr,
|
||||
|
@ -4460,7 +4460,7 @@ multiclass sse41_fp_binop_rm<bits<8> opcss, bits<8> opcsd,
|
|||
OpSize;
|
||||
|
||||
// Intrinsic operation, reg.
|
||||
def SDr_Int : SS4AIi8<opcsd, MRMSrcReg,
|
||||
def SDr : SS4AIi8<opcsd, MRMSrcReg,
|
||||
(outs VR128:$dst), (ins VR128:$src1, VR128:$src2, i32i8imm:$src3),
|
||||
!if(Is2Addr,
|
||||
!strconcat(OpcodeStr,
|
||||
|
@ -4471,7 +4471,7 @@ multiclass sse41_fp_binop_rm<bits<8> opcss, bits<8> opcsd,
|
|||
OpSize;
|
||||
|
||||
// Intrinsic operation, mem.
|
||||
def SDm_Int : SS4AIi8<opcsd, MRMSrcMem,
|
||||
def SDm : SS4AIi8<opcsd, MRMSrcMem,
|
||||
(outs VR128:$dst), (ins VR128:$src1, sdmem:$src2, i32i8imm:$src3),
|
||||
!if(Is2Addr,
|
||||
!strconcat(OpcodeStr,
|
||||
|
@ -4486,28 +4486,28 @@ multiclass sse41_fp_binop_rm<bits<8> opcss, bits<8> opcsd,
|
|||
multiclass sse41_fp_binop_rm_avx_s<bits<8> opcss, bits<8> opcsd,
|
||||
string OpcodeStr> {
|
||||
// Intrinsic operation, reg.
|
||||
def SSr : SS4AIi8<opcss, MRMSrcReg,
|
||||
def SSr_AVX : SS4AIi8<opcss, MRMSrcReg,
|
||||
(outs VR128:$dst), (ins VR128:$src1, VR128:$src2, i32i8imm:$src3),
|
||||
!strconcat(OpcodeStr,
|
||||
"ss\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
|
||||
[]>, OpSize;
|
||||
|
||||
// Intrinsic operation, mem.
|
||||
def SSm : SS4AIi8<opcss, MRMSrcMem,
|
||||
def SSm_AVX : SS4AIi8<opcss, MRMSrcMem,
|
||||
(outs VR128:$dst), (ins VR128:$src1, ssmem:$src2, i32i8imm:$src3),
|
||||
!strconcat(OpcodeStr,
|
||||
"ss\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
|
||||
[]>, OpSize;
|
||||
|
||||
// Intrinsic operation, reg.
|
||||
def SDr : SS4AIi8<opcsd, MRMSrcReg,
|
||||
def SDr_AVX : SS4AIi8<opcsd, MRMSrcReg,
|
||||
(outs VR128:$dst), (ins VR128:$src1, VR128:$src2, i32i8imm:$src3),
|
||||
!strconcat(OpcodeStr,
|
||||
"sd\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
|
||||
[]>, OpSize;
|
||||
|
||||
// Intrinsic operation, mem.
|
||||
def SDm : SS4AIi8<opcsd, MRMSrcMem,
|
||||
def SDm_AVX : SS4AIi8<opcsd, MRMSrcMem,
|
||||
(outs VR128:$dst), (ins VR128:$src1, sdmem:$src2, i32i8imm:$src3),
|
||||
!strconcat(OpcodeStr,
|
||||
"sd\t{$src3, $src2, $src1, $dst|$dst, $src1, $src2, $src3}"),
|
||||
|
|
|
@ -430,3 +430,9 @@ cvttpd2dq (%rax), %xmm0 // CHECK: cvttpd2dq (%rax), %xmm0
|
|||
|
||||
cvttps2dq %xmm1, %xmm0 // CHECK: cvttps2dq %xmm1, %xmm0
|
||||
cvttps2dq (%rax), %xmm0 // CHECK: cvttps2dq (%rax), %xmm0
|
||||
|
||||
// rdar://8456376 - llvm-mc rejects 'roundss'
|
||||
roundss $0xE, %xmm0, %xmm0 // CHECK: encoding: [0x66,0x0f,0x3a,0x0a,0xc0,0x0e]
|
||||
roundps $0xE, %xmm0, %xmm0 // CHECK: encoding: [0x66,0x0f,0x3a,0x08,0xc0,0x0e]
|
||||
roundsd $0xE, %xmm0, %xmm0 // CHECK: encoding: [0x66,0x0f,0x3a,0x0b,0xc0,0x0e]
|
||||
roundpd $0xE, %xmm0, %xmm0 // CHECK: encoding: [0x66,0x0f,0x3a,0x09,0xc0,0x0e]
|
||||
|
|
|
@ -835,10 +835,13 @@ OperandType RecognizableInstr::typeFromString(const std::string &s,
|
|||
TYPE("GR8", TYPE_R8)
|
||||
TYPE("VR128", TYPE_XMM128)
|
||||
TYPE("f128mem", TYPE_M128)
|
||||
TYPE("f256mem", TYPE_M256)
|
||||
TYPE("FR64", TYPE_XMM64)
|
||||
TYPE("f64mem", TYPE_M64FP)
|
||||
TYPE("sdmem", TYPE_M64FP)
|
||||
TYPE("FR32", TYPE_XMM32)
|
||||
TYPE("f32mem", TYPE_M32FP)
|
||||
TYPE("ssmem", TYPE_M32FP)
|
||||
TYPE("RST", TYPE_ST)
|
||||
TYPE("i128mem", TYPE_M128)
|
||||
TYPE("i64i32imm_pcrel", TYPE_REL64)
|
||||
|
@ -930,7 +933,10 @@ OperandEncoding RecognizableInstr::memoryEncodingFromString
|
|||
ENCODING("i32mem", ENCODING_RM)
|
||||
ENCODING("i64mem", ENCODING_RM)
|
||||
ENCODING("i8mem", ENCODING_RM)
|
||||
ENCODING("ssmem", ENCODING_RM)
|
||||
ENCODING("sdmem", ENCODING_RM)
|
||||
ENCODING("f128mem", ENCODING_RM)
|
||||
ENCODING("f256mem", ENCODING_RM)
|
||||
ENCODING("f64mem", ENCODING_RM)
|
||||
ENCODING("f32mem", ENCODING_RM)
|
||||
ENCODING("i128mem", ENCODING_RM)
|
||||
|
|
Loading…
Reference in New Issue