mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-03 17:32:59 +00:00
[GISel]: Enhance the MachineIRBuilder API
Allows the MachineIRBuilder APIs to directly create registers (based on LLT or TargetRegisterClass) as well as accept MachineInstrBuilders and implicitly converts to register(with getOperand(0).getReg()). Eg usage: LLT s32 = LLT::scalar(32); auto C32 = Builder.buildConstant(s32, 32); auto Tmp = Builder.buildInstr(TargetOpcode::G_SUB, s32, C32, OtherReg); auto Tmp2 = Builder.buildInstr(Opcode, DstReg, Builder.buildConstant(s32, 31)); .... Only a few methods added for now. Reviewed by Tim git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307302 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
73886a60d8
commit
3c86b1705b
@ -19,6 +19,7 @@
|
||||
#include "llvm/CodeGen/LowLevelType.h"
|
||||
#include "llvm/CodeGen/MachineBasicBlock.h"
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/DebugLoc.h"
|
||||
|
||||
@ -61,6 +62,20 @@ class MachineIRBuilder {
|
||||
void validateTruncExt(unsigned Dst, unsigned Src, bool IsExtend);
|
||||
MachineInstrBuilder buildBinaryOp(unsigned Opcode, unsigned Res, unsigned Op0, unsigned Op1);
|
||||
|
||||
unsigned getDestFromArg(unsigned Reg) { return Reg; }
|
||||
unsigned getDestFromArg(LLT Ty) {
|
||||
return getMF().getRegInfo().createGenericVirtualRegister(Ty);
|
||||
}
|
||||
unsigned getDestFromArg(const TargetRegisterClass *RC) {
|
||||
return getMF().getRegInfo().createVirtualRegister(RC);
|
||||
}
|
||||
|
||||
unsigned getRegFromArg(unsigned Reg) { return Reg; }
|
||||
|
||||
unsigned getRegFromArg(const MachineInstrBuilder &MIB) {
|
||||
return MIB->getOperand(0).getReg();
|
||||
}
|
||||
|
||||
public:
|
||||
/// Getter for the function we currently build.
|
||||
MachineFunction &getMF() {
|
||||
@ -121,6 +136,22 @@ public:
|
||||
/// \return a MachineInstrBuilder for the newly created instruction.
|
||||
MachineInstrBuilder buildInstr(unsigned Opcode);
|
||||
|
||||
/// DAG like Generic method for building arbitrary instructions as above.
|
||||
/// \Opc opcode for the instruction.
|
||||
/// \Ty Either LLT/TargetRegisterClass/unsigned types for Dst
|
||||
/// \Args Variadic list of uses of types(unsigned/MachineInstrBuilder)
|
||||
/// Uses of type MachineInstrBuilder will perform
|
||||
/// getOperand(0).getReg() to convert to register.
|
||||
template <typename DstTy, typename... UseArgsTy>
|
||||
MachineInstrBuilder buildInstr(unsigned Opc, DstTy &&Ty,
|
||||
UseArgsTy &&... Args) {
|
||||
auto MIB = buildInstr(Opc).addDef(getDestFromArg(Ty));
|
||||
unsigned It[] = {(getRegFromArg(Args))...};
|
||||
for (const auto &i : It)
|
||||
MIB.addUse(i);
|
||||
return MIB;
|
||||
}
|
||||
|
||||
/// Build but don't insert <empty> = \p Opcode <empty>.
|
||||
///
|
||||
/// \pre setMF, setBasicBlock or setMI must have been called.
|
||||
@ -189,6 +220,11 @@ public:
|
||||
/// \return a MachineInstrBuilder for the newly created instruction.
|
||||
MachineInstrBuilder buildAdd(unsigned Res, unsigned Op0,
|
||||
unsigned Op1);
|
||||
template <typename DstTy, typename... UseArgsTy>
|
||||
MachineInstrBuilder buildAdd(DstTy &&Ty, UseArgsTy &&... UseArgs) {
|
||||
unsigned Res = getDestFromArg(Ty);
|
||||
return buildAdd(Res, (getRegFromArg(UseArgs))...);
|
||||
}
|
||||
|
||||
/// Build and insert \p Res<def> = G_SUB \p Op0, \p Op1
|
||||
///
|
||||
@ -429,6 +465,10 @@ public:
|
||||
/// \return The newly created instruction.
|
||||
MachineInstrBuilder buildConstant(unsigned Res, int64_t Val);
|
||||
|
||||
template <typename DstType>
|
||||
MachineInstrBuilder buildConstant(DstType &&Res, int64_t Val) {
|
||||
return buildConstant(getDestFromArg(Res), Val);
|
||||
}
|
||||
/// Build and insert \p Res = G_FCONSTANT \p Val
|
||||
///
|
||||
/// G_FCONSTANT is a floating-point constant with the specified size and
|
||||
|
@ -291,11 +291,10 @@ bool AArch64LegalizerInfo::legalizeVaArg(MachineInstr &MI,
|
||||
unsigned DstPtr;
|
||||
if (Align > PtrSize) {
|
||||
// Realign the list to the actual required alignment.
|
||||
unsigned AlignMinus1 = MRI.createGenericVirtualRegister(IntPtrTy);
|
||||
MIRBuilder.buildConstant(AlignMinus1, Align - 1);
|
||||
auto AlignMinus1 = MIRBuilder.buildConstant(IntPtrTy, Align - 1);
|
||||
|
||||
unsigned ListTmp = MRI.createGenericVirtualRegister(PtrTy);
|
||||
MIRBuilder.buildGEP(ListTmp, List, AlignMinus1);
|
||||
MIRBuilder.buildGEP(ListTmp, List, AlignMinus1->getOperand(0).getReg());
|
||||
|
||||
DstPtr = MRI.createGenericVirtualRegister(PtrTy);
|
||||
MIRBuilder.buildPtrMask(DstPtr, ListTmp, Log2_64(Align));
|
||||
|
Loading…
Reference in New Issue
Block a user