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