dup命令


はじめに

$ grep ^vdup /usr/lib/gcc/aarch64-linux-gnu/7.5.0/include/arm_neon.h  | cut -f -2 -d _ | sort | uniq -c
     14 vdup_lane
     14 vdup_laneq
     14 vdup_n
      3 vdupb_lane
      3 vdupb_laneq
      3 vdupd_lane
      3 vdupd_laneq
      4 vduph_lane
      4 vduph_laneq
     14 vdupq_lane
     14 vdupq_laneq
     14 vdupq_n
      3 vdups_lane
      3 vdups_laneq

dup命令

  • 何度も書いているが、末尾にqが付く命令は128bit命令幅、ついてないやつは64bit幅
  • 単純に同じデータを全レーンに設定する命令なので、基本的には難しくない

dup_n命令

  • 引数に取るのは単体のデータ(int8_tとかfloatとか)
  • それをベクトルレジスタ全体に同じ値をセットする
  • dupq_n命令だと128bit幅レジスタ全レーンに同じデータを設定する

dup_lane

  • 第1引数にベクトルレジスタ、第2引数にコンパイル時定数のインデックスを取る
  • なかなかに誤解を招きそうなのだが、qが付く場所次第で、以下の4通りの命令が存在する
    • vdup_lane : 64bit幅レジスタを返し、64bit幅レジスタを引数に取る
    • vdup_laneq : 64bit幅レジスタを返し、128bit幅レジスタを引数に取る
    • vudpq_lane : 128bit幅レジスタを返し、64bit幅レジスタを引数に取る
    • vdupq_laneq : 128bit幅レジスタを返し、128bit幅レジスタを引数に取る
命令 戻り値のbit幅 第1引数のbit幅
vdup_lane 64 64
vdup_laneq 64 128
vdupq_lane 128 64
vdupq_laneq 128 128
  • 引数が64bit幅で、戻り値が128bitってどういうことだよ、って感じだけれど、全レーン(全要素)に同じ値を設定するので、そういう命令もあり得る

使い方

  • 色変換フィルタみたいに同じ値を全画素に適用したい、という状況で、わざわざメモリ上に配置しなくても所望のベクトルを用意できるので便利
  • ちなみに単体の値を返す命令もあるが、要はvget命令のエイリアスなので、ここでは割愛

終わりに

  • 単一のデータを全レーンに設定するdup命令を紹介しました
  • 明日も手島の執筆予定で、何を書こう。。。。