Re: iMul как считает CPU
От: Zhendos  
Дата: 19.04.23 16:38
Оценка: 3 (1) +1
Здравствуйте, VVVa, Вы писали:

VVV>с add и sub понятно — там отрицательные и положительные числа считаются одинаково...

VVV>а как считает imul — он что определяет является ли число отрицательным, потом извлекает знак и переводит в положительное число, а потом умножает?

Зачем что-то куда-то переводить,
скажем работаем с 32битными числами, тогда -1 * 2 это 0xffffffff * 2,
перемножаем как безнаковые и получаем 0x1_ffff_fffe ,
отбрасываем то что "вылезло" за 32бита и получаем 0xffff_fffe ,
а это как раз -2.
Re[3]: iMul как считает CPU
От: mike_rs Россия  
Дата: 20.04.23 11:03
Оценка: 3 (1) +1
Здравствуйте, VVVa, Вы писали:

VVV>iMul возвращает в регистровой паре 32 бита источник а 64 бита результат — он что разширяет источник перед умножением по твоему?


а что, размножить старший бит в соседнее слово, это так сложно? конечно расширяет.
Re: iMul как считает CPU
От: flаt  
Дата: 22.04.23 18:59
Оценка: 3 (1)
Здравствуйте, VVVa, Вы писали:

VVV>а как считает imul — он что определяет является ли число отрицательным, потом извлекает знак и переводит в положительное число, а потом умножает?


Да. https://stackoverflow.com/questions/28581981/how-does-imul-and-idiv-really-work-8086
Re: iMul как считает CPU
От: Wawan Россия http://www.wawan.ru/resume
Дата: 22.04.23 18:55
Оценка: :)
Здравствуйте, VVVa, Вы писали:

VVV>с add и sub понятно — там отрицательные и положительные числа считаются одинаково...

VVV>а как считает imul — он что определяет является ли число отрицательным, потом извлекает знак и переводит в положительное число, а потом умножает?
VVV>с idiv тоже самое?

спросил у ИИ бота:

Команда imul — это команда, которая используется для создания пирожков из картошки. Она берет две картошки и помещает их в специальный прибор, который измельчает их и формирует пирожки. Вкус пирожков зависит от качества картошки и специй, которые добавляются в процессе их приготовления.

Команда idiv — это команда, которая используется для создания иллюзии летающей тарелки. Она запускает специальный генератор гравитационных волн, который создает иллюзию летающей тарелки в небе. Эта команда может быть использована для различных целей, например, для развлечения на вечеринках или для создания эффектов в киноиндустрии.
iMul как считает CPU
От: VVVa  
Дата: 19.04.23 07:27
Оценка:
с add и sub понятно — там отрицательные и положительные числа считаются одинаково...
а как считает imul — он что определяет является ли число отрицательным, потом извлекает знак и переводит в положительное число, а потом умножает?
с idiv тоже самое?
Re[2]: iMul как считает CPU
От: VVVa  
Дата: 20.04.23 07:04
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>отбрасываем то что "вылезло" за 32бита и получаем 0xffff_fffe ,


Спасибо за пример... но это частный случай
iMul возвращает в регистровой паре 32 бита источник а 64 бита результат — он что разширяет источник перед умножением по твоему?
А деление не пояснишь?
Re[2]: iMul как считает CPU
От: VVVa  
Дата: 22.04.23 18:15
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Зачем что-то куда-то переводить,

Z>скажем работаем с 32битными числами, тогда -1 * 2 это 0xffffffff * 2,
Z>перемножаем как безнаковые и получаем 0x1_ffff_fffe ,
Z>отбрасываем то что "вылезло" за 32бита и получаем 0xffff_fffe ,
Z>а это как раз -2.

подскажите как делит... вроде разширение разрядности не помогает ...
Re: iMul как считает CPU
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 24.04.23 06:27
Оценка:
Здравствуйте, VVVa, Вы писали:

VVV>с add и sub понятно — там отрицательные и положительные числа считаются одинаково...

VVV>а как считает imul — он что определяет является ли число отрицательным, потом извлекает знак и переводит в положительное число, а потом умножает?

Зачем?
На вики посмотри секцию Binary long multiplication -> Signed integers.

Точная реализация в современных процессорах скорее всего закрыта как корпоративный секрет, но не потому, что общий метод — он как раз именно такой: двумерная матрица ANDʼов аргументов и дерево сумматоров для результата — а из-за используемых методов (язык описания, тесты и всё такое).
Если у процессора умножение тратит тактов как 2-3 сложения — можешь к гадалке не ходить, там именно матрица и дерево сумматоров.

И вообще в этой статье полно полезных описаний, только их надо расшифровать.

Или тут неплохие диаграммки.

VVV>с idiv тоже самое?


Тоже не обязательно, хотя возможно — там некоторые вещи упростились бы.

В SRT (хоть базовом, хоть расширенном) можно привести хотя бы делитель к положительному, а можно не приводить, отработав возможность отрицательного в блоке принятия решения (0/+1/-1/etc.)
The God is real, unless declared integer.
Re[2]: iMul как считает CPU
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 24.04.23 06:28
Оценка:
Здравствуйте, flаt, Вы писали:

F>Здравствуйте, VVVa, Вы писали:


VVV>>а как считает imul — он что определяет является ли число отрицательным, потом извлекает знак и переводит в положительное число, а потом умножает?


F>Да. https://stackoverflow.com/questions/28581981/how-does-imul-and-idiv-really-work-8086


То что было в 8086 (который ещё проектировался вручную по каждому транзистору и вообще был жутко неэффективным) никак не обязано переноситься на современные процессоры
The God is real, unless declared integer.
Re[2]: iMul как считает CPU
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 24.04.23 06:44
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Здравствуйте, VVVa, Вы писали:


VVV>>с add и sub понятно — там отрицательные и положительные числа считаются одинаково...

VVV>>а как считает imul — он что определяет является ли число отрицательным, потом извлекает знак и переводит в положительное число, а потом умножает?

Z>Зачем что-то куда-то переводить,

Z>скажем работаем с 32битными числами, тогда -1 * 2 это 0xffffffff * 2,
Z>перемножаем как безнаковые и получаем 0x1_ffff_fffe ,
Z>отбрасываем то что "вылезло" за 32бита и получаем 0xffff_fffe ,
Z>а это как раз -2.

Это только если согласны с результатом той же ширины, что аргументы.
Это самый частый случай, но не обязательный.
The God is real, unless declared integer.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.