From: Brian Gaeke Date: Wed, 4 Aug 2004 07:29:04 +0000 (+0000) Subject: Add a new file containing just TmpInstruction and its implementation. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=d5ce4116b21e501903873c895e374dbc91248678;p=oota-llvm.git Add a new file containing just TmpInstruction and its implementation. Many other pieces of the SparcV9 backend want to use TmpInstruction, but don't need any other instruction selector baggage. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15469 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/SparcV9/SparcV9TmpInstr.cpp b/lib/Target/SparcV9/SparcV9TmpInstr.cpp new file mode 100644 index 00000000000..605cf061898 --- /dev/null +++ b/lib/Target/SparcV9/SparcV9TmpInstr.cpp @@ -0,0 +1,60 @@ +//===- SparcV9TmpInstr.cpp - SparcV9 Intermediate Value class -------------===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by the LLVM research group and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// Methods of class for temporary intermediate values used within the current +// SparcV9 backend. +// +//===----------------------------------------------------------------------===// + +#include "SparcV9TmpInstr.h" +#include "Support/LeakDetector.h" + +namespace llvm { + +TmpInstruction::TmpInstruction(Value *s1, Value *s2, const std::string &name) + : Instruction(s1->getType(), Instruction::UserOp1, name) { + Operands.push_back(Use(s1, this)); // s1 must be non-null + if (s2) + Operands.push_back(Use(s2, this)); + + // TmpInstructions should not be garbage checked. + LeakDetector::removeGarbageObject(this); +} + +TmpInstruction::TmpInstruction(MachineCodeForInstruction& mcfi, + Value *s1, Value *s2, const std::string &name) + : Instruction(s1->getType(), Instruction::UserOp1, name) { + mcfi.addTemp(this); + + Operands.push_back(Use(s1, this)); // s1 must be non-null + if (s2) + Operands.push_back(Use(s2, this)); + + // TmpInstructions should not be garbage checked. + LeakDetector::removeGarbageObject(this); +} + +// Constructor that requires the type of the temporary to be specified. +// Both S1 and S2 may be NULL. +TmpInstruction::TmpInstruction(MachineCodeForInstruction& mcfi, + const Type *Ty, Value *s1, Value* s2, + const std::string &name) + : Instruction(Ty, Instruction::UserOp1, name) { + mcfi.addTemp(this); + + if (s1) + Operands.push_back(Use(s1, this)); + if (s2) + Operands.push_back(Use(s2, this)); + + // TmpInstructions should not be garbage checked. + LeakDetector::removeGarbageObject(this); +} + +} // end namespace llvm diff --git a/lib/Target/SparcV9/SparcV9TmpInstr.h b/lib/Target/SparcV9/SparcV9TmpInstr.h new file mode 100644 index 00000000000..b4a7d4935cd --- /dev/null +++ b/lib/Target/SparcV9/SparcV9TmpInstr.h @@ -0,0 +1,72 @@ +//===-- SparcV9TmpInstr.h ---------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by the LLVM research group and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// Definition of class for temporary intermediate values used within the current +// SparcV9 backend. +// +//===----------------------------------------------------------------------===// + +#ifndef SPARCV9TMPINSTR_H +#define SPARCV9TMPINSTR_H + +#include "llvm/Instruction.h" +#include "llvm/CodeGen/MachineCodeForInstruction.h" + +namespace llvm { + +/// TmpInstruction - This class represents temporary intermediate +/// values used within the SparcV9 machine code for an LLVM instruction. +/// +class TmpInstruction : public Instruction { + TmpInstruction(const TmpInstruction &TI) + : Instruction(TI.getType(), TI.getOpcode()) { + if (!TI.Operands.empty()) { + Operands.push_back(Use(TI.Operands[0], this)); + if (TI.Operands.size() == 2) + Operands.push_back(Use(TI.Operands[1], this)); + else + assert(0 && "Bad # operands to TmpInstruction!"); + } + } +public: + // Constructor that uses the type of S1 as the type of the temporary. + // s1 must be a valid value. s2 may be NULL. + TmpInstruction(MachineCodeForInstruction &mcfi, + Value *s1, Value *s2 = 0, const std::string &name = ""); + + // Constructor that uses the type of S1 as the type of the temporary, + // but does not require a MachineCodeForInstruction. + // s1 must be a valid value. s2 may be NULL. + TmpInstruction(Value *s1, Value *s2 = 0, const std::string &name = ""); + + // Constructor that requires the type of the temporary to be specified. + // Both S1 and S2 may be NULL. + TmpInstruction(MachineCodeForInstruction& mcfi, + const Type *Ty, Value *s1 = 0, Value* s2 = 0, + const std::string &name = ""); + + virtual Instruction *clone() const { + assert(0 && "Cannot clone TmpInstructions!"); + return 0; + } + virtual const char *getOpcodeName() const { return "TmpInstruction"; } + + // Methods for support type inquiry through isa, cast, and dyn_cast: + static inline bool classof(const TmpInstruction *) { return true; } + static inline bool classof(const Instruction *I) { + return (I->getOpcode() == Instruction::UserOp1); + } + static inline bool classof(const Value *V) { + return isa(V) && classof(cast(V)); + } +}; + +} // End llvm namespace + +#endif