mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-04 06:09:05 +00:00
[x86] Teach the instruction printer to decode immediate operands to
BLENDPS, BLENDPD, and PBLENDW instructions into pretty shuffle comments. These will be used in my next commit as part of test cases for AVX shuffles which can directly use blend in more places. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@215701 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f52efce72d
commit
d996c5b54b
@ -35,6 +35,70 @@ void llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
|
||||
const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
|
||||
|
||||
switch (MI->getOpcode()) {
|
||||
case X86::BLENDPDrri:
|
||||
case X86::VBLENDPDrri:
|
||||
Src2Name = getRegName(MI->getOperand(2).getReg());
|
||||
// FALL THROUGH.
|
||||
case X86::BLENDPDrmi:
|
||||
case X86::VBLENDPDrmi:
|
||||
if(MI->getOperand(MI->getNumOperands()-1).isImm())
|
||||
DecodeBLENDMask(MVT::v2f64,
|
||||
MI->getOperand(MI->getNumOperands()-1).getImm(),
|
||||
ShuffleMask);
|
||||
Src1Name = getRegName(MI->getOperand(1).getReg());
|
||||
DestName = getRegName(MI->getOperand(0).getReg());
|
||||
break;
|
||||
case X86::VBLENDPDYrri:
|
||||
Src2Name = getRegName(MI->getOperand(2).getReg());
|
||||
// FALL THROUGH.
|
||||
case X86::VBLENDPDYrmi:
|
||||
if(MI->getOperand(MI->getNumOperands()-1).isImm())
|
||||
DecodeBLENDMask(MVT::v4f64,
|
||||
MI->getOperand(MI->getNumOperands()-1).getImm(),
|
||||
ShuffleMask);
|
||||
Src1Name = getRegName(MI->getOperand(1).getReg());
|
||||
DestName = getRegName(MI->getOperand(0).getReg());
|
||||
break;
|
||||
|
||||
case X86::BLENDPSrri:
|
||||
case X86::VBLENDPSrri:
|
||||
Src2Name = getRegName(MI->getOperand(2).getReg());
|
||||
// FALL THROUGH.
|
||||
case X86::BLENDPSrmi:
|
||||
case X86::VBLENDPSrmi:
|
||||
if(MI->getOperand(MI->getNumOperands()-1).isImm())
|
||||
DecodeBLENDMask(MVT::v4f32,
|
||||
MI->getOperand(MI->getNumOperands()-1).getImm(),
|
||||
ShuffleMask);
|
||||
Src1Name = getRegName(MI->getOperand(1).getReg());
|
||||
DestName = getRegName(MI->getOperand(0).getReg());
|
||||
break;
|
||||
case X86::VBLENDPSYrri:
|
||||
Src2Name = getRegName(MI->getOperand(2).getReg());
|
||||
// FALL THROUGH.
|
||||
case X86::VBLENDPSYrmi:
|
||||
if(MI->getOperand(MI->getNumOperands()-1).isImm())
|
||||
DecodeBLENDMask(MVT::v8f32,
|
||||
MI->getOperand(MI->getNumOperands()-1).getImm(),
|
||||
ShuffleMask);
|
||||
Src1Name = getRegName(MI->getOperand(1).getReg());
|
||||
DestName = getRegName(MI->getOperand(0).getReg());
|
||||
break;
|
||||
|
||||
case X86::PBLENDWrri:
|
||||
case X86::VPBLENDWrri:
|
||||
Src2Name = getRegName(MI->getOperand(2).getReg());
|
||||
// FALL THROUGH.
|
||||
case X86::PBLENDWrmi:
|
||||
case X86::VPBLENDWrmi:
|
||||
if(MI->getOperand(MI->getNumOperands()-1).isImm())
|
||||
DecodeBLENDMask(MVT::v8i16,
|
||||
MI->getOperand(MI->getNumOperands()-1).getImm(),
|
||||
ShuffleMask);
|
||||
Src1Name = getRegName(MI->getOperand(1).getReg());
|
||||
DestName = getRegName(MI->getOperand(0).getReg());
|
||||
break;
|
||||
|
||||
case X86::INSERTPSrr:
|
||||
case X86::VINSERTPSrr:
|
||||
DestName = getRegName(MI->getOperand(0).getReg());
|
||||
|
@ -258,6 +258,13 @@ void DecodePSHUFBMask(ArrayRef<uint64_t> RawMask,
|
||||
}
|
||||
}
|
||||
|
||||
void DecodeBLENDMask(MVT VT, unsigned Imm,
|
||||
SmallVectorImpl<int> &ShuffleMask) {
|
||||
int NumElements = VT.getVectorNumElements();
|
||||
for (int i = 0; i < NumElements; ++i)
|
||||
ShuffleMask.push_back(((Imm >> i) & 1) ? NumElements + i : i);
|
||||
}
|
||||
|
||||
/// DecodeVPERMMask - this decodes the shuffle masks for VPERMQ/VPERMPD.
|
||||
/// No VT provided since it only works on 256-bit, 4 element vectors.
|
||||
void DecodeVPERMMask(unsigned Imm, SmallVectorImpl<int> &ShuffleMask) {
|
||||
|
@ -70,6 +70,9 @@ void DecodePSHUFBMask(const ConstantDataSequential *C,
|
||||
void DecodePSHUFBMask(ArrayRef<uint64_t> RawMask,
|
||||
SmallVectorImpl<int> &ShuffleMask);
|
||||
|
||||
/// \brief Decode a BLEND immediate mask into a shuffle mask.
|
||||
void DecodeBLENDMask(MVT VT, unsigned Imm, SmallVectorImpl<int> &ShuffleMask);
|
||||
|
||||
void DecodeVPERM2X128Mask(MVT VT, unsigned Imm,
|
||||
SmallVectorImpl<int> &ShuffleMask);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user