summaryrefslogtreecommitdiff
path: root/lib/VMCore/iOperators.cpp
blob: c1efb42e716fb39ee0dec6ac1a6b8f56fa406bf8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//===-- iBinaryOperators.cpp - Implement the BinaryOperators -----*- C++ -*--=//
//
// This file implements the nontrivial binary operator instructions.
//
//===----------------------------------------------------------------------===//

#include "llvm/iBinary.h"
#include "llvm/Type.h"

BinaryOperator *BinaryOperator::create(unsigned Op, Value *S1, Value *S2,
				       const string &Name) {
  switch (Op) {
  // Standard binary operators...
  case Add: return new GenericBinaryInst(Op, S1, S2, "add", Name);
  case Sub: return new GenericBinaryInst(Op, S1, S2, "sub", Name);
  case Mul: return new GenericBinaryInst(Op, S1, S2, "mul", Name);
  case Div: return new GenericBinaryInst(Op, S1, S2, "div", Name);
  case Rem: return new GenericBinaryInst(Op, S1, S2, "rem", Name);

  // Logical operators...
  case And: return new GenericBinaryInst(Op, S1, S2, "and", Name);
  case Or : return new GenericBinaryInst(Op, S1, S2, "or", Name);
  case Xor: return new GenericBinaryInst(Op, S1, S2, "xor", Name);

  // Binary comparison operators...
  case SetLT: case SetGT: case SetLE:
  case SetGE: case SetEQ: case SetNE:
    return new SetCondInst((BinaryOps)Op, S1, S2, Name);

  default:
    cerr << "Don't know how to GetBinaryOperator " << Op << endl;
    return 0;
  }
}

//===----------------------------------------------------------------------===//
//                             SetCondInst Class
//===----------------------------------------------------------------------===//

SetCondInst::SetCondInst(BinaryOps opType, Value *S1, Value *S2, 
                         const string &Name) 
  : BinaryOperator(opType, S1, S2, Name) {

  OpType = opType;
  setType(Type::BoolTy);   // setcc instructions always return bool type.

  // Make sure it's a valid type...
  assert(getOpcode() != "Invalid opcode type to SetCondInst class!");
}

string SetCondInst::getOpcode() const {
  switch (OpType) {
  case SetLE:  return "setle";
  case SetGE:  return "setge";
  case SetLT:  return "setlt";
  case SetGT:  return "setgt";
  case SetEQ:  return "seteq";
  case SetNE:  return "setne";
  default:
    assert(0 && "Invalid opcode type to SetCondInst class!");
    return "invalid opcode type to SetCondInst";
  }
}