mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-05 12:31:46 +00:00
Add a pass AArch64InterleavedAccess to identify and match interleaved memory accesses. This pass transforms an interleaved load/store into ldN/stN intrinsic. As Loop Vectorizor disables optimization on interleaved accesses by default, this optimization is also disabled by default. To enable it by "-aarch64-interleaved-access-opt=true" E.g. Transform an interleaved load (Factor = 2): %wide.vec = load <8 x i32>, <8 x i32>* %ptr %v0 = shuffle %wide.vec, undef, <0, 2, 4, 6> ; Extract even elements %v1 = shuffle %wide.vec, undef, <1, 3, 5, 7> ; Extract odd elements Into: %ld2 = { <4 x i32>, <4 x i32> } call aarch64.neon.ld2(%ptr) %v0 = extractelement { <4 x i32>, <4 x i32> } %ld2, i32 0 %v1 = extractelement { <4 x i32>, <4 x i32> } %ld2, i32 1 E.g. Transform an interleaved store (Factor = 2): %i.vec = shuffle %v0, %v1, <0, 4, 1, 5, 2, 6, 3, 7> ; Interleaved vec store <8 x i32> %i.vec, <8 x i32>* %ptr Into: %v0 = shuffle %i.vec, undef, <0, 1, 2, 3> %v1 = shuffle %i.vec, undef, <4, 5, 6, 7> call void aarch64.neon.st2(%v0, %v1, %ptr) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@239514 91177308-0d34-0410-b5e6-96231b3b80d8
51 lines
1.7 KiB
C++
51 lines
1.7 KiB
C++
//==-- AArch64.h - Top-level interface for AArch64 --------------*- C++ -*-==//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file contains the entry points for global functions defined in the LLVM
|
|
// AArch64 back-end.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_TARGET_AARCH64_AARCH64_H
|
|
#define LLVM_LIB_TARGET_AARCH64_AARCH64_H
|
|
|
|
#include "MCTargetDesc/AArch64MCTargetDesc.h"
|
|
#include "Utils/AArch64BaseInfo.h"
|
|
#include "llvm/Support/DataTypes.h"
|
|
#include "llvm/Target/TargetMachine.h"
|
|
|
|
namespace llvm {
|
|
|
|
class AArch64TargetMachine;
|
|
class FunctionPass;
|
|
class MachineFunctionPass;
|
|
|
|
FunctionPass *createAArch64DeadRegisterDefinitions();
|
|
FunctionPass *createAArch64ConditionalCompares();
|
|
FunctionPass *createAArch64AdvSIMDScalar();
|
|
FunctionPass *createAArch64BranchRelaxation();
|
|
FunctionPass *createAArch64ISelDag(AArch64TargetMachine &TM,
|
|
CodeGenOpt::Level OptLevel);
|
|
FunctionPass *createAArch64StorePairSuppressPass();
|
|
FunctionPass *createAArch64ExpandPseudoPass();
|
|
FunctionPass *createAArch64LoadStoreOptimizationPass();
|
|
ModulePass *createAArch64PromoteConstantPass();
|
|
FunctionPass *createAArch64ConditionOptimizerPass();
|
|
FunctionPass *createAArch64AddressTypePromotionPass();
|
|
FunctionPass *createAArch64InterleavedAccessPass();
|
|
FunctionPass *createAArch64A57FPLoadBalancing();
|
|
FunctionPass *createAArch64A53Fix835769();
|
|
|
|
FunctionPass *createAArch64CleanupLocalDynamicTLSPass();
|
|
|
|
FunctionPass *createAArch64CollectLOHPass();
|
|
} // end namespace llvm
|
|
|
|
#endif
|