Tag: powerpc

了解PowerPC rlwinm指令

所以我终于说服自己尝试学习/使用PowerPC(PPC)。 一切进展顺利,大多数信息都是在网上找到的。 但是,在查看一些示例时,我发现了这个: rlwinm r3, r3, 0,1,1 我怎么用C做这个? 我尝试做一些研究,但找不到任何帮助我的东西。 提前致谢!

仅使用恒定移位来模拟可变位移?

我试图找到一种方法来执行间接左移/右移操作而不实际使用变量移位操作或任何分支。 我正在研究的特定PowerPC处理器有一个怪癖,即按常数立即移位,就像 int ShiftByConstant( int x ) { return x << 3 ; } 是快速的,单操作的,超标量的,而变量的变换,如 int ShiftByVar( int x, int y ) { return x << y ; } 是一个微编码操作,需要7-11个周期才能执行,而管道的其余部分都停止运行 。 我想做的是找出哪些非微码整数PPC操作sraw解码然后单独发出它们。 这对于sraw本身的延迟没有帮助 – 它将用6替换一个op – 但是在这六个操作之间我可以将一些工作双重调度到其他执行单元并获得净增益。 我似乎无法找到μopssraw解码到的任何地方 – 有没有人知道如何用一系列常量移位和基本整数运算替换变量位移? (for循环或开关或其中带有分支的任何东西都不起作用,因为分支惩罚甚至比微码惩罚更大。) 这不需要在assembly中回答; 我希望学习算法而不是特定的代码,所以用C语言或高级语言甚至伪代码的答案都会非常有用。 编辑:我应该补充一些说明: 我甚至不担心可移植性 PPC具有条件移动,因此我们可以假设存在无分支内部函数 int isel(a,b,c){return a> = 0? b:c; } (如果你写出一个做同样事情的三元组,我会明白你的意思) 整数乘法也是微编码的,甚至比sraw慢。 […]