DELPHI求乱序数组最小值快速算法(Delphi MMX优化算法应用之三)

type

  PMyList = ^TMylist;

  TMylist = array of word;



function GetMinValue(List: PMyList):Word; stdcall;

var

  ForCount, ListCount,i: Dword;

  MAXVaule: int64;

  List0Address: Dword;



begin

  Result := $7FFF;

  ListCount := High(List^) + 1;

  if (ListCount < 16) or ((ListCount mod 16)<>0) then

  begin

   for I := 0 to ListCount - 1 do

      begin

         if List^[i] <  Result then  Result := List^[i];

      end;

  end else

  begin

    MAXVaule := $7FFF7FFF7FFF7FFF;

    List0Address := Dword(@List^[0]);

    ForCount := ListCount div 16; //4*MMX

    asm

      push eax

      push ecx

      push esi

      mov esi, List0Address  //开始地址

      mov ecx, ForCount      //长度

      MOVQ MM0,MAXVaule

      mov eax,0

    @CmpLoop:

      prefetchnta [esi + eax + 1024] // fetch ahead by 1024 bytes

      movq mm1, qword [esi+eax]

      movq mm2, qword [esi+eax+8]

      movq mm3, qword [esi+eax+16]

      movq mm4, qword [esi+eax+24]

      PMINSW MM0,MM1

      PMINSW MM0,MM2

      PMINSW MM0,MM3

      PMINSW MM0,MM4

      add eax,32

      sub ecx, 1

    jnz @CmpLoop

      MOVQ MM1,MM0

      PSRLQ MM1,$20  //右移

      PMINSW MM0,MM1

      MOVQ MM1,MM0

      PSRLQ MM1,$10  //右移

      PMINSW MM0,MM1

      Movd eax,mm0

      Mov  Result,AX

      Sfence

      Emms

      pop esi

      pop ecx

      pop eax

    end;

  end;



end;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值