レジスタリネーミングでは、アーキテクチャレジスタと物理レジスタを接続するための仕組みだ。 レジスタに書き込みを行う命令が実行されると、アーキテクチャレジスタのIDはリネーミングレジスタのレジスタIDに置き換われる。 このレジスタリネーミングの仕組みがうまくいかないと、オペランドを正しく参照することができない。
- 作者: Hisa Ando
- 出版社/メーカー: マイナビ出版
- 発売日: 2011/06/23
- メディア: Kindle版
- この商品を含むブログを見る
リネームIDはアーキテクチャレジスタの番号に関係なく、シーケンシャルに配置される。 例えば、最初にアーキテクチャレジスタに以下のようにリネームIDが配置されているものとする。
- R0 : 32
- R1 : 33
- ...
- R31: 63
レジスタリネーミングにより、まずR1に書き込みが行われるとすると、新たにR1にリネームIDが割り当てられ、元々割り当てられている番号33は解放される。
- R0 : 32
- R1 : 0 (33は開放)
- ...
- R31: 63
これをモデル化するためには、ISSで以下のような変数を用意する。
std::unique_ptr<uint32_t []> m_dst_idx; std::queue<uint32_t> m_dst_queue;
m_dst_idx はアーキテクチャレジスタの数だけ定義され、どのアーキテクチャにどのリネームIDが保持されているかを記録する。 また、m_dst_queueは使用されていないIDを順番にFIFOで格納される。
これを実装すると、以下のようになる。
if (GetTraceDstAddr() != static_cast<Addr_t>(-1)) { DebugPrint ("(%2d,%2d) ", m_dst_queue.front(), m_dst_idx[GetTraceDstAddr()]); m_dst_queue.push(m_dst_idx[GetTraceDstAddr()]); m_dst_idx[GetTraceDstAddr()] = m_dst_queue.front(); m_dst_queue.pop(); } else { DebugPrint (" "); }
レジスタ書き込みのある命令の場合、まずはm_dst_queueの先頭から新しいリネームIDを取得する。
そして、現在のリネームID m_dst_idx[GetTraceDstAddr()]
を解放する。解放するということは、FIFOの最後尾に格納することを意味する。
m_dst_idx[GetTraceDstAddr()] = m_dst_queue.front(); m_dst_queue.pop();
これにより、Coremarkのテストプログラムを実行すると、以下のようにログが出力されるようになった。(xx,xx)の部分がリネームIDの情報だ。 1つ目が新たに割り当てるIDで、2つ目が解放されるIDだ。
0:M:MBar:[00000200][P00000200] 7f000197 : auipc r03,0x7f000 ( 0,34) r03<=7f000200 1:M:MBar:[00000204][P00000204] e1018193 : addi r03,r03,0xe10 ( 1, 0) r03=>7f000200 r03<=7f000010 2:M:MBar:[00000208][P00000208] 7f004117 : auipc r02,0x7f004 ( 2,33) r02<=7f004208 3:M:MBar:[0000020c][P0000020c] e0010113 : addi r02,r02,0xe00 ( 3, 2) r02=>7f004208 r02<=7f004008 4:M:MBar:[00000210][P00000210] 000000b3 : add r01,r00,r00 ( 4,32) r00=>00000000 r00=>00000000 r01<=00000000 5:M:MBar:[00000214][P00000214] 00000233 : add r04,r00,r00 ( 5,35) r00=>00000000 r00=>00000000 r04<=00000000 6:M:MBar:[00000218][P00000218] 000002b3 : add r05,r00,r00 ( 6,36) r00=>00000000 r00=>00000000 r05<=00000000 7:M:MBar:[0000021c][P0000021c] 00000333 : add r06,r00,r00 ( 7,37) r00=>00000000 r00=>00000000 r06<=00000000 8:M:MBar:[00000220][P00000220] 000003b3 : add r07,r00,r00 ( 8,38) r00=>00000000 r00=>00000000 r07<=00000000 9:M:MBar:[00000224][P00000224] 00000433 : add r08,r00,r00 ( 9,39) r00=>00000000 r00=>00000000 r08<=00000000 10:M:MBar:[00000228][P00000228] 000004b3 : add r09,r00,r00 (10,40) r00=>00000000 r00=>00000000 r09<=00000000 11:M:MBar:[0000022c][P0000022c] 00000533 : add r10,r00,r00 (11,41) r00=>00000000 r00=>00000000 r10<=00000000 12:M:MBar:[00000230][P00000230] 000005b3 : add r11,r00,r00 (12,42) r00=>00000000 r00=>00000000 r11<=00000000 13:M:MBar:[00000234][P00000234] 00000633 : add r12,r00,r00 (13,43) r00=>00000000 r00=>00000000 r12<=00000000 14:M:MBar:[00000238][P00000238] 000006b3 : add r13,r00,r00 (14,44) r00=>00000000 r00=>00000000 r13<=00000000 15:M:MBar:[0000023c][P0000023c] 00000733 : add r14,r00,r00 (15,45) r00=>00000000 r00=>00000000 r14<=00000000 16:M:MBar:[00000240][P00000240] 000007b3 : add r15,r00,r00 (16,46) r00=>00000000 r00=>00000000 r15<=00000000 17:M:MBar:[00000244][P00000244] 00000833 : add r16,r00,r00 (17,47) r00=>00000000 r00=>00000000 r16<=00000000 18:M:MBar:[00000248][P00000248] 000008b3 : add r17,r00,r00 (18,48) r00=>00000000 r00=>00000000 r17<=00000000 19:M:MBar:[0000024c][P0000024c] 00000933 : add r18,r00,r00 (19,49) r00=>00000000 r00=>00000000 r18<=00000000 20:M:MBar:[00000250][P00000250] 000009b3 : add r19,r00,r00 (20,50) r00=>00000000 r00=>00000000 r19<=00000000 21:M:MBar:[00000254][P00000254] 00000a33 : add r20,r00,r00 (21,51) r00=>00000000 r00=>00000000 r20<=00000000 22:M:MBar:[00000258][P00000258] 00000ab3 : add r21,r00,r00 (22,52) r00=>00000000 r00=>00000000 r21<=00000000 23:M:MBar:[0000025c][P0000025c] 00000b33 : add r22,r00,r00 (23,53) r00=>00000000 r00=>00000000 r22<=00000000 24:M:MBar:[00000260][P00000260] 00000bb3 : add r23,r00,r00 (24,54) r00=>00000000 r00=>00000000 r23<=00000000 25:M:MBar:[00000264][P00000264] 00000c33 : add r24,r00,r00 (25,55) r00=>00000000 r00=>00000000 r24<=00000000 26:M:MBar:[00000268][P00000268] 00000cb3 : add r25,r00,r00 (26,56) r00=>00000000 r00=>00000000 r25<=00000000 27:M:MBar:[0000026c][P0000026c] 00000d33 : add r26,r00,r00 (27,57) r00=>00000000 r00=>00000000 r26<=00000000 28:M:MBar:[00000270][P00000270] 00000db3 : add r27,r00,r00 (28,58) r00=>00000000 r00=>00000000 r27<=00000000 29:M:MBar:[00000274][P00000274] 00000e33 : add r28,r00,r00 (29,59) r00=>00000000 r00=>00000000 r28<=00000000 30:M:MBar:[00000278][P00000278] 00000eb3 : add r29,r00,r00 (30,60) r00=>00000000 r00=>00000000 r29<=00000000 31:M:MBar:[0000027c][P0000027c] 00000f33 : add r30,r00,r00 (31,61) r00=>00000000 r00=>00000000 r30<=00000000 32:M:MBar:[00000280][P00000280] 00000fb3 : add r31,r00,r00 (34,62) r00=>00000000 r00=>00000000 r31<=00000000 33:M:MBar:[00000284][P00000284] 80002417 : auipc r08,0x80002 ( 0, 9) r08<=80002284 34:M:MBar:[00000288][P00000288] db040413 : addi r08,r08,0xdb0 (33, 0) r08=>80002284 r08<=80002034 35:M:MBar:[0000028c][P0000028c] 000400e7 : jalr r01,r08,0x0e7 ( 2, 4) r08=>80002034 r01<=00000290 pc<=80002034 36:M:MBar:[80002034][P80002034] f7010113 : addi r02,r02,0xf70 (32, 3) r02=>7f004008 r02<=7f003f78 37:M:MBar:[80002038][P80002038] 00410593 : addi r11,r02,0x004 (35,12) r02=>7f003f78 r11<=7f003f7c 38:M:MBar:[8000203c][P8000203c] 00810613 : addi r12,r02,0x008 (36,13) r02=>7f003f78 r12<=7f003f80 39:M:MBar:[80002040][P80002040] 04e10513 : addi r10,r02,0x04e (37,11) r02=>7f003f78 r10<=7f003fc6 40:M:MBar:[80002044][P80002044] 08112623 : sw r01,0x08c(r02) r02=>7f003f78 r01=>00000290 (7f004004)<=00000290 41:M:MBar:[80002048][P80002048] 08812423 : sw r08,0x088(r02) r02=>7f003f78 r08=>80002034 (7f004000)<=80002034 42:M:MBar:[8000204c][P8000204c] 08912223 : sw r09,0x084(r02) r02=>7f003f78 r09=>00000000 (7f003ffc)<=00000000