/[smarc]/smarc/src/vmachine/vmachine.cc
ViewVC logotype

Diff of /smarc/src/vmachine/vmachine.cc

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.15 by misto, Sat Jan 4 01:37:44 2003 UTC revision 1.16 by misto, Sat Jan 4 12:26:34 2003 UTC
# Line 205  void vmachine::step( void ) Line 205  void vmachine::step( void )
205                  do_ADDR();                  do_ADDR();
206    
207          // turning off load stall          // turning off load stall
208          if (phase_stall[WB] == stall_load)          if (phase_stall[WB] == stall_load){
209                  phase_stall[WB] = stall_no;                  phase_stall[WB] = stall_no;
210    #ifdef VMDEBUG
211                    cout.form("VM: turning off LOAD stall.\n");
212    #endif
213            }
214                    
215          // third phase of load stall          // third phase of load stall
216          if (phase_stall[MA] == stall_load){          if (phase_stall[MA] == stall_load){
217                  phase_stall[MA] = stall_no;                  phase_stall[MA] = stall_no;
218    
219                  phase_stall[WB] = stall_load;                  phase_stall[WB] = stall_load;
220    #ifdef VMDEBUG
221                    cout.form("VM: third phase of LOAD stall.\n");
222    #endif
223          }          }
224                    
225          // second phase of load stall          // second phase of load stall
# Line 221  void vmachine::step( void ) Line 228  void vmachine::step( void )
228                  phase_stall[ID] = stall_no;                  phase_stall[ID] = stall_no;
229    
230                  phase_stall[MA] = stall_load;                  phase_stall[MA] = stall_load;
231    #ifdef VMDEBUG
232                    cout.form("VM: second phase of LOAD stall.\n");
233    #endif
234          }          }
235    
236          // turning off jmpl stall          // turning off jmpl stall
237          if ( phase_stall[ID] == stall_jmpl )          if ( phase_stall[ID] == stall_jmpl ){
238                  for( int i = ID ; i <= WB ; i++ )                  for( int i = ID ; i <= WB ; i++ )
239                          phase_stall[i] = stall_no;                          phase_stall[i] = stall_no;
240    #ifdef VMDEBUG
241                    cout.form("VM: turning off JMPL stall.\n");
242    #endif
243            }
244                    
245          // second phase of jmpl stall          // second phase of jmpl stall
246          if (phase_stall[IF] == stall_jmpl){          if (phase_stall[IF] == stall_jmpl){
# Line 237  void vmachine::step( void ) Line 251  void vmachine::step( void )
251                  phase_stall[IF] = stall_no;                  phase_stall[IF] = stall_no;
252                  for( int i = ID ; i <= WB ; i++ )                  for( int i = ID ; i <= WB ; i++ )
253                          phase_stall[i] = stall_jmpl;                          phase_stall[i] = stall_jmpl;
254    #ifdef VMDEBUG
255                    cout.form("VM: second phase of JMPL stall.\n");
256    #endif
257          }          }
258                                    
259  }  }
# Line 345  void vmachine::do_EX( void ) Line 362  void vmachine::do_EX( void )
362                  return;                  return;
363          }          }
364                    
365          if ( phase_active[WB] && OP.is_arlog_src() &&          if ( phase_active[WB] && phase_stall[WB] == stall_no
366                            && OP.is_arlog_src1() &&
367                          (ppOP.is_arlog_dst() || ppOP.group==instr_word::load) &&                          (ppOP.is_arlog_dst() || ppOP.group==instr_word::load) &&
368                          OP.src1 != 0 &&                          OP.src1 != 0 &&
369                          Registers.real_regnum(pppsr.CWP, ppOP.dst)                          Registers.real_regnum(pppsr.CWP, ppOP.dst)
370                                  == Registers.real_regnum(psr.CWP, OP.src1) )                                  == Registers.real_regnum(psr.CWP, OP.src1) ){
371                  Mpx4.process( 3 );                  Mpx4.process( 3 );
372          else if ( phase_active[MA] && OP.is_arlog_src() &&  #ifdef VMDEBUG
373                    cout.form("EX: far forward of first argument.\n");
374    #endif
375            } else if ( phase_active[MA] && phase_stall[MA] == stall_no
376                            && OP.is_arlog_src1() &&
377                          pOP.is_arlog_dst() && OP.src1 != 0 &&                          pOP.is_arlog_dst() && OP.src1 != 0 &&
378                          Registers.real_regnum(ppsr.CWP, pOP.dst)                          Registers.real_regnum(ppsr.CWP, pOP.dst)
379                                  == Registers.real_regnum(psr.CWP, OP.src1))                                  == Registers.real_regnum(psr.CWP, OP.src1)){
380                  Mpx4.process( 1 );                  Mpx4.process( 1 );
381          else if ( phase_active[MA] && OP.is_arlog_src() &&  #ifdef VMDEBUG
382                    cout.form("EX: near forward of first argument.\n");
383    #endif
384            } else if ( phase_active[MA] && phase_stall[MA] == stall_no
385                            && OP.is_arlog_src1() &&
386                          pOP.group == instr_word::load && OP.src1 != 0 &&                          pOP.group == instr_word::load && OP.src1 != 0 &&
387                          Registers.real_regnum(ppsr.CWP, pOP.dst)                          Registers.real_regnum(ppsr.CWP, pOP.dst)
388                                  == Registers.real_regnum(psr.CWP,OP.src1) ){                                  == Registers.real_regnum(psr.CWP,OP.src1) ){
389                  phase_stall[IF] = stall_load;                  phase_stall[IF] = stall_load;
390                  phase_stall[ID] = stall_load;                  phase_stall[ID] = stall_load;
391    #ifdef VMDEBUG
392                    cout.form("EX: starting LOAD stall [first argument].\n");
393    #endif
394          } else          } else
395                  Mpx4.process( 2 );                  Mpx4.process( 2 );
396                    
397          if ( phase_active[WB] && OP.is_arlog_src() &&          if ( phase_active[WB] && phase_stall[WB] == stall_no &&
398                            OP.is_arlog_src2() &&
399                          (ppOP.is_arlog_dst() || ppOP.group==instr_word::load) &&                          (ppOP.is_arlog_dst() || ppOP.group==instr_word::load) &&
400                          OP.src2 != 0 &&                          OP.src2 != 0 &&
401                          Registers.real_regnum(pppsr.CWP, ppOP.dst)                          Registers.real_regnum(pppsr.CWP, ppOP.dst)
402                                  == Registers.real_regnum(psr.CWP, OP.src2) )                                  == Registers.real_regnum(psr.CWP, OP.src2) ){
403                  Mpx5.process( 3 );                  Mpx5.process( 3 );
404          else if ( phase_active[MA] && OP.is_arlog_src() &&  #ifdef VMDEBUG
405                    cout.form("EX: near forward of second argument.\n");
406    #endif
407            } else if ( phase_active[MA] && phase_stall[MA] == stall_no &&
408                            OP.is_arlog_src2() &&
409                          pOP.is_arlog_dst() && OP.src2 != 0 &&                          pOP.is_arlog_dst() && OP.src2 != 0 &&
410                          Registers.real_regnum(ppsr.CWP, pOP.dst)                          Registers.real_regnum(ppsr.CWP, pOP.dst)
411                                  == Registers.real_regnum(psr.CWP, OP.src2))                                  == Registers.real_regnum(psr.CWP, OP.src2)){
412                  Mpx5.process( 1 );                  Mpx5.process( 1 );
413          else if ( phase_active[MA] && OP.is_arlog_src() &&  #ifdef VMDEBUG
414                    cout.form("EX: near forward of second argument.\n");
415    #endif
416            } else if ( phase_active[MA] && phase_stall[MA] == stall_no &&
417                            OP.is_arlog_src2() &&
418                          pOP.group == instr_word::load && OP.src2 != 0 &&                          pOP.group == instr_word::load && OP.src2 != 0 &&
419                          Registers.real_regnum(ppsr.CWP, pOP.dst)                          Registers.real_regnum(ppsr.CWP, pOP.dst)
420                                  == Registers.real_regnum(psr.CWP, OP.src2) ){                                  == Registers.real_regnum(psr.CWP, OP.src2) ){
421                  phase_stall[IF] = stall_load;                  phase_stall[IF] = stall_load;
422                  phase_stall[ID] = stall_load;                  phase_stall[ID] = stall_load;
423    #ifdef VMDEBUG
424                    cout.form("EX: starting LOAD stall [second argument].\n");
425    #endif
426          } else          } else
427                  Mpx5.process( 2 );                  Mpx5.process( 2 );
428    
429          if ( phase_active[WB] && OP.group == instr_word::store &&          if ( phase_active[WB] && phase_stall[WB] == stall_no
430                            && OP.group == instr_word::store &&
431                          (ppOP.is_arlog_dst() || ppOP.group==instr_word::load) &&                          (ppOP.is_arlog_dst() || ppOP.group==instr_word::load) &&
432                          OP.dst != 0 &&                          OP.dst != 0 &&
433                          Registers.real_regnum(pppsr.CWP, ppOP.dst)                          Registers.real_regnum(pppsr.CWP, ppOP.dst)
434                                  == Registers.real_regnum(psr.CWP, OP.dst) )                                  == Registers.real_regnum(psr.CWP, OP.dst) ){
435                  Mpx7.process( 2 );                  Mpx7.process( 2 );
436          else  #ifdef VMDEBUG
437                    cout.form("EX: far forward of destination [store].\n");
438    #endif
439            } else
440                  Mpx7.process( 1 );                  Mpx7.process( 1 );
441                    
442          if ( phase_stall[IF] == stall_load && phase_stall[ID] == stall_load )          if ( phase_stall[IF] == stall_load && phase_stall[ID] == stall_load )
# Line 418  void vmachine::do_EX( void ) Line 463  void vmachine::do_EX( void )
463          if (OP.instr == instr_word::jmpl){          if (OP.instr == instr_word::jmpl){
464                  Mpx2.set(2);                  Mpx2.set(2);
465                  phase_stall[IF] = stall_jmpl;                  phase_stall[IF] = stall_jmpl;
466    #ifdef VMDEBUG
467                    cout.form("EX: starting JMPL stall.\n");
468    #endif
469          }          }
470    
471          if (OP.instr == instr_word::save)          if (OP.instr == instr_word::save)
# Line 443  void vmachine::do_MA( void ) Line 491  void vmachine::do_MA( void )
491                  return;                  return;
492          }          }
493                    
494          if ( phase_active[WB] && pOP.group == instr_word::store &&          if ( phase_active[WB] && phase_stall[WB] == stall_no
495                            && pOP.group == instr_word::store &&
496                          (ppOP.is_arlog_dst() || ppOP.group==instr_word::load) &&                          (ppOP.is_arlog_dst() || ppOP.group==instr_word::load) &&
497                          pOP.dst != 0 &&                          pOP.dst != 0 &&
498                          Registers.real_regnum(pppsr.CWP, ppOP.dst)                          Registers.real_regnum(pppsr.CWP, ppOP.dst)
499                                  == Registers.real_regnum(ppsr.CWP, pOP.dst) )                                  == Registers.real_regnum(ppsr.CWP, pOP.dst) ){
500                  Mpx8.process( 2 );                  Mpx8.process( 2 );
501          else  #ifdef VMDEBUG
502                    cout.form("EX: near forward of destination [store].\n");
503    #endif
504            } else
505                  Mpx8.process( 1 );                  Mpx8.process( 1 );
506    
507          if ( pOP.instr == instr_word::ld )          if ( pOP.instr == instr_word::ld )

Legend:
Removed from v.1.15  
changed lines
  Added in v.1.16

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26