历史上的今天
今天是:2025年01月20日(星期一)
2020年01月20日 | 从编译器源码中提取ARMv8的指令编码
2020-01-20 来源:eefocus
问题1:提取ARMv8的指令编码
答:ARMv8指令的opcode可以在支持ARMv8的编译器binutils中找到,该工具能在网上找到,见参考资料[1],或者在[1]中搜索aarch64_opcode_table。
为了说明指令编码细节,现将网页中部分内容摘录如下:
1208 struct aarch64_opcode aarch64_opcode_table[] =
1209 {
1210 /* Add/subtract (with carry). */
1211 {"adc", 0x1a000000, 0x7fe0fc00, addsub_carry, 0, CORE, OP3 (Rd, Rn, Rm), QL_I3SAMER, F_SF},
1212 {"adcs", 0x3a000000, 0x7fe0fc00, addsub_carry, 0, CORE, OP3 (Rd, Rn, Rm), QL_I3SAMER, F_SF},
以上结构体中的每一项对应某条指令的操作码等信息,其中aarch64_opcode结构体(见参考文献[2])在,内容摘录如下:
structaarch64_opcode
{
/*The name of the mnemonic. */
const char *name;
/*The opcode itself. Those bits which willbe filled in with operands are zeroes. */
aarch64_insn opcode;
/*The opcode mask. This is used by thedisassembler. This is a mask containingones indicating those bits which must match the opcode field, and zeroesindicating those bits which need not match (and are presumably filled in byoperands). */
aarch64_insn mask;
/* Instruction class. */
enum aarch64_insn_class iclass;
/*Enumerator identifier. */
enum aarch64_op op;
/*Which architecture variant provides this instruction. */
const aarch64_feature_set *avariant;
/*An array of operand codes. Each code isan index into the operand table. Theyappear in the order which the operands must appear in assembly code, and are terminatedby a zero. */
enum aarch64_opnd operands[AARCH64_MAX_OPND_NUM];
/*A list of operand qualifier code sequence. Each operand qualifier code qualifies the corresponding operandcode. Each operand qualifier sequencespecifies a valid opcode variant and related constraint on operands. */
aarch64_opnd_qualifier_seq_t qualifiers_list[AARCH64_MAX_QLF_SEQ_NUM];
/*Flags providing information about this instruction */
uint32_t flags;
}
按照以上信息解释aarch64_opcode_table中的结构体如下表:

1:Aarch64-opc.c中有关于指令位域的定义。
const aarch64_field fields[] =
{
{ 0, 0 }, /*NIL. */
{ 0, 4 }, /*cond2: condition in truly conditional-executed inst. */
{ 0, 4 }, /*nzcv: flag bit specifier, encoded in the "nzcv" field. */
{ 5, 5 }, /*defgh: d:e:f:g:h bits in AdvSIMD modified immediate. */
{16, 3 }, /*abc: a:b:c bits in AdvSIMD modified immediate. */
{ 5, 19 }, /* imm19: e.g. in CBZ. */
{ 5, 19 }, /* immhi: e.g. in ADRP. */
{29, 2 }, /*immlo: e.g. in ADRP. */
{22, 2 }, /*size: in most AdvSIMD and floating-point instructions. */
{10, 2 }, /*vldst_size: size field in the AdvSIMD load/store inst. */
{29, 1 }, /*op: in AdvSIMD modified immediate instructions. */
{30, 1 }, /*Q: in most AdvSIMD instructions. */
{ 0, 5 }, /*Rt: in load/store instructions. */
{ 0, 5 }, /*Rd: in many integer instructions. */
{ 5, 5 }, /*Rn: in many integer instructions. */
{10, 5 }, /*Rt2: in load/store pair instructions. */
{10, 5 }, /*Ra: in fp instructions. */
{ 5, 3 }, /*op2: in the system instructions. */
{ 8, 4 }, /*CRm: in the system instructions. */
{12, 4 }, /*CRn: in the system instructions. */
{16, 3 }, /*op1: in the system instructions. */
{19, 2 }, /*op0: in the system instructions. */
{10, 3 }, /*imm3: in add/sub extended reg instructions. */
{12, 4 }, /*cond: condition flags as a source operand. */
{12, 4 }, /*opcode: in advsimd load/store instructions. */
{12, 4 }, /*cmode: in advsimd modified immediate instructions. */
{13, 3 }, /*asisdlso_opcode: opcode in advsimd ld/st single element. */
{13, 2 }, /*len: in advsimd tbl/tbx instructions. */
{16, 5 }, /*Rm: in ld/st reg offset and some integer inst. */
{16, 5 }, /*Rs: in load/store exclusive instructions. */
{13, 3 }, /*option: in ld/st reg offset + add/sub extended reg inst. */
{12, 1 }, /*S: in load/store reg offset instructions. */
{21, 2 }, /*hw: in move wide constant instructions. */
{22, 2 }, /*opc: in load/store reg offset instructions. */
{23, 1 }, /*opc1: in load/store reg offset instructions. */
{22, 2 }, /*shift: in add/sub reg/imm shifted instructions. */
{22, 2 }, /*type: floating point type field in fp data inst. */
{30, 2 }, /*ldst_size: size field in ld/st reg offset inst. */
{10, 6 }, /*imm6: in add/sub reg shifted instructions. */
{11, 4 }, /*imm4: in advsimd ext and advsimd ins instructions. */
{16, 5 }, /*imm5: in conditional compare (immediate) instructions. */
{15, 7 }, /*imm7: in load/store pair pre/post index instructions. */
{13, 8 }, /*imm8: in floating-point scalar move immediate inst. */
{12, 9 }, /*imm9: in load/store pre/post index instructions. */
{10, 12 }, /* imm12: in ld/stunsigned imm or add/sub shifted inst. */
{ 5, 14 }, /* imm14: in test bit and branch instructions. */
{ 5, 16 }, /* imm16: in exception instructions. */
{ 0, 26 }, /* imm26: in unconditional branch instructions. */
{ 10, 6 }, /* imms: in bitfield andlogical immediate instructions. */
{16, 6 }, /*immr: in bitfield and logical immediate instructions. */
{16, 3 }, /*immb: in advsimd shift by immediate instructions. */
{19, 4 }, /*immh: in advsimd shift by immediate instructions. */
{22, 1 }, /*N: in logical (immediate) instructions. */
{11, 1 }, /*index: in ld/st inst deciding the pre/post-index. */
{24, 1 }, /*index2: in ld/st pair inst deciding the pre/post-index. */
{31, 1 }, /*sf: in integer data processing instructions. */
{11, 1 }, /*H: in advsimd scalar x indexed element instructions. */
{21, 1 }, /*L: in advsimd scalar x indexed element instructions. */
{20, 1 }, /*M: in advsimd scalar x indexed element instructions. */
{31, 1 }, /*b5: in the test bit and branch instructions. */
{19, 5 }, /*b40: in the test bit and branch instructions. */
{10, 6 }, /*scale: in the fixed-point scalar to fp converting inst. */
};
2、函数aarch64_opcode_encode用于将操作数插入opcode中
参考资料
[1] ARMv8的编译器binutils,结构体aarch64_opcode_table定义见line 1208
http://kernel.ubuntu.com/git?p=jk/arm64/binutils.git;a=blob;f=opcodes/aarch64-tbl.h;h=d360b1406718257da86050f5b3a760cd02196250;hb=aarch64
[2] 结构体aarch64_opcode定义,line451
http://kernel.ubuntu.com/git?p=jk/arm64/binutils.git;a=blob;f=include/opcode/aarch64.h;h=98529954ea098349eb16572d4915f4edbd2e7b5d;hb=aarch64
[3] 《ARMv8 InstructionSet Overview 》page11
下一篇:关于ARMv8指令的几个问题
史海拾趣
|
加拿大一家企业最近推出可取代现有汽车液晶显示器的显示系统。该系统在仪表盘内部设置小型投影机,可以向整个仪表盘投射内容并显示,既可使画面尺寸大型化,又可在仪表盘之类的曲面上显示。另外,如只需改变投影图像,就能更改仪表盘的外形,以满足 ...… 查看全部问答> |
|
请帮忙推荐一款元器件I-V曲线测试仪,用作手机领域电子器件的失效分析用,要求价格适中。 我们工厂现在用的是Sony 370A programmable curve tracer,我需要与之功能类似的I-V曲线测试仪。 我的邮箱为liuping_davy@yahoo.com.cn 谢谢大家。 [ 本 ...… 查看全部问答> |
|
看到坛子里正在带着大家做电子钟,看到了一个博客,写的很清晰,引用过来供大家参考: LED3216电子钟是由LED3216点阵显示系统升级过来的,在这个过程中硬件电路也有过几次变动,如果不是跟着我一起升级过来的爱好者, ...… 查看全部问答> |
|
这是我找到的一些信息,供大家参考下~~~~ 日前,德州仪器 (TI) 宣布推出业界最低功耗 6 核 DSP,该款 TMS320C6472 器件旨在满足要求极低功耗的处理密集型应用的需求。此外,为了更便捷、更经济地评估 C6472 器件的性能,TI 还同步推出了一款多核处 ...… 查看全部问答> |
|
需要一些提示! 因为对数据的传输要求高! 我是利用SPI 来实现向设备写数据的,而且写数据时在设备触发的IST中的! 我想用DMA的方式来做! 【平台】 2440 wince5.0… 查看全部问答> |
|
急需compactPCI 相关规范,尤其compactPCI hot swap specification 哪个好心人给发一份吧, 邮箱:dashu124@yahoo.com.cn QQ: 277642914… 查看全部问答> |
|
请教各位大侠,如何快速地利用板子上已有的+5V和+12V产生-5v和-12v电压? 采用什么芯片或者电路构建比较简单合理呢? 补充: -12v负电压没什么要求,只要引到LF353的4脚给他做负电源就行了~ 板子上的+5v和+12v是通过PC104总线 ...… 查看全部问答> |
|
—地下停车场LED智能灯应用及前景展望 经过数年的理论积淀、技术研发及产品推广,华威凯德照明科技(北京)有限公司在半导体照明领域取得了显著成绩。公司率先提出的“按需照明”理念已为业内专家、同行及社会各界广泛接受,以地下停车场LED智能 ...… 查看全部问答> |




