Я обнаружил, что вопреки своей природе двоичного / двунаправленного состояния, процессоры x86 работают очень медленно при обработке команд бинарных манипуляций, таких как SHR, BT, BTR, ROL и чего-то подобного.
Например, я где-то читал, что сдвиг / вращение бита более чем на 1 позицию считается медленным (с большой задержкой, снижением производительности и такими страшными вещами).Еще хуже, когда операнды находятся в памяти (не являются ли периферийные устройства с памятью тоже?)
shl eax,1 ;ok
shl eax,7 ;slow?
Так что же делает их медленными?Ирония в том, что бинарные машины, такие как процессоры, медленно работают с битами, когда такие операции должны быть естественными.Создается впечатление, что двоичный процессор испытывает трудности с переключением битов на месте!
РЕДАКТИРОВАТЬ: Теперь, после второго взгляда на запись SHL в руководстве, она включает в себя некоторые тяжелые логики микрокода!
Из руководства Intel vol.2 для shl
...
Operation
TemporaryCount = Count & 0x1F;
TemporaryDestination = Destination;
while(TemporaryCount != 0) {
if(Instruction == SAL || Instruction == SHL) {
CF = MSB(Destination);
Destination = Destination << 1;
}
//instruction is SAR or SHR
else {
CF = LSB(Destination);
if(Instruction == SAR) Destination = Destination / 2; //Signed divide, rounding toward negative infinity
//Instruction is SHR
else Destination = Destination / 2; //Unsigned divide
}
TemporaryCount = TemporaryCount - 1;
}
//Determine overflow
if(Count & 0x1F == 1) {
if(Instruction == SAL || Instruction == SHL) OF = MSB(Destination) ^ CF;
else if(Instruction == SAR) OF = 0;
//Instruction == SHR
else OF = MSB(TemporaryDestination);
}
else OF = Undefined;
Невероятно увидеть, что такая простая булева алгебра превращается в кошмар реализации.