169 похожих чатов

Добрый вечер, уважаемые знатоки. Не знаете ли вы как сравнивать

xmm регистры, в которых лежат unsigned значения? Нужно узнать в каком большее значение. К сожалению, подсчет Leading Zero Bits невозможен, а все встроенные инструкции сравнивают только signed значения

19 ответов

10 просмотров

VPTEST?

Dog_with_a_Tail- Автор вопроса
КТ315
VPTEST?

Оно, насколько я понял, bitwise and сделает, но не покажет какой из операндов больше

Dog_with_a_Tail
Оно, насколько я понял, bitwise and сделает, но не...

Тебе нужно сравнить ответ с любым слагаемым, если ответ меньше, значит имело место переполнение, но по любому должны быть какие-то флаги

Dog_with_a_Tail- Автор вопроса
disba1ancer
Тебе нужно сравнить ответ с любым слагаемым, если ...

Сравнить то нужно, но вот нигде никакие флаги не задаются, просто "When an individual result is too large to be represented in 8 bits (overflow), the result is wrapped around and the low 8 bits are written to the destination operand (that is, the carry is ignored)."

Dog_with_a_Tail
Сравнить то нужно, но вот нигде никакие флаги не з...

Так тебе всего-то нужны флаги ZF, SF, OF. Насчёт VPTEST — да, не подойдёт.

Конвертировать в signed и сравнивать, например. Конвертировать можно, изменив старший бит или вычитая половину диапазона (sub/xor с 0x80...000). Это плюс несколько инструкций, но одной-двумя всё равно не получится.

Dog_with_a_Tail
Сравнить то нужно, но вот нигде никакие флаги не з...

Можешь посчитать с переполнением и без переполнения и сравнить. Но получится примерно то же по количеству инструкций: movdqa xmm2,xmm0 paddw xmm0,xmm1 paddusw xmm2,xmm1 pcmpeqw xmm2,xmm0 ; плюс что-то делаем с маской в xmm2

Dog_with_a_Tail- Автор вопроса
s54820
Можешь посчитать с переполнением и без переполнени...

так проблема в сравнивании опять же, маска xmm2 будет либо строка едениц, если xmm2 == xmm0, либо строка 0, если соответственно не равны, флаги не трогаются какие либо

Dog_with_a_Tail
так проблема в сравнивании опять же, маска xmm2 бу...

А что тебе потом делать-то нужно? Маска в таком виде специально формируется, потому что самый частый следующий шаг - инвертировать маску если нужно, потом замаскировать и заменить часть упакованных значений.

Dog_with_a_Tail- Автор вопроса
s54820
А что тебе потом делать-то нужно? Маска в таком ви...

Изначальная цель - сложить, узнать есть ли оверфлоу

Dog_with_a_Tail
Изначальная цель - сложить, узнать есть ли оверфло...

Но ты ведь можешь забрать маску pmovmskb в обычный регистр.

Dog_with_a_Tail- Автор вопроса
s54820
Но ты ведь можешь забрать маску pmovmskb в обычный...

А я балбес, видимо, мне переполнение в unsigned сложении надо определить

Dog_with_a_Tail
А я балбес, видимо, мне переполнение в unsigned сл...

Так я же предложил решение, что с ним не так? Ну кроме того, что длинное. Если точное место переполнения не интересует, то можно сократить на пару инструкций, отложив финальную проверку до конца цикла.

Dog_with_a_Tail- Автор вопроса
s54820
Так я же предложил решение, что с ним не так? Ну к...

ааааа, пришлось открыть глаза чтобы понять, что написано. Осталось понять как узнать старший бит, менять понятно как

Dog_with_a_Tail
ааааа, пришлось открыть глаза чтобы понять, что на...

movdqa xmm2,xmm0 ; paddw xmm0,xmm1 ; С переполнением. paddusw xmm2,xmm1 ; С накоплением. pcmpeqw xmm2,xmm0 ; 11..11 совпало, 00..00 нет. pmovmskb eax,xmm2 ; Старшие биты каждого байта маски. cmp (или xor) eax,0xffff ; 2 (одинаковых) бита на слово, 8 слов. jnz overflow ; И там какое-нибудь tzcnt/bsf, если надо. Наверняка быстрее можно, если что-то поновее SSE2 взять. Но надо думать/мерять.

Dog_with_a_Tail- Автор вопроса
s54820
movdqa xmm2,xmm0 ; paddw xmm0,xmm...

Гипотетическая ситуация: xmm0 задан старший бит, а у xmm1 не задан, а в unsigned сумме переполнения нет. После paddw и paddusw в xmm0 и xmm2 будут лежать разные числа => дальше пойдем по логике overflow, однако переполнения в реале нет. Во избежание такого, нужно конвертировать числа из unsigned в signed, как и было уже написано тобой, но просто ксорить или вычитатать нельзя, потому что теряется информация о старшем бите, который как раз и определяет будет ли переполнение или нет. А считать старший бит xmm регистров без avx512 невозможно (или я уже не знаю)

Dog_with_a_Tail
Гипотетическая ситуация: xmm0 задан старший бит, а...

А почему будут разные-то? Давай для двухбитных: 10 + 01 = 11, с накоплением тоже 11. И нет, при преобразовании в signed сдвигом диапазона ничего не теряется, просто телодвижений больше.

Dog_with_a_Tail- Автор вопроса
s54820
А почему будут разные-то? Давай для двухбитных: 10...

когда переходим из unsigned в signed 2^128 -> 2^127 - 1 бит под знак. По этой же причине будут и разные результаты, потому что число с заданным старшим битом будет как отрицательное во время paddw

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта