RISC-Vターゲットのユーザーガイド¶
はじめに¶
RISC-Vターゲットは、RISC-V仕様のサポートされているバリエーションを実装するプロセッサのコード生成を提供します。これはllvm/lib/Target/RISCV
ディレクトリにあります。
仕様書¶
RISC-V仕様にはいくつかの改訂があります。LLVMは、標準RISC-V基本ISAおよびISA拡張機能の最新の承認済みバージョンを、実用的な差異をもって実装することを目指しています。最新の仕様は、https://github.com/riscv/riscv-isa-manual/releases/で確認できます。
公式のRISC-V International仕様ページも確認する価値がありますが、上記リンクの仕様よりも大幅に遅れる傾向があります。まだ統合されていない拡張機能のwikiを確認し、さらに、まだ承認されていない拡張機能のサポート(これらは実験的としてマークされます - 以下を参照)や、さまざまなベンダー固有の拡張機能のサポート(以下を参照)を行う場合があることに注意してください。
現在確認されている仕様からの差異は次のとおりです。
拡張機能が有効になっているかどうかに関係なく、zifencei、zicsr、zicntr、およびzihpmからの命令を無条件に許可します。仕様の以前のリビジョンにはこれらの命令が基本ISAに含まれており、既存のコードを壊さないようにこの動作を維持します。仕様の将来のリビジョンでこれらのオペコードが他の拡張機能に再利用された場合、この選択を再評価する必要があるかもしれないため、これに依存しないようにビルドシステムを移行することをお勧めします。
特定の拡張機能でゲーティングすることなく、CSRに名前を付けることを許可します。これは、zicsr、zicntr、およびzihpmだけでなく、すべてのCSR名に適用されます。
z*
、s*
、およびx*
で始まる拡張機能名の順序は、ユーザー指定のISA命名文字列(例:-march
)では強制されません。
現時点では、複数の仕様リビジョンのサポートを積極的に決定していません。将来のニーズの可能性は認識していますが、実際のハードウェアが出荷され、その後仕様に互換性のない変更が行われた具体的な例ができるまで、この処理に関する決定を積極的に延期します。
基本ISA¶
仕様では、5つの基本命令セット(RV32I、RV32E、RV64I、RV64E、RV128I)が定義されています。現在、LLVMはRV32IとRV64Iを完全にサポートしています。RV32EとRV64Eは、アセンブリベースのツールでのみサポートされています。RV128Iはサポートされていません。
ターゲットトリプルを指定するには
表 110 RISC-Vアーキテクチャ¶ アーキテクチャ
説明
riscv32
XLEN=32のRISC-V(つまり、RV32IまたはRV32E)
riscv64
XLEN=64のRISC-V(つまり、RV64IまたはRV64E)
EバリアントISA(例:RV32Iの代わりにRV32E)を選択するには、拡張機能e
を持つ基本アーキテクチャ文字列(例:riscv32
)を使用します。
プロファイル¶
サポートされているプロファイル名は、標準のISA命名文字列の代わりに-march
を使用して渡すことができます。現在サポートされているプロファイル
rvi20u32
rvi20u64
rva20u64
rva20s64
rva22u64
rva22s64
有効にする追加の拡張機能名を付加することもできます。たとえば、rva20u64_zicond
は、rva20u64
プロファイルに加えてzicond
拡張機能を有効にします。
-menable-experimental-extensions
(または他のツールでは同等のもの)が指定されない限り、まだ承認されていないプロファイルは使用できません。これは次のプロファイルに適用されます
rva23u64
rva23s64
rvb23u64
rvb23s64
rvm23u32
拡張機能¶
次の表は、批准されており、したがって仕様が確定した拡張機能のステータスの概要を示しています。関連する場合は、サポートに関する詳細な注記が続きます。
表 111 ステータスごとの批准済み拡張機能¶ 拡張機能
ステータス
A
サポート済み
B
サポート済み
C
サポート済み
D
サポート済み
F
サポート済み
E
サポート済み(注記を参照)
H
アセンブリサポート
M
サポート済み
Shcounterenw
アセンブリサポート(注記を参照)
Shgatpa
アセンブリサポート(注記を参照)
Shtvala
アセンブリサポート(注記を参照)
Shvsatpa
アセンブリサポート(注記を参照)
Shvstvala
アセンブリサポート(注記を参照)
Shvstvecd
アセンブリサポート(注記を参照)
Smaia
サポート済み
Smcdeleg
サポート済み
Smcsrind
サポート済み
Smepmp
サポート済み
Smstateen
アセンブリサポート
Ssaia
サポート済み
Ssccfg
サポート済み
Ssccptr
アセンブリサポート(注記を参照)
Sscofpmf
アセンブリサポート
Sscounterenw
アセンブリサポート(注記を参照)
Sscsrind
サポート済み
Ssqosid
アセンブリサポート
Ssstateen
アセンブリサポート(注記を参照)
Ssstrict
アセンブリサポート(注記を参照)
Sstc
アセンブリサポート
Sstvala
アセンブリサポート(注記を参照)
Sstvecd
アセンブリサポート(注記を参照)
Ssu64xl
アセンブリサポート(注記を参照)
Svade
アセンブリサポート(注記を参照)
Svadu
アセンブリサポート
Svbare
アセンブリサポート(注記を参照)
Svinval
アセンブリサポート
Svnapot
アセンブリサポート
Svpbmt
サポート済み
V
サポート済み
Za128rs
サポート済み(注記を参照)
Za64rs
サポート済み(注記を参照)
Zaamo
アセンブリサポート
Zabha
サポート済み
Zalrsc
アセンブリサポート
Zama16b
サポート済み(注記を参照)
Zawrs
アセンブリサポート
Zba
サポート済み
Zbb
サポート済み
Zbc
サポート済み
Zbkb
サポート済み(注記を参照)
Zbkc
サポート済み
Zbkx
サポート済み(注記を参照)
Zbs
サポート済み
Zca
サポート済み
Zcb
サポート済み
Zcd
サポート済み
Zcf
サポート済み
Zcmop
サポート済み
Zcmp
サポート済み
Zcmt
アセンブリサポート
Zdinx
サポート済み
Zfa
サポート済み
Zfbfmin
サポート済み
Zfh
サポート済み
Zfhmin
サポート済み
Zfinx
サポート済み
Zhinx
サポート済み
Zhinxmin
サポート済み
Zic64b
サポート済み(注記を参照)
Zicbom
アセンブリサポート
Zicbop
サポート済み
Zicboz
アセンブリサポート
Ziccamoa
サポート済み(注記を参照)
Ziccif
サポート済み(注記を参照)
Zicclsm
サポート済み(注記を参照)
Ziccrse
サポート済み(注記を参照)
Zicntr
(注記を参照)
Zicond
サポート済み
Zicsr
(注記を参照)
Zifencei
(注記を参照)
Zihintntl
サポート済み
Zihintpause
アセンブリサポート
Zihpm
(注記を参照)
Zimop
サポート済み
Zkn
サポート済み
Zknd
サポート済み(注記を参照)
Zkne
サポート済み(注記を参照)
Zknh
サポート済み(注記を参照)
Zksed
サポート済み(注記を参照)
Zksh
サポート済み(注記を参照)
Zk
サポート済み
Zkr
サポート済み
Zks
サポート済み
Zkt
サポート済み
Zmmul
サポート済み
Ztso
サポート済み
Zvbb
アセンブリサポート
Zvbc
アセンブリサポート
Zve32x
(部分的に)サポート
Zve32f
(部分的に)サポート
Zve64x
サポート済み
Zve64f
サポート済み
Zve64d
サポート済み
Zvfbfmin
サポート済み
Zvfbfwma
サポート済み
Zvfh
サポート済み
Zvkb
アセンブリサポート
Zvkg
アセンブリサポート
Zvkn
アセンブリサポート
Zvknc
アセンブリサポート
Zvkned
アセンブリサポート
Zvkng
アセンブリサポート
Zvknha
アセンブリサポート
Zvknhb
アセンブリサポート
Zvks
アセンブリサポート
Zvksc
アセンブリサポート
Zvksed
アセンブリサポート
Zvksg
アセンブリサポート
Zvksh
アセンブリサポート
Zvkt
アセンブリサポート
Zvl32b
(部分的に)サポート
Zvl64b
サポート済み
Zvl128b
サポート済み
Zvl256b
サポート済み
Zvl512b
サポート済み
Zvl1024b
サポート済み
Zvl2048b
サポート済み
Zvl4096b
サポート済み
Zvl8192b
サポート済み
Zvl16384b
サポート済み
Zvl32768b
サポート済み
Zvl65536b
サポート済み
- アセンブリサポート
LLVMは、アセンブリ内の関連する命令をサポートしています。すべてのアセンブリ関連ツール(例:アセンブラー、逆アセンブラー、llvm-objdumpなど)がサポートされています。コンパイラーとリンカーは拡張名を受け入れ、リンクされたバイナリには、名前付き拡張機能の使用を反映するための適切なELFフラグと属性が含まれます。
- サポート済み
コンパイラーで完全にサポートされています。これには、アセンブリサポートのすべてと、関連する場合は、命令のC言語イントリンシック、およびコンパイラーによる、関連する命令に変換できる慣用的なパターンを認識するためのパターンマッチングが含まれます。
E
RV32E/RV64Eおよびilp32e/lp64e ABIのサポートは実験的です。GCCでのilp32eの実装との互換性を保つために、可変長引数を渡すためにアラインされたレジスタを使用しません。さらに、長さが2*XLENの型については、スタックアラインメントを4バイトに設定します。
Zbkb
、Zbkx
これらの命令のパターンマッチングサポートは不完全です。
Zknd
、Zkne
、Zknh
、Zksed
、Zksh
パターンマッチングは存在しません。結果として、これらの命令はアセンブラーから、またはイントリンシック呼び出しを介してのみ使用できます。
Zve32x
、Zve32f
、Zvl32b
LLVMは現在、コンパイル中に最小VLEN(ベクトルレジスタ幅)を64ビットと想定しており、その結果、
Zve32x
とZve32f
はVLEN>=64の場合にのみサポートされます。アセンブリサポートにはこの制限はありません。
Zicntr
、Zicsr
、Zifencei
、Zihpm
基本I仕様のバージョン2.0と2.1の間で、選択された命令とCSRを基本ISAから削除する後方互換性のない変更が行われました。これらの命令は新しい拡張機能のセットにグループ化されましたが、基本ISAでは必須ではなくなりました。この変更は、仕様書(
zicntr
ビットとzihpm
ビットは言及されていません)の「ドキュメントバージョン20190608-Base-Ratifiedへの序文」で部分的に説明されています。LLVMは現在、基本仕様のバージョン2.1を実装しています。互換性を維持するために、これらの拡張機能の命令は-march
文字列に含まれていなくても受け入れられます。LLVMでは、-march
文字列での拡張機能の明示的な指定も許可しています。
Za128rs
,Za64rs
,Zama16b
,Zic64b
,Ziccamoa
,Ziccif
,Zicclsm
,Ziccrse
,Shcounterenvw
,Shgatpa
,Shtvala
,Shvsatpa
,Shvstvala
,Shvstvecd
,Ssccptr
,Sscounterenw
,Ssstateen
,Ssstrict
,Sstvala
,Sstvecd
,Ssu64xl
,Svade
,Svbare
これらの拡張機能は、RISC-V Profiles 仕様の一部として定義されています。これらは新しい機能を導入するものではなく、既存のハードウェア機能を記述するものです。
実験的な拡張機能¶
LLVM は、いくつかの実験的な拡張機能(様々な度合いで)をサポートしています。すべての実験的な拡張機能には、接頭辞として experimental-
が付いています。ツールチェーンのバージョン間の互換性は明示的に約束されておらず、一般のユーザーは、実験的な拡張機能が承認されるまで、利用しないことを強く推奨します。
実験的なサポートの主な目的は、実装の存在証明を提供し、大規模なコードベースに対して提案された拡張機能の価値を検証する取り組みを簡素化することにより、承認プロセスを支援することです。実験的な拡張機能は、承認されたステータスに移行するか、最終的には削除されることが予想されます。実験的な拡張機能を受け入れるかどうかは、現在、完全にケースバイケースで決定されています。提案したい場合は、隔週開催のRISC-V同期会議に参加することを強くお勧めします。
experimental-ssnpm
,experimental-smnpm
,experimental-smmpm
,experimental-sspm
,experimental-supm
LLVM は、v1.0.0-rc2 仕様を実装しています。
experimental-zacas
LLVM は、1.0 リリース仕様を実装しています。amocas.w は i32 cmpxchg に使用されます。amocas.d は RV64 上の i64 cmpxchg に使用されます。コンパイラは、ABI 互換性のために、RV32 で amocas.d、RV64 で amocas.q を生成しません。これらはアセンブラでのみ使用できます。ABI の問題が解決されるまで、この拡張機能は実験的なままになります。
experimental-zalasr
LLVM は、0.0.5 ドラフト仕様を実装しています。
experimental-zicfilp
,experimental-zicfiss
LLVM は、1.0 リリース仕様を実装しています。
experimental-zvbc32e
,experimental-zvkgs
LLVM は、0.7 リリース仕様を実装しています。
experimental-smctr
,experimental-ssctr
LLVM は、1.0-rc3 仕様を実装しています。
clang から実験的な拡張機能を使用するには、コマンドラインに -menable-experimental-extensions を追加し、使用している実験的な拡張機能の正確なバージョンを指定する必要があります。LLVM の内部開発ツール(例:llc、llvm-objdump、llvm-mc)で実験的な拡張機能を使用するには、拡張機能名の前に experimental- を付ける必要があります。内部ツールではバージョンを指定する必要はなく、clang では experimental- 接頭辞を含めないでください。
ベンダー拡張機能¶
ベンダー拡張機能とは、RISC-V International によって標準化されておらず、代わりにハードウェアベンダーによって定義された拡張機能のことです。ベンダー拡張機能という用語は、ボリューム I:RISC-V 非特権 ISA 仕様のセクション 1.3 での 非標準 拡張機能の定義とほぼ並行しています。特に、カスタム 拡張機能と 非準拠 拡張機能の両方を最終的に受け入れることを期待しています。
ベンダー拡張機能の包含は、ケースバイケースで検討されます。すべての提案は、議論のために隔週開催の RISCV 同期会議に持ち込まれる必要があります。考慮される可能性のある要因の一般的なアイデアについては、Clang のドキュメントを参照してください。
riscv-non-isa/riscv-toolchain-conventionsで説明されている命名規則に従うことを意図しています。この命名からの例外には、強力な動機が必要になります。
現在サポートされているベンダー拡張機能は次のとおりです。
XTHeadBa
LLVM は、Alibaba の T-HEAD によって指定された THeadBa (アドレス生成) ベンダー定義命令を実装しています。命令には、仕様に記載されているように、接頭辞 th. が付いています。
XTHeadBb
LLVM は、Alibaba の T-HEAD によって指定された THeadBb (基本ビット操作) ベンダー定義命令を実装しています。命令には、仕様に記載されているように、接頭辞 th. が付いています。
XTHeadBs
LLVM は、Alibaba の T-HEAD によって指定された THeadBs (シングルビット操作) ベンダー定義命令を実装しています。命令には、仕様に記載されているように、接頭辞 th. が付いています。
XTHeadCondMov
LLVM は、Alibaba の T-HEAD によって指定された THeadCondMov (条件付き移動) ベンダー定義命令を実装しています。命令には、仕様に記載されているように、接頭辞 th. が付いています。
XTHeadCmo
LLVM は、Alibaba の T-HEAD によって指定された THeadCmo (キャッシュ管理操作) ベンダー定義命令を実装しています。命令には、仕様に記載されているように、接頭辞 th. が付いています。
XTHeadFMemIdx
LLVM は、Alibaba の T-HEAD によって指定された THeadFMemIdx (浮動小数点用のインデックス付きメモリ操作) ベンダー定義命令を実装しています。命令には、仕様に記載されているように、接頭辞 th. が付いています。
XTheadMac
LLVM は、Alibaba の T-HEAD によって指定された XTheadMac (乗算累積命令) ベンダー定義命令を実装しています。命令には、仕様に記載されているように、接頭辞 th. が付いています。
XTHeadMemIdx
LLVM は、Alibaba の T-HEAD によって指定された THeadMemIdx (インデックス付きメモリ操作) ベンダー定義命令を実装しています。命令には、仕様に記載されているように、接頭辞 th. が付いています。
XTHeadMemPair
LLVM は、Alibaba の T-HEAD によって指定された THeadMemPair (2 つの GPR メモリ操作) ベンダー定義命令を実装しています。命令には、仕様に記載されているように、接頭辞 th. が付いています。
XTHeadSync
LLVM は、Alibaba の T-HEAD によって指定された THeadSync (マルチコア同期命令) ベンダー定義命令を実装しています。命令には、仕様に記載されているように、接頭辞 th. が付いています。
XTHeadVdot
LLVM は、Alibaba の T-HEAD による THeadV ファミリーのカスタム命令仕様のバージョン 1.0.0 を実装しています。すべての命令には、仕様と上記の riscv-toolchain-convention ドキュメントに記載されているように、接頭辞 th. が付いています。
XVentanaCondOps
LLVM は、Ventana Micro Systems による VTx ファミリーのカスタム命令仕様のバージョン 1.0.0 を実装しています。すべての命令には、仕様と上記の riscv-toolchain-convention ドキュメントに記載されているように、接頭辞 vt. が付いています。これらの命令は、現時点では riscv64 でのみ使用できます。
XSfvcp
LLVM は、SiFive による SiFive Vector Coprocessor Interface (VCIX) ソフトウェア仕様のバージョン 1.1.0 を実装しています。すべての命令には、仕様と上記の riscv-toolchain-convention ドキュメントに記載されているように、接頭辞 sf.vc. が付いています。
XSfvqmaccdod
,XSfvqmaccqoq
LLVM は、SiFive による SiFive Int8 行列乗算拡張仕様のバージョン 1.1.0 を実装しています。すべての命令には、上記にリンクされている仕様に記載されているように、接頭辞 sf. が付いています。
Xsfvfnrclipxfqf
LLVM は、SiFive による FP32 から int8 への範囲クリップ命令拡張仕様のバージョン 1.0.0 を実装しています。すべての命令には、上記にリンクされている仕様に記載されているように、接頭辞 sf. が付いています。
Xsfvfwmaccqqq
LLVM は、SiFive による 行列乗算累積命令拡張仕様のバージョン 1.0.0 を実装しています。すべての命令には、上記にリンクされている仕様に記載されているように、接頭辞 sf. が付いています。
XCVbitmanip
LLVM は、OpenHW Group による CORE-V ビット操作カスタム命令仕様のバージョン 1.0.0 を実装しています。すべての命令には、仕様に記載されているように、接頭辞 cv. が付いています。
XCVelw
LLVM は、OpenHW Group による CORE-V イベントロードカスタム命令仕様のバージョン 1.0.0 を実装しています。すべての命令には、仕様に記載されているように、接頭辞 cv. が付いています。これらの命令は、現時点では riscv32 でのみ使用できます。
XCVmac
LLVM は、OpenHW Group による CORE-V 乗算累積 (MAC) カスタム命令仕様のバージョン 1.0.0 を実装しています。すべての命令には、仕様に記載されているように、接頭辞 cv.mac が付いています。これらの命令は、現時点では riscv32 でのみ使用できます。
XCVmem
LLVM は、OpenHW Group による CORE-V ポストインクリメントロードおよびストアカスタム命令仕様のバージョン 1.0.0 を実装しています。すべての命令には、仕様に記載されているように、接頭辞 cv. が付いています。これらの命令は、現時点では riscv32 でのみ使用できます。
XCValu
LLVMは、Core-VによるCore-V ALUカスタム命令仕様のバージョン1.0.0を実装しています。すべての命令は、仕様に記載されているように、cv.というプレフィックスが付いています。これらの命令は、現時点ではriscv32でのみ利用可能です。
XCVsimd
LLVMは、OpenHW GroupによるCORE-V SIMDカスタム命令仕様のバージョン1.0.0を実装しています。すべての命令は、仕様に記載されているように、cv.というプレフィックスが付いています。
XCVbi
LLVMは、OpenHW GroupによるCORE-V即値分岐カスタム命令仕様のバージョン1.0.0を実装しています。すべての命令は、仕様に記載されているように、cv.というプレフィックスが付いています。これらの命令は、現時点ではriscv32でのみ利用可能です。
XSiFivecdiscarddlone
LLVMは、SiFiveによるSiFiveのsf.cdiscard.d.l1命令を実装しています。
XSiFivecflushdlone
LLVMは、SiFiveによるSiFiveのsf.cflush.d.l1命令を実装しています。
XSfcease
LLVMは、SiFiveによるSiFiveのsf.cease命令を実装しています。
Xwchc
LLVMは、WCH / Nanjing Qinheng Microelectronicsによる一部のQingKeコアに存在するカスタム圧縮オペコードを実装しています。ベンダーはこれらのオペコードを「XW」という名前で呼んでいます。
実験的なCイントリンシック¶
一部の拡張機能は実験的ではありませんが、その拡張機能のCイントリンシックはまだ実験的である場合があります。 clangからそのような拡張機能のCイントリンシックを使用するには、コマンドラインに-menable-experimental-extensionsを追加する必要があります。これは現在、次の拡張機能に適用されます。
Zvbb
Zvbc
Zvkb
Zvkg
Zvkn
Zvknc
Zvkned
Zvkng
Zvknha
Zvknhb
Zvks
Zvksc
Zvksed
Zvksg
Zvksh
Zvkt