& T 구문은 인텔 구문과 반대 순서를 사용합니다. 회전 수는 마지막이 아닌 처음이어야합니다 (rol $1, %0
).
또한, 당신이 필요로하지 않으며, 이에 대한 인라인 어셈블리를 사용하지 않아야합니다 : 회전 - 관용구 인식 코드가 실패하기 때문에 Best practices for circular shift (rotate) operations in C++에서 설명한 바와 같이 https://gcc.gnu.org/wiki/DontUseInlineAsm
, GNU C는 좁은 회전을위한 내장 함수가 있습니다 회전 수의 and
을 최적화 할 수 있습니다. x86에서는 8 비트 및 16 비트의 경우에도 count & 31
으로 마스크를 이동/회전하지만 회전은 계속됩니다. 그것은 교대로 중요합니다.
어쨌든 gcc에는 오버 헤드를 피하기 위해 좁은 회전을위한 내장 기능이 있습니다. x86intrin.h
에는 __rolb
래퍼가 있지만 MSVC는 등의 intrin.h
을 사용합니다. 어쨌든 clang은 회전을위한 __builtin
또는 x86intrin.h
래퍼를 지원하지 않지만 gcc와 ICC는 지원합니다.
#include <stdint.h>
uint8_t rotate_left_byte_by1(uint8_t a) {
return __builtin_ia32_rolqi(a, 1); // qi = quarter-integer
}
은 내가 byte
유형을 정의하는 대신 정상적인 사람처럼 stdint.h
에서 uint8_t
을 사용했다.
이 전혀 그 소리와 함께 컴파일되지 않습니다,하지만 it compiles as you'd hope with gcc7.2 :
rotate_left_byte_by1:
movl %edi, %eax
rolb %al
ret
이렇게하면 지금은 할 수 귀하의 인라인 어셈블리로 효율적으로 컴파일 기능을 제공하지만, 어느 것이 컴파일 시간을 완전히 최적화 할 수 있습니다 상수 및 컴파일러는 작동 방식/수행 방식을 알고 그에 따라 최적화 할 수 있습니다.
여기서 '바이트'를 정의합니까? – klutt
AT & T 구문을 사용하면 src와 대상이 반대입니다. 아마도 "rol $ 1, % 0"' –
https://godbolt.org/g/z6Qof7을 의미 할 수도 있습니다. (최소한 gcc와 clang은) –