Remove a whole bunch more ugliness. This is actually getting to the point of
[oota-llvm.git] / lib / VMCore / ConstantFold.h
1 //===-- ConstantHandling.h - Stuff for manipulating constants ---*- C++ -*-===//
2 // 
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
7 // 
8 //===----------------------------------------------------------------------===//
9 //
10 // WARNING: These operators may return a null object if I don't know how to 
11 //          perform the specified operation on the specified constant types.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #ifndef CONSTANTHANDLING_H
16 #define CONSTANTHANDLING_H
17
18 #include <vector>
19
20 namespace llvm {
21   class Constant;
22   class Type;
23   class PointerType;
24
25 struct ConstRules {
26   ConstRules() {}
27
28   // Binary Operators...
29   virtual Constant *add(const Constant *V1, const Constant *V2) const = 0;
30   virtual Constant *sub(const Constant *V1, const Constant *V2) const = 0;
31   virtual Constant *mul(const Constant *V1, const Constant *V2) const = 0;
32   virtual Constant *div(const Constant *V1, const Constant *V2) const = 0;
33   virtual Constant *rem(const Constant *V1, const Constant *V2) const = 0;
34   virtual Constant *op_and(const Constant *V1, const Constant *V2) const = 0;
35   virtual Constant *op_or (const Constant *V1, const Constant *V2) const = 0;
36   virtual Constant *op_xor(const Constant *V1, const Constant *V2) const = 0;
37   virtual Constant *shl(const Constant *V1, const Constant *V2) const = 0;
38   virtual Constant *shr(const Constant *V1, const Constant *V2) const = 0;
39
40   virtual Constant *lessthan(const Constant *V1, const Constant *V2) const = 0;
41                              
42   virtual Constant *equalto(const Constant *V1, const Constant *V2) const = 0;
43
44   // Casting operators.  ick
45   virtual Constant *castToBool  (const Constant *V) const = 0;
46   virtual Constant *castToSByte (const Constant *V) const = 0;
47   virtual Constant *castToUByte (const Constant *V) const = 0;
48   virtual Constant *castToShort (const Constant *V) const = 0;
49   virtual Constant *castToUShort(const Constant *V) const = 0;
50   virtual Constant *castToInt   (const Constant *V) const = 0;
51   virtual Constant *castToUInt  (const Constant *V) const = 0;
52   virtual Constant *castToLong  (const Constant *V) const = 0;
53   virtual Constant *castToULong (const Constant *V) const = 0;
54   virtual Constant *castToFloat (const Constant *V) const = 0;
55   virtual Constant *castToDouble(const Constant *V) const = 0;
56   virtual Constant *castToPointer(const Constant *V,
57                                   const PointerType *Ty) const = 0;
58
59   // ConstRules::get - Return an instance of ConstRules for the specified
60   // constant operands.
61   //
62   static ConstRules &get(const Constant *V1, const Constant *V2);
63 private:
64   ConstRules(const ConstRules &);             // Do not implement
65   ConstRules &operator=(const ConstRules &);  // Do not implement
66 };
67
68
69 //===----------------------------------------------------------------------===//
70 //  Implement higher level instruction folding type instructions
71 //===----------------------------------------------------------------------===//
72
73 // Constant fold various types of instruction...
74 Constant *ConstantFoldCastInstruction(const Constant *V, const Type *DestTy);
75 Constant *ConstantFoldBinaryInstruction(unsigned Opcode, const Constant *V1,
76                                         const Constant *V2);
77 Constant *ConstantFoldGetElementPtr(const Constant *C,
78                                     const std::vector<Constant*> &IdxList);
79
80 } // End llvm namespace
81
82 #endif