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
);
39 int post_checksum
= 0;
41 /* find optimized gx block that includes this PC */
42 block
= sim_gx_block_find(cia
);
45 /* start new learning block */
46 block
= sim_gx_block_create(cia
);
47 sim_gx_write_block_list();
49 ASSERT(block
!= NULL
);
51 /* pick preferred compiled block */
52 if(block
->optimized_block
!= NULL
)
54 compiled_block
= block
->optimized_block
;
59 /* test for optimization policy */
60 if(tgx_optimize_test(block
))
62 block
->opt_compile_count
++;
63 sim_gx_block_translate(block
, 1 /* optimized */);
64 sim_gx_write_block_list();
65 compiled_block
= block
->optimized_block
;
70 compiled_block
= block
->learning_block
;
74 ASSERT(compiled_block
!= NULL
);
76 /* load & resolve gx function */
77 f
= sim_gx_compiled_block_f(compiled_block
);
80 printf("calling into gx function %p, pc=%08lx, opt %d\n",
81 (void*) f, (unsigned long) cpu->regs.h_pc, optimized);
84 /* compute pc_flags checksum */
89 for(i
=0; i
< block
->length
/ block
->divisor
; i
++)
90 pre_checksum
+= block
->pc_flags
[i
];
93 /* call into gx function */
95 struct tgx_info info
= {& cpu
->regs
,
101 /* compute pc_flags checksum */
106 for(i
=0; i
< block
->length
/ block
->divisor
; i
++)
107 post_checksum
+= block
->pc_flags
[i
];
109 if(post_checksum
!= pre_checksum
) /* system changing */
111 block
->learn_last_change
= time(NULL
);
116 printf("returned from gx function %p, rc=%d, pc=%08lx\n",
117 (void*) f, rc, (unsigned long) cpu->regs.h_pc);
122 case GX_F_YIELD
: /* gx block voluntarily gave up control */
123 case GX_F_RANGE
: /* PC travelled outside this block */
124 ; /* continue block dispatch loop */
127 case GX_F_NONPC
: /* non-instruction PC in this block */
128 if(compiled_block
== block
->optimized_block
)
130 /* sim_io_printf(sd, "NOTE: cancelling premature optimization, GX block %p, PC %08lx\n",
131 block, (long) cpu->regs.h_pc); */
132 sim_gx_compiled_block_dispose(compiled_block
);
133 block
->learn_last_change
= time(NULL
);
134 block
->optimized_block
= NULL
;
138 /* learning-mode gx block should not fail this way */
139 sim_io_error(sd
, "Internal error - GX block cia %08lx NONPC\n", (long) cia
);
143 case GX_F_HALT
: /* gx function returning control */
144 cont
= 0; /* merely exit loop */
147 /* should not happen */
149 sim_io_error(sd
, "Translation error (bad rc 0x%d in gx block)", rc
);
153 if(sim_events_tick(sd
))
154 sim_events_process(sd
);