89 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
// $Id$ -*-c++-*-
 | 
						|
//***************************************************************************
 | 
						|
// File:
 | 
						|
//	SparcInstrSelectionSupport.h
 | 
						|
// 
 | 
						|
// Purpose:
 | 
						|
// 
 | 
						|
// History:
 | 
						|
//	10/17/01	 -  Vikram Adve  -  Created
 | 
						|
//**************************************************************************/
 | 
						|
 | 
						|
#ifndef SPARC_INSTR_SELECTION_SUPPORT_h
 | 
						|
#define SPARC_INSTR_SELECTION_SUPPORT_h
 | 
						|
 | 
						|
#include "llvm/DerivedTypes.h"
 | 
						|
#include "llvm/Value.h"
 | 
						|
 | 
						|
inline MachineOpCode
 | 
						|
ChooseLoadInstruction(const Type *DestTy)
 | 
						|
{
 | 
						|
  switch (DestTy->getPrimitiveID()) {
 | 
						|
  case Type::BoolTyID:
 | 
						|
  case Type::UByteTyID:   return LDUB;
 | 
						|
  case Type::SByteTyID:   return LDSB;
 | 
						|
  case Type::UShortTyID:  return LDUH;
 | 
						|
  case Type::ShortTyID:   return LDSH;
 | 
						|
  case Type::UIntTyID:    return LDUW;
 | 
						|
  case Type::IntTyID:     return LDSW;
 | 
						|
  case Type::PointerTyID:
 | 
						|
  case Type::ULongTyID:
 | 
						|
  case Type::LongTyID:    return LDX;
 | 
						|
  case Type::FloatTyID:   return LD;
 | 
						|
  case Type::DoubleTyID:  return LDD;
 | 
						|
  default: assert(0 && "Invalid type for Load instruction");
 | 
						|
  }
 | 
						|
  
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
inline MachineOpCode
 | 
						|
ChooseStoreInstruction(const Type *DestTy)
 | 
						|
{
 | 
						|
  switch (DestTy->getPrimitiveID()) {
 | 
						|
  case Type::BoolTyID:
 | 
						|
  case Type::UByteTyID:
 | 
						|
  case Type::SByteTyID:   return STB;
 | 
						|
  case Type::UShortTyID:
 | 
						|
  case Type::ShortTyID:   return STH;
 | 
						|
  case Type::UIntTyID:
 | 
						|
  case Type::IntTyID:     return STW;
 | 
						|
  case Type::PointerTyID:
 | 
						|
  case Type::ULongTyID:
 | 
						|
  case Type::LongTyID:    return STX;
 | 
						|
  case Type::FloatTyID:   return ST;
 | 
						|
  case Type::DoubleTyID:  return STD;
 | 
						|
  default: assert(0 && "Invalid type for Store instruction");
 | 
						|
  }
 | 
						|
  
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
inline MachineOpCode 
 | 
						|
ChooseAddInstructionByType(const Type* resultType)
 | 
						|
{
 | 
						|
  MachineOpCode opCode = INVALID_OPCODE;
 | 
						|
  
 | 
						|
  if (resultType->isIntegral() ||
 | 
						|
      isa<PointerType>(resultType) ||
 | 
						|
      isa<FunctionType>(resultType) ||
 | 
						|
      resultType == Type::LabelTy ||
 | 
						|
      resultType == Type::BoolTy)
 | 
						|
    {
 | 
						|
      opCode = ADD;
 | 
						|
    }
 | 
						|
  else
 | 
						|
    switch(resultType->getPrimitiveID())
 | 
						|
      {
 | 
						|
      case Type::FloatTyID:  opCode = FADDS; break;
 | 
						|
      case Type::DoubleTyID: opCode = FADDD; break;
 | 
						|
      default: assert(0 && "Invalid type for ADD instruction"); break; 
 | 
						|
      }
 | 
						|
  
 | 
						|
  return opCode;
 | 
						|
}
 | 
						|
 | 
						|
#endif
 |