2024.12.16-2024.12.22 学习内容

5 minute read

Published:

对上周没有补充的指令继续补充,即ldnp、ldp、ldr、ldur、stnp、stp、str、stur

1、InstType进一步补充

1.1 指令语义

  • ldnp

关于该指令,参考官方文档:LDNP (SIMD&FP)

在该指令中,可以使用的vector类型包括:

寄存器宽度
s32
d64
q128

而对于访存,只支持Offset addressing modes。

在Offset addressing modes下,根据opc字段(或SIMD寄存器的宽度)的不同,立即数有三种取值:

opc寄存器宽度imm
0032-bit-256 到 252 范围内 4 的倍数
0164-bit-512 到 504 范围内 8 的倍数
10128-bit-1024 到 1008 的 16 倍数

因此,该指令需要补充的代码为:

{Inst::kIdLdnp_v, InstType::get(REG_VEC_WID(32), REG_VEC_WID(32), BasePlusOffsetMemType::get(generateImmediates(-256, 252, 4)))},
{Inst::kIdLdnp_v, InstType::get(REG_VEC_WID(64), REG_VEC_WID(64), BasePlusOffsetMemType::get(generateImmediates(-512, 504, 8)))},
{Inst::kIdLdnp_v, InstType::get(REG_VEC_WID(128), REG_VEC_WID(128), BasePlusOffsetMemType::get(generateImmediates(-1024, 1008, 16)))},
  • ldp

关于该指令,参考官方文档:LDP (SIMD&FP)

在该指令中,可以使用的vector类型包括:

寄存器宽度
s32
d64
q128

而对于访存,支持Post-index、Pre-index和(Signed) Offset addressing modes。

在Offset addressing modes下,根据opc字段(决定SIMD寄存器的宽度)的不同,立即数有三种取值:

opc寄存器宽度imm
0032-bit-256 到 252 范围内 4 的倍数
0164-bit-512 到 504 范围内 8 的倍数
10128-bit-1024 到 1008 的 16 倍数

在Post-index和Pre-index模式下,根据opc字段(决定SIMD寄存器的宽度)的不同,立即数有三种取值:

opc寄存器宽度imm
0032-bit-256 到 252 范围内 4 的倍数
0164-bit-512 到 504 范围内 8 的倍数
10128-bit-1024 到 1008 的 16 倍数

因此,该指令需要补充的代码为:

// Post-index
{Inst::kIdLdp_v, InstType::get(REG_VEC_WID(32), REG_VEC_WID(32), PostIndexMemType::get(generateImmediates(-256, 252, 4)))},
{Inst::kIdLdp_v, InstType::get(REG_VEC_WID(64), REG_VEC_WID(64), PostIndexMemType::get(generateImmediates(-512, 504, 8)))},
{Inst::kIdLdp_v, InstType::get(REG_VEC_WID(128), REG_VEC_WID(128), PostIndexMemType::get(generateImmediates(-1024, 1008, 16)))},
// Pre-index
{Inst::kIdLdp_v, InstType::get(REG_VEC_WID(32), REG_VEC_WID(32), PreIndexMemType::get(generateImmediates(-256, 252, 4)))},
{Inst::kIdLdp_v, InstType::get(REG_VEC_WID(64), REG_VEC_WID(64), PreIndexMemType::get(generateImmediates(-512, 504, 8)))},
{Inst::kIdLdp_v, InstType::get(REG_VEC_WID(128), REG_VEC_WID(128), PreIndexMemType::get(generateImmediates(-1024, 1008, 16)))},
// Signed offset
{Inst::kIdLdp_v, InstType::get(REG_VEC_WID(32), REG_VEC_WID(32), BasePlusOffsetMemType::get(generateImmediates(-256, 252, 4)))},
{Inst::kIdLdp_v, InstType::get(REG_VEC_WID(64), REG_VEC_WID(64), BasePlusOffsetMemType::get(generateImmediates(-512, 504, 8)))},
{Inst::kIdLdp_v, InstType::get(REG_VEC_WID(128), REG_VEC_WID(128), BasePlusOffsetMemType::get(generateImmediates(-1024, 1008, 16)))},
  • ldr

关于该指令,参考官方文档:LDR (vector)LDR (immediate, SIMD&FP)

我们先暂时只补充第二种的InstType。

在该指令中,可以使用的vector类型包括:

寄存器宽度
b8
h16
s32
d64
q128

而对于访存,支持Post-index、Pre-index和 (Unsigned) Offset addressing modes。

在Offset addressing modes下,根据opc字段和size字段(共同决定SIMD寄存器的宽度)的不同,立即数有5种取值:

寄存器宽度pimm
8-bit0 到 4095
16-bit0 到 8190 范围内 2 的倍数
32-bit0 到 16380 范围内 4 的倍数
64-bit0 到 32760 范围内 8 的倍数
128-bit0 到 65520 范围内 16 的倍数

在Post-index和Pre-index模式下,立即数有5种取值:

寄存器宽度simm
/-256 到 255

因此,该指令需要补充的代码为:

// Post-index
{Inst::kIdLdr_v, InstType::get(REG_VEC_WID(8), PostIndexMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdLdr_v, InstType::get(REG_VEC_WID(16), PostIndexMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdLdr_v, InstType::get(REG_VEC_WID(32), PostIndexMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdLdr_v, InstType::get(REG_VEC_WID(64), PostIndexMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdLdr_v, InstType::get(REG_VEC_WID(128), PostIndexMemType::get(generateImmediates(-256, 255, 1)))},
// Pre-index
{Inst::kIdLdr_v, InstType::get(REG_VEC_WID(8), PreIndexMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdLdr_v, InstType::get(REG_VEC_WID(16), PreIndexMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdLdr_v, InstType::get(REG_VEC_WID(32), PreIndexMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdLdr_v, InstType::get(REG_VEC_WID(64), PreIndexMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdLdr_v, InstType::get(REG_VEC_WID(128),PreIndexMemType::get(generateImmediates(-256, 255, 1)))},
// Unsigned offset
{Inst::kIdLdr_v, InstType::get(REG_VEC_WID(8), BasePlusOffsetMemType::get(generateImmediates(0, 4095, 1)))},
{Inst::kIdLdr_v, InstType::get(REG_VEC_WID(16), BasePlusOffsetMemType::get(generateImmediates(0, 8190, 2)))},
{Inst::kIdLdr_v, InstType::get(REG_VEC_WID(32), BasePlusOffsetMemType::get(generateImmediates(0, 16380, 4)))},
{Inst::kIdLdr_v, InstType::get(REG_VEC_WID(64), BasePlusOffsetMemType::get(generateImmediates(0, 32760, 8)))},
{Inst::kIdLdr_v, InstType::get(REG_VEC_WID(128), BasePlusOffsetMemType::get(generateImmediates(0, 65520, 16)))},
  • ldur

关于该指令,参考官方文档:LDUR (SIMD&FP)

在该指令中,可以使用的vector类型包括:

寄存器宽度
b8
h16
s32
d64
q128

而对于访存,支持Offset addressing modes。

在Offset addressing模式下,立即数有1种取值:

寄存器宽度simm
/-256 到 255

因此,该指令需要补充的代码为:

// Signed offset
{Inst::kIdLdur_v, InstType::get(REG_VEC_WID(8), BasePlusOffsetMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdLdur_v, InstType::get(REG_VEC_WID(16), BasePlusOffsetMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdLdur_v, InstType::get(REG_VEC_WID(32), BasePlusOffsetMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdLdur_v, InstType::get(REG_VEC_WID(64), BasePlusOffsetMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdLdur_v, InstType::get(REG_VEC_WID(128), BasePlusOffsetMemType::get(generateImmediates(-256, 255, 1)))},
  • stnp

关于该指令,参考官方文档:STNP (SIMD&FP)

在该指令中,可以使用的vector类型包括:

寄存器宽度
s32
d64
q128

而对于访存,只支持Offset addressing modes。

在Offset addressing modes下,根据opc字段(或SIMD寄存器的宽度)的不同,立即数有三种取值:

opc寄存器宽度imm
0032-bit-256 到 252 范围内 4 的倍数
0164-bit-512 到 504 范围内 8 的倍数
10128-bit-1024 到 1008 的 16 倍数

因此,该指令需要补充的代码为:

{Inst::kIdStnp_v, InstType::get(REG_VEC_WID(32), REG_VEC_WID(32), BasePlusOffsetMemType::get(generateImmediates(-256, 252, 4)))},
{Inst::kIdStnp_v, InstType::get(REG_VEC_WID(64), REG_VEC_WID(64), BasePlusOffsetMemType::get(generateImmediates(-512, 504, 8)))},
{Inst::kIdStnp_v, InstType::get(REG_VEC_WID(128),REG_VEC_WID(128), BasePlusOffsetMemType::get(generateImmediates(-1024, 1008, 16)))},
  • stp

关于该指令,参考官方文档:STP (SIMD&FP)

在该指令中,可以使用的vector类型包括:

寄存器宽度
s32
d64
q128

而对于访存,支持Post-index、Pre-index和(Signed) Offset addressing modes。

在Offset addressing modes下,根据opc字段(决定SIMD寄存器的宽度)的不同,立即数有三种取值:

opc寄存器宽度imm
0032-bit-256 到 252 范围内 4 的倍数
0164-bit-512 到 504 范围内 8 的倍数
10128-bit-1024 到 1008 的 16 倍数

在Post-index和Pre-index模式下,根据opc字段(决定SIMD寄存器的宽度)的不同,立即数有三种取值:

opc寄存器宽度imm
0032-bit-256 到 252 范围内 4 的倍数
0164-bit-512 到 504 范围内 8 的倍数
10128-bit-1024 到 1008 的 16 倍数

因此,该指令需要补充的代码为:

// Post-index
{Inst::kIdStp_v, InstType::get(REG_VEC_WID(32), REG_VEC_WID(32), PostIndexMemType::get(generateImmediates(-256, 252, 4)))},
{Inst::kIdStp_v, InstType::get(REG_VEC_WID(64), REG_VEC_WID(64), PostIndexMemType::get(generateImmediates(-512, 504, 8)))},
{Inst::kIdStp_v, InstType::get(REG_VEC_WID(128),REG_VEC_WID(128), PostIndexMemType::get(generateImmediates(-1024, 1008, 16)))},
// Pre-index
{Inst::kIdStp_v, InstType::get(REG_VEC_WID(32), REG_VEC_WID(32), PreIndexMemType::get(generateImmediates(-256, 252, 4)))},
{Inst::kIdStp_v, InstType::get(REG_VEC_WID(64), REG_VEC_WID(64), PreIndexMemType::get(generateImmediates(-512, 504, 8)))},
{Inst::kIdStp_v, InstType::get(REG_VEC_WID(128),REG_VEC_WID(128), PreIndexMemType::get(generateImmediates(-1024, 1008, 16)))},
// Signed offset
{Inst::kIdStp_v, InstType::get(REG_VEC_WID(32), REG_VEC_WID(32), BasePlusOffsetMemType::get(generateImmediates(-256, 252, 4)))},
{Inst::kIdStp_v, InstType::get(REG_VEC_WID(64), REG_VEC_WID(64), BasePlusOffsetMemType::get(generateImmediates(-512, 504, 8)))},
{Inst::kIdStp_v, InstType::get(REG_VEC_WID(128),REG_VEC_WID(128), BasePlusOffsetMemType::get(generateImmediates(-1024, 1008, 16)))},
  • str

关于该指令,参考官方文档:STR (vector)STR (immediate, SIMD&FP)

这里也先只补充第二种类型

在该指令中,可以使用的vector类型包括:

寄存器宽度
b8
h16
s32
d64
q128

而对于访存,支持Post-index、Pre-index和 (Unsigned) Offset addressing modes。

在Offset addressing modes下,根据opc字段和size字段(共同决定SIMD寄存器的宽度)的不同,立即数有5种取值:

寄存器宽度pimm
8-bit0 到 4095
16-bit0 到 8190 范围内 2 的倍数
32-bit0 到 16380 范围内 4 的倍数
64-bit0 到 32760 范围内 8 的倍数
128-bit0 到 65520 范围内 16 的倍数

在Post-index和Pre-index模式下,立即数有5种取值:

寄存器宽度simm
/-256 到 255

因此,该指令需要补充的代码为:

// Post-index
{Inst::kIdStr_v, InstType::get(REG_VEC_WID(8), PostIndexMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdStr_v, InstType::get(REG_VEC_WID(16), PostIndexMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdStr_v, InstType::get(REG_VEC_WID(32), PostIndexMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdStr_v, InstType::get(REG_VEC_WID(64), PostIndexMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdStr_v, InstType::get(REG_VEC_WID(128), PostIndexMemType::get(generateImmediates(-256, 255, 1)))},
// Pre-index
{Inst::kIdStr_v, InstType::get(REG_VEC_WID(8), PreIndexMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdStr_v, InstType::get(REG_VEC_WID(16), PreIndexMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdStr_v, InstType::get(REG_VEC_WID(32), PreIndexMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdStr_v, InstType::get(REG_VEC_WID(64), PreIndexMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdStr_v, InstType::get(REG_VEC_WID(128), PreIndexMemType::get(generateImmediates(-256, 255, 1)))},
// Unsigned offset
{Inst::kIdStr_v, InstType::get(REG_VEC_WID(8), BasePlusOffsetMemType::get(generateImmediates(0, 4095, 1)))},
{Inst::kIdStr_v, InstType::get(REG_VEC_WID(16), BasePlusOffsetMemType::get(generateImmediates(0, 8190, 2)))},
{Inst::kIdStr_v, InstType::get(REG_VEC_WID(32), BasePlusOffsetMemType::get(generateImmediates(0, 16380, 4)))},
{Inst::kIdStr_v, InstType::get(REG_VEC_WID(64), BasePlusOffsetMemType::get(generateImmediates(0, 32760, 8)))},
{Inst::kIdStr_v, InstType::get(REG_VEC_WID(128), BasePlusOffsetMemType::get(generateImmediates(0, 65520, 16)))},
  • stur

关于该指令,参考官方文档:STUR (SIMD&FP)

在该指令中,可以使用的vector类型包括:

寄存器宽度
b8
h16
s32
d64
q128

而对于访存,支持Offset addressing modes。

在Offset addressing模式下,立即数有1种取值:

寄存器宽度simm
/-256 到 255

因此,该指令需要补充的代码为:

// Signed offset
{Inst::kIdStur_v, InstType::get(REG_VEC_WID(8), BasePlusOffsetMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdStur_v, InstType::get(REG_VEC_WID(16), BasePlusOffsetMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdStur_v, InstType::get(REG_VEC_WID(32), BasePlusOffsetMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdStur_v, InstType::get(REG_VEC_WID(64), BasePlusOffsetMemType::get(generateImmediates(-256, 255, 1)))},
{Inst::kIdStur_v, InstType::get(REG_VEC_WID(128), BasePlusOffsetMemType::get(generateImmediates(-256, 255, 1)))},