Найдено 130 результатов

beria
20.10.2022 09:35:19
Форум: Free Pascal Compiler
Тема: Ошибка в генерации ассембленого кода?
Ответы: 7
Просмотры: 6422

Re: Ошибка в генерации ассембленого кода?

iskander писал(а):Очень похоже на глюк компилятора.
Я об этом и говорю... Просто я был по началу уверен, что это сам что-то глобально в ассемблере не знаю..
beria
20.10.2022 07:22:51
Форум: Free Pascal Compiler
Тема: Ошибка в генерации ассембленого кода?
Ответы: 7
Просмотры: 6422

Re: Ошибка в генерации ассембленого кода?

Наверно нужен хоть какой-то компилируемый кусочек кода.
Выше как раз и есть уже скомпилированный кусок кода. так фрс интерпретирует вообще в любом месте именно эту, с другими все нормально, команду косвенной адресации...
К примеру...
program project1; //x32

{$mode objfpc}{$H+}

uses {$IFDEF UNIX ...
beria
19.10.2022 07:26:13
Форум: Free Pascal Compiler
Тема: Ошибка в генерации ассембленого кода?
Ответы: 7
Просмотры: 6422

Ошибка в генерации ассембленого кода?

; [326] AND Len,3
%LINE 326+0
and eax,3
; [327] JZ @Exit
%LINE 327+0
jz ..@j44_1
..@j45_1:
; [329] MOVD XMM0, [P1+EAX*4]
%LINE 329+0
movd xmm0,[edx+eax*4]
; [330] MOVD XMM0, [P1+Len*4]
%LINE 330+0
movd xmm0,[eax+edx*4]


То есть MOVD XMM0, [P1+EAX*4] <> MOVD XMM0, [P1+Len*4] , хотя это ...
beria
04.10.2022 12:37:14
Форум: Free Pascal Compiler
Тема: О производительности ассемблерных вставок...
Ответы: 16
Просмотры: 11967

Re: О производительности ассемблерных вставок...

И при этом код ниже все равно быстрее на длину shortstring и цикл в 5000000

На моей машине

Swap1: 905
Swap2: 873



for i := 0 to 5000000 do Data.Swap1(sizeof(shortstring),sh1,sh2);875
for i := 0 to 5000000 do Data.Swap2(sizeof(shortstring),sh1,sh2);844

Ассемблер все таки победил! Ура. Мир ...
beria
04.10.2022 11:21:17
Форум: Free Pascal Compiler
Тема: О производительности ассемблерных вставок...
Ответы: 16
Просмотры: 11967

Re: О производительности ассемблерных вставок...

Результаты 5000000 прогонов на sizeof(shortstring) байт
то.

Добавлено спустя 16 часов 29 минут 57 секунд:
Хех, совсем забыл, что согласно Windows x64 ABI, RBX не относится к изменяемым регистрам. Забавно, что оно при этом не падало.
В итоге Swap3 должна выглядеть как-то так:


При том то вы ...
beria
03.10.2022 10:47:20
Форум: Free Pascal Compiler
Тема: О производительности ассемблерных вставок...
Ответы: 16
Просмотры: 11967

Re: О производительности ассемблерных вставок...

Alex2013 писал(а):??? Народ не понял в чем прикол! :shock:
В начале топикастер как-то странно удивляется, что ассемблеровский код быстрее.
ассемблеровский код медленнее. В - значит "внимательность" )
beria
03.10.2022 00:51:29
Форум: Free Pascal Compiler
Тема: О производительности ассемблерных вставок...
Ответы: 16
Просмотры: 11967

О производительности ассемблерных вставок...

Задача : побайтовый обмен в массиве, квадратно-гнездовым способом.... Да, я знаю и использую avx, и да, он быстрее, но это не о нем...

procedure Swap1(Len: ptrUInt; P1, P2: Pointer); nostackframe; inline;
assembler;
asm
DEC RCX
@L:
MOV AL,[RDX+RCX]
MOV BL,[R8+RCX]
MOV [RDX+RCX],BL
MOV [R8 ...
beria
01.10.2022 16:57:08
Форум: Free Pascal Compiler
Тема: Параметрические макросы...
Ответы: 2
Просмотры: 3531

Параметрические макросы...

Изучал код компилятора и нашел вот такое в trees.pas...

macro put_short(s, w)
begin
{put_byte(s, (byte)((w) & 0xff));}
s.pending_buf^[s.pending] := byte((w) and $ff);
inc(s.pending);

{put_byte(s, (byte)((word)(w) >> 8));}
s.pending_buf^[s.pending] := byte(word(w) shr 8);;
inc(s.pending ...
beria
28.09.2022 18:16:23
Форум: Free Pascal Compiler
Тема: Ка правильно написать энумератор по записи...
Ответы: 7
Просмотры: 6180

Re: Ка правильно написать энумератор по записи...

Согласен, стало гораздо лучше, но почему энумератор непременно должен быть вложенной структурой?
Все очень просто.
Из-за ошибки в FPC, которую никак не правят уже почти год, использование в записи Initialize/Finalize и энумератора просто невозможно одновременно ибо энумератор тоже вызывает ...
beria
28.09.2022 17:29:59
Форум: Free Pascal Compiler
Тема: Ка правильно написать энумератор по записи...
Ответы: 7
Просмотры: 6180

Re: Ка правильно написать энумератор по записи...

...
Рабочий вариант....
Воля ваша, конечно, но на всякий случай гляньте вот на этот баг .

Правится вложенной структурой в записи.
То есть примерно так.. это для энумератора по адресу...


TDyn = record
.......
procedure Z; inline;
procedure Done;
class operator Initialize(var aRec: TDyn ...
beria
25.09.2022 08:05:09
Форум: Free Pascal Compiler
Тема: Ка правильно написать энумератор по записи...
Ответы: 7
Просмотры: 6180

Re: Ка правильно написать энумератор по записи...

Как минимум ваш первых вариант компилируется до конца, но все равно хрень полная.
Как выяснилось в function TDyn.MoveNext: boolean; не определены (там мусор) любые переменные, TDyn.... Как это - я вот прямо сейчас в шоке. Такое чувство, что при этом неявно создается ещё один экземпляр записи..... Не ...
beria
24.09.2022 10:48:32
Форум: Free Pascal Compiler
Тема: Ка правильно написать энумератор по записи...
Ответы: 7
Просмотры: 6180

Ка правильно написать энумератор по записи...

Написал для цикла нечто следующее и оно компилируется...

TDyn = record
FCurrent: sizeInt;
...........
class operator Initialize(var aRec: TDyn);
class operator Finalize(var aRec: TDyn);
function MoveNext: boolean; inline;
property Current: sizeInt read FCurrent;
class operator enumerator(i ...
beria
08.09.2022 12:09:16
Форум: Free Pascal Compiler
Тема: О производительности динамических массивов...
Ответы: 38
Просмотры: 24513

Re: О производительности динамических массивов...

попробуйте проверить это предположение для строк, например.
зачем проверять если из определения и для них не надо...
Pchar - нулевой маркер часть самой строки.
Для всех остальных длина строки явно указывается в начале строки и все что лишнее отбрасывается при приведении типа...
Так что вообще ...
beria
07.09.2022 15:25:50
Форум: Free Pascal Compiler
Тема: О производительности динамических массивов...
Ответы: 38
Просмотры: 24513

Re: О производительности динамических массивов...

GetMem не вызываете FillCha
А зачем? Сначала обнулять, и только потом заполнять данными - бессмысленная и по моему ненужная вещь. Поэтому я выше и написал что " перераспределения памяти у массива медленнее"
Если чисто распределение памяти для данных, как в первом тесте показано - так вообще GetMem ...