В данной теме, я хочу спросить Знающих людей, об командах MOVhlPS и MOVlhPS
Как известно, в SSE регистрах xmm помещается 128 бит, так вот я написал такой малюсинький тест, без которого я так и не смог запустить пару функций, потому что как мне кажется в FPC они идут в разрез Книгам. (Хотя возможно тут я и ошибаюсь)
А именно:
- Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
SingleArray = array [0..3] of Single;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var A1,A2,A3: SingleArray;
begin
A1[0]:=0.0;
A1[1]:=1.0;
A1[2]:=2.0;
A1[3]:=3.0;
{$ASMMODE intel}
asm
MOVuPS xmm0,A1
MOVuPS xmm1,xmm0
MOVuPS xmm2,xmm0
MOVhlPS xmm1,xmm0
MOVuPS A2,xmm1
MOVlhPS xmm2,xmm0
MOVuPS A3,xmm2
end;
Memo1.Lines.Add('A1:');
Memo1.Lines.Add('A1[0]= ' + FloatToStr(A1[0])+
' A1[1]= '+ FloatToStr(A1[1])+
' A1[2]= '+ FloatToStr(A1[2])+
' A1[3]= '+ FloatToStr(A1[3]));
Memo1.Lines.Add('A2:');
Memo1.Lines.Add('A2[0]= ' + FloatToStr(A2[0])+
' A2[1]= '+ FloatToStr(A2[1])+
' A2[2]= '+ FloatToStr(A2[2])+
' A2[3]= '+ FloatToStr(A2[3]));
Memo1.Lines.Add('A3:');
Memo1.Lines.Add('A3[0]= ' + FloatToStr(A3[0])+
' A3[1]= '+ FloatToStr(A3[1])+
' A3[2]= '+ FloatToStr(A3[2])+
' A3[3]= '+ FloatToStr(A3[3]));
// В более краткой форме:
Memo1.Lines.Add('A1:');
Memo1.Lines.Add( FloatToStr(A1[0])+
', '+ FloatToStr(A1[1])+
', '+ FloatToStr(A1[2])+
', '+ FloatToStr(A1[3]));
Memo1.Lines.Add('A2:');
Memo1.Lines.Add( FloatToStr(A2[0])+
', '+ FloatToStr(A2[1])+
', '+ FloatToStr(A2[2])+
', '+ FloatToStr(A2[3]));
Memo1.Lines.Add('A3:');
Memo1.Lines.Add( FloatToStr(A3[0])+
', '+ FloatToStr(A3[1])+
', '+ FloatToStr(A3[2])+
', '+ FloatToStr(A3[3]));
end;
end.
Тест выдает следующее:
- Код: Выделить всё
A1:
0, 1, 2, 3
A2:
2, 3, 2, 3
A3:
0, 1, 0, 1
Но ведь в хмм Регистрах массив А1 располагается как то так: 0, 1, 2, 3, что видно в момент отладки в окне Регистры.
При этом как я понял, что 0 лежит в старших битых, а 3 в младших.. Не так ли?...
Если это так, то я ждал что результат будет таков:
- Код: Выделить всё
A1:
0, 1, 2, 3
A2:
0, 1, 0, 1
A3:
2, 3, 2, 3
Кто мне что скажет, буду признателен, Или я опять читаю не правильные Книги
