#ifndef PTXBASEINFO_H
#define PTXBASEINFO_H
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
#include "PTXMCTargetDesc.h"
namespace llvm {
namespace PTXStateSpace {
enum {
Global = 0, Constant = 1,
Local = 2,
Parameter = 3,
Shared = 4
};
}
namespace PTXPredicate {
enum {
Normal = 0,
Negate = 1,
None = 2
};
}
namespace PTXRoundingMode {
enum {
RndMask = 15,
RndDefault = 0, RndNone = 1, RndNearestEven = 2, RndTowardsZero = 3, RndNegInf = 4, RndPosInf = 5, RndApprox = 6, RndNearestEvenInt = 7, RndTowardsZeroInt = 8, RndNegInfInt = 9, RndPosInfInt = 10 };
}
namespace PTXRegisterType {
enum {
Pred = 0,
B16,
B32,
B64,
F32,
F64
};
}
namespace PTXRegisterSpace {
enum {
Reg = 0,
Local,
Param,
Argument,
Return
};
}
inline static void decodeRegisterName(raw_ostream &OS,
unsigned EncodedReg) {
OS << "%";
unsigned RegSpace = EncodedReg & 0x7;
unsigned RegType = (EncodedReg >> 3) & 0x7;
unsigned RegOffset = EncodedReg >> 6;
switch (RegSpace) {
default:
llvm_unreachable("Unknown register space!");
case PTXRegisterSpace::Reg:
switch (RegType) {
default:
llvm_unreachable("Unknown register type!");
case PTXRegisterType::Pred:
OS << "p";
break;
case PTXRegisterType::B16:
OS << "rh";
break;
case PTXRegisterType::B32:
OS << "r";
break;
case PTXRegisterType::B64:
OS << "rd";
break;
case PTXRegisterType::F32:
OS << "f";
break;
case PTXRegisterType::F64:
OS << "fd";
break;
}
break;
case PTXRegisterSpace::Return:
OS << "ret";
break;
case PTXRegisterSpace::Argument:
OS << "arg";
break;
}
OS << RegOffset;
}
}
#endif