Starfive VisonFive2(RISC-V SBC) で遊ぶ – その9 拡張命令を試す

RISC-V, VisionFive-2

StarFive VisionFive2 が RISC-V の bitmap拡張命令(Zba,Zbb)が使えるのだが、意外に知られていないようだ。 RVspace forumでも、拡張に関する質問があった。


VisionFive2のCPUは、Starfive U74-MC

/proc/cpuから、isaとuarchはわかる。VisionFive2で使われているのは、Starfive U74-MCコアである。しかし、ISAはrv64imafdcと表示されて、Z拡張の存在がわからない。私が試したところではBitmap拡張(zba,zbb)は存在する。RVspace forumの情報から、zicsrもありそうである。

$ cat /proc/cpuinfo
processor    : 0
hart        : 1
isa        : rv64imafdc
mmu        : sv39
uarch        : sifive,u74-mc



正式な文書を探したところ、Starfive U74-MCの説明とマニュアルが下記にあった。


マニュアルから拡張機能を探す

Starfive U74-MC マニュアルの6.8章がB拡張、6.9章がZicsr拡張の解説である。

6.8     B Extension: Bit Manipulation Instructions
6.8.1 Basic Bit Manipulation Instructions
6.8.2 Bit Permutation Instructions
6.8.3 Address Calculation Instructions
6.8.4 Add/Shift with Prefix Zero-Extend Instructions
6.8.5 Bit Manupulation Pseudoinstructions



マニュアルに書かれている命令は下記の通り。RISC-VのBitmap拡張は、Zba/Zbb/Zbc/Zbsの4つに分かれている。U74-MCは、このうち Zba/Zbb をサポートしているようだ。

CLZ,CTZ,CLZW,CTZW
CPOP,CPOPW,
ANDN,ORN,XORN,
MIN,MINU,MAX,MAXU,
SEXT.B,SEXT.H,
ROR,ROL,RORI,RORW,ROLW,RORIW,
SH1ADD,SH2ADD,SH3ADD,SH1ADD.UW,SH2ADD.UW,SH3ADD.UW,
ADD.UW,SLLI.UW,
ZEXT.H,REV8,ORC.B



Zbsは欲しかったなあ (もっと言えば、RVV拡張が欲しい)。


実際に試してみると、Zba/Zbbは実行されるが、Zbc/ZbsはIllegal instructionになる。

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

void test_bclr(int64_t a)
{
    int64_t c=0;
    int64_t b=random()&0x1f;
    printf("a=%ld,c=%ld\n",a,c);
    __asm__ __volatile__ ("bclr %0,%1,%2"
    :"=r" (c)
    :"r" (a),"r" (b));
    printf("a=%lx,b=%ld,cpop=%ld\n",a,b,c);
}

int main()
{
    int64_t a = random();
    test_bclr(a);
}

$ gcc -O -march=rv64imafdc_zba_zbb_zbc_zbs bclr.c
$ ./a.out
a=1804289383,c=0
Illegal instruction



Zba/Zbbの範囲でも、REV8が使えるので__bswap_64マクロが使えるし、色々と便利ではある。画面表示などのビット操作が多いプログラムを再コンパイルしたら少しは早くなるんじゃなかろうか。

RISC-V, VisionFive-2

Posted by ず@沖縄