Add support for casting operators
[oota-llvm.git] / lib / VMCore / iOperators.cpp
index d856a20d0a5a7afb8712735469ff93bb5b747f89..22b6052d4692dd5f484e22795387e0011bf5767b 100644 (file)
@@ -1,31 +1,83 @@
-//===-- iBinaryOperators.cpp - Implement the BinaryOperators -----*- C++ -*--=//
+//===-- iOperators.cpp - Implement the Binary & Unary Operators --*- C++ -*--=//
 //
-// This file implements the nontrivial binary operator instructions.
+// This file implements the nontrivial binary & unary operator instructions.
 //
 //===----------------------------------------------------------------------===//
 
-#include "llvm/iBinary.h"
+#include "llvm/iOperators.h"
 #include "llvm/Type.h"
 
-BinaryOperator *BinaryOperator::create(unsigned Op, Value *S1, Value *S2,
+//===----------------------------------------------------------------------===//
+//                              UnaryOperator Class
+//===----------------------------------------------------------------------===//
+
+UnaryOperator *UnaryOperator::create(UnaryOps Op, Value *Source) {
+  switch (Op) {
+  case Not:  return new GenericUnaryInst(Op, Source);
+  default:
+    cerr << "Don't know how to Create UnaryOperator " << Op << endl;
+    return 0;
+  }
+}
+
+
+//===----------------------------------------------------------------------===//
+//                           GenericUnaryOperator Class
+//===----------------------------------------------------------------------===//
+
+const char *GenericUnaryInst::getOpcodeName() const {
+  switch (getOpcode()) {
+  case Not: return "not";
+  case Cast: return "cast";
+  default:
+    cerr << "Invalid unary operator type!" << getOpcode() << endl;
+    abort();
+  }
+}
+
+
+//===----------------------------------------------------------------------===//
+//                             BinaryOperator Class
+//===----------------------------------------------------------------------===//
+
+BinaryOperator *BinaryOperator::create(BinaryOps Op, Value *S1, Value *S2,
                                       const string &Name) {
   switch (Op) {
-  case Add: return new AddInst(S1, S2, Name);
-  case Sub: return new SubInst(S1, S2, Name);
-  case SetLT:
-  case SetGT:
-  case SetLE:
-  case SetGE:
-  case SetEQ:
-  case SetNE:
-    return new SetCondInst((BinaryOps)Op, S1, S2, Name);
+  // Binary comparison operators...
+  case SetLT: case SetGT: case SetLE:
+  case SetGE: case SetEQ: case SetNE:
+    return new SetCondInst(Op, S1, S2, Name);
 
   default:
-    cerr << "Don't know how to GetBinaryOperator " << Op << endl;
-    return 0;
+    return new GenericBinaryInst(Op, S1, S2, Name);
+  }
+}
+
+
+//===----------------------------------------------------------------------===//
+//                            GenericBinaryInst Class
+//===----------------------------------------------------------------------===//
+
+const char *GenericBinaryInst::getOpcodeName() const {
+  switch (getOpcode()) {
+  // Standard binary operators...
+  case Add: return "add";
+  case Sub: return "sub";
+  case Mul: return "mul";
+  case Div: return "div";
+  case Rem: return "rem";
+
+  // Logical operators...
+  case And: return "and";
+  case Or : return "or";
+  case Xor: return "xor";
+  default:
+    cerr << "Invalid binary operator type!" << getOpcode() << endl;
+    abort();
   }
 }
 
+
 //===----------------------------------------------------------------------===//
 //                             SetCondInst Class
 //===----------------------------------------------------------------------===//
@@ -38,10 +90,10 @@ SetCondInst::SetCondInst(BinaryOps opType, Value *S1, Value *S2,
   setType(Type::BoolTy);   // setcc instructions always return bool type.
 
   // Make sure it's a valid type...
-  assert(getOpcode() != "Invalid opcode type to SetCondInst class!");
+  assert(getOpcodeName() != 0);
 }
 
-string SetCondInst::getOpcode() const {
+const char *SetCondInst::getOpcodeName() const {
   switch (OpType) {
   case SetLE:  return "setle";
   case SetGE:  return "setge";