1 /* GX generic simulator run.
2 Copyright (C) 1998 Cygnus Solutions.
6 #include "sim-assert.h"
14 /* GX implementation of sim_engine_run that works within the
15 sim_engine setjmp/longjmp framework. */
19 sim_engine_run (SIM_DESC sd
,
21 int nr_cpus
, /* ignore */
22 int siggnal
) /* ignore */
28 SIM_ASSERT (STATE_MAGIC (sd
) == SIM_MAGIC_NUMBER
);
29 cpu
= STATE_CPU (sd
, next_cpu_nr
);
34 sim_gx_compiled_block
* compiled_block
;
36 sim_cia cia
= CIA_GET(cpu
);
38 int pre_checksum
, post_checksum
;
40 /* find optimized gx block that includes this PC */
41 block
= sim_gx_block_find(cia
);
44 /* start new learning block */
45 block
= sim_gx_block_create(cia
);
47 ASSERT(block
!= NULL
);
49 /* pick preferred compiled block */
50 if(block
->optimized_block
!= NULL
)
52 compiled_block
= block
->optimized_block
;
57 /* test for optimization policy */
58 if(tgx_optimize_test(block
))
60 block
->opt_compile_count
++;
61 sim_gx_block_translate(block
, 1 /* optimized */);
62 compiled_block
= block
->optimized_block
;
67 compiled_block
= block
->learning_block
;
71 ASSERT(compiled_block
!= NULL
);
73 /* load & resolve gx function */
74 f
= sim_gx_compiled_block_f(compiled_block
);
77 printf("calling into gx function %p, pc=%08lx, opt %d\n",
78 (void*) f, (unsigned long) cpu->regs.h_pc, optimized);
81 /* compute pc_flags checksum */
86 for(i
=0; i
< block
->length
/ block
->divisor
; i
++)
87 pre_checksum
+= block
->pc_flags
[i
];
90 /* call into gx function */
91 rc
= (*f
)(& cpu
->regs
, block
->pc_flags
, block
->callbacks
);
93 /* compute pc_flags checksum */
98 for(i
=0; i
< block
->length
/ block
->divisor
; i
++)
99 post_checksum
+= block
->pc_flags
[i
];
101 if(post_checksum
!= pre_checksum
) /* system changing */
103 block
->learn_last_change
= time(NULL
);
108 printf("returned from gx function %p, rc=%d, pc=%08lx\n",
109 (void*) f, rc, (unsigned long) cpu->regs.h_pc);
114 case GX_F_YIELD
: /* gx block voluntarily gave up control */
115 case GX_F_RANGE
: /* PC travelled outside this block */
116 ; /* continue block dispatch loop */
119 case GX_F_NONPC
: /* non-instruction PC in this block */
120 if(compiled_block
== block
->optimized_block
)
122 /* sim_io_printf(sd, "NOTE: cancelling premature optimization, GX block %p, PC %08lx\n",
123 block, (long) cpu->regs.h_pc); */
124 sim_gx_compiled_block_dispose(compiled_block
);
125 block
->learn_last_change
= time(NULL
);
126 block
->optimized_block
= NULL
;
130 /* learning-mode gx block should not fail this way */
131 sim_io_error(sd
, "Internal error - GX block cia %08lx NONPC\n", (long) cia
);
135 case GX_F_HALT
: /* gx function returning control */
136 cont
= 0; /* merely exit loop */
139 /* should not happen */
141 sim_io_error(sd
, "Translation error (bad rc 0x%d in gx block)", rc
);
145 if(sim_events_tick(sd
))
146 sim_events_process(sd
);
This page took 0.033285 seconds and 4 git commands to generate.