xref: /netbsd-src/external/gpl3/gdb/dist/sim/m32r/m32r.c (revision 05fa08567a80471fd0eb3843a238392874f2577c)
14e98e3e1Schristos /* m32r simulator support code
2*05fa0856Schristos    Copyright (C) 1996-2024 Free Software Foundation, Inc.
34e98e3e1Schristos    Contributed by Cygnus Support.
44e98e3e1Schristos 
54e98e3e1Schristos    This file is part of GDB, the GNU debugger.
64e98e3e1Schristos 
74e98e3e1Schristos    This program is free software; you can redistribute it and/or modify
84e98e3e1Schristos    it under the terms of the GNU General Public License as published by
94e98e3e1Schristos    the Free Software Foundation; either version 3 of the License, or
104e98e3e1Schristos    (at your option) any later version.
114e98e3e1Schristos 
124e98e3e1Schristos    This program is distributed in the hope that it will be useful,
134e98e3e1Schristos    but WITHOUT ANY WARRANTY; without even the implied warranty of
144e98e3e1Schristos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
154e98e3e1Schristos    GNU General Public License for more details.
164e98e3e1Schristos 
174e98e3e1Schristos    You should have received a copy of the GNU General Public License
184e98e3e1Schristos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
194e98e3e1Schristos 
204b169a6bSchristos /* This must come before any other includes.  */
214b169a6bSchristos #include "defs.h"
224b169a6bSchristos 
234e98e3e1Schristos #define WANT_CPU m32rbf
244e98e3e1Schristos #define WANT_CPU_M32RBF
254e98e3e1Schristos 
264e98e3e1Schristos #include "sim-main.h"
274e98e3e1Schristos #include "cgen-mem.h"
284e98e3e1Schristos #include "cgen-ops.h"
294b169a6bSchristos #include <stdlib.h>
304b169a6bSchristos 
31*05fa0856Schristos #include "m32r-sim.h"
32*05fa0856Schristos 
334b169a6bSchristos /* Return the size of REGNO in bytes.  */
344b169a6bSchristos 
354b169a6bSchristos static int
364b169a6bSchristos m32rbf_register_size (int regno)
374b169a6bSchristos {
384b169a6bSchristos   return 4;
394b169a6bSchristos }
404e98e3e1Schristos 
414e98e3e1Schristos /* Decode gdb ctrl register number.  */
424e98e3e1Schristos 
434e98e3e1Schristos int
444e98e3e1Schristos m32r_decode_gdb_ctrl_regnum (int gdb_regnum)
454e98e3e1Schristos {
464e98e3e1Schristos   switch (gdb_regnum)
474e98e3e1Schristos     {
484e98e3e1Schristos       case PSW_REGNUM : return H_CR_PSW;
494e98e3e1Schristos       case CBR_REGNUM : return H_CR_CBR;
504e98e3e1Schristos       case SPI_REGNUM : return H_CR_SPI;
514e98e3e1Schristos       case SPU_REGNUM : return H_CR_SPU;
524e98e3e1Schristos       case BPC_REGNUM : return H_CR_BPC;
534e98e3e1Schristos       case BBPSW_REGNUM : return H_CR_BBPSW;
544e98e3e1Schristos       case BBPC_REGNUM : return H_CR_BBPC;
554e98e3e1Schristos       case EVB_REGNUM : return H_CR_CR5;
564e98e3e1Schristos     }
574e98e3e1Schristos   abort ();
584e98e3e1Schristos }
594e98e3e1Schristos 
604e98e3e1Schristos /* The contents of BUF are in target byte order.  */
614e98e3e1Schristos 
624e98e3e1Schristos int
634b169a6bSchristos m32rbf_fetch_register (SIM_CPU *current_cpu, int rn, void *buf, int len)
644e98e3e1Schristos {
654b169a6bSchristos   int size = m32rbf_register_size (rn);
664b169a6bSchristos   if (len != size)
674b169a6bSchristos     return -1;
684b169a6bSchristos 
694e98e3e1Schristos   if (rn < 16)
704e98e3e1Schristos     SETTWI (buf, m32rbf_h_gr_get (current_cpu, rn));
714e98e3e1Schristos   else
724e98e3e1Schristos     switch (rn)
734e98e3e1Schristos       {
744e98e3e1Schristos       case PSW_REGNUM :
754e98e3e1Schristos       case CBR_REGNUM :
764e98e3e1Schristos       case SPI_REGNUM :
774e98e3e1Schristos       case SPU_REGNUM :
784e98e3e1Schristos       case BPC_REGNUM :
794e98e3e1Schristos       case BBPSW_REGNUM :
804e98e3e1Schristos       case BBPC_REGNUM :
814e98e3e1Schristos 	SETTWI (buf, m32rbf_h_cr_get (current_cpu,
824e98e3e1Schristos 				      m32r_decode_gdb_ctrl_regnum (rn)));
834e98e3e1Schristos 	break;
844e98e3e1Schristos       case PC_REGNUM :
854e98e3e1Schristos 	SETTWI (buf, m32rbf_h_pc_get (current_cpu));
864e98e3e1Schristos 	break;
874e98e3e1Schristos       case ACCL_REGNUM :
884e98e3e1Schristos 	SETTWI (buf, GETLODI (m32rbf_h_accum_get (current_cpu)));
894e98e3e1Schristos 	break;
904e98e3e1Schristos       case ACCH_REGNUM :
914e98e3e1Schristos 	SETTWI (buf, GETHIDI (m32rbf_h_accum_get (current_cpu)));
924e98e3e1Schristos 	break;
934e98e3e1Schristos       default :
944e98e3e1Schristos 	return 0;
954e98e3e1Schristos       }
964e98e3e1Schristos 
974b169a6bSchristos   return size;
984e98e3e1Schristos }
994e98e3e1Schristos 
1004e98e3e1Schristos /* The contents of BUF are in target byte order.  */
1014e98e3e1Schristos 
1024e98e3e1Schristos int
1034b169a6bSchristos m32rbf_store_register (SIM_CPU *current_cpu, int rn, const void *buf, int len)
1044e98e3e1Schristos {
1054b169a6bSchristos   int size = m32rbf_register_size (rn);
1064b169a6bSchristos   if (len != size)
1074b169a6bSchristos     return -1;
1084b169a6bSchristos 
1094e98e3e1Schristos   if (rn < 16)
1104e98e3e1Schristos     m32rbf_h_gr_set (current_cpu, rn, GETTWI (buf));
1114e98e3e1Schristos   else
1124e98e3e1Schristos     switch (rn)
1134e98e3e1Schristos       {
1144e98e3e1Schristos       case PSW_REGNUM :
1154e98e3e1Schristos       case CBR_REGNUM :
1164e98e3e1Schristos       case SPI_REGNUM :
1174e98e3e1Schristos       case SPU_REGNUM :
1184e98e3e1Schristos       case BPC_REGNUM :
1194e98e3e1Schristos       case BBPSW_REGNUM :
1204e98e3e1Schristos       case BBPC_REGNUM :
1214e98e3e1Schristos 	m32rbf_h_cr_set (current_cpu,
1224e98e3e1Schristos 			 m32r_decode_gdb_ctrl_regnum (rn),
1234e98e3e1Schristos 			 GETTWI (buf));
1244e98e3e1Schristos 	break;
1254e98e3e1Schristos       case PC_REGNUM :
1264e98e3e1Schristos 	m32rbf_h_pc_set (current_cpu, GETTWI (buf));
1274e98e3e1Schristos 	break;
1284e98e3e1Schristos       case ACCL_REGNUM :
1294e98e3e1Schristos 	{
1304e98e3e1Schristos 	  DI val = m32rbf_h_accum_get (current_cpu);
1314e98e3e1Schristos 	  SETLODI (val, GETTWI (buf));
1324e98e3e1Schristos 	  m32rbf_h_accum_set (current_cpu, val);
1334e98e3e1Schristos 	  break;
1344e98e3e1Schristos 	}
1354e98e3e1Schristos       case ACCH_REGNUM :
1364e98e3e1Schristos 	{
1374e98e3e1Schristos 	  DI val = m32rbf_h_accum_get (current_cpu);
1384e98e3e1Schristos 	  SETHIDI (val, GETTWI (buf));
1394e98e3e1Schristos 	  m32rbf_h_accum_set (current_cpu, val);
1404e98e3e1Schristos 	  break;
1414e98e3e1Schristos 	}
1424e98e3e1Schristos       default :
1434e98e3e1Schristos 	return 0;
1444e98e3e1Schristos       }
1454e98e3e1Schristos 
1464b169a6bSchristos   return size;
1474e98e3e1Schristos }
1484e98e3e1Schristos 
1494e98e3e1Schristos USI
1504e98e3e1Schristos m32rbf_h_cr_get_handler (SIM_CPU *current_cpu, UINT cr)
1514e98e3e1Schristos {
1524e98e3e1Schristos   switch (cr)
1534e98e3e1Schristos     {
1544e98e3e1Schristos     case H_CR_PSW : /* psw */
1554e98e3e1Schristos       return (((CPU (h_bpsw) & 0xc1) << 8)
1564e98e3e1Schristos 	      | ((CPU (h_psw) & 0xc0) << 0)
1574e98e3e1Schristos 	      | GET_H_COND ());
1584e98e3e1Schristos     case H_CR_BBPSW : /* backup backup psw */
1594e98e3e1Schristos       return CPU (h_bbpsw) & 0xc1;
1604e98e3e1Schristos     case H_CR_CBR : /* condition bit */
1614e98e3e1Schristos       return GET_H_COND ();
1624e98e3e1Schristos     case H_CR_SPI : /* interrupt stack pointer */
1634e98e3e1Schristos       if (! GET_H_SM ())
1644e98e3e1Schristos 	return CPU (h_gr[H_GR_SP]);
1654e98e3e1Schristos       else
1664e98e3e1Schristos 	return CPU (h_cr[H_CR_SPI]);
1674e98e3e1Schristos     case H_CR_SPU : /* user stack pointer */
1684e98e3e1Schristos       if (GET_H_SM ())
1694e98e3e1Schristos 	return CPU (h_gr[H_GR_SP]);
1704e98e3e1Schristos       else
1714e98e3e1Schristos 	return CPU (h_cr[H_CR_SPU]);
1724e98e3e1Schristos     case H_CR_BPC : /* backup pc */
1734e98e3e1Schristos       return CPU (h_cr[H_CR_BPC]) & 0xfffffffe;
1744e98e3e1Schristos     case H_CR_BBPC : /* backup backup pc */
1754e98e3e1Schristos       return CPU (h_cr[H_CR_BBPC]) & 0xfffffffe;
1764e98e3e1Schristos     case 4 : /* ??? unspecified, but apparently available */
1774e98e3e1Schristos     case 5 : /* ??? unspecified, but apparently available */
1784e98e3e1Schristos       return CPU (h_cr[cr]);
1794e98e3e1Schristos     default :
1804e98e3e1Schristos       return 0;
1814e98e3e1Schristos     }
1824e98e3e1Schristos }
1834e98e3e1Schristos 
1844e98e3e1Schristos void
1854e98e3e1Schristos m32rbf_h_cr_set_handler (SIM_CPU *current_cpu, UINT cr, USI newval)
1864e98e3e1Schristos {
1874e98e3e1Schristos   switch (cr)
1884e98e3e1Schristos     {
1894e98e3e1Schristos     case H_CR_PSW : /* psw */
1904e98e3e1Schristos       {
1914e98e3e1Schristos 	int old_sm = (CPU (h_psw) & 0x80) != 0;
1924e98e3e1Schristos 	int new_sm = (newval & 0x80) != 0;
1934e98e3e1Schristos 	CPU (h_bpsw) = (newval >> 8) & 0xff;
1944e98e3e1Schristos 	CPU (h_psw) = newval & 0xff;
1954e98e3e1Schristos 	SET_H_COND (newval & 1);
1964e98e3e1Schristos 	/* When switching stack modes, update the registers.  */
1974e98e3e1Schristos 	if (old_sm != new_sm)
1984e98e3e1Schristos 	  {
1994e98e3e1Schristos 	    if (old_sm)
2004e98e3e1Schristos 	      {
2014e98e3e1Schristos 		/* Switching user -> system.  */
2024e98e3e1Schristos 		CPU (h_cr[H_CR_SPU]) = CPU (h_gr[H_GR_SP]);
2034e98e3e1Schristos 		CPU (h_gr[H_GR_SP]) = CPU (h_cr[H_CR_SPI]);
2044e98e3e1Schristos 	      }
2054e98e3e1Schristos 	    else
2064e98e3e1Schristos 	      {
2074e98e3e1Schristos 		/* Switching system -> user.  */
2084e98e3e1Schristos 		CPU (h_cr[H_CR_SPI]) = CPU (h_gr[H_GR_SP]);
2094e98e3e1Schristos 		CPU (h_gr[H_GR_SP]) = CPU (h_cr[H_CR_SPU]);
2104e98e3e1Schristos 	      }
2114e98e3e1Schristos 	  }
2124e98e3e1Schristos 	break;
2134e98e3e1Schristos       }
2144e98e3e1Schristos     case H_CR_BBPSW : /* backup backup psw */
2154e98e3e1Schristos       CPU (h_bbpsw) = newval & 0xff;
2164e98e3e1Schristos       break;
2174e98e3e1Schristos     case H_CR_CBR : /* condition bit */
2184e98e3e1Schristos       SET_H_COND (newval & 1);
2194e98e3e1Schristos       break;
2204e98e3e1Schristos     case H_CR_SPI : /* interrupt stack pointer */
2214e98e3e1Schristos       if (! GET_H_SM ())
2224e98e3e1Schristos 	CPU (h_gr[H_GR_SP]) = newval;
2234e98e3e1Schristos       else
2244e98e3e1Schristos 	CPU (h_cr[H_CR_SPI]) = newval;
2254e98e3e1Schristos       break;
2264e98e3e1Schristos     case H_CR_SPU : /* user stack pointer */
2274e98e3e1Schristos       if (GET_H_SM ())
2284e98e3e1Schristos 	CPU (h_gr[H_GR_SP]) = newval;
2294e98e3e1Schristos       else
2304e98e3e1Schristos 	CPU (h_cr[H_CR_SPU]) = newval;
2314e98e3e1Schristos       break;
2324e98e3e1Schristos     case H_CR_BPC : /* backup pc */
2334e98e3e1Schristos       CPU (h_cr[H_CR_BPC]) = newval;
2344e98e3e1Schristos       break;
2354e98e3e1Schristos     case H_CR_BBPC : /* backup backup pc */
2364e98e3e1Schristos       CPU (h_cr[H_CR_BBPC]) = newval;
2374e98e3e1Schristos       break;
2384e98e3e1Schristos     case 4 : /* ??? unspecified, but apparently available */
2394e98e3e1Schristos     case 5 : /* ??? unspecified, but apparently available */
2404e98e3e1Schristos       CPU (h_cr[cr]) = newval;
2414e98e3e1Schristos       break;
2424e98e3e1Schristos     default :
2434e98e3e1Schristos       /* ignore */
2444e98e3e1Schristos       break;
2454e98e3e1Schristos     }
2464e98e3e1Schristos }
2474e98e3e1Schristos 
2484e98e3e1Schristos /* Cover fns to access h-psw.  */
2494e98e3e1Schristos 
2504e98e3e1Schristos UQI
2514e98e3e1Schristos m32rbf_h_psw_get_handler (SIM_CPU *current_cpu)
2524e98e3e1Schristos {
2534e98e3e1Schristos   return (CPU (h_psw) & 0xfe) | (CPU (h_cond) & 1);
2544e98e3e1Schristos }
2554e98e3e1Schristos 
2564e98e3e1Schristos void
2574e98e3e1Schristos m32rbf_h_psw_set_handler (SIM_CPU *current_cpu, UQI newval)
2584e98e3e1Schristos {
2594e98e3e1Schristos   CPU (h_psw) = newval;
2604e98e3e1Schristos   CPU (h_cond) = newval & 1;
2614e98e3e1Schristos }
2624e98e3e1Schristos 
2634e98e3e1Schristos /* Cover fns to access h-accum.  */
2644e98e3e1Schristos 
2654e98e3e1Schristos DI
2664e98e3e1Schristos m32rbf_h_accum_get_handler (SIM_CPU *current_cpu)
2674e98e3e1Schristos {
2684e98e3e1Schristos   /* Sign extend the top 8 bits.  */
2694e98e3e1Schristos   DI r;
2704e98e3e1Schristos #if 1
2714e98e3e1Schristos   r = ANDDI (CPU (h_accum), MAKEDI (0xffffff, 0xffffffff));
2724e98e3e1Schristos   r = XORDI (r, MAKEDI (0x800000, 0));
2734e98e3e1Schristos   r = SUBDI (r, MAKEDI (0x800000, 0));
2744e98e3e1Schristos #else
2754e98e3e1Schristos   SI hi,lo;
2764e98e3e1Schristos   r = CPU (h_accum);
2774e98e3e1Schristos   hi = GETHIDI (r);
2784e98e3e1Schristos   lo = GETLODI (r);
2794e98e3e1Schristos   hi = ((hi & 0xffffff) ^ 0x800000) - 0x800000;
2804e98e3e1Schristos   r = MAKEDI (hi, lo);
2814e98e3e1Schristos #endif
2824e98e3e1Schristos   return r;
2834e98e3e1Schristos }
2844e98e3e1Schristos 
2854e98e3e1Schristos void
2864e98e3e1Schristos m32rbf_h_accum_set_handler (SIM_CPU *current_cpu, DI newval)
2874e98e3e1Schristos {
2884e98e3e1Schristos   CPU (h_accum) = newval;
2894e98e3e1Schristos }
2904e98e3e1Schristos 
2914e98e3e1Schristos #if WITH_PROFILE_MODEL_P
2924e98e3e1Schristos 
2934e98e3e1Schristos /* FIXME: Some of these should be inline or macros.  Later.  */
2944e98e3e1Schristos 
2954e98e3e1Schristos /* Initialize cycle counting for an insn.
2964e98e3e1Schristos    FIRST_P is non-zero if this is the first insn in a set of parallel
2974e98e3e1Schristos    insns.  */
2984e98e3e1Schristos 
2994e98e3e1Schristos void
3004e98e3e1Schristos m32rbf_model_insn_before (SIM_CPU *cpu, int first_p)
3014e98e3e1Schristos {
3024e98e3e1Schristos   M32R_MISC_PROFILE *mp = CPU_M32R_MISC_PROFILE (cpu);
3034e98e3e1Schristos   mp->cti_stall = 0;
3044e98e3e1Schristos   mp->load_stall = 0;
3054e98e3e1Schristos   if (first_p)
3064e98e3e1Schristos     {
3074e98e3e1Schristos       mp->load_regs_pending = 0;
3084e98e3e1Schristos       mp->biggest_cycles = 0;
3094e98e3e1Schristos     }
3104e98e3e1Schristos }
3114e98e3e1Schristos 
3124e98e3e1Schristos /* Record the cycles computed for an insn.
3134e98e3e1Schristos    LAST_P is non-zero if this is the last insn in a set of parallel insns,
3144e98e3e1Schristos    and we update the total cycle count.
3154e98e3e1Schristos    CYCLES is the cycle count of the insn.  */
3164e98e3e1Schristos 
3174e98e3e1Schristos void
3184e98e3e1Schristos m32rbf_model_insn_after (SIM_CPU *cpu, int last_p, int cycles)
3194e98e3e1Schristos {
3204e98e3e1Schristos   PROFILE_DATA *p = CPU_PROFILE_DATA (cpu);
3214e98e3e1Schristos   M32R_MISC_PROFILE *mp = CPU_M32R_MISC_PROFILE (cpu);
3224e98e3e1Schristos   unsigned long total = cycles + mp->cti_stall + mp->load_stall;
3234e98e3e1Schristos 
3244e98e3e1Schristos   if (last_p)
3254e98e3e1Schristos     {
3264e98e3e1Schristos       unsigned long biggest = total > mp->biggest_cycles ? total : mp->biggest_cycles;
3274e98e3e1Schristos       PROFILE_MODEL_TOTAL_CYCLES (p) += biggest;
3284e98e3e1Schristos       PROFILE_MODEL_CUR_INSN_CYCLES (p) = total;
3294e98e3e1Schristos     }
3304e98e3e1Schristos   else
3314e98e3e1Schristos     {
3324e98e3e1Schristos       /* Here we take advantage of the fact that !last_p -> first_p.  */
3334e98e3e1Schristos       mp->biggest_cycles = total;
3344e98e3e1Schristos       PROFILE_MODEL_CUR_INSN_CYCLES (p) = total;
3354e98e3e1Schristos     }
3364e98e3e1Schristos 
3374e98e3e1Schristos   /* Branch and load stall counts are recorded independently of the
3384e98e3e1Schristos      total cycle count.  */
3394e98e3e1Schristos   PROFILE_MODEL_CTI_STALL_CYCLES (p) += mp->cti_stall;
3404e98e3e1Schristos   PROFILE_MODEL_LOAD_STALL_CYCLES (p) += mp->load_stall;
3414e98e3e1Schristos 
3424e98e3e1Schristos   mp->load_regs = mp->load_regs_pending;
3434e98e3e1Schristos }
3444e98e3e1Schristos 
3454e98e3e1Schristos static INLINE void
3464e98e3e1Schristos check_load_stall (SIM_CPU *cpu, int regno)
3474e98e3e1Schristos {
3484e98e3e1Schristos   UINT h_gr = CPU_M32R_MISC_PROFILE (cpu)->load_regs;
3494e98e3e1Schristos 
3504e98e3e1Schristos   if (regno != -1
3514e98e3e1Schristos       && (h_gr & (1 << regno)) != 0)
3524e98e3e1Schristos     {
3534e98e3e1Schristos       CPU_M32R_MISC_PROFILE (cpu)->load_stall += 2;
3544e98e3e1Schristos       if (TRACE_INSN_P (cpu))
3554e98e3e1Schristos 	cgen_trace_printf (cpu, " ; Load stall of 2 cycles.");
3564e98e3e1Schristos     }
3574e98e3e1Schristos }
3584e98e3e1Schristos 
3594e98e3e1Schristos int
3604e98e3e1Schristos m32rbf_model_m32r_d_u_exec (SIM_CPU *cpu, const IDESC *idesc,
3614e98e3e1Schristos 			    int unit_num, int referenced,
3624e98e3e1Schristos 			    INT sr, INT sr2, INT dr)
3634e98e3e1Schristos {
3644e98e3e1Schristos   check_load_stall (cpu, sr);
3654e98e3e1Schristos   check_load_stall (cpu, sr2);
3664e98e3e1Schristos   return idesc->timing->units[unit_num].done;
3674e98e3e1Schristos }
3684e98e3e1Schristos 
3694e98e3e1Schristos int
3704e98e3e1Schristos m32rbf_model_m32r_d_u_cmp (SIM_CPU *cpu, const IDESC *idesc,
3714e98e3e1Schristos 			   int unit_num, int referenced,
3724e98e3e1Schristos 			   INT src1, INT src2)
3734e98e3e1Schristos {
3744e98e3e1Schristos   check_load_stall (cpu, src1);
3754e98e3e1Schristos   check_load_stall (cpu, src2);
3764e98e3e1Schristos   return idesc->timing->units[unit_num].done;
3774e98e3e1Schristos }
3784e98e3e1Schristos 
3794e98e3e1Schristos int
3804e98e3e1Schristos m32rbf_model_m32r_d_u_mac (SIM_CPU *cpu, const IDESC *idesc,
3814e98e3e1Schristos 			   int unit_num, int referenced,
3824e98e3e1Schristos 			   INT src1, INT src2)
3834e98e3e1Schristos {
3844e98e3e1Schristos   check_load_stall (cpu, src1);
3854e98e3e1Schristos   check_load_stall (cpu, src2);
3864e98e3e1Schristos   return idesc->timing->units[unit_num].done;
3874e98e3e1Schristos }
3884e98e3e1Schristos 
3894e98e3e1Schristos int
3904e98e3e1Schristos m32rbf_model_m32r_d_u_cti (SIM_CPU *cpu, const IDESC *idesc,
3914e98e3e1Schristos 			   int unit_num, int referenced,
3924e98e3e1Schristos 			   INT sr)
3934e98e3e1Schristos {
3944e98e3e1Schristos   PROFILE_DATA *profile = CPU_PROFILE_DATA (cpu);
3954e98e3e1Schristos   int taken_p = (referenced & (1 << 1)) != 0;
3964e98e3e1Schristos 
3974e98e3e1Schristos   check_load_stall (cpu, sr);
3984e98e3e1Schristos   if (taken_p)
3994e98e3e1Schristos     {
4004e98e3e1Schristos       CPU_M32R_MISC_PROFILE (cpu)->cti_stall += 2;
4014e98e3e1Schristos       PROFILE_MODEL_TAKEN_COUNT (profile) += 1;
4024e98e3e1Schristos     }
4034e98e3e1Schristos   else
4044e98e3e1Schristos     PROFILE_MODEL_UNTAKEN_COUNT (profile) += 1;
4054e98e3e1Schristos   return idesc->timing->units[unit_num].done;
4064e98e3e1Schristos }
4074e98e3e1Schristos 
4084e98e3e1Schristos int
4094e98e3e1Schristos m32rbf_model_m32r_d_u_load (SIM_CPU *cpu, const IDESC *idesc,
4104e98e3e1Schristos 			    int unit_num, int referenced,
4114e98e3e1Schristos 			    INT sr, INT dr)
4124e98e3e1Schristos {
4134e98e3e1Schristos   CPU_M32R_MISC_PROFILE (cpu)->load_regs_pending |= (1 << dr);
4144e98e3e1Schristos   check_load_stall (cpu, sr);
4154e98e3e1Schristos   return idesc->timing->units[unit_num].done;
4164e98e3e1Schristos }
4174e98e3e1Schristos 
4184e98e3e1Schristos int
4194e98e3e1Schristos m32rbf_model_m32r_d_u_store (SIM_CPU *cpu, const IDESC *idesc,
4204e98e3e1Schristos 			     int unit_num, int referenced,
4214e98e3e1Schristos 			     INT src1, INT src2)
4224e98e3e1Schristos {
4234e98e3e1Schristos   check_load_stall (cpu, src1);
4244e98e3e1Schristos   check_load_stall (cpu, src2);
4254e98e3e1Schristos   return idesc->timing->units[unit_num].done;
4264e98e3e1Schristos }
4274e98e3e1Schristos 
4284e98e3e1Schristos int
4294e98e3e1Schristos m32rbf_model_test_u_exec (SIM_CPU *cpu, const IDESC *idesc,
4304e98e3e1Schristos 			  int unit_num, int referenced)
4314e98e3e1Schristos {
4324e98e3e1Schristos   return idesc->timing->units[unit_num].done;
4334e98e3e1Schristos }
4344e98e3e1Schristos 
4354e98e3e1Schristos #endif /* WITH_PROFILE_MODEL_P */
436