(转)DELPHI求乱序数组最小值快速算法(Delphi MMX优化算法应用之三)
2009-11-04 09:41
411 查看
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;
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;
相关文章推荐
- DELPHI求乱序数组最小值快速算法(Delphi MMX优化算法应用之三)
- Delphi洗牌算法 - 将一个数组随机乱序
- ios 数组最大值,最小值,平均值,和的快速算法
- 12、Java入门—将一数组乱序排列的三种方法 (快速洗牌的小算法)
- 给定一个有序的数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉查找树?
- Java数组的应用2:数组的最大,最小,求和,平均值,倒置
- 程序员面试题精选100题(41)-把数组排成最小的数[算法]
- 算法题19 把数组排成最小的数
- 乱序数组的算法
- 快速排序思想的应用--求数组中第k小的数
- Coursera_程序设计与算法_计算导论与C语言基础_数组应用练习
- 算法-旋转数组的最小数字
- 九度OJ 1504 把数组排成最小的数【算法】-- 2009年百度面试题
- 较快速在一个数组中查找最大值和最小值
- 设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。
- 程序员面试金典: 9.4树与图 4.3给定一个有序整数数组,元素各不相同且按升序排列,创建一颗高度最小的二叉查找树。 ---快速解法
- 笔试算法题(31):将有序数组转换成BST表示 & 线段树的应用
- C语言输出旋转后数组中的最小数元素的算法原理与实例
- 重拾算法之剑指Offier——旋转数组的最小数字
- 算法导论:快速找出无序数组中第k小的数