(转)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 ;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值