mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
Operation Enhancements
Create an OpInit class to serve as a base for all operation Inits. Move parsing of operation constructs to separate functions and reference from multiple places. Add some commented out new operations. Coming soon. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@71789 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -41,7 +41,9 @@ class IntInit;
|
||||
class StringInit;
|
||||
class CodeInit;
|
||||
class ListInit;
|
||||
//class UnOpInit;
|
||||
class BinOpInit;
|
||||
//class TernOpInit;
|
||||
class DefInit;
|
||||
class DagInit;
|
||||
class TypedInit;
|
||||
@@ -77,9 +79,15 @@ public: // These methods should only be called from subclasses of Init
|
||||
virtual Init *convertValue( IntInit *II) { return 0; }
|
||||
virtual Init *convertValue(StringInit *SI) { return 0; }
|
||||
virtual Init *convertValue( ListInit *LI) { return 0; }
|
||||
// virtual Init *convertValue( UnOpInit *UI) {
|
||||
// return convertValue((TypedInit*)UI);
|
||||
// }
|
||||
virtual Init *convertValue( BinOpInit *UI) {
|
||||
return convertValue((TypedInit*)UI);
|
||||
}
|
||||
// virtual Init *convertValue( TernOpInit *UI) {
|
||||
// return convertValue((TypedInit*)UI);
|
||||
// }
|
||||
virtual Init *convertValue( CodeInit *CI) { return 0; }
|
||||
virtual Init *convertValue(VarBitInit *VB) { return 0; }
|
||||
virtual Init *convertValue( DefInit *DI) { return 0; }
|
||||
@@ -125,7 +133,9 @@ public:
|
||||
virtual Init *convertValue(VarBitInit *VB) { return (Init*)VB; }
|
||||
virtual Init *convertValue( DefInit *DI) { return 0; }
|
||||
virtual Init *convertValue( DagInit *DI) { return 0; }
|
||||
// virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
|
||||
virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
|
||||
//virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
|
||||
virtual Init *convertValue( TypedInit *TI);
|
||||
virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);}
|
||||
virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
|
||||
@@ -167,7 +177,9 @@ public:
|
||||
virtual Init *convertValue(VarBitInit *VB) { return 0; }
|
||||
virtual Init *convertValue( DefInit *DI) { return 0; }
|
||||
virtual Init *convertValue( DagInit *DI) { return 0; }
|
||||
//virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
|
||||
virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
|
||||
//virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
|
||||
virtual Init *convertValue( TypedInit *TI);
|
||||
virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);}
|
||||
virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
|
||||
@@ -205,7 +217,9 @@ public:
|
||||
virtual Init *convertValue(VarBitInit *VB) { return 0; }
|
||||
virtual Init *convertValue( DefInit *DI) { return 0; }
|
||||
virtual Init *convertValue( DagInit *DI) { return 0; }
|
||||
//virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
|
||||
virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
|
||||
//virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
|
||||
virtual Init *convertValue( TypedInit *TI);
|
||||
virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);}
|
||||
virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
|
||||
@@ -237,7 +251,10 @@ public:
|
||||
virtual Init *convertValue( IntInit *II) { return 0; }
|
||||
virtual Init *convertValue(StringInit *SI) { return (Init*)SI; }
|
||||
virtual Init *convertValue( ListInit *LI) { return 0; }
|
||||
//virtual Init *convertValue( UnOpInit *BO);
|
||||
virtual Init *convertValue( BinOpInit *BO);
|
||||
//virtual Init *convertValue( TernOpInit *BO) { return RecTy::convertValue(BO);}
|
||||
|
||||
virtual Init *convertValue( CodeInit *CI) { return 0; }
|
||||
virtual Init *convertValue(VarBitInit *VB) { return 0; }
|
||||
virtual Init *convertValue( DefInit *DI) { return 0; }
|
||||
@@ -284,7 +301,9 @@ public:
|
||||
virtual Init *convertValue(VarBitInit *VB) { return 0; }
|
||||
virtual Init *convertValue( DefInit *DI) { return 0; }
|
||||
virtual Init *convertValue( DagInit *DI) { return 0; }
|
||||
//virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
|
||||
virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
|
||||
//virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
|
||||
virtual Init *convertValue( TypedInit *TI);
|
||||
virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);}
|
||||
virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
|
||||
@@ -321,7 +340,9 @@ public:
|
||||
virtual Init *convertValue(VarBitInit *VB) { return 0; }
|
||||
virtual Init *convertValue( DefInit *DI) { return 0; }
|
||||
virtual Init *convertValue( DagInit *DI) { return 0; }
|
||||
//virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
|
||||
virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
|
||||
//virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
|
||||
virtual Init *convertValue( TypedInit *TI);
|
||||
virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);}
|
||||
virtual Init *convertValue( FieldInit *FI) { return RecTy::convertValue(FI);}
|
||||
@@ -354,7 +375,9 @@ public:
|
||||
virtual Init *convertValue( CodeInit *CI) { return 0; }
|
||||
virtual Init *convertValue(VarBitInit *VB) { return 0; }
|
||||
virtual Init *convertValue( DefInit *DI) { return 0; }
|
||||
//virtual Init *convertValue( UnOpInit *BO);
|
||||
virtual Init *convertValue( BinOpInit *BO);
|
||||
//virtual Init *convertValue( TernOpInit *BO) { return RecTy::convertValue(BO);}
|
||||
virtual Init *convertValue( DagInit *CI) { return (Init*)CI; }
|
||||
virtual Init *convertValue( TypedInit *TI);
|
||||
virtual Init *convertValue( VarInit *VI) { return RecTy::convertValue(VI);}
|
||||
@@ -395,7 +418,9 @@ public:
|
||||
virtual Init *convertValue( ListInit *LI) { return 0; }
|
||||
virtual Init *convertValue( CodeInit *CI) { return 0; }
|
||||
virtual Init *convertValue(VarBitInit *VB) { return 0; }
|
||||
//virtual Init *convertValue( UnOpInit *UI) { return RecTy::convertValue(UI);}
|
||||
virtual Init *convertValue( BinOpInit *UI) { return RecTy::convertValue(UI);}
|
||||
//virtual Init *convertValue( TernOpInit *UI) { return RecTy::convertValue(UI);}
|
||||
virtual Init *convertValue( DefInit *DI);
|
||||
virtual Init *convertValue( DagInit *DI) { return 0; }
|
||||
virtual Init *convertValue( TypedInit *VI);
|
||||
@@ -686,27 +711,21 @@ public:
|
||||
unsigned Elt) = 0;
|
||||
};
|
||||
|
||||
|
||||
/// BinOpInit - !op (X, Y) - Combine two inits.
|
||||
/// OpInit - Base class for operators
|
||||
///
|
||||
class BinOpInit : public TypedInit {
|
||||
class OpInit : public TypedInit {
|
||||
public:
|
||||
enum BinaryOp { SHL, SRA, SRL, STRCONCAT, CONCAT, NAMECONCAT };
|
||||
private:
|
||||
BinaryOp Opc;
|
||||
Init *LHS, *RHS;
|
||||
public:
|
||||
BinOpInit(BinaryOp opc, Init *lhs, Init *rhs, RecTy *Type) :
|
||||
TypedInit(Type), Opc(opc), LHS(lhs), RHS(rhs) {
|
||||
}
|
||||
|
||||
BinaryOp getOpcode() const { return Opc; }
|
||||
Init *getLHS() const { return LHS; }
|
||||
Init *getRHS() const { return RHS; }
|
||||
OpInit(RecTy *Type) : TypedInit(Type) {}
|
||||
|
||||
// Clone - Clone this operator, replacing arguments with the new list
|
||||
virtual OpInit *clone(std::vector<Init *> &Operands) = 0;
|
||||
|
||||
virtual int getNumOperands(void) const = 0;
|
||||
virtual Init *getOperand(int i) = 0;
|
||||
|
||||
// Fold - If possible, fold this to a simpler init. Return this if not
|
||||
// possible to fold.
|
||||
Init *Fold(Record *CurRec, MultiClass *CurMultiClass);
|
||||
virtual Init *Fold(Record *CurRec, MultiClass *CurMultiClass) = 0;
|
||||
|
||||
virtual Init *convertInitializerTo(RecTy *Ty) {
|
||||
return Ty->convertValue(this);
|
||||
@@ -716,12 +735,136 @@ public:
|
||||
unsigned Bit);
|
||||
virtual Init *resolveListElementReference(Record &R, const RecordVal *RV,
|
||||
unsigned Elt);
|
||||
};
|
||||
|
||||
|
||||
/// UnOpInit - !op (X) - Transform an init.
|
||||
///
|
||||
// class UnOpInit : public OpInit {
|
||||
// public:
|
||||
// enum UnaryOp { CAST };
|
||||
// private:
|
||||
// UnaryOp Opc;
|
||||
// Init *LHS;
|
||||
// public:
|
||||
// UnOpInit(UnaryOp opc, Init *lhs, RecTy *Type) :
|
||||
// OpInit(Type), Opc(opc), LHS(lhs) {
|
||||
// }
|
||||
|
||||
// // Clone - Clone this operator, replacing arguments with the new list
|
||||
// virtual OpInit *clone(std::vector<Init *> &Operands) {
|
||||
// assert(Operands.size() == 1 && "Wrong number of operands for unary operation");
|
||||
// return new UnOpInit(getOpcode(), *Operands.begin(), getType());
|
||||
// }
|
||||
|
||||
// int getNumOperands(void) const { return 1; }
|
||||
// Init *getOperand(int i) {
|
||||
// assert(i == 0 && "Invalid operand id for unary operator");
|
||||
// return getOperand();
|
||||
// }
|
||||
|
||||
// UnaryOp getOpcode() const { return Opc; }
|
||||
// Init *getOperand() const { return LHS; }
|
||||
|
||||
// // Fold - If possible, fold this to a simpler init. Return this if not
|
||||
// // possible to fold.
|
||||
// Init *Fold(Record *CurRec, MultiClass *CurMultiClass);
|
||||
|
||||
// virtual Init *resolveReferences(Record &R, const RecordVal *RV);
|
||||
|
||||
// virtual std::string getAsString() const;
|
||||
// };
|
||||
|
||||
/// BinOpInit - !op (X, Y) - Combine two inits.
|
||||
///
|
||||
class BinOpInit : public OpInit {
|
||||
public:
|
||||
enum BinaryOp { SHL, SRA, SRL, STRCONCAT, CONCAT, NAMECONCAT };
|
||||
private:
|
||||
BinaryOp Opc;
|
||||
Init *LHS, *RHS;
|
||||
public:
|
||||
BinOpInit(BinaryOp opc, Init *lhs, Init *rhs, RecTy *Type) :
|
||||
OpInit(Type), Opc(opc), LHS(lhs), RHS(rhs) {
|
||||
}
|
||||
|
||||
// Clone - Clone this operator, replacing arguments with the new list
|
||||
virtual OpInit *clone(std::vector<Init *> &Operands) {
|
||||
assert(Operands.size() == 2 && "Wrong number of operands for binary operation");
|
||||
return new BinOpInit(getOpcode(), Operands[0], Operands[1], getType());
|
||||
}
|
||||
|
||||
int getNumOperands(void) const { return 2; }
|
||||
Init *getOperand(int i) {
|
||||
assert(i == 0 || i == 1 && "Invalid operand id for binary operator");
|
||||
if (i == 0) {
|
||||
return getLHS();
|
||||
}
|
||||
else {
|
||||
return getRHS();
|
||||
}
|
||||
}
|
||||
|
||||
BinaryOp getOpcode() const { return Opc; }
|
||||
Init *getLHS() const { return LHS; }
|
||||
Init *getRHS() const { return RHS; }
|
||||
|
||||
// Fold - If possible, fold this to a simpler init. Return this if not
|
||||
// possible to fold.
|
||||
Init *Fold(Record *CurRec, MultiClass *CurMultiClass);
|
||||
|
||||
virtual Init *resolveReferences(Record &R, const RecordVal *RV);
|
||||
|
||||
virtual std::string getAsString() const;
|
||||
};
|
||||
|
||||
/// TernOpInit - !op (X, Y, Z) - Combine two inits.
|
||||
///
|
||||
// class TernOpInit : public OpInit {
|
||||
// public:
|
||||
// enum TernaryOp { SUBST, FOREACH };
|
||||
// private:
|
||||
// TernaryOp Opc;
|
||||
// Init *LHS, *MHS, *RHS;
|
||||
// public:
|
||||
// TernOpInit(TernaryOp opc, Init *lhs, Init *mhs, Init *rhs, RecTy *Type) :
|
||||
// OpInit(Type), Opc(opc), LHS(lhs), MHS(mhs), RHS(rhs) {
|
||||
// }
|
||||
|
||||
// // Clone - Clone this operator, replacing arguments with the new list
|
||||
// virtual OpInit *clone(std::vector<Init *> &Operands) {
|
||||
// assert(Operands.size() == 3 && "Wrong number of operands for ternary operation");
|
||||
// return new TernOpInit(getOpcode(), Operands[0], Operands[1], Operands[2], getType());
|
||||
// }
|
||||
|
||||
// int getNumOperands(void) const { return 3; }
|
||||
// Init *getOperand(int i) {
|
||||
// assert(i == 0 || i == 1 || i == 2 && "Invalid operand id for ternary operator");
|
||||
// if (i == 0) {
|
||||
// return getLHS();
|
||||
// }
|
||||
// else if (i == 1) {
|
||||
// return getMHS();
|
||||
// }
|
||||
// else {
|
||||
// return getRHS();
|
||||
// }
|
||||
// }
|
||||
|
||||
// TernaryOp getOpcode() const { return Opc; }
|
||||
// Init *getLHS() const { return LHS; }
|
||||
// Init *getMHS() const { return MHS; }
|
||||
// Init *getRHS() const { return RHS; }
|
||||
|
||||
// // Fold - If possible, fold this to a simpler init. Return this if not
|
||||
// // possible to fold.
|
||||
// Init *Fold(Record *CurRec, MultiClass *CurMultiClass);
|
||||
|
||||
// virtual Init *resolveReferences(Record &R, const RecordVal *RV);
|
||||
|
||||
// virtual std::string getAsString() const;
|
||||
// };
|
||||
|
||||
|
||||
/// VarInit - 'Opcode' - Represent a reference to an entire variable object.
|
||||
///
|
||||
|
Reference in New Issue
Block a user