* configure.in: Match *-*-solaris2* not *-sun-solaris2*.
[deliverable/binutils-gdb.git] / bfd / libhppa.h
CommitLineData
76c7e44d
SG
1/* HP PA-RISC SOM object file format: definitions internal to BFD.
2 Copyright (C) 1990-1991 Free Software Foundation, Inc.
3
4 Contributed by the Center for Software Science at the
5 University of Utah (pa-gdb-bugs@cs.utah.edu).
6
d9ad93bc 7 This file is part of BFD, the Binary File Descriptor library.
76c7e44d 8
d9ad93bc
KR
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
76c7e44d 13
d9ad93bc
KR
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
76c7e44d 18
d9ad93bc
KR
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
76c7e44d 22
d9ad93bc
KR
23#ifndef _HPPA_H
24#define _HPPA_H
d325e28c 25
d9ad93bc 26#define BYTES_IN_WORD 4
205d660d 27
d9ad93bc
KR
28#ifndef INLINE
29#ifdef __GNUC__
30#define INLINE inline
31#else
32#define INLINE
33#endif /* GNU C? */
34#endif /* INLINE */
d325e28c 35
d9ad93bc 36/* HP PA-RISC relocation types */
d325e28c 37
d9ad93bc
KR
38enum hppa_reloc_field_selector_type
39 {
40 R_HPPA_FSEL = 0x0,
41 R_HPPA_LSSEL = 0x1,
42 R_HPPA_RSSEL = 0x2,
43 R_HPPA_LSEL = 0x3,
44 R_HPPA_RSEL = 0x4,
45 R_HPPA_LDSEL = 0x5,
46 R_HPPA_RDSEL = 0x6,
47 R_HPPA_LRSEL = 0x7,
48 R_HPPA_RRSEL = 0x8,
49 R_HPPA_PSEL = 0x9,
50 R_HPPA_LPSEL = 0xa,
51 R_HPPA_RPSEL = 0xb,
52 R_HPPA_TSEL = 0xc,
53 R_HPPA_LTSEL = 0xd,
54 R_HPPA_RTSEL = 0xe
55 };
89c789f6 56
d9ad93bc
KR
57/* for compatibility */
58enum hppa_reloc_field_selector_type_alt
59 {
60 e_fsel = R_HPPA_FSEL,
61 e_lssel = R_HPPA_LSSEL,
62 e_rssel = R_HPPA_RSSEL,
63 e_lsel = R_HPPA_LSEL,
64 e_rsel = R_HPPA_RSEL,
65 e_ldsel = R_HPPA_LDSEL,
66 e_rdsel = R_HPPA_RDSEL,
67 e_lrsel = R_HPPA_LRSEL,
68 e_rrsel = R_HPPA_RRSEL,
69 e_psel = R_HPPA_PSEL,
70 e_lpsel = R_HPPA_LPSEL,
71 e_rpsel = R_HPPA_RPSEL,
72 e_tsel = R_HPPA_TSEL,
73 e_ltsel = R_HPPA_LTSEL,
74 e_rtsel = R_HPPA_RTSEL
75 };
89c789f6 76
d9ad93bc
KR
77enum hppa_reloc_expr_type
78 {
79 R_HPPA_E_ONE = 0,
80 R_HPPA_E_TWO = 1,
81 R_HPPA_E_PCREL = 2,
82 R_HPPA_E_CON = 3,
83 R_HPPA_E_PLABEL = 7,
84 R_HPPA_E_ABS = 18
85 };
d325e28c 86
d9ad93bc
KR
87/* for compatibility */
88enum hppa_reloc_expr_type_alt
89 {
90 e_one = R_HPPA_E_ONE,
91 e_two = R_HPPA_E_TWO,
92 e_pcrel = R_HPPA_E_PCREL,
93 e_con = R_HPPA_E_CON,
94 e_plabel = R_HPPA_E_PLABEL,
95 e_abs = R_HPPA_E_ABS
96 };
97
98
99/* Some functions to manipulate PA instructions. */
100static INLINE unsigned int
101assemble_3 (x)
102 unsigned int x;
103{
104 return (((x & 1) << 2) | ((x & 6) >> 1)) & 7;
105}
d325e28c 106
d9ad93bc
KR
107static INLINE void
108dis_assemble_3 (x, r)
109 unsigned int x;
110 unsigned int *r;
111{
112 *r = (((x & 4) >> 2) | ((x & 3) << 1)) & 7;
113}
89c789f6 114
d9ad93bc
KR
115static INLINE unsigned int
116assemble_12 (x, y)
117 unsigned int x, y;
118{
119 return (((y & 1) << 11) | ((x & 1) << 10) | ((x & 0x7fe) >> 1)) & 0xfff;
120}
89c789f6 121
d9ad93bc
KR
122static INLINE void
123dis_assemble_12 (as12, x, y)
124 unsigned int as12;
125 unsigned int *x, *y;
126{
127 *y = (as12 & 0x800) >> 11;
128 *x = ((as12 & 0x3ff) << 1) | ((as12 & 0x400) >> 10);
129}
76c7e44d 130
d9ad93bc
KR
131static INLINE unsigned long
132assemble_17 (x, y, z)
133 unsigned int x, y, z;
134{
135 unsigned long temp;
136
137 temp = ((z & 1) << 16) |
138 ((x & 0x1f) << 11) |
139 ((y & 1) << 10) |
140 ((y & 0x7fe) >> 1);
141 return temp & 0x1ffff;
142}
143
144static INLINE void
145dis_assemble_17 (as17, x, y, z)
146 unsigned int as17;
147 unsigned int *x, *y, *z;
148{
76c7e44d 149
d9ad93bc
KR
150 *z = (as17 & 0x10000) >> 16;
151 *x = (as17 & 0x0f800) >> 11;
152 *y = (((as17 & 0x00400) >> 10) | ((as17 & 0x3ff) << 1)) & 0x7ff;
153}
76c7e44d 154
d9ad93bc
KR
155static INLINE unsigned long
156assemble_21 (x)
157 unsigned int x;
76c7e44d 158{
d9ad93bc
KR
159 unsigned long temp;
160
161 temp = ((x & 1) << 20) |
162 ((x & 0xffe) << 8) |
163 ((x & 0xc000) >> 7) |
164 ((x & 0x1f0000) >> 14) |
165 ((x & 0x003000) >> 12);
166 return temp & 0x1fffff;
167}
168
169static INLINE void
170dis_assemble_21 (as21, x)
171 unsigned int as21, *x;
76c7e44d 172{
d9ad93bc 173 unsigned long temp;
76c7e44d 174
76c7e44d 175
d9ad93bc
KR
176 temp = (as21 & 0x100000) >> 20;
177 temp |= (as21 & 0x0ffe00) >> 8;
178 temp |= (as21 & 0x000180) << 7;
179 temp |= (as21 & 0x00007c) << 14;
180 temp |= (as21 & 0x000003) << 12;
181 *x = temp;
182}
76c7e44d 183
d9ad93bc
KR
184static INLINE unsigned long
185sign_ext (x, len)
186 unsigned int x, len;
187{
188 return (x << (32 - len)) >> (32 - len);
189}
76c7e44d 190
d9ad93bc
KR
191static INLINE unsigned int
192ones (n)
193 int n;
194{
195 unsigned int len_ones;
196 int i;
197
198 i = 0;
199 len_ones = 0;
200 while (i < n)
201 {
202 len_ones = (len_ones << 1) | 1;
203 i++;
204 }
205
206 return len_ones;
207}
208
209static INLINE void
210sign_unext (x, len, result)
211 unsigned int x, len;
212 unsigned int *result;
213{
214 unsigned int len_ones;
76c7e44d 215
d9ad93bc 216 len_ones = ones (len);
76c7e44d 217
d9ad93bc
KR
218 *result = x & len_ones;
219}
76c7e44d 220
d9ad93bc
KR
221static INLINE unsigned long
222low_sign_ext (x, len)
223 unsigned int x, len;
224{
225 unsigned int temp1, temp2;
226 unsigned int len_ones;
76c7e44d 227
d9ad93bc 228 len_ones = ones (len);
76c7e44d 229
d9ad93bc
KR
230 temp1 = (x & 1) << (len - 1);
231 temp2 = ((x & 0xfffffffe) & len_ones) >> 1;
232 return sign_ext ((temp1 | temp2), len);
233}
205d660d 234
d9ad93bc
KR
235static INLINE void
236low_sign_unext (x, len, result)
237 unsigned int x, len;
238 unsigned int *result;
76c7e44d 239{
d9ad93bc
KR
240 unsigned int temp;
241 unsigned int sign;
242 unsigned int rest;
243 unsigned int one_bit_at_len;
244 unsigned int len_ones;
8568acaa 245
d9ad93bc
KR
246 len_ones = ones (len);
247 one_bit_at_len = 1 << (len - 1);
8568acaa 248
d9ad93bc
KR
249 sign_unext (x, len, &temp);
250 sign = temp & one_bit_at_len;
251 sign >>= (len - 1);
b2057735 252
d9ad93bc
KR
253 rest = temp & (len_ones ^ one_bit_at_len);
254 rest <<= 1;
8568acaa 255
d9ad93bc
KR
256 *result = rest | sign;
257}
8568acaa 258
d9ad93bc
KR
259/* Handle field selectors for PA instructions. */
260
261static INLINE unsigned long
262hppa_field_adjust (value, constant_value, r_field)
263 unsigned long value;
264 unsigned long constant_value;
265 unsigned short r_field;
8568acaa 266{
d9ad93bc
KR
267 unsigned long init_value = value;
268 value += constant_value;
269 switch (r_field)
270 {
271 case e_fsel: /* F : no change */
272 break;
273
274 case e_lssel: /* LS : if (bit 21) then add 0x800
275 arithmetic shift right 11 bits */
276 if (value & 0x00000400)
277 value += 0x800;
278 value = (value & 0xfffff800) >> 11;
279 break;
280
281 case e_rssel: /* RS : Sign extend from bit 21 */
282 if (value & 0x00000400)
283 value |= 0xfffff800;
284 else
285 value &= 0x7ff;
286 break;
287
288 case e_lsel: /* L : Arithmetic shift right 11 bits */
289 value = (value & 0xfffff800) >> 11;
290 break;
291
292 case e_rsel: /* R : Set bits 0-20 to zero */
293 value = value & 0x7ff;
294 break;
295
296 case e_ldsel: /* LD : Add 0x800, arithmetic shift
297 right 11 bits */
298 value += 0x800;
299 value = (value & 0xfffff800) >> 11;
300 break;
301
302 case e_rdsel: /* RD : Set bits 0-20 to one */
303 value |= 0xfffff800;
304 break;
305
306 case e_lrsel: /* LR : L with "rounded" constant */
307 value = value + ((constant_value + 0x1000) & 0xffffe000);
308 value = (value & 0xfffff800) >> 11;
309 break;
310
311 case e_rrsel: /* RR : R with "rounded" constant */
312 value = value + ((constant_value + 0x1000) & 0xffffe000);
313 value = (value & 0x7ff) + constant_value - ((constant_value + 0x1000) & 0xffffe000);
314 break;
315
316 default:
317 abort ();
318 }
319 return value;
320
321}
322#endif /* _HPPA_H */
This page took 0.065195 seconds and 4 git commands to generate.