FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

拡張インラインアセンブリ構文におけるベクトルレジスタの指定方法について

ベクトル命令のインラインアセンブリについて。

拡張インラインアセンブリでは、オペランドの制約にベクトルレジスタを入れる場合の構文。 検索しても全く出てこなかったのだが、LLVMのフォーラムに書いてあった。

https://reviews.llvm.org/D98616?id=#2626093

GCC use vr for vector register and vm for vector mask register.

なるほど、テストしてみる。

      /* STEP0 */ asm volatile ("vle64.v   %0,(%1)":"=vr"(v_dx0):"r"(dx + vlmax * 0)); 
      /* STEP0 */ asm volatile ("vle64.v   %0,(%1)":"=vr"(v_dy0):"r"(dy + vlmax * 0));
      /* STEP0 */ asm volatile ("vfmacc.vf %0,%1,%2":"=vr"(v_dy0):"f"(a),"vr"(v_dx0));
      /* STEP0 */ asm volatile ("vse64.v   %0,(%1)":"=vr"(v_dy0):"r"(dy + vlmax * 0));
   10244:   02047407            vle64.v v8,(s0)
   10248:   02077607            vle64.v v12,(a4)
   1024c:   b2855457            vfmacc.vf   v8,fa0,v8

あれ、レジスタの読み取りと上書きに使用するレジスタはどのように指定するのだろう?

ああ、=vrではなく+vrだった。

      /* STEP0 */ asm volatile ("vfmacc.vf %0,%1,%2":"+vr"(v_dy0):"f"(a),"vr"(v_dx0));
   1024c:   b2855657            vfmacc.vf   v12,fa0,v8