LLVM 20.0.0git
Functions
AArch64ExpandImm.cpp File Reference
#include "AArch64.h"
#include "AArch64ExpandImm.h"
#include "MCTargetDesc/AArch64AddressingModes.h"

Go to the source code of this file.

Functions

static uint64_t getChunk (uint64_t Imm, unsigned ChunkIdx)
 Helper function which extracts the specified 16-bit chunk from a 64-bit value.
 
static bool canUseOrr (uint64_t Chunk, uint64_t &Encoding)
 Check whether the given 16-bit chunk replicated to full 64-bit width can be materialized with an ORR instruction.
 
static bool tryToreplicateChunks (uint64_t UImm, SmallVectorImpl< ImmInsnModel > &Insn)
 Check for identical 16-bit chunks within the constant and if so materialize them with a single ORR instruction.
 
static bool isStartChunk (uint64_t Chunk)
 Check whether this chunk matches the pattern '1...0...'.
 
static bool isEndChunk (uint64_t Chunk)
 Check whether this chunk matches the pattern '0...1...' This pattern ends a contiguous sequence of ones if we look at the bits from the LSB towards the MSB.
 
static uint64_t updateImm (uint64_t Imm, unsigned Idx, bool Clear)
 Clear or set all bits in the chunk at the given index.
 
static bool trySequenceOfOnes (uint64_t UImm, SmallVectorImpl< ImmInsnModel > &Insn)
 Check whether the constant contains a sequence of contiguous ones, which might be interrupted by one or two chunks.
 
static uint64_t GetRunOfOnesStartingAt (uint64_t V, uint64_t StartPosition)
 
static uint64_t MaximallyReplicateSubImmediate (uint64_t V, uint64_t Subset)
 
static uint64_t maximalLogicalImmWithin (uint64_t RemainingBits, uint64_t OriginalBits)
 
static std::optional< std::pair< uint64_t, uint64_t > > decomposeIntoOrrOfLogicalImmediates (uint64_t UImm)
 
static bool tryOrrOfLogicalImmediates (uint64_t UImm, SmallVectorImpl< ImmInsnModel > &Insn)
 
static bool tryAndOfLogicalImmediates (uint64_t UImm, SmallVectorImpl< ImmInsnModel > &Insn)
 
static bool tryEorOfLogicalImmediates (uint64_t Imm, SmallVectorImpl< ImmInsnModel > &Insn)
 
static void expandMOVImmSimple (uint64_t Imm, unsigned BitSize, unsigned OneChunks, unsigned ZeroChunks, SmallVectorImpl< ImmInsnModel > &Insn)
 Expand a MOVi32imm or MOVi64imm pseudo instruction to a MOVZ or MOVN of width BitSize followed by up to 3 MOVK instructions.
 

Function Documentation

◆ canUseOrr()

static bool canUseOrr ( uint64_t  Chunk,
uint64_t Encoding 
)
static

Check whether the given 16-bit chunk replicated to full 64-bit width can be materialized with an ORR instruction.

Definition at line 30 of file AArch64ExpandImm.cpp.

References llvm::AArch64_AM::processLogicalImmediate().

Referenced by tryToreplicateChunks().

◆ decomposeIntoOrrOfLogicalImmediates()

static std::optional< std::pair< uint64_t, uint64_t > > decomposeIntoOrrOfLogicalImmediates ( uint64_t  UImm)
static

◆ expandMOVImmSimple()

static void expandMOVImmSimple ( uint64_t  Imm,
unsigned  BitSize,
unsigned  OneChunks,
unsigned  ZeroChunks,
SmallVectorImpl< ImmInsnModel > &  Insn 
)
inlinestatic

Expand a MOVi32imm or MOVi64imm pseudo instruction to a MOVZ or MOVN of width BitSize followed by up to 3 MOVK instructions.

Definition at line 466 of file AArch64ExpandImm.cpp.

References llvm::countl_zero(), llvm::countr_zero(), llvm::AArch64_AM::getShifterImm(), Insn, isNeg(), llvm::AArch64_AM::LSL, and Size.

Referenced by llvm::AArch64_IMM::expandMOVImm().

◆ getChunk()

static uint64_t getChunk ( uint64_t  Imm,
unsigned  ChunkIdx 
)
static

Helper function which extracts the specified 16-bit chunk from a 64-bit value.

Definition at line 22 of file AArch64ExpandImm.cpp.

References assert().

Referenced by llvm::AArch64_IMM::expandMOVImm(), trySequenceOfOnes(), and tryToreplicateChunks().

◆ GetRunOfOnesStartingAt()

static uint64_t GetRunOfOnesStartingAt ( uint64_t  V,
uint64_t  StartPosition 
)
static

Definition at line 242 of file AArch64ExpandImm.cpp.

References llvm::countr_one().

Referenced by maximalLogicalImmWithin().

◆ isEndChunk()

static bool isEndChunk ( uint64_t  Chunk)
static

Check whether this chunk matches the pattern '0...1...' This pattern ends a contiguous sequence of ones if we look at the bits from the LSB towards the MSB.

Definition at line 116 of file AArch64ExpandImm.cpp.

References llvm::isMask_64().

Referenced by trySequenceOfOnes().

◆ isStartChunk()

static bool isStartChunk ( uint64_t  Chunk)
static

Check whether this chunk matches the pattern '1...0...'.

This pattern starts a contiguous sequence of ones if we look at the bits from the LSB towards the MSB.

Definition at line 106 of file AArch64ExpandImm.cpp.

References llvm::isMask_64().

Referenced by trySequenceOfOnes().

◆ maximalLogicalImmWithin()

static uint64_t maximalLogicalImmWithin ( uint64_t  RemainingBits,
uint64_t  OriginalBits 
)
static

◆ MaximallyReplicateSubImmediate()

static uint64_t MaximallyReplicateSubImmediate ( uint64_t  V,
uint64_t  Subset 
)
static

Definition at line 254 of file AArch64ExpandImm.cpp.

Referenced by maximalLogicalImmWithin().

◆ tryAndOfLogicalImmediates()

static bool tryAndOfLogicalImmediates ( uint64_t  UImm,
SmallVectorImpl< ImmInsnModel > &  Insn 
)
static

◆ tryEorOfLogicalImmediates()

static bool tryEorOfLogicalImmediates ( uint64_t  Imm,
SmallVectorImpl< ImmInsnModel > &  Insn 
)
static

◆ tryOrrOfLogicalImmediates()

static bool tryOrrOfLogicalImmediates ( uint64_t  UImm,
SmallVectorImpl< ImmInsnModel > &  Insn 
)
static

◆ trySequenceOfOnes()

static bool trySequenceOfOnes ( uint64_t  UImm,
SmallVectorImpl< ImmInsnModel > &  Insn 
)
static

Check whether the constant contains a sequence of contiguous ones, which might be interrupted by one or two chunks.

If so, materialize the sequence of contiguous ones with an ORR instruction. Materialize the chunks which are either interrupting the sequence or outside of the sequence with a MOVK instruction.

Assuming S is a chunk which starts the sequence (1...0...), E is a chunk which ends the sequence (0...1...). Then we are looking for constants which contain at least one S and E chunk. E.g. |E|A|B|S|, |A|E|B|S| or |A|B|E|S|.

We are also looking for constants like |S|A|B|E| where the contiguous sequence of ones wraps around the MSB into the LSB.

Definition at line 150 of file AArch64ExpandImm.cpp.

References assert(), getChunk(), llvm::AArch64_AM::getShifterImm(), Idx, Insn, isEndChunk(), isStartChunk(), llvm::AArch64_AM::LSL, llvm::AArch64_AM::processLogicalImmediate(), std::swap(), and updateImm().

Referenced by llvm::AArch64_IMM::expandMOVImm().

◆ tryToreplicateChunks()

static bool tryToreplicateChunks ( uint64_t  UImm,
SmallVectorImpl< ImmInsnModel > &  Insn 
)
static

Check for identical 16-bit chunks within the constant and if so materialize them with a single ORR instruction.

The remaining one or two 16-bit chunks will be materialized with MOVK instructions.

This allows us to materialize constants like |A|B|A|A| or |A|B|C|A| (order of the chunks doesn't matter), assuming |A|A|A|A| can be materialized with an ORR instruction.

Definition at line 43 of file AArch64ExpandImm.cpp.

References canUseOrr(), getChunk(), llvm::AArch64_AM::getShifterImm(), Idx, Insn, and llvm::AArch64_AM::LSL.

Referenced by llvm::AArch64_IMM::expandMOVImm().

◆ updateImm()

static uint64_t updateImm ( uint64_t  Imm,
unsigned  Idx,
bool  Clear 
)
static

Clear or set all bits in the chunk at the given index.

Definition at line 124 of file AArch64ExpandImm.cpp.

References Idx.

Referenced by trySequenceOfOnes().