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