]> CyberLeo.Net >> Repos - FreeBSD/stable/9.git/blob - contrib/llvm/lib/Target/PTX/MCTargetDesc/PTXBaseInfo.h
MFC r234353:
[FreeBSD/stable/9.git] / contrib / llvm / lib / Target / PTX / MCTargetDesc / PTXBaseInfo.h
1 //===-- PTXBaseInfo.h - Top level definitions for PTX -------- --*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains small standalone helper functions and enum definitions for
11 // the PTX target useful for the compiler back-end and the MC libraries.
12 // As such, it deliberately does not include references to LLVM core
13 // code gen types, passes, etc..
14 //
15 //===----------------------------------------------------------------------===//
16
17 #ifndef PTXBASEINFO_H
18 #define PTXBASEINFO_H
19
20 #include "PTXMCTargetDesc.h"
21 #include "llvm/Support/ErrorHandling.h"
22 #include "llvm/Support/raw_ostream.h"
23
24 namespace llvm {
25   namespace PTXStateSpace {
26     enum {
27       Global    = 0, // default to global state space
28       Constant  = 1,
29       Local     = 2,
30       Parameter = 3,
31       Shared    = 4
32     };
33   } // namespace PTXStateSpace
34
35   namespace PTXPredicate {
36     enum {
37       Normal = 0,
38       Negate = 1,
39       None   = 2
40     };
41   } // namespace PTXPredicate
42
43   /// Namespace to hold all target-specific flags.
44   namespace PTXRoundingMode {
45     // Instruction Flags
46     enum {
47       // Rounding Mode Flags
48       RndMask             = 15,
49       RndDefault          =  0, // ---
50       RndNone             =  1, // <NONE>
51       RndNearestEven      =  2, // .rn
52       RndTowardsZero      =  3, // .rz
53       RndNegInf           =  4, // .rm
54       RndPosInf           =  5, // .rp
55       RndApprox           =  6, // .approx
56       RndNearestEvenInt   =  7, // .rni
57       RndTowardsZeroInt   =  8, // .rzi
58       RndNegInfInt        =  9, // .rmi
59       RndPosInfInt        = 10  // .rpi
60     };
61   } // namespace PTXII
62
63   namespace PTXRegisterType {
64     // Register type encoded in MCOperands
65     enum {
66       Pred  = 0,
67       B16,
68       B32,
69       B64,
70       F32,
71       F64
72     };
73   } // namespace PTXRegisterType
74
75   namespace PTXRegisterSpace {
76     // Register space encoded in MCOperands
77     enum {
78       Reg = 0,
79       Local,
80       Param,
81       Argument,
82       Return
83     };
84   }
85
86   inline static void decodeRegisterName(raw_ostream &OS,
87                                         unsigned EncodedReg) {
88     OS << "%";
89
90     unsigned RegSpace  = EncodedReg & 0x7;
91     unsigned RegType   = (EncodedReg >> 3) & 0x7;
92     unsigned RegOffset = EncodedReg >> 6;
93
94     switch (RegSpace) {
95     default:
96       llvm_unreachable("Unknown register space!");
97     case PTXRegisterSpace::Reg:
98       switch (RegType) {
99       default:
100         llvm_unreachable("Unknown register type!");
101       case PTXRegisterType::Pred:
102         OS << "p";
103         break;
104       case PTXRegisterType::B16:
105         OS << "rh";
106         break;
107       case PTXRegisterType::B32:
108         OS << "r";
109         break;
110       case PTXRegisterType::B64:
111         OS << "rd";
112         break;
113       case PTXRegisterType::F32:
114         OS << "f";
115         break;
116       case PTXRegisterType::F64:
117         OS << "fd";
118         break;
119       }
120       break;
121     case PTXRegisterSpace::Return:
122       OS << "ret";
123       break;
124     case PTXRegisterSpace::Argument:
125       OS << "arg";
126       break;
127     }
128
129     OS << RegOffset;
130   }
131 } // namespace llvm
132
133 #endif
134