FPGA開発日記

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

AArch64のSVEロード命令について調べる (LD1{B,SB,H,SH,W,SW,D}命令)

SVEのメモリアクセス命令についてまとめる

Gem5のコードを眺めながら、Aarch64のメモリアクセス命令にはどのようなコンフィグレーションがあるのかをまとめている。

まずAArch64のメモリアクセス命令の構造がよくわからん。いろいろあるがまずはリストアップしていきたい。

  • LD1B
    • メモリアクセスサイズ = 8-bit
    • 下の表の「要素数」はベクトルレジスタ長が128ビットとして計算
    • LD1SBも似ている。符号拡張するかどうかの違い
要素サイズ 素数 eoffの計算方法
Scalar plus immediate LD1B { .B }, /Z, [<Xn SP>{, #, MUL VL}] 8-bit 16 | addr = base + ((offset * elements) + elem_index)
LD1B { .H }, /Z, [<Xn SP>{, #, MUL VL}] 16-bit 8 | addr = base + ((offset * elements) + elem_index)
LD1B { .S }, /Z, [<Xn SP>{, #, MUL VL}] 32-bit 4 | addr = base + ((offset * elements) + elem_index)
LD1B { .D }, /Z, [<Xn SP>{, #, MUL VL}] 64-bit 2 | addr = base + ((offset * elements) + elem_index)
Scalar plus scalar LD1B { .B }, /Z, [<Xn SP>, ] 8-bit 16 | addr = base + (X[m] + elem_index)
LD1B { .H }, /Z, [<Xn SP>, ] 16-bit 8 | addr = base + (X[m] + elem_index)
LD1B { .S }, /Z, [<Xn SP>, ] 32-bit 4 | addr = base + (X[m] + elem_index)
LD1B { .D }, /Z, [<Xn SP>, ] 64-bit 2 | addr = base + (X[m] + elem_index)
Scalar plus vector LD1B { .B }, /Z, [<Xn SP>, .B, ] 8-bit 16 | addr = base + Elem[Z[m], elem_index, 8-bit]<7:0>
LD1B { .H }, /Z, [<Xn SP>, .H, ] 16-bit 8 | addr = base + Elem[Z[m], elem_index, 16-bit]<15:0>
LD1B { .S }, /Z, [<Xn SP>, .S, ] 32-bit 4 | addr = base + Elem[Z[m], elem_index, 32-bit]<31:0>
LD1B { .D }, /Z, [<Xn SP>, .D, ] 64-bit 2 | addr = base + Elem[Z[m], elem_index, 64-bit]<63:0>
Vector plus immediate LD1B { .S }, /Z, [.S{, #}] 32-bit 4 addr = Elem[base, elem_index, 32] + imm
LD1B { .D }, /Z, [.D{, #}] 64-bit 2 addr = Elem[base, elem_index, 64] + imm
  • LD1H
    • メモリアクセスサイズ = 16-bit
    • 下の表の「要素数」はベクトルレジスタ長が128ビットとして計算
    • LD1SHも似ている。符号拡張するかどうかの違い
要素サイズ 素数 eoffの計算方法
Scalar plus immediate LD1H { .H }, /Z, [<Xn SP>{, #, MUL VL}] 16-bit 8 | addr = base + ((offset * elements) + elem_index) * 2
LD1H { .S }, /Z, [<Xn SP>{, #, MUL VL}] 32-bit 4 | addr = base + ((offset * elements) + elem_index) * 2
LD1H { .D }, /Z, [<Xn SP>{, #, MUL VL}] 64-bit 2 | addr = base + ((offset * elements) + elem_index) * 2
Scalar plus scalar LD1H { .H }, /Z, [<Xn SP>, ] 16-bit 8 | addr = base + (X[m] + elem_index) * 2
LD1H { .S }, /Z, [<Xn SP>, ] 32-bit 4 | elem_index
LD1H { .D }, /Z, [<Xn SP>, ] 64-bit 2 | addr = base + (X[m] + elem_index) * 2
Scalar plus vector LD1H { .H }, /Z, [<Xn SP>, .H, ] 16-bit 8 | addr = base + Elem[Z[m], elem_index, 16-bit]<15:0>
LD1H { .S }, /Z, [<Xn SP>, .S, ] 32-bit 4 | addr = base + Elem[Z[m], elem_index, 32-bit]<31:0>
LD1H { .D }, /Z, [<Xn SP>, .D, ] 64-bit 2 | addr = base + Elem[Z[m], elem_index, 64-bit]<63:0>
Vector plus immediate LD1H { .S }, /Z, [.S{, #}] 32-bit 4 addr = Elem[base, elem_index, 32] + imm * 2
LD1H { .D }, /Z, [.D{, #}] 64-bit 2 addr = Elem[base, elem_index, 64] + imm * 2
  • LD1W
    • メモリアクセスサイズ = 32-bit
    • 下の表の「要素数」はベクトルレジスタ長が128ビットとして計算
    • LD1SWも似ている。符号拡張するかどうかの違い
要素サイズ 素数 eoffの計算方法
Scalar plus immediate LD1W { .S }, /Z, [<Xn SP>{, #, MUL VL}] 32-bit 4 | addr = base + ((offset * elements) + elem_index) * 4
LD1W { .D }, /Z, [<Xn SP>{, #, MUL VL}] 64-bit 2 | addr = base + ((offset * elements) + elem_index) * 4
Scalar plus scalar LD1W { .S }, /Z, [<Xn SP>, ] 32-bit 4 | addr = base + (X[m] + elem_index) * 4
LD1W { .D }, /Z, [<Xn SP>, ] 64-bit 2 | addr = base + (X[m] + elem_index) * 4
Scalar plus vector LD1W { .S }, /Z, [<Xn SP>, .S, ] 32-bit 4 | addr = base + Elem[Z[m], elem_index, 32-bit]<31:0>
LD1W { .D }, /Z, [<Xn SP>, .D, ] 64-bit 2 | addr = base + Elem[Z[m], elem_index, 64-bit]<63:0>
Vector plus immediate LD1W { .S }, /Z, [.S{, #}] 32-bit 4 addr = Elem[base, elem_index, 32] + imm * 4
LD1W { .D }, /Z, [.D{, #}] 64-bit 2 addr = Elem[base, elem_index, 64] + imm * 4
  • LD1D
    • メモリのアクセスサイズ = 64-bit
    • 下の表の「要素数」はベクトルレジスタ長が128ビットとして計算
    • LD1SWも似ている。符号拡張するかどうかの違い
要素サイズ 素数 eoffの計算方法
Scalar plus immediate LD1D { .D }, /Z, [<Xn SP>{, #, MUL VL}] 64-bit 2 | addr = base + ((offset * elements) + elem_index) * 8
Scalar plus scalar LD1D { .D }, /Z, [<Xn SP>, ] 64-bit 2 | addr = base + (X[m] + elem_index) * 8
Scalar plus vector LD1D { .D }, /Z, [<Xn SP>, .D, ] 64-bit 2 | addr = base + Elem[Z[m], elem_index, 64-bit]<63:0>
Vector plus immediate LD1D { .D }, /Z, [.D{, #}] 64-bit 2 addr = Elem[base, elem_index, 64] + imm * 8