Implementing rel operators <,<=,>,>= for the hp - naim
[dyninst.git] / dyninstAPI / src / arch-hppa.h
1 #if !defined(hppa1_1_hp_hpux)
2 #error "invalid architecture-os inclusion"
3 #endif
4
5
6 #if !defined(_arch_hppa_h_)
7 #define _arch_hppa_h_
8
9
10 //
11 // instruction types
12 //
13
14 struct load_store {
15     unsigned op   : 6;
16     unsigned b    : 5;
17     unsigned tr   : 5;
18     unsigned s    : 2;
19     int      im14 : 14;
20 };
21
22 struct indexed_displacement_load_store {
23     unsigned op      : 6;
24     unsigned b       : 5;
25     unsigned x_im5_r : 5;
26     unsigned s       : 2;
27     unsigned u_a     : 1;
28     unsigned bit1    : 1;
29     unsigned bit2    : 2;
30     unsigned ext4    : 4;
31     unsigned m       : 1;
32     unsigned t_im5   : 5;
33 };
34
35 union memory_reference {
36     load_store                      ls;
37     indexed_displacement_load_store idls;
38 };
39
40 struct w_w1_w2_bits {
41     unsigned ignore : 15;
42     unsigned w      : 1;
43     unsigned w1     : 5;
44     unsigned w2     : 11;
45 };
46
47 union assemble_w_w1_w2 {
48     int          raw;
49     w_w1_w2_bits w_w1_w2;
50 };
51
52 struct branch_instruction {
53     unsigned op          : 6;
54     unsigned r2_p_b_t    : 5;
55     unsigned r1_im5_w1_x : 5;
56     unsigned c_s_ext3    : 3;
57     unsigned w1_w2       : 11;
58     unsigned n           : 1;
59     unsigned w           : 1;
60 };
61
62 struct long_immediate {
63     unsigned op   : 6;
64     unsigned tr   : 5;
65     int      im21 : 21;
66 };
67
68 struct arithmetic_logical {
69     unsigned op   : 6;
70     unsigned r2   : 5;
71     unsigned r1   : 5;
72     unsigned c    : 3;
73     unsigned f    : 1;
74     unsigned ext7 : 7;
75     unsigned t    : 5;
76 };
77
78 struct arithmetic_immediate {
79     unsigned op   : 6;
80     unsigned r    : 5;
81     unsigned t    : 5;
82     unsigned c    : 3;
83     unsigned f    : 1;
84     unsigned e    : 1;
85     unsigned im11 : 11;
86 };
87
88 struct computation_generic {
89     unsigned op   : 6;
90     unsigned r2   : 5;
91     unsigned r1   : 5;
92     unsigned c    : 3;
93     unsigned rest : 13;
94 };
95
96 union computation_instruction {
97     arithmetic_logical   al;
98     arithmetic_immediate ai;
99     computation_generic  cg;
100 };
101
102 struct generic_instruction {
103     unsigned op   : 6;
104     unsigned rest : 26;
105 };
106
107 union instruction {
108     unsigned                raw;
109     memory_reference        mr;
110     branch_instruction      bi;
111     long_immediate          li;
112     computation_instruction ci;
113     generic_instruction     gi;
114 };
115
116
117 /*
118  * Define the operation codes
119  *
120  */
121
122 #define LDILop          0x08
123 #define LDOop           0x0d
124 #define LDWop           0x12
125 #define STWop           0x1a
126
127 #define BLop            0x3a
128 #define BLext           0x0
129
130 #define ADDop           0x02
131 #define ADDext7         0x30
132
133 #define SUBop           0x02
134 #define SUBext7         0x20
135
136 #define ORop            0x02
137 #define ORext7          0x12
138
139 #define ANDop           0x02
140 #define ANDext7         0x10
141
142 #define COMBTop         0x20
143 #define COMIBTop        0x21
144 #define COMBFop         0x22
145 #define COMIBFop        0x23
146 #define ADDBTop         0x28
147 #define ADDIBTop        0x29
148 #define ADDBFop         0x2a
149 #define ADDIBFop        0x2b
150 #define BVBop           0x30
151 #define BBop            0x31
152 #define MOVBop          0x32
153 #define MOVIBop         0x33
154
155 #define COMCLRop        0x02
156 #define COMCLRext7      0x44
157
158 #define COMCLR_EQ_C     1
159 #define COMCLR_EQ_F     0
160 #define COMCLR_NE_C     1
161 #define COMCLR_NE_F     1
162 #define COMCLR_LT_C     2
163 #define COMCLR_LT_F     0
164 #define COMCLR_LT_T     1
165 #define COMCLR_LE_C     3
166 #define COMCLR_LE_F     0
167 #define COMCLR_LE_T     1
168
169 /* mask bits for various parts of the instruction format */
170
171 #define GATEmask        0xfc00e000
172 #define GATEmatch       0xe8002000
173
174 #define BEmask          0xfc000000
175 #define BEmatch         0xe0000000
176
177 #define BLEmask         0xfc000000
178 #define BLEmatch        0xe4000000
179
180 #define CALLmask        0xfc00e000
181 #define CALLmatch       0xe8000000
182
183 #define CALLImask       0xfc00fffd
184 #define CALLImatch      0xe8004000
185
186 #define RETmask         0xfffffffd
187 #define RETmatch        0xe840c000 /* bv,n 0(%r2) */
188
189
190 //
191 // support functions
192 //
193
194 static inline bool
195 isInsnType(const instruction& insn, unsigned mask, unsigned match) {
196     return ((insn.raw & mask) == match);
197 }
198
199 static inline bool
200 isCallInsn(const instruction& insn) {
201     return ((isInsnType(insn, CALLmask, CALLmatch) ||
202         isInsnType(insn, CALLImask, CALLImatch)) &&
203         (insn.bi.r2_p_b_t != 0));
204         // target gr0 is a jump, and thus jump tables should
205         // be correctly handled
206 }
207
208 static inline bool
209 IS_CONDITIONAL_BRANCH(const instruction& insn) {
210     switch (insn.gi.op) {
211     case COMBTop:
212     case COMIBTop:
213     case COMBFop:
214     case COMIBFop:
215     case ADDBTop:
216     case ADDIBTop:
217     case ADDBFop:
218     case ADDIBFop:
219     case BVBop:
220     case BBop:
221     case MOVBop:
222     case MOVIBop:
223         return true;
224     default:
225         break;
226     }
227     return false;
228 }
229
230 static inline bool
231 IS_DELAYED_INST(const instruction& insn) {
232     return (((insn.bi.op == 0x3a) /* all unconditional branches */
233         || (isInsnType(insn, BEmask, BEmatch)) /* external */
234         || (isInsnType(insn, BLEmask, BLEmatch)) /* external link */
235         || (IS_CONDITIONAL_BRANCH(insn))) /* conditionals */
236         && (!(insn.bi.n)));
237 }
238
239 static inline bool
240 IS_VALID_INSN(const instruction& insn) {
241     // almost everything on PA-RISC is valid, after all
242     // this is a "RISC" processor, haha
243     switch (insn.gi.op) {
244     case 0x07:
245     case 0x14:
246     case 0x15:
247     case 0x16:
248     case 0x17:
249     case 0x1c:
250     case 0x1d:
251     case 0x1e:
252     case 0x1f:
253     case 0x27:
254     case 0x2e:
255     case 0x2f:
256     case 0x36:
257     case 0x37:
258     case 0x3b:
259     case 0x3c:
260     case 0x3d:
261     case 0x3e:
262     case 0x3f:
263         return false;
264     default:
265         break;
266     }
267     return true;
268 }
269
270 #endif /* !defined(_arch_hppa_h_) */