OSDev
http://osdev.ru/

Арифметический сдвиг
http://osdev.ru/viewtopic.php?f=5&t=1144
Страница 2 из 2

Автор:  Himik [ 14 июн 2016, 18:24 ]
Заголовок сообщения:  Re: Арифметический сдвиг

А арифметический сдвиг - это не оксюморон? Присутствие слова "арифметический" не должно будоражить математическую общественность. Канонической арифметики тут, очевидно, нет, это просто игра битов. Надо бы найти и посмотреть спецификацию "арифметического сдвига", очевидно в описании команды SAR должно быть всё подробно описано.

Автор:  Himik [ 20 июн 2016, 13:11 ]
Заголовок сообщения:  Re: Арифметический сдвиг

Intel® 64 and IA-32 Architectures Software Developer’s Manual
Volume 2 (2A, 2B & 2C):
Instruction Set Reference
SAR/SHR Description

Shifts the bits in the first operand (destination operand) to the left or right by the number of bits specified in the
second operand (count operand). Bits shifted beyond the destination operand boundary are first shifted into the CF
flag, then discarded. At the end of the shift operation, the CF flag contains the last bit shifted out of the destination
operand.

The shift arithmetic right (SAR) and shift logical right (SHR) instructions shift the bits of the destination operand to
the right (toward less significant bit locations). For each shift count, the least significant bit of the destination
operand is shifted into the CF flag, and the most significant bit is either set or cleared depending on the instruction
type. The SHR instruction clears the most significant bit; the SAR instruction sets or clears the most significant bit to correspond
to the sign (most significant bit) of the original value in the destination operand. In effect, the SAR instruction fills
the empty bit position’s shifted value with the sign of the unshifted value.

The SAR and SHR instructions can be used to perform signed or unsigned division, respectively, of the destination
operand by powers of 2. For example, using the SAR instruction to shift a signed integer 1 bit to the right divides
the value by 2.

Using the SAR instruction to perform a division operation does not produce the same result as the IDIV instruction.
The quotient from the IDIV instruction is rounded toward zero, whereas the “quotient” of the SAR instruction is
rounded toward negative infinity. This difference is apparent only for negative numbers. For example, when the
IDIV instruction is used to divide -9 by 4, the result is -2 with a remainder of -1. If the SAR instruction is used to
shift -9 right by two bits, the result is -3 and the “remainder” is +3; however, the SAR instruction stores only the
most significant bit of the remainder (in the CF flag).

Автор:  Yoda [ 21 июн 2016, 12:13 ]
Заголовок сообщения:  Re: Арифметический сдвиг

Himik,
мы знаем, что делает инструкция SAR. Вопрос был в том, нужна ли эта инструкция в том виде, в котором существует, или нет.

Автор:  Himik [ 21 июн 2016, 15:15 ]
Заголовок сообщения:  Re: Арифметический сдвиг

Yoda, я не сразу понял какой вопрос, действительно много букв. Инструкцию SAR не применял ни разу. Ну а евклидово/неевкливово деление - это заморочки отдельных математиков этим весьма нелогическим (я бы сказал ошибочным) постулатом.

Автор:  dixie [ 25 июн 2016, 15:44 ]
Заголовок сообщения:  Re: Арифметический сдвиг

SAR? Конечно нужна...
Даже в нынешнее время быстрого деления, думаю sar несколько быстрее div?
Компиляторы, однако, её и генерят на 2/4/8/16/итд

Автор:  Yoda [ 27 июн 2016, 12:18 ]
Заголовок сообщения:  Re: Арифметический сдвиг

Yoda писал(а):
...Вопрос был в том, нужна ли эта инструкция в том виде, в котором существует, или нет.

Посмотрите, я ведь даже написал конкретные причины, почему эта инструкция плохо подходит для деления на степени двойки.

Автор:  Himik [ 27 июн 2016, 19:19 ]
Заголовок сообщения:  Re: Арифметический сдвиг

И всё-таки она работает, хоть и не так как задумано.
Но если её и уберут, то ни чего страшного, я думаю, не случится.
Надеюсь, IDIV работает почти так же быстро. Если у кого есть тесты, протестируйте скорость деления на 64.

Автор:  dixie [ 28 июн 2016, 06:52 ]
Заголовок сообщения:  Re: Арифметический сдвиг

Yoda писал(а):
Посмотрите, я ведь даже написал конкретные причины, почему эта инструкция плохо подходит для деления на степени двойки.
Ну, помимо деления на степень двойки - существует ещё и обычный сдвиг. Никто, ж, не отменял int cc = aa>>bb;
Да и в целочисленном делении - по хорошему, стоило бы давать опцию юзеру...

Вообще - с какой стати необходимость инструкции определяется только языками высокого уровня? Если так мерять - давайте и bt, btc, bts итд уберём - один фиг их никто не генерит...

Попробуйте в один бутсектор или MBR впихнуть что-ньть не совсем тривиальное - и все "ненужные" инструкции мигом пойдут в дело, чтобы уместиться в эти 400 с копейками байт. Просто привычка к ЯВУ и "гигабайтам" - подобный процесс почти убила, а жаль ;)

Автор:  v.g.a. [ 13 сен 2017, 22:53 ]
Заголовок сообщения:  Re: Арифметический сдвиг

Арифметический сдвиг вправо можно использовать для работы с битовыми полями.
Например в 32 битном числе первые пять битов число со знаком.
v32 = v5 << 27 >> 27;
Тоже самое правда можно сделать и без сдвигов.
v32 = v5 | (0 - (v5 & 0x00000010));
Но больше на одну команду получается.

Страница 2 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/