@@ -1202,10 +1202,10 @@ static void block_insert(block_map_t *map, const block_t *block)
1202
1202
}
1203
1203
1204
1204
/* try to locate an already translated block in the block map */
1205
- static block_t * block_find (const block_map_t * map , const uint32_t pc )
1205
+ static block_t * block_find (const block_map_t * map , const uint32_t addr )
1206
1206
{
1207
1207
assert (map );
1208
- uint32_t index = hash (pc );
1208
+ uint32_t index = hash (addr );
1209
1209
const uint32_t mask = map -> block_capacity - 1 ;
1210
1210
1211
1211
/* find block in block map */
@@ -1214,7 +1214,7 @@ static block_t *block_find(const block_map_t *map, const uint32_t pc)
1214
1214
if (!block )
1215
1215
return NULL ;
1216
1216
1217
- if (block -> pc_start == pc )
1217
+ if (block -> pc_start == addr )
1218
1218
return block ;
1219
1219
}
1220
1220
return NULL ;
@@ -1240,8 +1240,7 @@ static bool block_emulate(riscv_t *rv, const block_t *block)
1240
1240
1241
1241
static void block_translate (riscv_t * rv , block_t * block )
1242
1242
{
1243
- block -> pc_start = rv -> PC ;
1244
- block -> pc_end = rv -> PC ;
1243
+ block -> pc_start = block -> pc_end = rv -> PC ;
1245
1244
1246
1245
/* translate the basic block */
1247
1246
while (block -> n_insn < block -> insn_capacity ) {
@@ -1288,7 +1287,11 @@ static block_t *block_find_or_translate(riscv_t *rv, block_t *prev)
1288
1287
/* insert the block into block map */
1289
1288
block_insert (& rv -> block_map , next );
1290
1289
1291
- /* update the block prediction */
1290
+ /* update the block prediction
1291
+ * When we translate a new block, the block predictor may benefit,
1292
+ * but when it is updated after we find a particular block, it may
1293
+ * penalize us significantly.
1294
+ */
1292
1295
if (prev )
1293
1296
prev -> predict = next ;
1294
1297
}
@@ -1301,24 +1304,32 @@ void rv_step(riscv_t *rv, int32_t cycles)
1301
1304
assert (rv );
1302
1305
1303
1306
/* find or translate a block for starting PC */
1304
- block_t * prev = NULL , * next = NULL ;
1307
+ block_t * prev = NULL ;
1308
+
1305
1309
const uint64_t cycles_target = rv -> csr_cycle + cycles ;
1306
1310
1311
+ /* loop until we hit out cycle target */
1307
1312
while (rv -> csr_cycle < cycles_target && !rv -> halt ) {
1308
- /* check the block prediction first */
1313
+ block_t * block ;
1314
+
1315
+ /* try to predict the next block */
1309
1316
if (prev && prev -> predict && prev -> predict -> pc_start == rv -> PC ) {
1310
- next = prev -> predict ;
1317
+ block = prev -> predict ;
1311
1318
} else {
1312
- next = block_find_or_translate (rv , prev );
1319
+ /* lookup the next block in block map or translate a new block,
1320
+ * and move onto the next block.
1321
+ */
1322
+ block = block_find_or_translate (rv , prev );
1313
1323
}
1314
1324
1315
- assert (next );
1325
+ /* we should have a block by now */
1326
+ assert (block );
1316
1327
1317
1328
/* execute the block */
1318
- if (!block_emulate (rv , next ))
1329
+ if (!block_emulate (rv , block ))
1319
1330
break ;
1320
1331
1321
- prev = next ;
1332
+ prev = block ;
1322
1333
}
1323
1334
}
1324
1335
0 commit comments