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バイトに設定します。

ZbkbZbkx

これらの命令のパターンマッチングサポートは不完全です。

ZkndZkneZknhZksedZksh

パターンマッチングは存在しません。結果として、これらの命令はアセンブラーから、またはイントリンシック呼び出しを介してのみ使用できます。

Zve32xZve32fZvl32b

LLVMは現在、コンパイル中に最小VLEN(ベクトルレジスタ幅)を64ビットと想定しており、その結果、Zve32xZve32fはVLEN>=64の場合にのみサポートされます。アセンブリサポートにはこの制限はありません。

ZicntrZicsrZifenceiZihpm

基本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 の内部開発ツール(例:llcllvm-objdumpllvm-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