Форум: "Прочее";
Текущий архив: 2010.10.17;
Скачать: [xml.tar.bz2];
Внизasm to pascal Найти похожие ветки
← →
Я (2010-07-13 18:09) [0]Здравствуйте. Помогите перевести функцию с асма в паскаль. Я тут вроде чета напереводил, но сомневаюсь
function shr_int32 (i, shift: longint): longint;
begin
asm
mov eax ,dword ptr [i ]
mov ecx ,dword ptr [shift ]
sar eax ,cl
mov dword ptr [result ] ,eax
end;
end;
function shr_int32 (i, shift: longint): longint;
begin
result:=i shr shift
end;
заранее спасибо
← →
Sapersky (2010-07-13 18:50) [1]sar - арифметический сдвиг, с учётом знака, т.е. отрицательные корректно сдвигает, а дельфийский оператор shr компилируется всегда в беззнаковый сдвиг.
Можно заменить вызов shr_int32 на div [степень двойки], скомпилируется именно в sar. Правда, компилятор ещё зачем-то добавляет к sar условный джамп, что не прибавляет скорости, но зато не будет лишнего вызова функции.
← →
Я (2010-07-13 19:52) [2]Чесно говоря не очень вкурил :(
Будет ли этот код равнозначен исходному? Скорость пока опустимfunction shr_int32 (i, shift: longint): longint;
begin
result:=i div (shift*32);
end;
← →
Германн © (2010-07-13 20:08) [3]А причем тут 32?
← →
Димка На (2010-07-13 20:10) [4]result:=i;
while shift >0 do
begin
result :=result div 2;
dec(shift)
end;
← →
Я (2010-07-13 20:18) [5]ааа понял. Спасибо ;)
← →
Германн © (2010-07-13 20:22) [6]
> ааа понял.
Тогда сделай то же самое, но без цикла. А то некрасиво выглядит. :)
← →
Sha © (2010-07-13 20:24) [7]> Я (13.07.10 19:52) [2]
Не равносилен.
Знак переменной i известен или может быть любой?
← →
Я (2010-07-13 20:58) [8]
> Германн © (13.07.10 20:22) [6]
> > ааа понял.Тогда сделай то же самое, но без цикла. А то
> некрасиво выглядит. :)
где-то так думаю ;)result:=i div (1 shl shift);
← →
Sha © (2010-07-13 21:01) [9]> Sapersky (13.07.10 18:50) [1]
> компилятор ещё зачем-то добавляет к sar условный джамп
Там еще добавляется бит переноса.
Нужно для правильного деления отрицательных чисел.
Иначе было б, например, -1 div 2 = -1
← →
Sha © (2010-07-13 21:04) [10]> Я (13.07.10 20:58) [8]
Очень медленно.
← →
Я (2010-07-13 21:10) [11]не, ну если возведение в степень вынести за функцию то скорость будет как у исходной
← →
Sha © (2010-07-13 21:16) [12]> Я (13.07.10 21:10) [11]
> не, ну если возведение в степень вынести за функцию то скорость будет как у исходной
не, ну работает неверно же :)
← →
Я (2010-07-13 21:22) [13]
> Sha © (13.07.10 21:16) [12]
>не, ну работает неверно же :)
Тоесть? Можете пояснить?
← →
Sha © (2010-07-13 21:23) [14]> Я (13.07.10 21:10) [11]
На [7] ответь.
← →
Я (2010-07-13 21:25) [15]значение в переменной i может быть и как положительное так и отрицательное
← →
Я (2010-07-13 21:30) [16]гы и правда неверно. При $ffffffff в исходной получается -1 во всех остальных 0
← →
Sha © (2010-07-13 21:32) [17]> Я (13.07.10 21:22) [13]
для i:=-25; shift:=2;
результат -7
а у тебя -6
← →
Sha © (2010-07-13 21:33) [18]Вот так попробуй j:=int64(i) shr shift;
← →
Я (2010-07-13 21:57) [19]Да так работает корректно. Но скорость выросла почти на треть.
было 375-390 при 100000000 итераций, стало 500
Но думаю пойдет. Спасибо. ;0)
← →
Я (2010-07-13 22:04) [20]
> Но скорость выросла почти на треть.
упала тоесть
← →
Sha © (2010-07-13 22:09) [21]Если важна скорость, можно проверить такое
k:=(i and MaxInt) shr shift - (i and (not MaxInt)) shr shift;
или такоеfunction sar32(i, shift: longint): longint;
asm
mov ecx, edx
sar eax, cl
end;
← →
Я (2010-07-13 22:44) [22]да уж, фигово не уметь оперировать битами ;(
Остановлюсь на этомk:=(i and MaxInt) shr shift - (i and (not MaxInt)) shr shift;
asm мне не пойдет, fpc сопротивляется
~265 при 100000000 итераций
попытаюсь понять что вы здесь напрогали ;)
спасибо
← →
Sha © (2010-07-14 15:12) [23]Еще надо иметь в виду, что на IA-32 вариант [22] выдает результат,
совпадающий с оригинальной функцией, для любого значения shift,
а вариант [18] - только для shift=0..31
← →
Sha © (2010-07-14 20:20) [24]> Я (13.07.10 22:44) [22]
> попытаюсь понять что вы здесь напрогали ;)
Пояснения здесь:
http://guildalfa.ru/alsha/node/9
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2010.10.17;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.003 c