用于指令描述的伪代码

时间:2010-05-24 14:55:34

标签: c++ c

我只是想弄清楚用C-like伪代码描述两个简单指令的最佳和最短方法。提取指令定义如下:

extract rd, rs, imm

该指令从32位源寄存器rs和中提取相应的字节 在目的地登记册中证明它是对的。该字节由imm指定,因此 可以取值0(对于最低有效字节)和3(对于最高有效字节)。

rd = 0x0;  // zero-extend result, ie to make sure bits 31 to 8 are set to zero in the result
rd = (rs && (0xff << imm)) >> imm; // this extracts the approriate byte and stores it in rd

插入指令可以被视为反向操作,它从源寄存器rs获取右对齐字节并将其存放在相应的字节中。 目的地登记册;再次,这个字节由imm

的值决定
tmp = 0x0 XOR (rs << imm)) // shift the byte to the appropriate byte determined by imm
rd = (rd && (0x00 << imm)) // set appropriate byte to zero in rd
rd = rd XOR tmp            // XOR the byte into the destination register

这看起来有点可怕,所以我想知道是否有更优雅的方式 用C样风格描述这个bahaviour;)

非常感谢, 克劳斯

2 个答案:

答案 0 :(得分:5)

提取物:

rd = (rs >> (imm * 8)) & 0xff

插入:

rd = (rd & ~(0xff << (imm * 8))) | ((rs & 0xff) << (imm * 8))  

答案 1 :(得分:0)

首先,我认为你的意思是'&amp;' (位操作符AND)而不是'&amp;&amp;' (逻辑AND)。 C中的XOR位运算符是'^'

rd = 0x0;
rd = (rs & (0xff << imm)) >> imm;

tmp = 0x0 ^ (rs << imm));
rd = (rd & (0x00 << imm));
rd = rd ^ tmp;

其次,做一些事情比较简单:

rd = (rs >> (imm * 8)) & 0xFF;

和第二部分:

rd = (~(0xFF << (imm * 8)) & rd) | ((rs & 0xFF) << (imm * 8));

第一部分创建一个“1”位的掩码,但在有趣的字节中,AND(&amp;)将此字节设置为“0”,然后添加rs字节。它没有优化,但你明白了这一点。

编辑:我只看到马修回答。我误读了,imm是字节而不是位,所以当他指出需要* 8时。我已经纠正了这个公式。他也是用0xFF屏蔽rd以确保不考虑最重要的字节...

MY2C