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アーキテクチャ¶ アーキテクチャ
説明
riscv32XLEN=32のRISC-V(つまり、RV32IまたはRV32E)
riscv64XLEN=64のRISC-V(つまり、RV64IまたはRV64E)
EバリアントISA(例:RV32Iの代わりにRV32E)を選択するには、拡張機能eを持つ基本アーキテクチャ文字列(例:riscv32)を使用します。
プロファイル¶
サポートされているプロファイル名は、標準のISA命名文字列の代わりに-marchを使用して渡すことができます。現在サポートされているプロファイル
rvi20u32rvi20u64rva20u64rva20s64rva22u64rva22s64
有効にする追加の拡張機能名を付加することもできます。たとえば、rva20u64_zicondは、rva20u64プロファイルに加えてzicond拡張機能を有効にします。
-menable-experimental-extensions(または他のツールでは同等のもの)が指定されない限り、まだ承認されていないプロファイルは使用できません。これは次のプロファイルに適用されます
rva23u64rva23s64rvb23u64rvb23s64rvm23u32
拡張機能¶
次の表は、批准されており、したがって仕様が確定した拡張機能のステータスの概要を示しています。関連する場合は、サポートに関する詳細な注記が続きます。
表 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言語イントリンシック、およびコンパイラーによる、関連する命令に変換できる慣用的なパターンを認識するためのパターンマッチングが含まれます。
ERV32E/RV64Eおよびilp32e/lp64e ABIのサポートは実験的です。GCCでのilp32eの実装との互換性を保つために、可変長引数を渡すためにアラインされたレジスタを使用しません。さらに、長さが2*XLENの型については、スタックアラインメントを4バイトに設定します。
Zbkb、Zbkxこれらの命令のパターンマッチングサポートは不完全です。
Zknd、Zkne、Zknh、Zksed、Zkshパターンマッチングは存在しません。結果として、これらの命令はアセンブラーから、またはイントリンシック呼び出しを介してのみ使用できます。
Zve32x、Zve32f、Zvl32bLLVMは現在、コンパイル中に最小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-supmLLVM は、v1.0.0-rc2 仕様を実装しています。
experimental-zacasLLVM は、1.0 リリース仕様を実装しています。amocas.w は i32 cmpxchg に使用されます。amocas.d は RV64 上の i64 cmpxchg に使用されます。コンパイラは、ABI 互換性のために、RV32 で amocas.d、RV64 で amocas.q を生成しません。これらはアセンブラでのみ使用できます。ABI の問題が解決されるまで、この拡張機能は実験的なままになります。
experimental-zalasrLLVM は、0.0.5 ドラフト仕様を実装しています。
experimental-zicfilp,experimental-zicfissLLVM は、1.0 リリース仕様を実装しています。
experimental-zvbc32e,experimental-zvkgsLLVM は、0.7 リリース仕様を実装しています。
experimental-smctr,experimental-ssctrLLVM は、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で説明されている命名規則に従うことを意図しています。この命名からの例外には、強力な動機が必要になります。
現在サポートされているベンダー拡張機能は次のとおりです。
XTHeadBaLLVM は、Alibaba の T-HEAD によって指定された THeadBa (アドレス生成) ベンダー定義命令を実装しています。命令には、仕様に記載されているように、接頭辞 th. が付いています。
XTHeadBbLLVM は、Alibaba の T-HEAD によって指定された THeadBb (基本ビット操作) ベンダー定義命令を実装しています。命令には、仕様に記載されているように、接頭辞 th. が付いています。
XTHeadBsLLVM は、Alibaba の T-HEAD によって指定された THeadBs (シングルビット操作) ベンダー定義命令を実装しています。命令には、仕様に記載されているように、接頭辞 th. が付いています。
XTHeadCondMovLLVM は、Alibaba の T-HEAD によって指定された THeadCondMov (条件付き移動) ベンダー定義命令を実装しています。命令には、仕様に記載されているように、接頭辞 th. が付いています。
XTHeadCmoLLVM は、Alibaba の T-HEAD によって指定された THeadCmo (キャッシュ管理操作) ベンダー定義命令を実装しています。命令には、仕様に記載されているように、接頭辞 th. が付いています。
XTHeadFMemIdxLLVM は、Alibaba の T-HEAD によって指定された THeadFMemIdx (浮動小数点用のインデックス付きメモリ操作) ベンダー定義命令を実装しています。命令には、仕様に記載されているように、接頭辞 th. が付いています。
XTheadMacLLVM は、Alibaba の T-HEAD によって指定された XTheadMac (乗算累積命令) ベンダー定義命令を実装しています。命令には、仕様に記載されているように、接頭辞 th. が付いています。
XTHeadMemIdxLLVM は、Alibaba の T-HEAD によって指定された THeadMemIdx (インデックス付きメモリ操作) ベンダー定義命令を実装しています。命令には、仕様に記載されているように、接頭辞 th. が付いています。
XTHeadMemPairLLVM は、Alibaba の T-HEAD によって指定された THeadMemPair (2 つの GPR メモリ操作) ベンダー定義命令を実装しています。命令には、仕様に記載されているように、接頭辞 th. が付いています。
XTHeadSyncLLVM は、Alibaba の T-HEAD によって指定された THeadSync (マルチコア同期命令) ベンダー定義命令を実装しています。命令には、仕様に記載されているように、接頭辞 th. が付いています。
XTHeadVdotLLVM は、Alibaba の T-HEAD による THeadV ファミリーのカスタム命令仕様のバージョン 1.0.0 を実装しています。すべての命令には、仕様と上記の riscv-toolchain-convention ドキュメントに記載されているように、接頭辞 th. が付いています。
XVentanaCondOpsLLVM は、Ventana Micro Systems による VTx ファミリーのカスタム命令仕様のバージョン 1.0.0 を実装しています。すべての命令には、仕様と上記の riscv-toolchain-convention ドキュメントに記載されているように、接頭辞 vt. が付いています。これらの命令は、現時点では riscv64 でのみ使用できます。
XSfvcpLLVM は、SiFive による SiFive Vector Coprocessor Interface (VCIX) ソフトウェア仕様のバージョン 1.1.0 を実装しています。すべての命令には、仕様と上記の riscv-toolchain-convention ドキュメントに記載されているように、接頭辞 sf.vc. が付いています。
XSfvqmaccdod,XSfvqmaccqoqLLVM は、SiFive による SiFive Int8 行列乗算拡張仕様のバージョン 1.1.0 を実装しています。すべての命令には、上記にリンクされている仕様に記載されているように、接頭辞 sf. が付いています。
XsfvfnrclipxfqfLLVM は、SiFive による FP32 から int8 への範囲クリップ命令拡張仕様のバージョン 1.0.0 を実装しています。すべての命令には、上記にリンクされている仕様に記載されているように、接頭辞 sf. が付いています。
XsfvfwmaccqqqLLVM は、SiFive による 行列乗算累積命令拡張仕様のバージョン 1.0.0 を実装しています。すべての命令には、上記にリンクされている仕様に記載されているように、接頭辞 sf. が付いています。
XCVbitmanipLLVM は、OpenHW Group による CORE-V ビット操作カスタム命令仕様のバージョン 1.0.0 を実装しています。すべての命令には、仕様に記載されているように、接頭辞 cv. が付いています。
XCVelwLLVM は、OpenHW Group による CORE-V イベントロードカスタム命令仕様のバージョン 1.0.0 を実装しています。すべての命令には、仕様に記載されているように、接頭辞 cv. が付いています。これらの命令は、現時点では riscv32 でのみ使用できます。
XCVmacLLVM は、OpenHW Group による CORE-V 乗算累積 (MAC) カスタム命令仕様のバージョン 1.0.0 を実装しています。すべての命令には、仕様に記載されているように、接頭辞 cv.mac が付いています。これらの命令は、現時点では riscv32 でのみ使用できます。
XCVmemLLVM は、OpenHW Group による CORE-V ポストインクリメントロードおよびストアカスタム命令仕様のバージョン 1.0.0 を実装しています。すべての命令には、仕様に記載されているように、接頭辞 cv. が付いています。これらの命令は、現時点では riscv32 でのみ使用できます。
XCValuLLVMは、Core-VによるCore-V ALUカスタム命令仕様のバージョン1.0.0を実装しています。すべての命令は、仕様に記載されているように、cv.というプレフィックスが付いています。これらの命令は、現時点ではriscv32でのみ利用可能です。
XCVsimdLLVMは、OpenHW GroupによるCORE-V SIMDカスタム命令仕様のバージョン1.0.0を実装しています。すべての命令は、仕様に記載されているように、cv.というプレフィックスが付いています。
XCVbiLLVMは、OpenHW GroupによるCORE-V即値分岐カスタム命令仕様のバージョン1.0.0を実装しています。すべての命令は、仕様に記載されているように、cv.というプレフィックスが付いています。これらの命令は、現時点ではriscv32でのみ利用可能です。
XSiFivecdiscarddloneLLVMは、SiFiveによるSiFiveのsf.cdiscard.d.l1命令を実装しています。
XSiFivecflushdloneLLVMは、SiFiveによるSiFiveのsf.cflush.d.l1命令を実装しています。
XSfceaseLLVMは、SiFiveによるSiFiveのsf.cease命令を実装しています。
XwchcLLVMは、WCH / Nanjing Qinheng Microelectronicsによる一部のQingKeコアに存在するカスタム圧縮オペコードを実装しています。ベンダーはこれらのオペコードを「XW」という名前で呼んでいます。
実験的なCイントリンシック¶
一部の拡張機能は実験的ではありませんが、その拡張機能のCイントリンシックはまだ実験的である場合があります。 clangからそのような拡張機能のCイントリンシックを使用するには、コマンドラインに-menable-experimental-extensionsを追加する必要があります。これは現在、次の拡張機能に適用されます。
ZvbbZvbcZvkbZvkgZvknZvkncZvknedZvkngZvknhaZvknhbZvksZvkscZvksedZvksgZvkshZvkt
