mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			109 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===-- iOperators.cpp - Implement the Binary & Unary Operators --*- C++ -*--=//
 | |
| //
 | |
| // This file implements the nontrivial binary & unary operator instructions.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #include "llvm/iOperators.h"
 | |
| #include "llvm/Type.h"
 | |
| 
 | |
| //===----------------------------------------------------------------------===//
 | |
| //                              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) {
 | |
|   // Binary comparison operators...
 | |
|   case SetLT: case SetGT: case SetLE:
 | |
|   case SetGE: case SetEQ: case SetNE:
 | |
|     return new SetCondInst(Op, S1, S2, Name);
 | |
| 
 | |
|   default:
 | |
|     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
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| 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(getOpcodeName() != 0);
 | |
| }
 | |
| 
 | |
| const char *SetCondInst::getOpcodeName() 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";
 | |
|   }
 | |
| }
 |