diff options
author | Evandro Menezes <e.menezes@samsung.com> | 2018-05-15 20:41:12 +0000 |
---|---|---|
committer | Evandro Menezes <e.menezes@samsung.com> | 2018-05-15 20:41:12 +0000 |
commit | 8d522d811a6d8ec72b10dbd76ba670678bc4251b (patch) | |
tree | bd40d941d5078ae2f4933c19de4667335c0c2276 /llvm/lib | |
parent | cc0fbdb6e4e7dee89b2b83916d53aa82fa9863c1 (diff) | |
download | bcm5719-llvm-8d522d811a6d8ec72b10dbd76ba670678bc4251b.tar.gz bcm5719-llvm-8d522d811a6d8ec72b10dbd76ba670678bc4251b.zip |
[AArch64] Improve single vector lane unscaled stores
When storing the 0th lane of a vector, use a simpler and usually more
efficient scalar store instead. In this case, also using the unscaled
offset.
Differential revision: https://reviews.llvm.org/D46762
llvm-svn: 332394
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64InstrInfo.td | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td b/llvm/lib/Target/AArch64/AArch64InstrInfo.td index 5f78a328875..e815137ef3b 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td @@ -2477,6 +2477,22 @@ def : Pat<(truncstorei16 GPR64:$Rt, (am_unscaled16 GPR64sp:$Rn, simm9:$offset)), def : Pat<(truncstorei8 GPR64:$Rt, (am_unscaled8 GPR64sp:$Rn, simm9:$offset)), (STURBBi (EXTRACT_SUBREG GPR64:$Rt, sub_32), GPR64sp:$Rn, simm9:$offset)>; +// Match stores from lane 0 to the appropriate subreg's store. +multiclass VecStoreULane0Pat<SDPatternOperator StoreOp, + ValueType VTy, ValueType STy, + SubRegIndex SubRegIdx, Instruction STR> { + defm : VecStoreLane0Pat<am_unscaled128, StoreOp, VTy, STy, SubRegIdx, simm9, STR>; +} + +let AddedComplexity = 19 in { + defm : VecStoreULane0Pat<truncstorei16, v8i16, i32, hsub, STURHi>; + defm : VecStoreULane0Pat<store, v8f16, f16, hsub, STURHi>; + defm : VecStoreULane0Pat<store, v4i32, i32, ssub, STURSi>; + defm : VecStoreULane0Pat<store, v4f32, f32, ssub, STURSi>; + defm : VecStoreULane0Pat<store, v2i64, i64, dsub, STURDi>; + defm : VecStoreULane0Pat<store, v2f64, f64, dsub, STURDi>; +} + //--- // STR mnemonics fall back to STUR for negative or unaligned offsets. def : InstAlias<"str $Rt, [$Rn, $offset]", |