使用 GCC 组件向左/向右旋转移动次数
Posted
技术标签:
【中文标题】使用 GCC 组件向左/向右旋转移动次数【英文标题】:Rotate left/right with number of moves using GCC assembly 【发布时间】:2013-11-21 00:20:51 【问题描述】:我有以下代码来计算 Visual Studio 程序集中的左/右旋转。
template<class T>
inline T rotr(T x, unsigned char moves)
unsigned char temp;
__asm
mov temp, CL
mov CL, moves
ror x, CL
mov CL, temp
;
return x;
template<class T>
inline T rotl(T x, unsigned char moves)
unsigned char temp;
__asm
mov temp, CL
mov CL, moves
rol x, CL
mov CL, temp
;
return x;
1- 我们如何为 gcc 编写等效的 asm 代码。
2- 有没有更好的方法在 Visual Studio 程序集中编写它?
【问题讨论】:
VC++ 在标准库中有_rotl
/_rotr
(对于int
s)和_rotl64
/_rotr64
对于long long
)。
同理,gcc(gas)x86 程序集有 rol/ror(旋转且不包含进位)和 rcl/rcr(旋转包含进位)。
【参考方案1】:
我在这里找到了答案:
Poor _rotl performance under minGW
并将我的代码重写为:
template<class T>
inline T rotr(T x, uint8_t r)
asm("rorl %1,%0" : "+r" (x) : "c" (r));
return x;
template<class T>
inline T rotl(T x, uint8_t r)
asm("roll %1,%0" : "+r" (x) : "c" (r));
return x;
感谢 Jerry Coffin 和 gnometorule 提供的关于 _rotl/_rotr _rotl64/_rotr64 的有用 cmets
【讨论】:
以上是关于使用 GCC 组件向左/向右旋转移动次数的主要内容,如果未能解决你的问题,请参考以下文章