目次: GCC
前回(2020年3月6日の日記参照)はレジスタ制約(register_constraints)を追加しました。これだけでは何もできませんので、今回はベクトルレジスタの定義を追加してみます。長そうなので分割して書きます。
RISC-Vには汎用レジスタ(GP_REGS)と浮動小数点レジスタ(FP_REGS)が既に定義されているため、それらを参考にします。
変更するファイルはgcc/config/riscv/riscv.c, riscv.hです。FP_REGくらいで検索すると、下記の関数、マクロに名前が見当たりますので、真似して追加します。(詳細は パッチファイルもご覧ください、内容の正しさは全く保証できませんけど)
// 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
初歩の初歩的な変更の割に必要な変更点はかなり多いです。どの変更が何に効くか完全にわかっていないので、合っているかわかりませんし、説明し難い変更もあります。後日、要調査ですね。
変更した中のriscv_regno_to_classをみるとFIRST_PSEUDO_REGISTERというマクロが出てきます。GCCはレジスタを2種類使い分けていて、レジスタ番号で区別できます。
正式な名前がわからない(※)ので、名付けは適当です。GCCはRTLのフェーズで命令の引数にレジスタを割り当てます。その際、いきなりメモリや物理レジスタを割り当てるのではなく、まず疑似レジスタを割り当てます。
疑似レジスタには数の制限がないので、最初の方の最適化パスで必要なだけ割り当てます。その後の最適化パスで物理レジスタや、メモリにうまく割り当てを考える二段構成になっています。
今回は32個の物理レジスタを足そうとしているので、FIRST_PSEUDO_REGISTERにも32個分だけズレてもらう必要があります。
今回の変更の要はREG_CLASS_CONTENTSです。このマクロの効き目についてはまた今度。
(※)GCCのヘンテコなマクロの意味を調べる際、GCC Internals(HTML版へのリンク)が大変参考になるのですが、この文書は用語の説明がイマイチ甘くて、正式な用語がわかりません。いつも困ります……。
< | 2020 | > | ||||
<< | < | 03 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 | - | - | - | - |
合計:
本日:
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2023.
Powered by PHP 8.2.18.
using GD 2.3.3(png support.)