FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Binary Translation型エミュレータを作る(Compressed命令の実装3)

Binary Translation型エミュレータを作る(Compressed命令の実装3)

前回Compressed命令のフレームワークは完成したので後はひたすら命令を追加していくだけとなる。メモリアクセス命令の実装を行った。

メモリアクセス命令については、ソースオペランドがSP固定のような命令が定義されているので、やはりレジスタオペランドの部分だけ注意しながらメモリアクセスのためのTCGを生成していく。

f:id:msyksphinz:20201126235755p:plain
  • 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命令のテストパタンがすべて動作完了した。