MOVhlPS и MOVlhPS перепутаны?[Решено]

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

MOVhlPS и MOVlhPS перепутаны?[Решено]

Сообщение Maxizar » 11.05.2011 20:17:59

Ну, что тут сказать, это опять я со своими вопросами по Асму.
В данной теме, я хочу спросить Знающих людей, об командах 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


Кто мне что скажет, буду признателен, Или я опять читаю не правильные Книги :(
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Maxizar 12.05.2011 08:14:26, всего редактировалось 1 раз.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: MOVhlPS и MOVlhPS перепутаны?

Сообщение Sergei I. Gorelkin » 11.05.2011 22:23:15

Отображения регистра в виде массива и в виде машинного слова "перевернуты" по отношению друг к другу. Вот твой изначальный xmm-регистр:

Код: Выделить всё
(gdb) p $xmm0
$2 = {v4_float = {0, 1, 2, 3}, v2_double = {0.0078125, 32.000007629394531},
  v16_int8 = #0#0#0#0#0#0#128'?'#0#0#0'@'#0#0'@@', v8_int16 = {0, 0, 0, 16256,
    0, 16384, 0, 16448}, v4_int32 = {0, 1065353216, 1073741824, 1077936128},
  v2_int64 = {4575657221408423936, 4629700418010611712},
  uint128 = 0x40400000400000003f80000000000000}


v4_float - это массив, uint128 - машинное слово, остальные представления в данном случае не имеют значения. 0 находится в младших битах, 3f800000 - это единица, и т.д.
Так что все соответствует Книгам.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: MOVhlPS и MOVlhPS перепутаны?

Сообщение Maxizar » 12.05.2011 08:14:08

Sergei I. Gorelkin писал(а):Отображения регистра в виде массива и в виде машинного слова "перевернуты" по отношению друг к другу.

Да точно, опять я на этом споткнулся :oops:

Сегодня даже поставил делфи, там регистры xmm отображены как в памяти переменные лежат, точно так, как сказали Вы.
Спасибо.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru