mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
GlobalISel: Use appropriate extension for legalizing select conditions
llvm-svn: 352597
This commit is contained in:
parent
dff45d3f73
commit
cbb9bec841
@ -229,6 +229,11 @@ public:
|
||||
return *State.MF;
|
||||
}
|
||||
|
||||
const MachineFunction &getMF() const {
|
||||
assert(State.MF && "MachineFunction is not set");
|
||||
return *State.MF;
|
||||
}
|
||||
|
||||
/// Getter for DebugLoc
|
||||
const DebugLoc &getDL() { return State.DL; }
|
||||
|
||||
@ -457,6 +462,15 @@ public:
|
||||
/// \return The newly created instruction.
|
||||
MachineInstrBuilder buildSExt(const DstOp &Res, const SrcOp &Op);
|
||||
|
||||
/// \return The opcode of the extension the target wants to use for boolean
|
||||
/// values.
|
||||
unsigned getBoolExtOp(bool IsVec, bool IsFP) const;
|
||||
|
||||
// Build and insert \p Res = G_ANYEXT \p Op, \p Res = G_SEXT \p Op, or \p Res
|
||||
// = G_ZEXT \p Op depending on how the target wants to extend boolean values.
|
||||
MachineInstrBuilder buildBoolExt(const DstOp &Res, const SrcOp &Op,
|
||||
bool IsFP);
|
||||
|
||||
/// Build and insert \p Res = G_ZEXT \p Op
|
||||
///
|
||||
/// G_ZEXT produces a register of the specified width, with bits 0 to
|
||||
|
@ -995,8 +995,9 @@ LegalizerHelper::widenScalar(MachineInstr &MI, unsigned TypeIdx, LLT WideTy) {
|
||||
widenScalarSrc(MI, WideTy, 3, TargetOpcode::G_ANYEXT);
|
||||
widenScalarDst(MI, WideTy);
|
||||
} else {
|
||||
bool IsVec = MRI.getType(MI.getOperand(1).getReg()).isVector();
|
||||
// Explicit extension is required here since high bits affect the result.
|
||||
widenScalarSrc(MI, WideTy, 1, TargetOpcode::G_ZEXT);
|
||||
widenScalarSrc(MI, WideTy, 1, MIRBuilder.getBoolExtOp(IsVec, false));
|
||||
}
|
||||
Observer.changedInstr(MI);
|
||||
return Legalized;
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/TargetInstrInfo.h"
|
||||
#include "llvm/CodeGen/TargetLowering.h"
|
||||
#include "llvm/CodeGen/TargetOpcodes.h"
|
||||
#include "llvm/CodeGen/TargetSubtargetInfo.h"
|
||||
#include "llvm/IR/DebugInfo.h"
|
||||
@ -375,6 +376,25 @@ MachineInstrBuilder MachineIRBuilder::buildZExt(const DstOp &Res,
|
||||
return buildInstr(TargetOpcode::G_ZEXT, Res, Op);
|
||||
}
|
||||
|
||||
unsigned MachineIRBuilder::getBoolExtOp(bool IsVec, bool IsFP) const {
|
||||
const auto *TLI = getMF().getSubtarget().getTargetLowering();
|
||||
switch (TLI->getBooleanContents(IsVec, IsFP)) {
|
||||
case TargetLoweringBase::ZeroOrNegativeOneBooleanContent:
|
||||
return TargetOpcode::G_SEXT;
|
||||
case TargetLoweringBase::ZeroOrOneBooleanContent:
|
||||
return TargetOpcode::G_ZEXT;
|
||||
default:
|
||||
return TargetOpcode::G_ANYEXT;
|
||||
}
|
||||
}
|
||||
|
||||
MachineInstrBuilder MachineIRBuilder::buildBoolExt(const DstOp &Res,
|
||||
const SrcOp &Op,
|
||||
bool IsFP) {
|
||||
unsigned ExtOp = getBoolExtOp(getMRI()->getType(Op.getReg()).isVector(), IsFP);
|
||||
return buildInstr(ExtOp, Res, Op);
|
||||
}
|
||||
|
||||
MachineInstrBuilder MachineIRBuilder::buildExtOrTrunc(unsigned ExtOpc,
|
||||
const DstOp &Res,
|
||||
const SrcOp &Op) {
|
||||
|
Loading…
Reference in New Issue
Block a user