Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2015, 18:20   #1
alcaedo
Пользователь
 
Регистрация: 05.09.2015
Сообщений: 28
По умолчанию Непонятка с FILD/MOVSQ

Код:
type
  sob = set of byte;
var
  Q1,Q2:array of sob;

procedure test_move32byte(var p_to,p_from:sob);
asm
        FILD    QWORD PTR [EDX] {Load First 8}
        FILD    QWORD PTR [EDX+8] {Load Second 8}
        FXCH
        FISTP   QWORD PTR [ECX] {Save First 8}
        FISTP   QWORD PTR [ECX+8] {Save Second 8}
        FILD    QWORD PTR [EDX+16] {Load Third 8}
        FILD    QWORD PTR [EDX+24] {Load Last 8}
        FXCH
        FISTP   QWORD PTR [ECX+16] {Save Third 8}
        FISTP   QWORD PTR [ECX+24] {Save Last 8}
end;

procedure TForm4.Button6Click(Sender: TObject);
var
  x,x1,x2,x3,x4:int64;
  t1,t2:TDateTime;
  e1,e2:sob;
const
  c=100000000;
  d=86400000;
begin
  setlength(Q1,10);
  setlength(Q2,10);

  t1:=now;
  for x := 1 to c do test_move32byte(Q1[5],Q2[5]);
  t2:=now;
  x1:=round(d*(t2-t1));

  t1:=now;
  for x := 1 to c do test_move32byte(e1,e2);
  t2:=now;
  x2:=round(d*(t2-t1));

  t1:=now;
  for x := 1 to c do Q1[5]:=Q2[5];
  t2:=now;
  x3:=round(d*(t2-t1));

  t1:=now;
  for x := 1 to c do e1:=e2;
  t2:=now;
  x4:=round(d*(t2-t1));

  showmessage('Глобальные FILD '+inttostr(x1)+#13+'Локальные FILD '+inttostr(x2)+#13+'Глобальные MOVSQ (:=) '+inttostr(x3)+#13+'Локальные MOVSQ (:=) '+inttostr(x4));

end;
По тесту выходит, что FILD работает быстрее, чем MOVSQ. Тогда почему на присваивание ":=" переменных типа "set of byte" компилятор генерирует такой код вместо FILD/FISTP:

Код:
bendersgame.pas.1559: for x := 1 to c do e1:=e2;
48C7851801000001000000 mov qword ptr [rbp+$00000118],$0000000000000001
488DBDC8000000         lea rdi,[rbp+$000000c8]
488DB5A8000000         lea rsi,[rbp+$000000a8]
48A5                   movsq
48A5                   movsq
48A5                   movsq
48A5                   movsq
4883851801000001       add qword ptr [rbp+$00000118],$01
4881BD1801000001E1F505 cmp qword ptr [rbp+$00000118],$0000000005f5e101
75D5                   jnz TForm4.Button6Click + $12D
90                     nop
А, если покопаться в исходниках процедуры Move (модуль System.pas, строка 5722), там эта самая FILD вполне нормально используется.
alcaedo вне форума Ответить с цитированием
Старый 04.10.2015, 23:51   #2
Мордохвост
Пользователь
 
Регистрация: 15.04.2015
Сообщений: 30
По умолчанию

На x64 компилятор не генерирует FPU код более. В догонку оффтопом ещё не делает таблицы для case((
Как вариант кстати:
Код:
procedure test_movdqu(var p_to,p_from:sob);
asm
  movdqu    xmm0,[rdx]
  movdqu    xmm1,[rdx+16]
  movdqu    [rcx],xmm0
  movdqu    [rcx+16],xmm1
end;
В Move там директива {$IFDEF CPUX86}, для 32-битных исключительно то есть.

Последний раз редактировалось Мордохвост; 04.10.2015 в 23:55.
Мордохвост вне форума Ответить с цитированием
Старый 05.10.2015, 01:35   #3
alcaedo
Пользователь
 
Регистрация: 05.09.2015
Сообщений: 28
По умолчанию

alcaedo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Моделирование FILd m16int renny767 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 22.01.2015 03:44
непонятка с WINDCLASS Andrey_Ov Win Api 3 24.12.2013 09:21
непонятка в Windows 7 lis3009 Софт 2 30.01.2012 20:40
Непонятка с char* kypck Общие вопросы C/C++ 3 30.10.2011 22:34
FILD, FSQRT, FSUBP, FISTP - не нашел по ним справки Д'якон Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 21.12.2007 17:18