コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2020年3月27日 >>> 2020年3月27日
link もっと後

2020年3月27日

GCCを調べる - その8-1 - ベクトルレジスタ定義を足す

目次: GCC

前回(2020年3月6日の日記参照)はレジスタ制約(register_constraints)を追加しました。これだけでは何もできませんので、今回はベクトルレジスタの定義を追加してみます。長そうなので分割して書きます。

RISC-Vには汎用レジスタ(GP_REGS)と浮動小数点レジスタ(FP_REGS)が既に定義されているため、それらを参考にします。

変更するファイルはgcc/config/riscv/riscv.c, riscv.hです。FP_REGくらいで検索すると、下記の関数、マクロに名前が見当たりますので、真似して追加します。(詳細はlink パッチファイルもご覧ください、内容の正しさは全く保証できませんけど)

レジスタ定義を追加する際に変更する箇所

// gcc/config/riscv/riscv.c

riscv_regno_to_class[FIRST_PSEUDO_REGISTER]  //32個レジスタを足す
riscv_hard_regno_nregs    //どのマシンモードでもレジスタを1つだけ使う、よくわからん、また今度調べる
riscv_hard_regno_mode_ok  //どのマシンモードでも許可する、よくわからん、また今度調べる
riscv_class_max_nregs     //どのクラスでもレジスタを1つだけ使う、よくわからん、また今度調べる


// gcc/config/riscv/riscv.h

FIRST_PSEUDO_REGISTER  //32個分ずれてもらう
FIXED_REGISTERS        //32個足す、今回は0にした、固定された役目(スタックポインタなど)はない
CALL_USED_REGISTERS    //32個足す、今回は0にした(関数呼び出しにより内容を破壊されない、s0 - s11と同じ扱い)

enum reg_class
#define REG_CLASS_NAMES     //新たなレジスタクラスを足す
#define REG_CLASS_CONTENTS  //後述する
#define REG_ALLOC_ORDER	    //レジスタの割当順、レジスタ番号で指定する
#define REGISTER_NAMES      //レジスタの名前
#define ADDITIONAL_REGISTER_NAMES

初歩の初歩的な変更の割に必要な変更点はかなり多いです。どの変更が何に効くか完全にわかっていないので、合っているかわかりませんし、説明し難い変更もあります。後日、要調査ですね。

GCCの2つのレジスタ

変更した中のriscv_regno_to_classをみるとFIRST_PSEUDO_REGISTERというマクロが出てきます。GCCはレジスタを2種類使い分けていて、レジスタ番号で区別できます。

  • 物理レジスタ: 0〜 (FIRST_PSEUDO_REGISTER - 1)
  • 疑似レジスタ(pseudo register): FIRST_PSEUDO_REGISTERより大きな値

正式な名前がわからない(※)ので、名付けは適当です。GCCはRTLのフェーズで命令の引数にレジスタを割り当てます。その際、いきなりメモリや物理レジスタを割り当てるのではなく、まず疑似レジスタを割り当てます。

疑似レジスタには数の制限がないので、最初の方の最適化パスで必要なだけ割り当てます。その後の最適化パスで物理レジスタや、メモリにうまく割り当てを考える二段構成になっています。

今回は32個の物理レジスタを足そうとしているので、FIRST_PSEUDO_REGISTERにも32個分だけズレてもらう必要があります。

今回の変更の要はREG_CLASS_CONTENTSです。このマクロの効き目についてはまた今度。

(※)GCCのヘンテコなマクロの意味を調べる際、GCC Internals(HTML版へのリンク)が大変参考になるのですが、この文書は用語の説明がイマイチ甘くて、正式な用語がわかりません。いつも困ります……。

編集者:すずき(2023/09/24 11:48)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2020年3月27日 >>> 2020年3月27日
link もっと後

管理用メニュー

link 記事を新規作成

<2020>
<<<03>>>
1234567
891011121314
15161718192021
22232425262728
293031----

最近のコメント5件

  • link 21年3月13日
    すずきさん (03/05 15:13)
    「あー、このプログラムがまずいんですね。ご...」
  • link 21年3月13日
    emkさん (03/05 12:44)
    「キャストでvolatileを外してアクセ...」
  • link 24年1月24日
    すずきさん (02/19 18:37)
    「簡単にできる方法はPowerShellの...」
  • link 24年1月24日
    KKKさん (02/19 02:30)
    「追伸です。\nネットで調べたらマイクロソ...」
  • link 24年1月24日
    KKKさん (02/19 02:25)
    「私もエラーで困ってます\n手動での回復パ...」

最近の記事3件

  • link 24年3月25日
    すずき (03/26 03:20)
    「[Might and Magic Book One TASのその後] 目次: Might and Magicファミコン版以前(...」
  • link 21年10月4日
    すずき (03/26 03:14)
    「[Might and Magicファミコン版 - まとめリンク] 目次: Might and Magicファミコン版TASに挑...」
  • link 24年3月19日
    すずき (03/20 02:52)
    「[モジュラージャックの規格] 古くは電話線で、今だとEthernetで良く見かけるモジュラージャックというコネクタとレセプタク...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 03/26 03:20