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/CodeGen | |
| 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/CodeGen')
| -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;      } | 

