mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
Don't disable MMX support when AVX is enabled. Fix predicates for MMX instructions that were added along with SSE instructions to check for AVX in addition to SSE level.
llvm-svn: 147762
This commit is contained in:
parent
3fb8201fcb
commit
1fdcf7071d
@ -399,12 +399,12 @@ class S3I<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern>
|
||||
// SS3AI - SSSE3 instructions with TA prefix.
|
||||
//
|
||||
// Note: SSSE3 instructions have 64-bit and 128-bit versions. The 64-bit version
|
||||
// uses the MMX registers. We put those instructions here because they better
|
||||
// fit into the SSSE3 instruction category rather than the MMX category.
|
||||
// uses the MMX registers. The 64-bit versions are grouped with the MMX
|
||||
// classes. They need to be enabled even if AVX is enabled.
|
||||
|
||||
class SS38I<bits<8> o, Format F, dag outs, dag ins, string asm,
|
||||
list<dag> pattern>
|
||||
: Ii8<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8,
|
||||
: I<o, F, outs, ins, asm, pattern, SSEPackedInt>, T8,
|
||||
Requires<[HasSSSE3]>;
|
||||
class SS3AI<bits<8> o, Format F, dag outs, dag ins, string asm,
|
||||
list<dag> pattern>
|
||||
@ -569,6 +569,11 @@ class VRPDI<bits<8> o, Format F, dag outs, dag ins, string asm,
|
||||
// MMXIi8 - MMX instructions with ImmT == Imm8 and TB prefix.
|
||||
// MMXID - MMX instructions with XD prefix.
|
||||
// MMXIS - MMX instructions with XS prefix.
|
||||
// MMXPI - SSE 1 & 2 packed instructions for MMX with no AVX equivalents
|
||||
// MMXSDIi8 - SSE2 instructions with ImmT == Imm8 and XD prefix. No AVX equiv.
|
||||
// MMXSSDIi8 - SSE2 instructions with ImmT == Imm8 and XS prefix. No AVX equiv.
|
||||
// MMXSS38I - SSSE3 instructions with T8 prefix for MMX registers. No AVX equiv.
|
||||
// MMXSS3AI - SSSE3 instructions with TA prefix for MMX registers. No AVX equiv.
|
||||
class MMXI<bits<8> o, Format F, dag outs, dag ins, string asm,
|
||||
list<dag> pattern>
|
||||
: I<o, F, outs, ins, asm, pattern>, TB, Requires<[HasMMX]>;
|
||||
@ -590,3 +595,21 @@ class MMXID<bits<8> o, Format F, dag outs, dag ins, string asm,
|
||||
class MMXIS<bits<8> o, Format F, dag outs, dag ins, string asm,
|
||||
list<dag> pattern>
|
||||
: Ii8<o, F, outs, ins, asm, pattern>, XS, Requires<[HasMMX]>;
|
||||
|
||||
class MMXPI<bits<8> o, Format F, dag outs, dag ins, string asm, list<dag> pattern,
|
||||
Domain d>
|
||||
: I<o, F, outs, ins, asm, pattern, d> {
|
||||
let Predicates = !if(hasOpSizePrefix /* OpSize */, [HasXMMInt], [HasXMM]);
|
||||
}
|
||||
class MMXSDIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
|
||||
list<dag> pattern>
|
||||
: Ii8<o, F, outs, ins, asm, pattern>, XD, Requires<[HasXMMInt]>;
|
||||
class MMXSSDIi8<bits<8> o, Format F, dag outs, dag ins, string asm,
|
||||
list<dag> pattern>
|
||||
: Ii8<o, F, outs, ins, asm, pattern>, XS, Requires<[HasXMMInt]>;
|
||||
class MMXSS38I<bits<8> o, Format F, dag outs, dag ins, string asm,
|
||||
list<dag> pattern>
|
||||
: I<o, F, outs, ins, asm, pattern>, T8, Requires<[HasSSSE3orAVX]>;
|
||||
class MMXSS3AI<bits<8> o, Format F, dag outs, dag ins, string asm,
|
||||
list<dag> pattern>
|
||||
: Ii8<o, F, outs, ins, asm, pattern>, TA, Requires<[HasSSSE3orAVX]>;
|
||||
|
@ -476,6 +476,7 @@ def HasAVX2 : Predicate<"Subtarget->hasAVX2()">;
|
||||
def HasXMM : Predicate<"Subtarget->hasXMM()">;
|
||||
def HasXMMInt : Predicate<"Subtarget->hasXMMInt()">;
|
||||
def HasSSE3orAVX : Predicate<"Subtarget->hasSSE3orAVX()">;
|
||||
def HasSSSE3orAVX : Predicate<"Subtarget->hasSSSE3orAVX()">;
|
||||
def HasSSE42orAVX : Predicate<"Subtarget->hasSSE42orAVX()">;
|
||||
|
||||
def HasPOPCNT : Predicate<"Subtarget->hasPOPCNT()">;
|
||||
|
@ -60,14 +60,14 @@ let Constraints = "$src1 = $dst" in {
|
||||
/// Unary MMX instructions requiring SSSE3.
|
||||
multiclass SS3I_unop_rm_int_mm<bits<8> opc, string OpcodeStr,
|
||||
Intrinsic IntId64> {
|
||||
def rr64 : SS38I<opc, MRMSrcReg, (outs VR64:$dst), (ins VR64:$src),
|
||||
!strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
|
||||
[(set VR64:$dst, (IntId64 VR64:$src))]>;
|
||||
def rr64 : MMXSS38I<opc, MRMSrcReg, (outs VR64:$dst), (ins VR64:$src),
|
||||
!strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
|
||||
[(set VR64:$dst, (IntId64 VR64:$src))]>;
|
||||
|
||||
def rm64 : SS38I<opc, MRMSrcMem, (outs VR64:$dst), (ins i64mem:$src),
|
||||
!strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
|
||||
[(set VR64:$dst,
|
||||
(IntId64 (bitconvert (memopmmx addr:$src))))]>;
|
||||
def rm64 : MMXSS38I<opc, MRMSrcMem, (outs VR64:$dst), (ins i64mem:$src),
|
||||
!strconcat(OpcodeStr, "\t{$src, $dst|$dst, $src}"),
|
||||
[(set VR64:$dst,
|
||||
(IntId64 (bitconvert (memopmmx addr:$src))))]>;
|
||||
}
|
||||
|
||||
/// Binary MMX instructions requiring SSSE3.
|
||||
@ -75,11 +75,11 @@ let ImmT = NoImm, Constraints = "$src1 = $dst" in {
|
||||
multiclass SS3I_binop_rm_int_mm<bits<8> opc, string OpcodeStr,
|
||||
Intrinsic IntId64> {
|
||||
let isCommutable = 0 in
|
||||
def rr64 : SS38I<opc, MRMSrcReg, (outs VR64:$dst),
|
||||
def rr64 : MMXSS38I<opc, MRMSrcReg, (outs VR64:$dst),
|
||||
(ins VR64:$src1, VR64:$src2),
|
||||
!strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
|
||||
[(set VR64:$dst, (IntId64 VR64:$src1, VR64:$src2))]>;
|
||||
def rm64 : SS38I<opc, MRMSrcMem, (outs VR64:$dst),
|
||||
def rm64 : MMXSS38I<opc, MRMSrcMem, (outs VR64:$dst),
|
||||
(ins VR64:$src1, i64mem:$src2),
|
||||
!strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
|
||||
[(set VR64:$dst,
|
||||
@ -90,11 +90,11 @@ multiclass SS3I_binop_rm_int_mm<bits<8> opc, string OpcodeStr,
|
||||
|
||||
/// PALIGN MMX instructions (require SSSE3).
|
||||
multiclass ssse3_palign_mm<string asm, Intrinsic IntId> {
|
||||
def R64irr : SS3AI<0x0F, MRMSrcReg, (outs VR64:$dst),
|
||||
def R64irr : MMXSS3AI<0x0F, MRMSrcReg, (outs VR64:$dst),
|
||||
(ins VR64:$src1, VR64:$src2, i8imm:$src3),
|
||||
!strconcat(asm, "\t{$src3, $src2, $dst|$dst, $src2, $src3}"),
|
||||
[(set VR64:$dst, (IntId VR64:$src1, VR64:$src2, (i8 imm:$src3)))]>;
|
||||
def R64irm : SS3AI<0x0F, MRMSrcMem, (outs VR64:$dst),
|
||||
def R64irm : MMXSS3AI<0x0F, MRMSrcMem, (outs VR64:$dst),
|
||||
(ins VR64:$src1, i64mem:$src2, i8imm:$src3),
|
||||
!strconcat(asm, "\t{$src3, $src2, $dst|$dst, $src2, $src3}"),
|
||||
[(set VR64:$dst, (IntId VR64:$src1,
|
||||
@ -104,18 +104,18 @@ multiclass ssse3_palign_mm<string asm, Intrinsic IntId> {
|
||||
multiclass sse12_cvt_pint<bits<8> opc, RegisterClass SrcRC, RegisterClass DstRC,
|
||||
Intrinsic Int, X86MemOperand x86memop, PatFrag ld_frag,
|
||||
string asm, Domain d> {
|
||||
def irr : PI<opc, MRMSrcReg, (outs DstRC:$dst), (ins SrcRC:$src), asm,
|
||||
def irr : MMXPI<opc, MRMSrcReg, (outs DstRC:$dst), (ins SrcRC:$src), asm,
|
||||
[(set DstRC:$dst, (Int SrcRC:$src))], d>;
|
||||
def irm : PI<opc, MRMSrcMem, (outs DstRC:$dst), (ins x86memop:$src), asm,
|
||||
def irm : MMXPI<opc, MRMSrcMem, (outs DstRC:$dst), (ins x86memop:$src), asm,
|
||||
[(set DstRC:$dst, (Int (ld_frag addr:$src)))], d>;
|
||||
}
|
||||
|
||||
multiclass sse12_cvt_pint_3addr<bits<8> opc, RegisterClass SrcRC,
|
||||
RegisterClass DstRC, Intrinsic Int, X86MemOperand x86memop,
|
||||
PatFrag ld_frag, string asm, Domain d> {
|
||||
def irr : PI<opc, MRMSrcReg, (outs DstRC:$dst),(ins DstRC:$src1, SrcRC:$src2),
|
||||
def irr : MMXPI<opc, MRMSrcReg, (outs DstRC:$dst),(ins DstRC:$src1, SrcRC:$src2),
|
||||
asm, [(set DstRC:$dst, (Int DstRC:$src1, SrcRC:$src2))], d>;
|
||||
def irm : PI<opc, MRMSrcMem, (outs DstRC:$dst),
|
||||
def irm : MMXPI<opc, MRMSrcMem, (outs DstRC:$dst),
|
||||
(ins DstRC:$src1, x86memop:$src2), asm,
|
||||
[(set DstRC:$dst, (Int DstRC:$src1, (ld_frag addr:$src2)))], d>;
|
||||
}
|
||||
@ -175,25 +175,25 @@ def MMX_MOVQ64mr : MMXI<0x7F, MRMDestMem, (outs), (ins i64mem:$dst, VR64:$src),
|
||||
"movq\t{$src, $dst|$dst, $src}",
|
||||
[(store (x86mmx VR64:$src), addr:$dst)]>;
|
||||
|
||||
def MMX_MOVDQ2Qrr : SDIi8<0xD6, MRMSrcReg, (outs VR64:$dst), (ins VR128:$src),
|
||||
"movdq2q\t{$src, $dst|$dst, $src}",
|
||||
def MMX_MOVDQ2Qrr : MMXSDIi8<0xD6, MRMSrcReg, (outs VR64:$dst),
|
||||
(ins VR128:$src), "movdq2q\t{$src, $dst|$dst, $src}",
|
||||
[(set VR64:$dst,
|
||||
(x86mmx (bitconvert
|
||||
(i64 (vector_extract (v2i64 VR128:$src),
|
||||
(iPTR 0))))))]>;
|
||||
|
||||
def MMX_MOVQ2DQrr : SSDIi8<0xD6, MRMSrcReg, (outs VR128:$dst), (ins VR64:$src),
|
||||
"movq2dq\t{$src, $dst|$dst, $src}",
|
||||
def MMX_MOVQ2DQrr : MMXSSDIi8<0xD6, MRMSrcReg, (outs VR128:$dst),
|
||||
(ins VR64:$src), "movq2dq\t{$src, $dst|$dst, $src}",
|
||||
[(set VR128:$dst,
|
||||
(v2i64 (scalar_to_vector
|
||||
(i64 (bitconvert (x86mmx VR64:$src))))))]>;
|
||||
|
||||
let neverHasSideEffects = 1 in
|
||||
def MMX_MOVQ2FR64rr: SSDIi8<0xD6, MRMSrcReg, (outs FR64:$dst), (ins VR64:$src),
|
||||
"movq2dq\t{$src, $dst|$dst, $src}", []>;
|
||||
def MMX_MOVQ2FR64rr: MMXSSDIi8<0xD6, MRMSrcReg, (outs FR64:$dst),
|
||||
(ins VR64:$src), "movq2dq\t{$src, $dst|$dst, $src}", []>;
|
||||
|
||||
def MMX_MOVFR642Qrr: SDIi8<0xD6, MRMSrcReg, (outs VR64:$dst), (ins FR64:$src),
|
||||
"movdq2q\t{$src, $dst|$dst, $src}", []>;
|
||||
def MMX_MOVFR642Qrr: MMXSDIi8<0xD6, MRMSrcReg, (outs VR64:$dst),
|
||||
(ins FR64:$src), "movdq2q\t{$src, $dst|$dst, $src}", []>;
|
||||
|
||||
def MMX_MOVNTQmr : MMXI<0xE7, MRMDestMem, (outs), (ins i64mem:$dst, VR64:$src),
|
||||
"movntq\t{$src, $dst|$dst, $src}",
|
||||
|
@ -386,7 +386,7 @@ X86Subtarget::X86Subtarget(const std::string &TT, const std::string &CPU,
|
||||
ToggleFeature(X86::Mode64Bit);
|
||||
|
||||
if (HasAVX)
|
||||
X86SSELevel = NoMMXSSE;
|
||||
X86SSELevel = MMX;
|
||||
|
||||
DEBUG(dbgs() << "Subtarget features: SSELevel " << X86SSELevel
|
||||
<< ", 3DNowLevel " << X863DNowLevel
|
||||
|
@ -1,4 +1,5 @@
|
||||
; RUN: llc < %s -march=x86 -mattr=+mmx,+ssse3 | FileCheck %s
|
||||
; RUN: llc < %s -march=x86 -mattr=+avx | FileCheck %s
|
||||
|
||||
declare x86_mmx @llvm.x86.ssse3.phadd.w(x86_mmx, x86_mmx) nounwind readnone
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user