我只是想弄清楚用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;)
非常感谢, 克劳斯
答案 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