diff options
| author | Chris Lattner <sabre@nondot.org> | 2006-02-04 02:16:44 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2006-02-04 02:16:44 +0000 |
| commit | 65ad53feb337a521e5a546e3a3b8ec06042dc2a9 (patch) | |
| tree | 07f4281e6abbeeec4febabdc0ec43a11c710f277 /llvm/lib | |
| parent | ee1dadbccf9923c46c8f344b4338661f11a5e053 (diff) | |
| download | bcm5719-llvm-65ad53feb337a521e5a546e3a3b8ec06042dc2a9.tar.gz bcm5719-llvm-65ad53feb337a521e5a546e3a3b8ec06042dc2a9.zip | |
Initial early support for non-register operands, like immediates
llvm-svn: 25952
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 57 |
1 files changed, 42 insertions, 15 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 88cc853ebea..47fb6c357d8 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -1316,29 +1316,56 @@ void SelectionDAGLowering::visitInlineAsm(CallInst &I) { OpNum++; // Consumes a call operand. unsigned SrcReg; + SDOperand ResOp; + unsigned ResOpType; + SDOperand InOperandVal = getValue(Operand); + if (isdigit(ConstraintCode[0])) { // Matching constraint? // If this is required to match an output register we have already set, // just use its register. unsigned OperandNo = atoi(ConstraintCode.c_str()); SrcReg = cast<RegisterSDNode>(AsmNodeOperands[OperandNo*2+2])->getReg(); + ResOp = DAG.getRegister(SrcReg, TLI.getValueType(OpTy)); + ResOpType = 1; + + Chain = DAG.getCopyToReg(Chain, SrcReg, InOperandVal, Flag); + Flag = Chain.getValue(1); } else { - // Copy the input into the appropriate register. - std::vector<unsigned> Regs = - TLI.getRegForInlineAsmConstraint(ConstraintCode); - if (Regs.size() == 1) - SrcReg = Regs[0]; - else - SrcReg = GetAvailableRegister(false, true, Regs, - OutputRegs, InputRegs); + TargetLowering::ConstraintType CTy = TargetLowering::C_RegisterClass; + if (ConstraintCode.size() == 1) // not a physreg name. + CTy = TLI.getConstraintType(ConstraintCode[0]); + + switch (CTy) { + default: assert(0 && "Unknown constraint type! FAIL!"); + case TargetLowering::C_RegisterClass: { + // Copy the input into the appropriate register. + std::vector<unsigned> Regs = + TLI.getRegForInlineAsmConstraint(ConstraintCode); + if (Regs.size() == 1) + SrcReg = Regs[0]; + else + SrcReg = GetAvailableRegister(false, true, Regs, + OutputRegs, InputRegs); + // FIXME: should be match fail. + assert(SrcReg && "Wasn't able to allocate register!"); + Chain = DAG.getCopyToReg(Chain, SrcReg, InOperandVal, Flag); + Flag = Chain.getValue(1); + + ResOp = DAG.getRegister(SrcReg, TLI.getValueType(OpTy)); + ResOpType = 1; + break; + } + case TargetLowering::C_Other: + if (!TLI.isOperandValidForConstraint(InOperandVal, ConstraintCode[0])) + assert(0 && "MATCH FAIL!"); + ResOp = InOperandVal; + ResOpType = 3; + break; + } } - assert(SrcReg && "Couldn't allocate input reg!"); - Chain = DAG.getCopyToReg(Chain, SrcReg, getValue(Operand), Flag); - Flag = Chain.getValue(1); - - // Add information to the INLINEASM node to know that this register is - // read. - AsmNodeOperands.push_back(DAG.getRegister(SrcReg,TLI.getValueType(OpTy))); + // Add information to the INLINEASM node to know about this input. + AsmNodeOperands.push_back(ResOp); AsmNodeOperands.push_back(DAG.getConstant(1, MVT::i32)); // ISUSE break; } |

