diff options
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp | 42 | 
1 files changed, 38 insertions, 4 deletions
| diff --git a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp index 6248a49317c..99e768e8ed2 100644 --- a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp +++ b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp @@ -242,11 +242,28 @@ MachineInstrBuilder MachineIRBuilder::buildCopy(const DstOp &Res,  MachineInstrBuilder MachineIRBuilder::buildConstant(const DstOp &Res,                                                      const ConstantInt &Val) {    LLT Ty = Res.getLLTTy(*getMRI()); +  LLT EltTy = Ty.getScalarType();    const ConstantInt *NewVal = &Val; -  if (Ty.getScalarSizeInBits() != Val.getBitWidth()) -    NewVal = ConstantInt::get(getMF().getFunction().getContext(), -                              Val.getValue().sextOrTrunc(Ty.getSizeInBits())); +  if (EltTy.getSizeInBits() != Val.getBitWidth()) { +    NewVal = ConstantInt::get( +      getMF().getFunction().getContext(), +      Val.getValue().sextOrTrunc(EltTy.getSizeInBits())); +  } + +  if (Ty.isVector()) { +    unsigned EltReg = getMRI()->createGenericVirtualRegister(EltTy); +    buildInstr(TargetOpcode::G_CONSTANT) +      .addDef(EltReg) +      .addCImm(NewVal); + +    auto MIB = buildInstr(TargetOpcode::G_BUILD_VECTOR); +    Res.addDefToMIB(*getMRI(), MIB); + +    for (unsigned I = 0, E = Ty.getNumElements(); I != E; ++I) +      MIB.addUse(EltReg); +    return MIB; +  }    auto MIB = buildInstr(TargetOpcode::G_CONSTANT);    Res.addDefToMIB(*getMRI(), MIB); @@ -264,7 +281,24 @@ MachineInstrBuilder MachineIRBuilder::buildConstant(const DstOp &Res,  MachineInstrBuilder MachineIRBuilder::buildFConstant(const DstOp &Res,                                                       const ConstantFP &Val) { -  assert(!Res.getLLTTy(*getMRI()).isPointer() && "invalid operand type"); +  LLT Ty = Res.getLLTTy(*getMRI()); + +  assert(!Ty.isPointer() && "invalid operand type"); + +  if (Ty.isVector()) { +    unsigned EltReg +      = getMRI()->createGenericVirtualRegister(Ty.getElementType()); +    buildInstr(TargetOpcode::G_FCONSTANT) +      .addDef(EltReg) +      .addFPImm(&Val); + +    auto MIB = buildInstr(TargetOpcode::G_BUILD_VECTOR); +    Res.addDefToMIB(*getMRI(), MIB); + +    for (unsigned I = 0, E = Ty.getNumElements(); I != E; ++I) +      MIB.addUse(EltReg); +    return MIB; +  }    auto MIB = buildInstr(TargetOpcode::G_FCONSTANT);    Res.addDefToMIB(*getMRI(), MIB); | 

