Binary Translation型エミュレータを作る(Compressed命令の実装3)
前回Compressed命令のフレームワークは完成したので後はひたすら命令を追加していくだけとなる。メモリアクセス命令の実装を行った。
メモリアクセス命令については、ソースオペランドがSP固定のような命令が定義されているので、やはりレジスタオペランドの部分だけ注意しながらメモリアクセスのためのTCGを生成していく。
- C.LWSP / C.LDSP命令の実装部分
pub fn translate_c_lwsp (&mut self, inst: &InstrInfo) -> Vec<TCGOp> { let imm = (((inst.inst >> 12) & 0x1) << 5) | (((inst.inst >> 4) & 0x7) << 2) | (((inst.inst >> 2) & 0x3) << 6); self.translate_raw_load(2, imm as u64, get_rd_addr!(inst.inst), inst, TCGOpcode::LOAD_32BIT, CALL_HELPER_IDX::CALL_LOAD32_IDX) } pub fn translate_c_ldsp (&mut self, inst: &InstrInfo) -> Vec<TCGOp> { let imm = (((inst.inst >> 12) & 0x1) << 5) | (((inst.inst >> 4) & 0x7) << 2) | (((inst.inst >> 2) & 0x3) << 6); self.translate_raw_load(2, imm as u64, get_rd_addr!(inst.inst), inst, TCGOpcode::LOAD_64BIT, CALL_HELPER_IDX::CALL_LOAD64_IDX) }
- C.SWSP / C.SDSP命令の実装部分
pub fn translate_c_swsp (&mut self, inst: &InstrInfo) -> Vec<TCGOp> { let imm = (((inst.inst >> 9) & 0xf) << 2) | (((inst.inst >> 7) & 0x3) << 6); self.translate_raw_store(2, imm as u64, ((inst.inst >> 2) & 0x1f), inst, TCGOpcode::STORE_32BIT, CALL_HELPER_IDX::CALL_STORE32_IDX) } pub fn translate_c_sdsp (&mut self, inst: &InstrInfo) -> Vec<TCGOp> { let imm = (((inst.inst >> 9) & 0xf) << 2) | (((inst.inst >> 7) & 0x3) << 6); self.translate_raw_store(2, imm as u64, ((inst.inst >> 2) & 0x1f), inst, TCGOpcode::STORE_64BIT, CALL_HELPER_IDX::CALL_STORE64_IDX) }
それぞれx86命令への変換後は以下のようになった。
- C.LDSPの変換結果
000000008000228a:000000008000228a Hostcode e3b76622 : c.ldsp a2, 8(sp) label found 2 label found. offset = 94 replacement target is 46, data = 4a label found 2 label found. offset = c8 replacement target is 8b, data = 39 00007FA618150000 488B9518000000 mov 0x18(%rbp),%rdx 00007FA618150007 4881C208000000 add $8,%rdx 00007FA61815000E 488BDA mov %rdx,%rbx 00007FA618150011 4881E3FF0F0000 and $0xFFF,%rbx 00007FA618150018 488BCA mov %rdx,%rcx 00007FA61815001B 48C1E90C shr $0xC,%rcx 00007FA61815001F 4881E1FF0F0000 and $0xFFF,%rcx 00007FA618150026 48C1E103 shl $3,%rcx 00007FA61815002A 488BF5 mov %rbp,%rsi 00007FA61815002D 488BFE mov %rsi,%rdi 00007FA618150030 4881C7A8050000 add $0x5A8,%rdi 00007FA618150037 4803F9 add %rcx,%rdi 00007FA61815003A 48C1EA18 shr $0x18,%rdx 00007FA61815003E 488B3F mov (%rdi),%rdi 00007FA618150041 483BFA cmp %rdx,%rdi 00007FA618150044 0F844A000000 je 0x0000_7FA6_1815_0094 00007FA61815004A 48BF60E1C8DAFF7F0000 movabs $0x7FFF_DAC8_E160,%rdi 00007FA618150054 48BE0C00000000000000 movabs $0xC,%rsi 00007FA61815005E 48BA0200000000000000 movabs $2,%rdx 00007FA618150068 48B90800000000000000 movabs $8,%rcx 00007FA618150072 49B88A22008000000000 movabs $0x8000_228A,%r8 00007FA61815007C FF9560040000 callq *0x460(%rbp) 00007FA618150082 483B8508000000 cmp 8(%rbp),%rax 00007FA618150089 0F8439000000 je 0x0000_7FA6_1815_00C8 00007FA61815008F E97BFFEA00 jmp 0x0000_7FA6_1900_000F 00007FA618150094 488BF5 mov %rbp,%rsi 00007FA618150097 488BFE mov %rsi,%rdi 00007FA61815009A 4881C7A8850000 add $0x85A8,%rdi 00007FA6181500A1 4803F9 add %rcx,%rdi 00007FA6181500A4 488B3F mov (%rdi),%rdi 00007FA6181500A7 4803FB add %rbx,%rdi 00007FA6181500AA 4881C700000080 add $0xFFFF_FFFF_8000_0000,%rdi 00007FA6181500B1 48B800000119A67F0000 movabs $0x7FA6_1901_0000,%rax 00007FA6181500BB 4803F8 add %rax,%rdi 00007FA6181500BE 488B3F mov (%rdi),%rdi 00007FA6181500C1 4889BD68000000 mov %rdi,0x68(%rbp) 00007FA6181500C8 E942FFEA00 jmp 0x0000_7FA6_1900_000F
- C.SDSPの変換結果
0000000080002288:0000000080002288 Hostcode 6622e42a : c.sdsp a0, 8(sp) label found 2 label found. offset = 94 replacement target is 46, data = 4a label found 2 label found. offset = c8 replacement target is 8b, data = 39 00007FA618160000 488B9518000000 mov 0x18(%rbp),%rdx 00007FA618160007 4881C208000000 add $8,%rdx 00007FA61816000E 488BDA mov %rdx,%rbx 00007FA618160011 4881E3FF0F0000 and $0xFFF,%rbx 00007FA618160018 488BCA mov %rdx,%rcx 00007FA61816001B 48C1E90C shr $0xC,%rcx 00007FA61816001F 4881E1FF0F0000 and $0xFFF,%rcx 00007FA618160026 48C1E103 shl $3,%rcx 00007FA61816002A 488BF5 mov %rbp,%rsi 00007FA61816002D 488BFE mov %rsi,%rdi 00007FA618160030 4881C7A8050000 add $0x5A8,%rdi 00007FA618160037 4803F9 add %rcx,%rdi 00007FA61816003A 48C1EA18 shr $0x18,%rdx 00007FA61816003E 488B3F mov (%rdi),%rdi 00007FA618160041 483BFA cmp %rdx,%rdi 00007FA618160044 0F844A000000 je 0x0000_7FA6_1816_0094 00007FA61816004A 48BF60E1C8DAFF7F0000 movabs $0x7FFF_DAC8_E160,%rdi 00007FA618160054 48BE0A00000000000000 movabs $0xA,%rsi 00007FA61816005E 48BA0200000000000000 movabs $2,%rdx 00007FA618160068 48B90800000000000000 movabs $8,%rcx 00007FA618160072 49B88822008000000000 movabs $0x8000_2288,%r8 00007FA61816007C FF9598040000 callq *0x498(%rbp) 00007FA618160082 483B8508000000 cmp 8(%rbp),%rax 00007FA618160089 0F8439000000 je 0x0000_7FA6_1816_00C8 00007FA61816008F E97BFFE900 jmp 0x0000_7FA6_1900_000F 00007FA618160094 488BF5 mov %rbp,%rsi 00007FA618160097 488BFE mov %rsi,%rdi 00007FA61816009A 4881C7A8850000 add $0x85A8,%rdi 00007FA6181600A1 4803F9 add %rcx,%rdi 00007FA6181600A4 488B3F mov (%rdi),%rdi 00007FA6181600A7 4803FB add %rbx,%rdi 00007FA6181600AA 4881C700000080 add $0xFFFF_FFFF_8000_0000,%rdi 00007FA6181600B1 48B800000119A67F0000 movabs $0x7FA6_1901_0000,%rax 00007FA6181600BB 4803F8 add %rax,%rdi 00007FA6181600BE 488B9558000000 mov 0x58(%rbp),%rdx 00007FA6181600C5 488917 mov %rdx,(%rdi) 00007FA6181600C8 E942FFE900 jmp 0x0000_7FA6_1900_000F
ここまででCompressed命令のテストパタンがすべて動作完了した。