diff options
| author | Chris Lattner <sabre@nondot.org> | 2006-02-04 02:26:14 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2006-02-04 02:26:14 +0000 |
| commit | 3b48431333cacd5c244ac262a1c1fa1d2dc89860 (patch) | |
| tree | 3cddf74dd23ac9f8a49cfaea595dd9d789deef1b /llvm/lib/CodeGen | |
| parent | 0a977c95aad616b3f1b40af1847ed551d1e589f5 (diff) | |
| download | bcm5719-llvm-3b48431333cacd5c244ac262a1c1fa1d2dc89860.tar.gz bcm5719-llvm-3b48431333cacd5c244ac262a1c1fa1d2dc89860.zip | |
Add initial support for immediates. This allows us to compile this:
int %rlwnm(int %A, int %B) {
%C = call int asm "rlwnm $0, $1, $2, $3, $4", "=r,r,r,n,n"(int %A, int %B, int 4, int 17)
ret int %C
}
into:
_rlwnm:
or r2, r3, r3
or r3, r4, r4
rlwnm r2, r2, r3, 4, 17 ;; note the immediates :)
or r3, r2, r2
blr
llvm-svn: 25955
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp | 20 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 2 |
2 files changed, 16 insertions, 6 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp index c0fd3975649..aff5d4265dd 100644 --- a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp @@ -300,16 +300,26 @@ void ScheduleDAG::EmitNode(NodeInfo *NI) { // Add all of the operand registers to the instruction. for (unsigned i = 2; i != NumOps; i += 2) { - unsigned Reg = cast<RegisterSDNode>(Node->getOperand(i))->getReg(); unsigned Flags =cast<ConstantSDNode>(Node->getOperand(i+1))->getValue(); MachineOperand::UseType UseTy; switch (Flags) { default: assert(0 && "Bad flags!"); - case 1: UseTy = MachineOperand::Use; break; - case 2: UseTy = MachineOperand::Def; break; - case 3: UseTy = MachineOperand::UseAndDef; break; + case 1: { // Use of register. + unsigned Reg = cast<RegisterSDNode>(Node->getOperand(i))->getReg(); + MI->addMachineRegOperand(Reg, MachineOperand::Use); + break; + } + case 2: { // Def of register. + unsigned Reg = cast<RegisterSDNode>(Node->getOperand(i))->getReg(); + MI->addMachineRegOperand(Reg, MachineOperand::Def); + break; + } + case 3: { // Immediate. + uint64_t Val = cast<ConstantSDNode>(Node->getOperand(i))->getValue(); + MI->addZeroExtImm64Operand(Val); + break; + } } - MI->addMachineRegOperand(Reg, UseTy); } break; } diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 47fb6c357d8..e4691b3d9c5 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -1366,7 +1366,7 @@ void SelectionDAGLowering::visitInlineAsm(CallInst &I) { // Add information to the INLINEASM node to know about this input. AsmNodeOperands.push_back(ResOp); - AsmNodeOperands.push_back(DAG.getConstant(1, MVT::i32)); // ISUSE + AsmNodeOperands.push_back(DAG.getConstant(ResOpType, MVT::i32)); break; } case InlineAsm::isClobber: |

