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 |