mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
Start replacing vector_extract/vector_insert with extractelt/insertelt
These are redundant pairs of nodes defined for INSERT_VECTOR_ELEMENT/EXTRACT_VECTOR_ELEMENT. insertelement/extractelement are slightly closer to the corresponding C++ node name, and has stricter type checking so prefer it. Update targets to only use these nodes where it is trivial to do so. AArch64, ARM, and Mips all have various type errors on simple replacement, so they will need work to fix. Example from AArch64: def : Pat<(sext_inreg (vector_extract (v16i8 V128:$Rn), VectorIndexB:$idx), i8), (i32 (SMOVvi8to32 V128:$Rn, VectorIndexB:$idx))>; Which is trying to do sext_inreg i8, i8. llvm-svn: 255359
This commit is contained in:
parent
06821d8eaa
commit
fad94dae85
@ -534,6 +534,9 @@ def vector_shuffle : SDNode<"ISD::VECTOR_SHUFFLE", SDTVecShuffle, []>;
|
||||
def build_vector : SDNode<"ISD::BUILD_VECTOR", SDTypeProfile<1, -1, []>, []>;
|
||||
def scalar_to_vector : SDNode<"ISD::SCALAR_TO_VECTOR", SDTypeProfile<1, 1, []>,
|
||||
[]>;
|
||||
|
||||
// vector_extract/vector_insert are deprecated. extractelt/insertelt
|
||||
// are preferred.
|
||||
def vector_extract : SDNode<"ISD::EXTRACT_VECTOR_ELT",
|
||||
SDTypeProfile<1, 2, [SDTCisPtrTy<2>]>, []>;
|
||||
def vector_insert : SDNode<"ISD::INSERT_VECTOR_ELT",
|
||||
|
@ -3508,8 +3508,8 @@ defm : Neon_mulacc_widen_patterns<
|
||||
// Patterns for 64-bit pmull
|
||||
def : Pat<(int_aarch64_neon_pmull64 V64:$Rn, V64:$Rm),
|
||||
(PMULLv1i64 V64:$Rn, V64:$Rm)>;
|
||||
def : Pat<(int_aarch64_neon_pmull64 (vector_extract (v2i64 V128:$Rn), (i64 1)),
|
||||
(vector_extract (v2i64 V128:$Rm), (i64 1))),
|
||||
def : Pat<(int_aarch64_neon_pmull64 (extractelt (v2i64 V128:$Rn), (i64 1)),
|
||||
(extractelt (v2i64 V128:$Rm), (i64 1))),
|
||||
(PMULLv2i64 V128:$Rn, V128:$Rm)>;
|
||||
|
||||
// CodeGen patterns for addhn and subhn instructions, which can actually be
|
||||
@ -3772,11 +3772,11 @@ defm : DUPWithTruncPats<v8i16, v2i32, v4i32, i32, DUPv8i16lane, VecIndex_x2>;
|
||||
|
||||
multiclass DUPWithTrunci64Pats<ValueType ResVT, Instruction DUP,
|
||||
SDNodeXForm IdxXFORM> {
|
||||
def : Pat<(ResVT (AArch64dup (i32 (trunc (vector_extract (v2i64 V128:$Rn),
|
||||
def : Pat<(ResVT (AArch64dup (i32 (trunc (extractelt (v2i64 V128:$Rn),
|
||||
imm:$idx))))),
|
||||
(DUP V128:$Rn, (IdxXFORM imm:$idx))>;
|
||||
|
||||
def : Pat<(ResVT (AArch64dup (i32 (trunc (vector_extract (v1i64 V64:$Rn),
|
||||
def : Pat<(ResVT (AArch64dup (i32 (trunc (extractelt (v1i64 V64:$Rn),
|
||||
imm:$idx))))),
|
||||
(DUP (SUBREG_TO_REG (i64 0), V64:$Rn, dsub), (IdxXFORM imm:$idx))>;
|
||||
}
|
||||
|
@ -514,7 +514,7 @@ class POW_Common <AMDGPUInst log_ieee, AMDGPUInst exp_ieee, AMDGPUInst mul>
|
||||
class Extract_Element <ValueType sub_type, ValueType vec_type, int sub_idx,
|
||||
SubRegIndex sub_reg>
|
||||
: Pat<
|
||||
(sub_type (vector_extract vec_type:$src, sub_idx)),
|
||||
(sub_type (extractelt vec_type:$src, sub_idx)),
|
||||
(EXTRACT_SUBREG $src, sub_reg)
|
||||
>;
|
||||
|
||||
@ -522,7 +522,7 @@ class Extract_Element <ValueType sub_type, ValueType vec_type, int sub_idx,
|
||||
class Insert_Element <ValueType elem_type, ValueType vec_type,
|
||||
int sub_idx, SubRegIndex sub_reg>
|
||||
: Pat <
|
||||
(vector_insert vec_type:$vec, elem_type:$elem, sub_idx),
|
||||
(insertelt vec_type:$vec, elem_type:$elem, sub_idx),
|
||||
(INSERT_SUBREG $vec, $elem, sub_reg)
|
||||
>;
|
||||
|
||||
|
@ -3025,25 +3025,25 @@ multiclass SI_INDIRECT_Pattern <ValueType vt, ValueType eltvt, string VecSize> {
|
||||
|
||||
// 1. Extract with offset
|
||||
def : Pat<
|
||||
(eltvt (vector_extract vt:$vec, (add i32:$idx, imm:$off))),
|
||||
(eltvt (extractelt vt:$vec, (add i32:$idx, imm:$off))),
|
||||
(!cast<Instruction>("SI_INDIRECT_SRC_"#VecSize) $vec, $idx, imm:$off)
|
||||
>;
|
||||
|
||||
// 2. Extract without offset
|
||||
def : Pat<
|
||||
(eltvt (vector_extract vt:$vec, i32:$idx)),
|
||||
(eltvt (extractelt vt:$vec, i32:$idx)),
|
||||
(!cast<Instruction>("SI_INDIRECT_SRC_"#VecSize) $vec, $idx, 0)
|
||||
>;
|
||||
|
||||
// 3. Insert with offset
|
||||
def : Pat<
|
||||
(vector_insert vt:$vec, eltvt:$val, (add i32:$idx, imm:$off)),
|
||||
(insertelt vt:$vec, eltvt:$val, (add i32:$idx, imm:$off)),
|
||||
(!cast<Instruction>("SI_INDIRECT_DST_"#VecSize) $vec, $idx, imm:$off, $val)
|
||||
>;
|
||||
|
||||
// 4. Insert without offset
|
||||
def : Pat<
|
||||
(vector_insert vt:$vec, eltvt:$val, i32:$idx),
|
||||
(insertelt vt:$vec, eltvt:$val, i32:$idx),
|
||||
(!cast<Instruction>("SI_INDIRECT_DST_"#VecSize) $vec, $idx, 0, $val)
|
||||
>;
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ let isAsCheapAsAMove=1, VecInstType=isVecExtract.Value in {
|
||||
def V2i16Extract : NVPTXVecInst<(outs Int16Regs:$dst),
|
||||
(ins V2I16Regs:$src, i8imm:$c),
|
||||
"mov.u16 \t$dst, $src${c:vecelem};",
|
||||
[(set Int16Regs:$dst, (vector_extract
|
||||
[(set Int16Regs:$dst, (extractelt
|
||||
(v2i16 V2I16Regs:$src), imm:$c))],
|
||||
IMOV16rr>;
|
||||
|
||||
@ -34,7 +34,7 @@ def V2i16Extract : NVPTXVecInst<(outs Int16Regs:$dst),
|
||||
def V4i16Extract : NVPTXVecInst<(outs Int16Regs:$dst),
|
||||
(ins V4I16Regs:$src, i8imm:$c),
|
||||
"mov.u16 \t$dst, $src${c:vecelem};",
|
||||
[(set Int16Regs:$dst, (vector_extract
|
||||
[(set Int16Regs:$dst, (extractelt
|
||||
(v4i16 V4I16Regs:$src), imm:$c))],
|
||||
IMOV16rr>;
|
||||
|
||||
@ -42,7 +42,7 @@ def V4i16Extract : NVPTXVecInst<(outs Int16Regs:$dst),
|
||||
def V2i8Extract : NVPTXVecInst<(outs Int8Regs:$dst),
|
||||
(ins V2I8Regs:$src, i8imm:$c),
|
||||
"mov.u16 \t$dst, $src${c:vecelem};",
|
||||
[(set Int8Regs:$dst, (vector_extract
|
||||
[(set Int8Regs:$dst, (extractelt
|
||||
(v2i8 V2I8Regs:$src), imm:$c))],
|
||||
IMOV8rr>;
|
||||
|
||||
@ -50,7 +50,7 @@ def V2i8Extract : NVPTXVecInst<(outs Int8Regs:$dst),
|
||||
def V4i8Extract : NVPTXVecInst<(outs Int8Regs:$dst),
|
||||
(ins V4I8Regs:$src, i8imm:$c),
|
||||
"mov.u16 \t$dst, $src${c:vecelem};",
|
||||
[(set Int8Regs:$dst, (vector_extract
|
||||
[(set Int8Regs:$dst, (extractelt
|
||||
(v4i8 V4I8Regs:$src), imm:$c))],
|
||||
IMOV8rr>;
|
||||
|
||||
@ -58,7 +58,7 @@ def V4i8Extract : NVPTXVecInst<(outs Int8Regs:$dst),
|
||||
def V2i32Extract : NVPTXVecInst<(outs Int32Regs:$dst),
|
||||
(ins V2I32Regs:$src, i8imm:$c),
|
||||
"mov.u32 \t$dst, $src${c:vecelem};",
|
||||
[(set Int32Regs:$dst, (vector_extract
|
||||
[(set Int32Regs:$dst, (extractelt
|
||||
(v2i32 V2I32Regs:$src), imm:$c))],
|
||||
IMOV32rr>;
|
||||
|
||||
@ -66,7 +66,7 @@ def V2i32Extract : NVPTXVecInst<(outs Int32Regs:$dst),
|
||||
def V2f32Extract : NVPTXVecInst<(outs Float32Regs:$dst),
|
||||
(ins V2F32Regs:$src, i8imm:$c),
|
||||
"mov.f32 \t$dst, $src${c:vecelem};",
|
||||
[(set Float32Regs:$dst, (vector_extract
|
||||
[(set Float32Regs:$dst, (extractelt
|
||||
(v2f32 V2F32Regs:$src), imm:$c))],
|
||||
FMOV32rr>;
|
||||
|
||||
@ -74,7 +74,7 @@ def V2f32Extract : NVPTXVecInst<(outs Float32Regs:$dst),
|
||||
def V2i64Extract : NVPTXVecInst<(outs Int64Regs:$dst),
|
||||
(ins V2I64Regs:$src, i8imm:$c),
|
||||
"mov.u64 \t$dst, $src${c:vecelem};",
|
||||
[(set Int64Regs:$dst, (vector_extract
|
||||
[(set Int64Regs:$dst, (extractelt
|
||||
(v2i64 V2I64Regs:$src), imm:$c))],
|
||||
IMOV64rr>;
|
||||
|
||||
@ -82,7 +82,7 @@ def V2i64Extract : NVPTXVecInst<(outs Int64Regs:$dst),
|
||||
def V2f64Extract : NVPTXVecInst<(outs Float64Regs:$dst),
|
||||
(ins V2F64Regs:$src, i8imm:$c),
|
||||
"mov.f64 \t$dst, $src${c:vecelem};",
|
||||
[(set Float64Regs:$dst, (vector_extract
|
||||
[(set Float64Regs:$dst, (extractelt
|
||||
(v2f64 V2F64Regs:$src), imm:$c))],
|
||||
FMOV64rr>;
|
||||
|
||||
@ -90,7 +90,7 @@ def V2f64Extract : NVPTXVecInst<(outs Float64Regs:$dst),
|
||||
def V4i32Extract : NVPTXVecInst<(outs Int32Regs:$dst),
|
||||
(ins V4I32Regs:$src, i8imm:$c),
|
||||
"mov.u32 \t$dst, $src${c:vecelem};",
|
||||
[(set Int32Regs:$dst, (vector_extract
|
||||
[(set Int32Regs:$dst, (extractelt
|
||||
(v4i32 V4I32Regs:$src), imm:$c))],
|
||||
IMOV32rr>;
|
||||
|
||||
@ -98,7 +98,7 @@ def V4i32Extract : NVPTXVecInst<(outs Int32Regs:$dst),
|
||||
def V4f32Extract : NVPTXVecInst<(outs Float32Regs:$dst),
|
||||
(ins V4F32Regs:$src, i8imm:$c),
|
||||
"mov.f32 \t$dst, $src${c:vecelem};",
|
||||
[(set Float32Regs:$dst, (vector_extract
|
||||
[(set Float32Regs:$dst, (extractelt
|
||||
(v4f32 V4F32Regs:$src), imm:$c))],
|
||||
FMOV32rr>;
|
||||
}
|
||||
@ -110,8 +110,7 @@ def V2i8Insert : NVPTXVecInst<(outs V2I8Regs:$dst),
|
||||
"mov.v2.u16 \t${dst:vecfull}, ${src:vecfull};"
|
||||
"\n\tmov.u16 \t$dst${c:vecelem}, $val;",
|
||||
[(set V2I8Regs:$dst,
|
||||
(vector_insert V2I8Regs:$src, Int8Regs:$val, imm:$c))],
|
||||
IMOV8rr>;
|
||||
(insertelt V2I8Regs:$src, Int8Regs:$val, imm:$c))], IMOV8rr>;
|
||||
|
||||
// Insert v4i8
|
||||
def V4i8Insert : NVPTXVecInst<(outs V4I8Regs:$dst),
|
||||
@ -119,8 +118,7 @@ def V4i8Insert : NVPTXVecInst<(outs V4I8Regs:$dst),
|
||||
"mov.v4.u16 \t${dst:vecfull}, ${src:vecfull};"
|
||||
"\n\tmov.u16 \t$dst${c:vecelem}, $val;",
|
||||
[(set V4I8Regs:$dst,
|
||||
(vector_insert V4I8Regs:$src, Int8Regs:$val, imm:$c))],
|
||||
IMOV8rr>;
|
||||
(insertelt V4I8Regs:$src, Int8Regs:$val, imm:$c))], IMOV8rr>;
|
||||
|
||||
// Insert v2i16
|
||||
def V2i16Insert : NVPTXVecInst<(outs V2I16Regs:$dst),
|
||||
@ -128,7 +126,7 @@ def V2i16Insert : NVPTXVecInst<(outs V2I16Regs:$dst),
|
||||
"mov.v2.u16 \t${dst:vecfull}, ${src:vecfull};"
|
||||
"\n\tmov.u16 \t$dst${c:vecelem}, $val;",
|
||||
[(set V2I16Regs:$dst,
|
||||
(vector_insert V2I16Regs:$src, Int16Regs:$val, imm:$c))],
|
||||
(insertelt V2I16Regs:$src, Int16Regs:$val, imm:$c))],
|
||||
IMOV16rr>;
|
||||
|
||||
// Insert v4i16
|
||||
@ -137,7 +135,7 @@ def V4i16Insert : NVPTXVecInst<(outs V4I16Regs:$dst),
|
||||
"mov.v4.u16 \t${dst:vecfull}, ${src:vecfull};"
|
||||
"\n\tmov.u16 \t$dst${c:vecelem}, $val;",
|
||||
[(set V4I16Regs:$dst,
|
||||
(vector_insert V4I16Regs:$src, Int16Regs:$val, imm:$c))],
|
||||
(insertelt V4I16Regs:$src, Int16Regs:$val, imm:$c))],
|
||||
IMOV16rr>;
|
||||
|
||||
// Insert v2i32
|
||||
@ -146,7 +144,7 @@ def V2i32Insert : NVPTXVecInst<(outs V2I32Regs:$dst),
|
||||
"mov.v2.u32 \t${dst:vecfull}, ${src:vecfull};"
|
||||
"\n\tmov.u32 \t$dst${c:vecelem}, $val;",
|
||||
[(set V2I32Regs:$dst,
|
||||
(vector_insert V2I32Regs:$src, Int32Regs:$val, imm:$c))],
|
||||
(insertelt V2I32Regs:$src, Int32Regs:$val, imm:$c))],
|
||||
IMOV32rr>;
|
||||
|
||||
// Insert v2f32
|
||||
@ -155,7 +153,7 @@ def V2f32Insert : NVPTXVecInst<(outs V2F32Regs:$dst),
|
||||
"mov.v2.f32 \t${dst:vecfull}, ${src:vecfull};"
|
||||
"\n\tmov.f32 \t$dst${c:vecelem}, $val;",
|
||||
[(set V2F32Regs:$dst,
|
||||
(vector_insert V2F32Regs:$src, Float32Regs:$val, imm:$c))],
|
||||
(insertelt V2F32Regs:$src, Float32Regs:$val, imm:$c))],
|
||||
FMOV32rr>;
|
||||
|
||||
// Insert v2i64
|
||||
@ -164,7 +162,7 @@ def V2i64Insert : NVPTXVecInst<(outs V2I64Regs:$dst),
|
||||
"mov.v2.u64 \t${dst:vecfull}, ${src:vecfull};"
|
||||
"\n\tmov.u64 \t$dst${c:vecelem}, $val;",
|
||||
[(set V2I64Regs:$dst,
|
||||
(vector_insert V2I64Regs:$src, Int64Regs:$val, imm:$c))],
|
||||
(insertelt V2I64Regs:$src, Int64Regs:$val, imm:$c))],
|
||||
IMOV64rr>;
|
||||
|
||||
// Insert v2f64
|
||||
@ -173,7 +171,7 @@ def V2f64Insert : NVPTXVecInst<(outs V2F64Regs:$dst),
|
||||
"mov.v2.f64 \t${dst:vecfull}, ${src:vecfull};"
|
||||
"\n\tmov.f64 \t$dst${c:vecelem}, $val;",
|
||||
[(set V2F64Regs:$dst,
|
||||
(vector_insert V2F64Regs:$src, Float64Regs:$val, imm:$c))],
|
||||
(insertelt V2F64Regs:$src, Float64Regs:$val, imm:$c))],
|
||||
FMOV64rr>;
|
||||
|
||||
// Insert v4i32
|
||||
@ -182,7 +180,7 @@ def V4i32Insert : NVPTXVecInst<(outs V4I32Regs:$dst),
|
||||
"mov.v4.u32 \t${dst:vecfull}, ${src:vecfull};"
|
||||
"\n\tmov.u32 \t$dst${c:vecelem}, $val;",
|
||||
[(set V4I32Regs:$dst,
|
||||
(vector_insert V4I32Regs:$src, Int32Regs:$val, imm:$c))],
|
||||
(insertelt V4I32Regs:$src, Int32Regs:$val, imm:$c))],
|
||||
IMOV32rr>;
|
||||
|
||||
// Insert v4f32
|
||||
@ -191,7 +189,7 @@ def V4f32Insert : NVPTXVecInst<(outs V4F32Regs:$dst),
|
||||
"mov.v4.f32 \t${dst:vecfull}, ${src:vecfull};"
|
||||
"\n\tmov.f32 \t$dst${c:vecelem}, $val;",
|
||||
[(set V4F32Regs:$dst,
|
||||
(vector_insert V4F32Regs:$src, Float32Regs:$val, imm:$c))],
|
||||
(insertelt V4F32Regs:$src, Float32Regs:$val, imm:$c))],
|
||||
FMOV32rr>;
|
||||
}
|
||||
|
||||
|
@ -839,31 +839,31 @@ def : Pat<(v4f64 (scalar_to_vector f64:$A)),
|
||||
def : Pat<(v4f32 (scalar_to_vector f32:$A)),
|
||||
(INSERT_SUBREG (v4f32 (IMPLICIT_DEF)), $A, sub_64)>;
|
||||
|
||||
def : Pat<(f64 (vector_extract v4f64:$S, 0)),
|
||||
def : Pat<(f64 (extractelt v4f64:$S, 0)),
|
||||
(EXTRACT_SUBREG $S, sub_64)>;
|
||||
def : Pat<(f32 (vector_extract v4f32:$S, 0)),
|
||||
def : Pat<(f32 (extractelt v4f32:$S, 0)),
|
||||
(EXTRACT_SUBREG $S, sub_64)>;
|
||||
|
||||
def : Pat<(f64 (vector_extract v4f64:$S, 1)),
|
||||
def : Pat<(f64 (extractelt v4f64:$S, 1)),
|
||||
(EXTRACT_SUBREG (QVESPLATI $S, 1), sub_64)>;
|
||||
def : Pat<(f64 (vector_extract v4f64:$S, 2)),
|
||||
def : Pat<(f64 (extractelt v4f64:$S, 2)),
|
||||
(EXTRACT_SUBREG (QVESPLATI $S, 2), sub_64)>;
|
||||
def : Pat<(f64 (vector_extract v4f64:$S, 3)),
|
||||
def : Pat<(f64 (extractelt v4f64:$S, 3)),
|
||||
(EXTRACT_SUBREG (QVESPLATI $S, 3), sub_64)>;
|
||||
|
||||
def : Pat<(f32 (vector_extract v4f32:$S, 1)),
|
||||
def : Pat<(f32 (extractelt v4f32:$S, 1)),
|
||||
(EXTRACT_SUBREG (QVESPLATIs $S, 1), sub_64)>;
|
||||
def : Pat<(f32 (vector_extract v4f32:$S, 2)),
|
||||
def : Pat<(f32 (extractelt v4f32:$S, 2)),
|
||||
(EXTRACT_SUBREG (QVESPLATIs $S, 2), sub_64)>;
|
||||
def : Pat<(f32 (vector_extract v4f32:$S, 3)),
|
||||
def : Pat<(f32 (extractelt v4f32:$S, 3)),
|
||||
(EXTRACT_SUBREG (QVESPLATIs $S, 3), sub_64)>;
|
||||
|
||||
def : Pat<(f64 (vector_extract v4f64:$S, i64:$F)),
|
||||
def : Pat<(f64 (extractelt v4f64:$S, i64:$F)),
|
||||
(EXTRACT_SUBREG (QVFPERM $S, $S,
|
||||
(QVLPCLSXint (RLDICR $F, 2,
|
||||
/* 63-2 = */ 61))),
|
||||
sub_64)>;
|
||||
def : Pat<(f32 (vector_extract v4f32:$S, i64:$F)),
|
||||
def : Pat<(f32 (extractelt v4f32:$S, i64:$F)),
|
||||
(EXTRACT_SUBREG (QVFPERMs $S, $S,
|
||||
(QVLPCLSXint (RLDICR $F, 2,
|
||||
/* 63-2 = */ 61))),
|
||||
|
@ -835,9 +835,9 @@ let Predicates = [IsBigEndian] in {
|
||||
def : Pat<(v2f64 (scalar_to_vector f64:$A)),
|
||||
(v2f64 (SUBREG_TO_REG (i64 1), $A, sub_64))>;
|
||||
|
||||
def : Pat<(f64 (vector_extract v2f64:$S, 0)),
|
||||
def : Pat<(f64 (extractelt v2f64:$S, 0)),
|
||||
(f64 (EXTRACT_SUBREG $S, sub_64))>;
|
||||
def : Pat<(f64 (vector_extract v2f64:$S, 1)),
|
||||
def : Pat<(f64 (extractelt v2f64:$S, 1)),
|
||||
(f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
|
||||
}
|
||||
|
||||
@ -846,9 +846,9 @@ def : Pat<(v2f64 (scalar_to_vector f64:$A)),
|
||||
(v2f64 (XXPERMDI (SUBREG_TO_REG (i64 1), $A, sub_64),
|
||||
(SUBREG_TO_REG (i64 1), $A, sub_64), 0))>;
|
||||
|
||||
def : Pat<(f64 (vector_extract v2f64:$S, 0)),
|
||||
def : Pat<(f64 (extractelt v2f64:$S, 0)),
|
||||
(f64 (EXTRACT_SUBREG (XXPERMDI $S, $S, 2), sub_64))>;
|
||||
def : Pat<(f64 (vector_extract v2f64:$S, 1)),
|
||||
def : Pat<(f64 (extractelt v2f64:$S, 1)),
|
||||
(f64 (EXTRACT_SUBREG $S, sub_64))>;
|
||||
}
|
||||
|
||||
|
@ -1420,9 +1420,9 @@ def : Pat<(atomic_store ADDRrr:$dst, i32:$val), (STrr ADDRrr:$dst, $val)>;
|
||||
def : Pat<(atomic_store ADDRri:$dst, i32:$val), (STri ADDRri:$dst, $val)>;
|
||||
|
||||
// extract_vector
|
||||
def : Pat<(vector_extract (v2i32 IntPair:$Rn), 0),
|
||||
def : Pat<(extractelt (v2i32 IntPair:$Rn), 0),
|
||||
(i32 (EXTRACT_SUBREG IntPair:$Rn, sub_even))>;
|
||||
def : Pat<(vector_extract (v2i32 IntPair:$Rn), 1),
|
||||
def : Pat<(extractelt (v2i32 IntPair:$Rn), 1),
|
||||
(i32 (EXTRACT_SUBREG IntPair:$Rn, sub_odd))>;
|
||||
|
||||
// build_vector
|
||||
|
@ -2879,13 +2879,13 @@ def VMOVDI2SSZrm : AVX512BI<0x6E, MRMSrcMem, (outs FR32X:$dst), (ins i32mem:$sr
|
||||
//
|
||||
def VMOVPDI2DIZrr : AVX512BI<0x7E, MRMDestReg, (outs GR32:$dst), (ins VR128X:$src),
|
||||
"vmovd\t{$src, $dst|$dst, $src}",
|
||||
[(set GR32:$dst, (vector_extract (v4i32 VR128X:$src),
|
||||
[(set GR32:$dst, (extractelt (v4i32 VR128X:$src),
|
||||
(iPTR 0)))], IIC_SSE_MOVD_ToGP>,
|
||||
EVEX, VEX_LIG;
|
||||
def VMOVPDI2DIZmr : AVX512BI<0x7E, MRMDestMem, (outs),
|
||||
(ins i32mem:$dst, VR128X:$src),
|
||||
"vmovd\t{$src, $dst|$dst, $src}",
|
||||
[(store (i32 (vector_extract (v4i32 VR128X:$src),
|
||||
[(store (i32 (extractelt (v4i32 VR128X:$src),
|
||||
(iPTR 0))), addr:$dst)], IIC_SSE_MOVDQ>,
|
||||
EVEX, VEX_LIG, EVEX_CD8<32, CD8VT1>;
|
||||
|
||||
@ -3090,10 +3090,10 @@ let Predicates = [HasAVX512] in {
|
||||
(EXTRACT_SUBREG (v4i64 VR256X:$src), sub_xmm)), sub_xmm)>;
|
||||
|
||||
// Extract and store.
|
||||
def : Pat<(store (f32 (vector_extract (v4f32 VR128X:$src), (iPTR 0))),
|
||||
def : Pat<(store (f32 (extractelt (v4f32 VR128X:$src), (iPTR 0))),
|
||||
addr:$dst),
|
||||
(VMOVSSZmr addr:$dst, (COPY_TO_REGCLASS (v4f32 VR128X:$src), FR32X))>;
|
||||
def : Pat<(store (f64 (vector_extract (v2f64 VR128X:$src), (iPTR 0))),
|
||||
def : Pat<(store (f64 (extractelt (v2f64 VR128X:$src), (iPTR 0))),
|
||||
addr:$dst),
|
||||
(VMOVSDZmr addr:$dst, (COPY_TO_REGCLASS (v2f64 VR128X:$src), FR64X))>;
|
||||
|
||||
|
@ -642,9 +642,9 @@ def extloadv8f32 : PatFrag<(ops node:$ptr), (v8f64 (extloadvf32 node:$ptr))>;
|
||||
// The memory operand is required to be a 128-bit load, so it must be converted
|
||||
// from a vector to a scalar.
|
||||
def loadf32_128 : PatFrag<(ops node:$ptr),
|
||||
(f32 (vector_extract (loadv4f32 node:$ptr), (iPTR 0)))>;
|
||||
(f32 (extractelt (loadv4f32 node:$ptr), (iPTR 0)))>;
|
||||
def loadf64_128 : PatFrag<(ops node:$ptr),
|
||||
(f64 (vector_extract (loadv2f64 node:$ptr), (iPTR 0)))>;
|
||||
(f64 (extractelt (loadv2f64 node:$ptr), (iPTR 0)))>;
|
||||
|
||||
// Like 'store', but always requires 128-bit vector alignment.
|
||||
def alignedstore : PatFrag<(ops node:$val, node:$ptr),
|
||||
@ -742,9 +742,9 @@ def memopv2i64 : PatFrag<(ops node:$ptr), (v2i64 (memop node:$ptr))>;
|
||||
// The memory operand is required to be a 128-bit load, so it must be converted
|
||||
// from a vector to a scalar.
|
||||
def memopfsf32_128 : PatFrag<(ops node:$ptr),
|
||||
(f32 (vector_extract (memopv4f32 node:$ptr), (iPTR 0)))>;
|
||||
(f32 (extractelt (memopv4f32 node:$ptr), (iPTR 0)))>;
|
||||
def memopfsf64_128 : PatFrag<(ops node:$ptr),
|
||||
(f64 (vector_extract (memopv2f64 node:$ptr), (iPTR 0)))>;
|
||||
(f64 (extractelt (memopv2f64 node:$ptr), (iPTR 0)))>;
|
||||
|
||||
|
||||
// SSSE3 uses MMX registers for some instructions. They aren't aligned on a
|
||||
|
@ -304,7 +304,7 @@ 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),
|
||||
(i64 (extractelt (v2i64 VR128:$src),
|
||||
(iPTR 0))))))],
|
||||
IIC_MMX_MOVQ_RR>;
|
||||
|
||||
|
@ -330,9 +330,9 @@ multiclass sse12_fp_packed_logical_rm<bits<8> opc, RegisterClass RC, Domain d,
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
// A vector extract of the first f32/f64 position is a subregister copy
|
||||
def : Pat<(f32 (vector_extract (v4f32 VR128:$src), (iPTR 0))),
|
||||
def : Pat<(f32 (extractelt (v4f32 VR128:$src), (iPTR 0))),
|
||||
(COPY_TO_REGCLASS (v4f32 VR128:$src), FR32)>;
|
||||
def : Pat<(f64 (vector_extract (v2f64 VR128:$src), (iPTR 0))),
|
||||
def : Pat<(f64 (extractelt (v2f64 VR128:$src), (iPTR 0))),
|
||||
(COPY_TO_REGCLASS (v2f64 VR128:$src), FR64)>;
|
||||
|
||||
// A 128-bit subvector extract from the first 256-bit vector position
|
||||
@ -650,10 +650,10 @@ let Predicates = [UseAVX] in {
|
||||
}
|
||||
|
||||
// Extract and store.
|
||||
def : Pat<(store (f32 (vector_extract (v4f32 VR128:$src), (iPTR 0))),
|
||||
def : Pat<(store (f32 (extractelt (v4f32 VR128:$src), (iPTR 0))),
|
||||
addr:$dst),
|
||||
(VMOVSSmr addr:$dst, (COPY_TO_REGCLASS (v4f32 VR128:$src), FR32))>;
|
||||
def : Pat<(store (f64 (vector_extract (v2f64 VR128:$src), (iPTR 0))),
|
||||
def : Pat<(store (f64 (extractelt (v2f64 VR128:$src), (iPTR 0))),
|
||||
addr:$dst),
|
||||
(VMOVSDmr addr:$dst, (COPY_TO_REGCLASS (v2f64 VR128:$src), FR64))>;
|
||||
|
||||
@ -736,7 +736,7 @@ let Predicates = [UseSSE1] in {
|
||||
}
|
||||
|
||||
// Extract and store.
|
||||
def : Pat<(store (f32 (vector_extract (v4f32 VR128:$src), (iPTR 0))),
|
||||
def : Pat<(store (f32 (extractelt (v4f32 VR128:$src), (iPTR 0))),
|
||||
addr:$dst),
|
||||
(MOVSSmr addr:$dst, (COPY_TO_REGCLASS VR128:$src, FR32))>;
|
||||
|
||||
@ -770,7 +770,7 @@ let Predicates = [UseSSE2] in {
|
||||
}
|
||||
|
||||
// Extract and store.
|
||||
def : Pat<(store (f64 (vector_extract (v2f64 VR128:$src), (iPTR 0))),
|
||||
def : Pat<(store (f64 (extractelt (v2f64 VR128:$src), (iPTR 0))),
|
||||
addr:$dst),
|
||||
(MOVSDmr addr:$dst, (COPY_TO_REGCLASS VR128:$src, FR64))>;
|
||||
|
||||
@ -1176,23 +1176,23 @@ let SchedRW = [WriteStore] in {
|
||||
let Predicates = [UseAVX] in {
|
||||
def VMOVLPSmr : VPSI<0x13, MRMDestMem, (outs), (ins f64mem:$dst, VR128:$src),
|
||||
"movlps\t{$src, $dst|$dst, $src}",
|
||||
[(store (f64 (vector_extract (bc_v2f64 (v4f32 VR128:$src)),
|
||||
[(store (f64 (extractelt (bc_v2f64 (v4f32 VR128:$src)),
|
||||
(iPTR 0))), addr:$dst)],
|
||||
IIC_SSE_MOV_LH>, VEX;
|
||||
def VMOVLPDmr : VPDI<0x13, MRMDestMem, (outs), (ins f64mem:$dst, VR128:$src),
|
||||
"movlpd\t{$src, $dst|$dst, $src}",
|
||||
[(store (f64 (vector_extract (v2f64 VR128:$src),
|
||||
[(store (f64 (extractelt (v2f64 VR128:$src),
|
||||
(iPTR 0))), addr:$dst)],
|
||||
IIC_SSE_MOV_LH>, VEX;
|
||||
}// UseAVX
|
||||
def MOVLPSmr : PSI<0x13, MRMDestMem, (outs), (ins f64mem:$dst, VR128:$src),
|
||||
"movlps\t{$src, $dst|$dst, $src}",
|
||||
[(store (f64 (vector_extract (bc_v2f64 (v4f32 VR128:$src)),
|
||||
[(store (f64 (extractelt (bc_v2f64 (v4f32 VR128:$src)),
|
||||
(iPTR 0))), addr:$dst)],
|
||||
IIC_SSE_MOV_LH>;
|
||||
def MOVLPDmr : PDI<0x13, MRMDestMem, (outs), (ins f64mem:$dst, VR128:$src),
|
||||
"movlpd\t{$src, $dst|$dst, $src}",
|
||||
[(store (f64 (vector_extract (v2f64 VR128:$src),
|
||||
[(store (f64 (extractelt (v2f64 VR128:$src),
|
||||
(iPTR 0))), addr:$dst)],
|
||||
IIC_SSE_MOV_LH>;
|
||||
} // SchedRW
|
||||
@ -1230,7 +1230,7 @@ let Predicates = [UseAVX] in {
|
||||
|
||||
let Predicates = [UseSSE1] in {
|
||||
// (store (vector_shuffle (load addr), v2, <4, 5, 2, 3>), addr) using MOVLPS
|
||||
def : Pat<(store (i64 (vector_extract (bc_v2i64 (v4f32 VR128:$src2)),
|
||||
def : Pat<(store (i64 (extractelt (bc_v2i64 (v4f32 VR128:$src2)),
|
||||
(iPTR 0))), addr:$src1),
|
||||
(MOVLPSmr addr:$src1, VR128:$src2)>;
|
||||
|
||||
@ -1287,25 +1287,25 @@ let SchedRW = [WriteStore] in {
|
||||
let Predicates = [UseAVX] in {
|
||||
def VMOVHPSmr : VPSI<0x17, MRMDestMem, (outs), (ins f64mem:$dst, VR128:$src),
|
||||
"movhps\t{$src, $dst|$dst, $src}",
|
||||
[(store (f64 (vector_extract
|
||||
[(store (f64 (extractelt
|
||||
(X86Unpckh (bc_v2f64 (v4f32 VR128:$src)),
|
||||
(bc_v2f64 (v4f32 VR128:$src))),
|
||||
(iPTR 0))), addr:$dst)], IIC_SSE_MOV_LH>, VEX;
|
||||
def VMOVHPDmr : VPDI<0x17, MRMDestMem, (outs), (ins f64mem:$dst, VR128:$src),
|
||||
"movhpd\t{$src, $dst|$dst, $src}",
|
||||
[(store (f64 (vector_extract
|
||||
[(store (f64 (extractelt
|
||||
(v2f64 (X86Unpckh VR128:$src, VR128:$src)),
|
||||
(iPTR 0))), addr:$dst)], IIC_SSE_MOV_LH>, VEX;
|
||||
} // UseAVX
|
||||
def MOVHPSmr : PSI<0x17, MRMDestMem, (outs), (ins f64mem:$dst, VR128:$src),
|
||||
"movhps\t{$src, $dst|$dst, $src}",
|
||||
[(store (f64 (vector_extract
|
||||
[(store (f64 (extractelt
|
||||
(X86Unpckh (bc_v2f64 (v4f32 VR128:$src)),
|
||||
(bc_v2f64 (v4f32 VR128:$src))),
|
||||
(iPTR 0))), addr:$dst)], IIC_SSE_MOV_LH>;
|
||||
def MOVHPDmr : PDI<0x17, MRMDestMem, (outs), (ins f64mem:$dst, VR128:$src),
|
||||
"movhpd\t{$src, $dst|$dst, $src}",
|
||||
[(store (f64 (vector_extract
|
||||
[(store (f64 (extractelt
|
||||
(v2f64 (X86Unpckh VR128:$src, VR128:$src)),
|
||||
(iPTR 0))), addr:$dst)], IIC_SSE_MOV_LH>;
|
||||
} // SchedRW
|
||||
@ -1334,7 +1334,7 @@ let Predicates = [UseAVX] in {
|
||||
(bc_v2f64 (v2i64 (scalar_to_vector (loadi64 addr:$src2)))))),
|
||||
(VMOVHPDrm VR128:$src1, addr:$src2)>;
|
||||
|
||||
def : Pat<(store (f64 (vector_extract
|
||||
def : Pat<(store (f64 (extractelt
|
||||
(v2f64 (X86VPermilpi VR128:$src, (i8 1))),
|
||||
(iPTR 0))), addr:$dst),
|
||||
(VMOVHPDmr addr:$dst, VR128:$src)>;
|
||||
@ -1366,7 +1366,7 @@ let Predicates = [UseSSE2] in {
|
||||
(bc_v2f64 (v2i64 (scalar_to_vector (loadi64 addr:$src2)))))),
|
||||
(MOVHPDrm VR128:$src1, addr:$src2)>;
|
||||
|
||||
def : Pat<(store (f64 (vector_extract
|
||||
def : Pat<(store (f64 (extractelt
|
||||
(v2f64 (X86Shufp VR128:$src, VR128:$src, (i8 1))),
|
||||
(iPTR 0))), addr:$dst),
|
||||
(MOVHPDmr addr:$dst, VR128:$src)>;
|
||||
@ -3178,7 +3178,7 @@ multiclass scalar_math_f32_patterns<SDNode Op, string OpcPrefix> {
|
||||
let Predicates = [UseSSE1] in {
|
||||
// extracted scalar math op with insert via movss
|
||||
def : Pat<(v4f32 (X86Movss (v4f32 VR128:$dst), (v4f32 (scalar_to_vector
|
||||
(Op (f32 (vector_extract (v4f32 VR128:$dst), (iPTR 0))),
|
||||
(Op (f32 (extractelt (v4f32 VR128:$dst), (iPTR 0))),
|
||||
FR32:$src))))),
|
||||
(!cast<I>(OpcPrefix#SSrr_Int) v4f32:$dst,
|
||||
(COPY_TO_REGCLASS FR32:$src, VR128))>;
|
||||
@ -3193,7 +3193,7 @@ multiclass scalar_math_f32_patterns<SDNode Op, string OpcPrefix> {
|
||||
let Predicates = [UseSSE41] in {
|
||||
// extracted scalar math op with insert via blend
|
||||
def : Pat<(v4f32 (X86Blendi (v4f32 VR128:$dst), (v4f32 (scalar_to_vector
|
||||
(Op (f32 (vector_extract (v4f32 VR128:$dst), (iPTR 0))),
|
||||
(Op (f32 (extractelt (v4f32 VR128:$dst), (iPTR 0))),
|
||||
FR32:$src))), (i8 1))),
|
||||
(!cast<I>(OpcPrefix#SSrr_Int) v4f32:$dst,
|
||||
(COPY_TO_REGCLASS FR32:$src, VR128))>;
|
||||
@ -3210,7 +3210,7 @@ multiclass scalar_math_f32_patterns<SDNode Op, string OpcPrefix> {
|
||||
let Predicates = [HasAVX] in {
|
||||
// extracted scalar math op with insert via blend
|
||||
def : Pat<(v4f32 (X86Blendi (v4f32 VR128:$dst), (v4f32 (scalar_to_vector
|
||||
(Op (f32 (vector_extract (v4f32 VR128:$dst), (iPTR 0))),
|
||||
(Op (f32 (extractelt (v4f32 VR128:$dst), (iPTR 0))),
|
||||
FR32:$src))), (i8 1))),
|
||||
(!cast<I>("V"#OpcPrefix#SSrr_Int) v4f32:$dst,
|
||||
(COPY_TO_REGCLASS FR32:$src, VR128))>;
|
||||
@ -3236,7 +3236,7 @@ multiclass scalar_math_f64_patterns<SDNode Op, string OpcPrefix> {
|
||||
let Predicates = [UseSSE2] in {
|
||||
// extracted scalar math op with insert via movsd
|
||||
def : Pat<(v2f64 (X86Movsd (v2f64 VR128:$dst), (v2f64 (scalar_to_vector
|
||||
(Op (f64 (vector_extract (v2f64 VR128:$dst), (iPTR 0))),
|
||||
(Op (f64 (extractelt (v2f64 VR128:$dst), (iPTR 0))),
|
||||
FR64:$src))))),
|
||||
(!cast<I>(OpcPrefix#SDrr_Int) v2f64:$dst,
|
||||
(COPY_TO_REGCLASS FR64:$src, VR128))>;
|
||||
@ -3251,7 +3251,7 @@ multiclass scalar_math_f64_patterns<SDNode Op, string OpcPrefix> {
|
||||
let Predicates = [UseSSE41] in {
|
||||
// extracted scalar math op with insert via blend
|
||||
def : Pat<(v2f64 (X86Blendi (v2f64 VR128:$dst), (v2f64 (scalar_to_vector
|
||||
(Op (f64 (vector_extract (v2f64 VR128:$dst), (iPTR 0))),
|
||||
(Op (f64 (extractelt (v2f64 VR128:$dst), (iPTR 0))),
|
||||
FR64:$src))), (i8 1))),
|
||||
(!cast<I>(OpcPrefix#SDrr_Int) v2f64:$dst,
|
||||
(COPY_TO_REGCLASS FR64:$src, VR128))>;
|
||||
@ -3266,14 +3266,14 @@ multiclass scalar_math_f64_patterns<SDNode Op, string OpcPrefix> {
|
||||
let Predicates = [HasAVX] in {
|
||||
// extracted scalar math op with insert via movsd
|
||||
def : Pat<(v2f64 (X86Movsd (v2f64 VR128:$dst), (v2f64 (scalar_to_vector
|
||||
(Op (f64 (vector_extract (v2f64 VR128:$dst), (iPTR 0))),
|
||||
(Op (f64 (extractelt (v2f64 VR128:$dst), (iPTR 0))),
|
||||
FR64:$src))))),
|
||||
(!cast<I>("V"#OpcPrefix#SDrr_Int) v2f64:$dst,
|
||||
(COPY_TO_REGCLASS FR64:$src, VR128))>;
|
||||
|
||||
// extracted scalar math op with insert via blend
|
||||
def : Pat<(v2f64 (X86Blendi (v2f64 VR128:$dst), (v2f64 (scalar_to_vector
|
||||
(Op (f64 (vector_extract (v2f64 VR128:$dst), (iPTR 0))),
|
||||
(Op (f64 (extractelt (v2f64 VR128:$dst), (iPTR 0))),
|
||||
FR64:$src))), (i8 1))),
|
||||
(!cast<I>("V"#OpcPrefix#SDrr_Int) v2f64:$dst,
|
||||
(COPY_TO_REGCLASS FR64:$src, VR128))>;
|
||||
@ -4766,23 +4766,23 @@ let isCodeGenOnly = 1 in {
|
||||
//
|
||||
def VMOVPDI2DIrr : VS2I<0x7E, MRMDestReg, (outs GR32:$dst), (ins VR128:$src),
|
||||
"movd\t{$src, $dst|$dst, $src}",
|
||||
[(set GR32:$dst, (vector_extract (v4i32 VR128:$src),
|
||||
[(set GR32:$dst, (extractelt (v4i32 VR128:$src),
|
||||
(iPTR 0)))], IIC_SSE_MOVD_ToGP>, VEX,
|
||||
Sched<[WriteMove]>;
|
||||
def VMOVPDI2DImr : VS2I<0x7E, MRMDestMem, (outs),
|
||||
(ins i32mem:$dst, VR128:$src),
|
||||
"movd\t{$src, $dst|$dst, $src}",
|
||||
[(store (i32 (vector_extract (v4i32 VR128:$src),
|
||||
[(store (i32 (extractelt (v4i32 VR128:$src),
|
||||
(iPTR 0))), addr:$dst)], IIC_SSE_MOVDQ>,
|
||||
VEX, Sched<[WriteStore]>;
|
||||
def MOVPDI2DIrr : S2I<0x7E, MRMDestReg, (outs GR32:$dst), (ins VR128:$src),
|
||||
"movd\t{$src, $dst|$dst, $src}",
|
||||
[(set GR32:$dst, (vector_extract (v4i32 VR128:$src),
|
||||
[(set GR32:$dst, (extractelt (v4i32 VR128:$src),
|
||||
(iPTR 0)))], IIC_SSE_MOVD_ToGP>,
|
||||
Sched<[WriteMove]>;
|
||||
def MOVPDI2DImr : S2I<0x7E, MRMDestMem, (outs), (ins i32mem:$dst, VR128:$src),
|
||||
"movd\t{$src, $dst|$dst, $src}",
|
||||
[(store (i32 (vector_extract (v4i32 VR128:$src),
|
||||
[(store (i32 (extractelt (v4i32 VR128:$src),
|
||||
(iPTR 0))), addr:$dst)],
|
||||
IIC_SSE_MOVDQ>, Sched<[WriteStore]>;
|
||||
|
||||
@ -4804,14 +4804,14 @@ def : Pat<(v4i64 (X86Vinsert undef, GR64:$src2, (iPTR 0))),
|
||||
let SchedRW = [WriteMove] in {
|
||||
def VMOVPQIto64rr : VRS2I<0x7E, MRMDestReg, (outs GR64:$dst), (ins VR128:$src),
|
||||
"movq\t{$src, $dst|$dst, $src}",
|
||||
[(set GR64:$dst, (vector_extract (v2i64 VR128:$src),
|
||||
[(set GR64:$dst, (extractelt (v2i64 VR128:$src),
|
||||
(iPTR 0)))],
|
||||
IIC_SSE_MOVD_ToGP>,
|
||||
VEX;
|
||||
|
||||
def MOVPQIto64rr : RS2I<0x7E, MRMDestReg, (outs GR64:$dst), (ins VR128:$src),
|
||||
"mov{d|q}\t{$src, $dst|$dst, $src}",
|
||||
[(set GR64:$dst, (vector_extract (v2i64 VR128:$src),
|
||||
[(set GR64:$dst, (extractelt (v2i64 VR128:$src),
|
||||
(iPTR 0)))],
|
||||
IIC_SSE_MOVD_ToGP>;
|
||||
} //SchedRW
|
||||
@ -4969,12 +4969,12 @@ def MOVQI2PQIrm : I<0x7E, MRMSrcMem, (outs VR128:$dst), (ins i64mem:$src),
|
||||
let ExeDomain = SSEPackedInt, SchedRW = [WriteStore] in {
|
||||
def VMOVPQI2QImr : VS2I<0xD6, MRMDestMem, (outs), (ins i64mem:$dst, VR128:$src),
|
||||
"movq\t{$src, $dst|$dst, $src}",
|
||||
[(store (i64 (vector_extract (v2i64 VR128:$src),
|
||||
[(store (i64 (extractelt (v2i64 VR128:$src),
|
||||
(iPTR 0))), addr:$dst)],
|
||||
IIC_SSE_MOVDQ>, VEX;
|
||||
def MOVPQI2QImr : S2I<0xD6, MRMDestMem, (outs), (ins i64mem:$dst, VR128:$src),
|
||||
"movq\t{$src, $dst|$dst, $src}",
|
||||
[(store (i64 (vector_extract (v2i64 VR128:$src),
|
||||
[(store (i64 (extractelt (v2i64 VR128:$src),
|
||||
(iPTR 0))), addr:$dst)],
|
||||
IIC_SSE_MOVDQ>;
|
||||
} // ExeDomain, SchedRW
|
||||
@ -8226,11 +8226,11 @@ let Predicates = [HasF16C] in {
|
||||
def : Pat<(int_x86_vcvtph2ps_128 (vzload_v2i64 addr:$src)),
|
||||
(VCVTPH2PSrm addr:$src)>;
|
||||
|
||||
def : Pat<(store (f64 (vector_extract (bc_v2f64 (v8i16
|
||||
def : Pat<(store (f64 (extractelt (bc_v2f64 (v8i16
|
||||
(int_x86_vcvtps2ph_128 VR128:$src1, i32:$src2))), (iPTR 0))),
|
||||
addr:$dst),
|
||||
(VCVTPS2PHmr addr:$dst, VR128:$src1, imm:$src2)>;
|
||||
def : Pat<(store (i64 (vector_extract (bc_v2i64 (v8i16
|
||||
def : Pat<(store (i64 (extractelt (bc_v2i64 (v8i16
|
||||
(int_x86_vcvtps2ph_128 VR128:$src1, i32:$src2))), (iPTR 0))),
|
||||
addr:$dst),
|
||||
(VCVTPS2PHmr addr:$dst, VR128:$src1, imm:$src2)>;
|
||||
|
Loading…
x
Reference in New Issue
Block a user