さらに小さなフロントエンドコードを目指して

  • (by K, 2015.12.01)

はじめに

  • これはrev3の構想のためのメモです。
    • 現時点での切り分け。
    • rev1: JITC型でとにかく作ってみたバージョン
    • rev2: rev1での経験を踏まえて今度はインタプリタ型でフロントエンドコードを改良。
    • rev3: さらにフロントエンドコードを改良。でもまだレンジコーダには手を出さない。予定。
    • rev4: ついに究極のレンジコーダ利用のフロントエンドコード。もはや読めない。

このページで何をやりたいのか

  • OSECPU-VMのアプリのフロントエンドコードの中には、様々な整数の定数が現れるが、rev2ではこれらをhh4の改造版でエンコードしている。かなりいいところまで行っていると思うけど、しかしまだ完全ではない気がする。場当たり的な感じがする。
  • それをもっと系統的に整理したい。
  • 関連:
    • rev2のフロントエンドバイトコードの仕様:page0107

分かっていること

  • 絶対値の小さな数値は頻出する。
  • 負の数は-1を除けばめったに表れない。
  • 2のベキ数を短くエンコードできると有利。
  • 10のベキ数も短くエンコードできると有利。
  • 四則演算ができるとさらに良い。
  • レジスタ参照も含める必要がある。
  • ビット列を見ると、1か0のどちらかが多い。均等に配分されることは珍しい。

案1

  • 4ビット形式(7通り):
    -1, 0, 1, 2, 3, 4, rep0
  • 8ビット形式(64通り):
    • 0および正の数(16):0~15
    • リピートレジスタ(8):rep0~7
    • 通常レジスタ(8):R00~0F
    • 負の数(8):-1~-8
    • 2のベキ数(8):16,32,64,128,256,512,2^n(n=10~),16^n(n=3~)
      • 2^nのnについて: 4ビット形式の特例: 10,11,13,14,15,17,pre-mul
    • 演算(6):ビット反転,積,和,差,xのy乗(x=3~,y=2~),10^(n=3~)
    • 未定(2):
      • R3Fを入れる?
  • 12ビット形式(512通り):
    • 0および正の数(384):0~383
    • 通常レジスタ(64):R00~3F
    • 負の数(32):-1~-32
    • 未定(32)
      • 割り算もほしい
  • 16ビット形式:
    • 0および正の数(3584):0~3583
    • 未定(512)
  • 24ビット形式以降では、0および正の数しかない。
  • 考察:
    • 8ビット形式で、リピートレジスタを半減させてしまったのは良い判断だっただろうか?
      • でもぶっちゃけ、rep8以降の出現率はかなり低そうだから、まあいいんじゃないかな?
    • 典型的な数のエンコード例:
      • 1024は12ビット、65536も12ビット
      • 100は12ビット、1000や1万も12ビット。1億まで12ビット。
      • 4億は(10^)(pre-mul)(8)(4)で8+4+4+4=20ビット。rev2と同点。
      • 192は普通に12ビット。
      • 384は普通に16ビット。

案2

  • pre-mulは利用頻度が高そうなのでデフォルトで適用する。これで4ビット減らせる。
    • pre-mulがデフォルトではない2のベキを未定に入れる。

案3

  • いや、ちょっとまて。こんなことがやりたかったわけじゃない。これじゃあrev2と大差ない(やり方的には)。
  • 数値ごとに利用頻度的なものをうまく定義して、それで上位64個を8ビット形式に割り振って、上位512個を12ビット形式に割り振って・・・みたいなことがやりたい。

こめんと欄


コメントお名前NameLink

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-12-02 (水) 08:06:28 (1143d)