ベクトル命令のインラインアセンブリについて。
拡張インラインアセンブリでは、オペランドの制約にベクトルレジスタを入れる場合の構文。 検索しても全く出てこなかったのだが、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