Home | History | Annotate | Line # | Download | only in ppc
      1 /*  This file is part of the program psim.
      2 
      3     Copyright (C) 1994-1995, Andrew Cagney <cagney (at) highland.com.au>
      4 
      5     This program is free software; you can redistribute it and/or modify
      6     it under the terms of the GNU General Public License as published by
      7     the Free Software Foundation; either version 3 of the License, or
      8     (at your option) any later version.
      9 
     10     This program is distributed in the hope that it will be useful,
     11     but WITHOUT ANY WARRANTY; without even the implied warranty of
     12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13     GNU General Public License for more details.
     14 
     15     You should have received a copy of the GNU General Public License
     16     along with this program; if not, see <http://www.gnu.org/licenses/>.
     17 
     18     */
     19 
     20 
     21 #ifndef _REGISTERS_C_
     22 #define _REGISTERS_C_
     23 
     24 #include <ctype.h>
     25 
     26 #include "basics.h"
     27 #include "registers.h"
     28 
     29 #include <stdlib.h>
     30 #include <string.h>
     31 
     32 INLINE_REGISTERS\
     33 (void)
     34 registers_dump(registers *registers)
     35 {
     36   int i;
     37   int j;
     38   for (i = 0; i < 8; i++) {
     39     printf_filtered("GPR %2d:", i*4);
     40     for (j = 0; j < 4; j++) {
     41       printf_filtered(" 0x%08lx", (long)registers->gpr[i*4 + j]);
     42     }
     43     printf_filtered("\n");
     44   }
     45 }
     46 
     47 STATIC_INLINE_REGISTERS\
     48 (sprs)
     49 find_spr(const char name[])
     50 {
     51   sprs spr;
     52   for (spr = 0; spr < nr_of_sprs; spr++)
     53     if (spr_is_valid(spr)
     54 	&& !strcmp(name, spr_name(spr))
     55 	&& spr_index(spr) == spr)
     56       return spr;
     57   return nr_of_sprs;
     58 }
     59 
     60 STATIC_INLINE_REGISTERS\
     61 (int)
     62 are_digits(const char *digits)
     63 {
     64   while (isdigit(*digits))
     65     digits++;
     66   return *digits == '\0';
     67 }
     68 
     69 
     70 INLINE_REGISTERS\
     71 (register_descriptions)
     72 register_description(const char reg[])
     73 {
     74   register_descriptions description;
     75 
     76   /* try for a general-purpose integer or floating point register */
     77   if (reg[0] == 'r' && are_digits(reg + 1)) {
     78     description.type = reg_gpr;
     79     description.index = atoi(reg+1);
     80     description.size = sizeof(gpreg);
     81   }
     82   else if (reg[0] == 'f' && are_digits(reg + 1)) {
     83     description.type = reg_fpr;
     84     description.index = atoi(reg+1);
     85     description.size = sizeof(fpreg);
     86   }
     87   else if (!strcmp(reg, "pc") || !strcmp(reg, "nia")) {
     88     description.type = reg_pc;
     89     description.index = 0;
     90     description.size = sizeof(unsigned_word);
     91   }
     92   else if (!strcmp(reg, "sp")) {
     93     description.type = reg_gpr;
     94     description.index = 1;
     95     description.size = sizeof(gpreg);
     96   }
     97   else if (!strcmp(reg, "toc")) {
     98     description.type = reg_gpr;
     99     description.index = 2;
    100     description.size = sizeof(gpreg);
    101   }
    102   else if (!strcmp(reg, "cr") || !strcmp(reg, "cnd")) {
    103     description.type = reg_cr;
    104     description.index = 0;
    105     description.size = sizeof(creg); /* FIXME */
    106   }
    107   else if (!strcmp(reg, "msr") || !strcmp(reg, "ps")) {
    108     description.type = reg_msr;
    109     description.index = 0;
    110     description.size = sizeof(msreg);
    111   }
    112   else if (!strcmp(reg, "fpscr")) {
    113     description.type = reg_fpscr;
    114     description.index = 0;
    115     description.size = sizeof(fpscreg);
    116   }
    117   else if (!strncmp(reg, "sr", 2) && are_digits(reg + 2)) {
    118     description.type = reg_sr;
    119     description.index = atoi(reg+2);
    120     description.size = sizeof(sreg);
    121   }
    122   else if (!strcmp(reg, "cnt")) {
    123     description.type = reg_spr;
    124     description.index = spr_ctr;
    125     description.size = sizeof(spreg);
    126   }
    127   else if (!strcmp(reg, "insns")) {
    128     description.type = reg_insns;
    129     description.index = spr_ctr;
    130     description.size = sizeof(unsigned_word);
    131   }
    132   else if (!strcmp(reg, "stalls")) {
    133     description.type = reg_stalls;
    134     description.index = spr_ctr;
    135     description.size = sizeof(unsigned_word);
    136   }
    137   else if (!strcmp(reg, "cycles")) {
    138     description.type = reg_cycles;
    139     description.index = spr_ctr;
    140     description.size = sizeof(unsigned_word);
    141   }
    142 #ifdef WITH_ALTIVEC
    143   else if (reg[0] == 'v' && reg[1] == 'r' && are_digits(reg + 2)) {
    144     description.type = reg_vr;
    145     description.index = atoi(reg+2);
    146     description.size = sizeof(vreg);
    147   }
    148    else if (!strcmp(reg, "vscr")) {
    149     description.type = reg_vscr;
    150     description.index = 0;
    151     description.size = sizeof(vscreg);
    152   }
    153 #endif
    154 #ifdef WITH_E500
    155   else if (reg[0] == 'e' && reg[1] == 'v' && are_digits(reg + 2)) {
    156     description.type = reg_evr;
    157     description.index = atoi(reg+2);
    158     description.size = sizeof(uint64_t);
    159   }
    160   else if (reg[0] == 'r' && reg[1] == 'h' && are_digits(reg + 2)) {
    161     description.type = reg_gprh;
    162     description.index = atoi(reg+2);
    163     description.size = sizeof(gpreg);
    164   }
    165   else if (!strcmp(reg, "acc")) {
    166     description.type = reg_acc;
    167     description.index = 0;
    168     description.size = sizeof(uint64_t);
    169   }
    170 #endif
    171   else {
    172     sprs spr = find_spr(reg);
    173     if (spr != nr_of_sprs) {
    174       description.type = reg_spr;
    175       description.index = spr;
    176       description.size = sizeof(spreg);
    177     }
    178     else {
    179       description.type = reg_invalid;
    180       description.index = 0;
    181       description.size = 0;
    182     }
    183   }
    184   return description;
    185 }
    186 
    187 #endif /* _REGISTERS_C_ */
    188