2024.12.16-2024.12.22 学习内容
Published:
对上周没有补充的指令继续补充,即ldnp、ldp、ldr、ldur、stnp、stp、str、stur
1、InstType进一步补充
1.1 指令语义
- ldnp
关于该指令,参考官方文档:LDNP (SIMD&FP)
在该指令中,可以使用的vector
类型包括:
寄存器 | 宽度 |
---|---|
s | 32 |
d | 64 |
q | 128 |
而对于访存,只支持Offset addressing modes。
在Offset addressing modes下,根据opc字段(或SIMD寄存器的宽度)的不同,立即数有三种取值:
opc | 寄存器宽度 | imm |
---|---|---|
00 | 32-bit | -256 到 252 范围内 4 的倍数 |
01 | 64-bit | -512 到 504 范围内 8 的倍数 |
10 | 128-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
类型包括:
寄存器 | 宽度 |
---|---|
s | 32 |
d | 64 |
q | 128 |
而对于访存,支持Post-index、Pre-index和(Signed) Offset addressing modes。
在Offset addressing modes下,根据opc字段(决定SIMD寄存器的宽度)的不同,立即数有三种取值:
opc | 寄存器宽度 | imm |
---|---|---|
00 | 32-bit | -256 到 252 范围内 4 的倍数 |
01 | 64-bit | -512 到 504 范围内 8 的倍数 |
10 | 128-bit | -1024 到 1008 的 16 倍数 |
在Post-index和Pre-index模式下,根据opc字段(决定SIMD寄存器的宽度)的不同,立即数有三种取值:
opc | 寄存器宽度 | imm |
---|---|---|
00 | 32-bit | -256 到 252 范围内 4 的倍数 |
01 | 64-bit | -512 到 504 范围内 8 的倍数 |
10 | 128-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
类型包括:
寄存器 | 宽度 |
---|---|
b | 8 |
h | 16 |
s | 32 |
d | 64 |
q | 128 |
而对于访存,支持Post-index、Pre-index和 (Unsigned) Offset addressing modes。
在Offset addressing modes下,根据opc字段和size字段(共同决定SIMD寄存器的宽度)的不同,立即数有5种取值:
寄存器宽度 | pimm |
---|---|
8-bit | 0 到 4095 |
16-bit | 0 到 8190 范围内 2 的倍数 |
32-bit | 0 到 16380 范围内 4 的倍数 |
64-bit | 0 到 32760 范围内 8 的倍数 |
128-bit | 0 到 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
类型包括:
寄存器 | 宽度 |
---|---|
b | 8 |
h | 16 |
s | 32 |
d | 64 |
q | 128 |
而对于访存,支持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
类型包括:
寄存器 | 宽度 |
---|---|
s | 32 |
d | 64 |
q | 128 |
而对于访存,只支持Offset addressing modes。
在Offset addressing modes下,根据opc字段(或SIMD寄存器的宽度)的不同,立即数有三种取值:
opc | 寄存器宽度 | imm |
---|---|---|
00 | 32-bit | -256 到 252 范围内 4 的倍数 |
01 | 64-bit | -512 到 504 范围内 8 的倍数 |
10 | 128-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
类型包括:
寄存器 | 宽度 |
---|---|
s | 32 |
d | 64 |
q | 128 |
而对于访存,支持Post-index、Pre-index和(Signed) Offset addressing modes。
在Offset addressing modes下,根据opc字段(决定SIMD寄存器的宽度)的不同,立即数有三种取值:
opc | 寄存器宽度 | imm |
---|---|---|
00 | 32-bit | -256 到 252 范围内 4 的倍数 |
01 | 64-bit | -512 到 504 范围内 8 的倍数 |
10 | 128-bit | -1024 到 1008 的 16 倍数 |
在Post-index和Pre-index模式下,根据opc字段(决定SIMD寄存器的宽度)的不同,立即数有三种取值:
opc | 寄存器宽度 | imm |
---|---|---|
00 | 32-bit | -256 到 252 范围内 4 的倍数 |
01 | 64-bit | -512 到 504 范围内 8 的倍数 |
10 | 128-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
类型包括:
寄存器 | 宽度 |
---|---|
b | 8 |
h | 16 |
s | 32 |
d | 64 |
q | 128 |
而对于访存,支持Post-index、Pre-index和 (Unsigned) Offset addressing modes。
在Offset addressing modes下,根据opc字段和size字段(共同决定SIMD寄存器的宽度)的不同,立即数有5种取值:
寄存器宽度 | pimm |
---|---|
8-bit | 0 到 4095 |
16-bit | 0 到 8190 范围内 2 的倍数 |
32-bit | 0 到 16380 范围内 4 的倍数 |
64-bit | 0 到 32760 范围内 8 的倍数 |
128-bit | 0 到 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
类型包括:
寄存器 | 宽度 |
---|---|
b | 8 |
h | 16 |
s | 32 |
d | 64 |
q | 128 |
而对于访存,支持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)))},