Хотя я спрашивал о выполнении поворота вправо , одно подмножество ROR - это когда вы выполняете ROR двух 64-битных значений ровно 32 битами.Это заставляет ваш произвольный поворот превращаться в простой обмен старших и младших 32-битных:
Зная, что выВы просто выполняете 32-битный (то есть doubleword ) своп, вы можете использовать другую инструкцию:
- pshufd : перемешать упакованные двойные слова
Кодировка инструкции хитрая, и Intel делает все возможное, чтобы запутать документацию .Идея состоит в том, что вы можете рассматривать 128-битный xmm как 32-битные двойные слова и передавать их туда, куда вам нравится:
Кодировка хитрая:
pshufd xmm0, xmm0, 0x02030001
Поскольку я толкаю четыре двойных слов, маска состоит из четырех частей:
02
03
00
01
Они расположены слева направо, сообщая вам индекс того, где должно быть перетасовано это 32-битное двойное словодо:
Если вы вращаете 64-битные четырехслойные слова, которые упакованы в регистр xmm
, ровно на 32 бита, вы можетеиспользуйте:
pshufd xmm0, xmm0, 0x02030001 //rotate packed quadwords by 32-bits¹
RotateRight (16)
Что теперь делать, если:
- вместо
ROR(32)
из 64-битных четырех слов, упакованных в xmm - Я хотел
ROR(16)
Мы можем применить тот же трюк.Предположим, что 64-разрядные четверные слова разделены на 16-разрядные слова, и перемешайте их:
pshufw xmm0, xmm0, 0x0605040702010003 //shuffle packed words¹
За исключением того, что pshufw не может работать с регистрами xmm,Поэтому я остановился.
RotateRight (24)
А что если:
- вместо
ROR(32)
64-битных четырехсловупаковано в xmm - я хотел
ROR(24)
Мы можем применять те же вещи.Предположим, что 64-разрядные четырехслойные слова разделены на 8-разрядные слова ....
pshufb xmm0, xmm0, что-то // перемешать упакованные байты
Хорошо, я подберу это завтра,Сейчас я устал.Я надеялся просто набрать одну строку кода;вместо этого это был четырехчасовой укол боли.Я просто предполагал, что у людей все эти основные операции будут задокументированы;ЦП работает около 3 лет.
RotateRight (1)
Да, позже.
Сноски
- Думаю.Я не уверен, что правильно понял кодировку.