regs.h revision cb4fb05032e3b716fd88e0c46d539650d0ce35f9
1b682349b33c86364669bd4e1016075695507d567hp.com!davidm#include "unwind_i.h"
2b682349b33c86364669bd4e1016075695507d567hp.com!davidm
3b682349b33c86364669bd4e1016075695507d567hp.com!davidm/* Apply rotation to a general register.  The number REG must be in
4b682349b33c86364669bd4e1016075695507d567hp.com!davidm   the range of 0-127.  */
5b682349b33c86364669bd4e1016075695507d567hp.com!davidm
6b682349b33c86364669bd4e1016075695507d567hp.com!davidmstatic inline int
7c333cb0d25eca3b6c4b2ed170396df6be7a2d894mostang.com!davidmrotate_gr (struct cursor *c, int reg)
8b682349b33c86364669bd4e1016075695507d567hp.com!davidm{
94d37950b2c182e7bc1de517aa27c9d87a28d5183mostang.com!davidm  unsigned int rrb_gr, sor, sof;
108bff7ccc92dd4c5d30e146b3e40b0e31cd16acf4mostang.com!davidm  int preg;
11b682349b33c86364669bd4e1016075695507d567hp.com!davidm
128bff7ccc92dd4c5d30e146b3e40b0e31cd16acf4mostang.com!davidm  sof = (c->cfm & 0x7f);
138bff7ccc92dd4c5d30e146b3e40b0e31cd16acf4mostang.com!davidm  sor = 8 * ((c->cfm >> 14) & 0xf);
148bff7ccc92dd4c5d30e146b3e40b0e31cd16acf4mostang.com!davidm  rrb_gr = (c->cfm >> 18) & 0x7f;
15b682349b33c86364669bd4e1016075695507d567hp.com!davidm
164d37950b2c182e7bc1de517aa27c9d87a28d5183mostang.com!davidm  if ((unsigned) (reg - 32) > sof)
17b2a5a9023b8fa5ffeb8fb87b533d56daec817895mostang.com!davidm    return reg;	/* not a valid stacked register: just return original value */
184d37950b2c182e7bc1de517aa27c9d87a28d5183mostang.com!davidm  else if ((unsigned) (reg - 32) > sor)
19b2a5a9023b8fa5ffeb8fb87b533d56daec817895mostang.com!davidm    preg = reg;	/* register not part of the rotating partition */
20b682349b33c86364669bd4e1016075695507d567hp.com!davidm  else
21b682349b33c86364669bd4e1016075695507d567hp.com!davidm    {
22b682349b33c86364669bd4e1016075695507d567hp.com!davidm      preg = reg + rrb_gr;	/* apply rotation */
23b2a5a9023b8fa5ffeb8fb87b533d56daec817895mostang.com!davidm      if (preg > 32 + (int) sor)
24b682349b33c86364669bd4e1016075695507d567hp.com!davidm	preg -= sor;		/* wrap around */
25b682349b33c86364669bd4e1016075695507d567hp.com!davidm    }
26cb4fb05032e3b716fd88e0c46d539650d0ce35f9mostang.com!davidm  if (sor)
27cb4fb05032e3b716fd88e0c46d539650d0ce35f9mostang.com!davidm    debug (100, "%s: sor=%u rrb.gr=%u, r%d -> r%d\n",
28cb4fb05032e3b716fd88e0c46d539650d0ce35f9mostang.com!davidm	   __FUNCTION__, sor, rrb_gr, reg, preg);
29b682349b33c86364669bd4e1016075695507d567hp.com!davidm  return preg;
30b682349b33c86364669bd4e1016075695507d567hp.com!davidm}
31b682349b33c86364669bd4e1016075695507d567hp.com!davidm
32b682349b33c86364669bd4e1016075695507d567hp.com!davidm/* Apply rotation to a floating-point register.  The number REG must
33b682349b33c86364669bd4e1016075695507d567hp.com!davidm   be in the range of 0-127.  */
34b682349b33c86364669bd4e1016075695507d567hp.com!davidm
35b682349b33c86364669bd4e1016075695507d567hp.com!davidmstatic inline int
36c333cb0d25eca3b6c4b2ed170396df6be7a2d894mostang.com!davidmrotate_fr (struct cursor *c, int reg)
37b682349b33c86364669bd4e1016075695507d567hp.com!davidm{
38b682349b33c86364669bd4e1016075695507d567hp.com!davidm  unsigned int rrb_fr;
398bff7ccc92dd4c5d30e146b3e40b0e31cd16acf4mostang.com!davidm  int preg;
40b682349b33c86364669bd4e1016075695507d567hp.com!davidm
418bff7ccc92dd4c5d30e146b3e40b0e31cd16acf4mostang.com!davidm  rrb_fr = (c->cfm >> 25) & 0x7f;
42b682349b33c86364669bd4e1016075695507d567hp.com!davidm  if (reg < 32)
43b682349b33c86364669bd4e1016075695507d567hp.com!davidm    preg = reg;		/* register not part of the rotating partition */
44b682349b33c86364669bd4e1016075695507d567hp.com!davidm  else
45b682349b33c86364669bd4e1016075695507d567hp.com!davidm    {
46b682349b33c86364669bd4e1016075695507d567hp.com!davidm      preg = reg + rrb_fr;	/* apply rotation */
47b682349b33c86364669bd4e1016075695507d567hp.com!davidm      if (preg > 127)
48b682349b33c86364669bd4e1016075695507d567hp.com!davidm	preg -= 96;		/* wrap around */
49b682349b33c86364669bd4e1016075695507d567hp.com!davidm    }
50cb4fb05032e3b716fd88e0c46d539650d0ce35f9mostang.com!davidm  if (rrb_fr)
51cb4fb05032e3b716fd88e0c46d539650d0ce35f9mostang.com!davidm    debug (100, "%s: rrb.fr=%u, f%d -> f%d\n",
52cb4fb05032e3b716fd88e0c46d539650d0ce35f9mostang.com!davidm	   __FUNCTION__, rrb_fr, reg, preg);
53b682349b33c86364669bd4e1016075695507d567hp.com!davidm  return preg;
54b682349b33c86364669bd4e1016075695507d567hp.com!davidm}
55b682349b33c86364669bd4e1016075695507d567hp.com!davidm
56b682349b33c86364669bd4e1016075695507d567hp.com!davidm/* Apply logical-to-physical rotation.  */
57b682349b33c86364669bd4e1016075695507d567hp.com!davidm
58b682349b33c86364669bd4e1016075695507d567hp.com!davidmstatic inline unw_word_t
59c333cb0d25eca3b6c4b2ed170396df6be7a2d894mostang.com!davidmpr_ltop (struct cursor *c, unw_word_t pr)
60b682349b33c86364669bd4e1016075695507d567hp.com!davidm{
618bff7ccc92dd4c5d30e146b3e40b0e31cd16acf4mostang.com!davidm  unw_word_t rrb_pr, mask, rot;
62b682349b33c86364669bd4e1016075695507d567hp.com!davidm
638bff7ccc92dd4c5d30e146b3e40b0e31cd16acf4mostang.com!davidm  rrb_pr = (c->cfm >> 32) & 0x3f;
64b682349b33c86364669bd4e1016075695507d567hp.com!davidm  rot = pr >> 16;
65b682349b33c86364669bd4e1016075695507d567hp.com!davidm  mask = ((unw_word_t) 1 << rrb_pr) - 1;
66b682349b33c86364669bd4e1016075695507d567hp.com!davidm  rot = ((pr & mask) << (48 - rrb_pr)) | ((pr >> rrb_pr) & mask);
67b682349b33c86364669bd4e1016075695507d567hp.com!davidm  return (pr & 0xffff) | (rot << 16);
68b682349b33c86364669bd4e1016075695507d567hp.com!davidm}
69b682349b33c86364669bd4e1016075695507d567hp.com!davidm
70b682349b33c86364669bd4e1016075695507d567hp.com!davidm/* Apply physical-to-logical rotation.  */
71b682349b33c86364669bd4e1016075695507d567hp.com!davidm
72b682349b33c86364669bd4e1016075695507d567hp.com!davidmstatic inline unw_word_t
73c333cb0d25eca3b6c4b2ed170396df6be7a2d894mostang.com!davidmpr_ptol (struct cursor *c, unw_word_t pr)
74b682349b33c86364669bd4e1016075695507d567hp.com!davidm{
758bff7ccc92dd4c5d30e146b3e40b0e31cd16acf4mostang.com!davidm  unw_word_t rrb_pr, mask, rot;
76b682349b33c86364669bd4e1016075695507d567hp.com!davidm
778bff7ccc92dd4c5d30e146b3e40b0e31cd16acf4mostang.com!davidm  rrb_pr = 48 - ((c->cfm >> 32) & 0x3f);
78b682349b33c86364669bd4e1016075695507d567hp.com!davidm  rot = pr >> 16;
79b682349b33c86364669bd4e1016075695507d567hp.com!davidm  mask = ((unw_word_t) 1 << rrb_pr) - 1;
80b682349b33c86364669bd4e1016075695507d567hp.com!davidm  rot = ((pr & mask) << (48 - rrb_pr)) | ((pr >> rrb_pr) & mask);
81b682349b33c86364669bd4e1016075695507d567hp.com!davidm  return (pr & 0xffff) | (rot << 16);
82b682349b33c86364669bd4e1016075695507d567hp.com!davidm}
83