千分求汇编优化:UInt96x96To192(...)
gxqcn 2007-04-30 01:03:24 // Test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdlib.h>
#if 1
#define _DUMP
#endif
typedef unsigned int UINT32;
/*
L2 L1 L0
x) R2 R1 R0 max
---------------------------- -----------------------------------------------------
L0*R0 FFFFFFFE 00000001
L1*R0 FFFFFFFE FFFFFFFF 00000001
+) L2*R0 FFFFFFFE FFFFFFFF FFFFFFFF 00000001
----------------------------
L0*R1 FFFFFFFF FFFFFFFE 00000000 00000001
L1*R1 00000001 FFFFFFFD FFFFFFFF 00000000 00000001
+) L2*R1 FFFFFFFF FFFFFFFE FFFFFFFF 00000000 00000001
----------------------------
L0*R2 00000001 00000000 FFFFFFFD 00000000 00000000 00000001
L1*R2 00000001 FFFFFFFE FFFFFFFE 00000000 00000000 00000001
+) L2*R2 FFFFFFFF FFFFFFFF FFFFFFFE 00000000 00000000 00000001
---------------------------- -----------------------------------------------------
*/
void UInt96x96To192( UINT32 * pH, UINT32 * pL, const UINT32 * pR )
{
// H[2]:H[1]:H[0] : L[2]:L[1]:L[0] <-- L[2]:L[1]:L[0] * R[2]:R[1]:R[0]
// 即:L、R 分别为 96bits 无符号数,将其相乘后,
// 结果的低 96bits 存在 L 中,高 96bits 存在 H 中。
__asm
{
// 请用 SSE2 或更适合的指令集,以充分利用流水线,加速该段算法的执行,help!
//...
}
}
int main(int argc, char* argv[])
{
// printf("Hello World!\n");
UINT32 u32H[3];
UINT32 u32L[3] = { 0xFFFFFFFF, 0xFFFFFFFE, 0xFFFFFFFD };
const UINT32 u32R[3] = { 0xFFFFFFFD, 0xFFFFFFFE, 0xFFFFFFFF };
#ifdef _DUMP
printf( "%08X %08X %08X * %08X %08X %08X",
u32L[2], u32L[1], u32L[0], u32R[2], u32R[1], u32R[0] );
#endif
UInt96x96To192( u32H, u32L, u32R );
#ifdef _DUMP
printf( "\r\n\t= %08X %08X %08X : %08X %08X %08X\r\n\r\n",
u32H[2], u32H[1], u32H[0], u32L[2], u32L[1], u32L[0] );
#endif
system( "pause" );
return 0;
}
/********************* end of Test.cpp ****************************/
我有一个核心模块:UInt96x96To192() 需要反复调用,所以对效率要求非常高,
希望能通过调用当前最先进的汇编指令,以使其可在尽可能少的 clock 周期内完成。
可惜我的汇编水平还很差,所以求助本版高手,望能圆满解决。
(如达到预期效果,将不惜千分相赠;来着讨论亦均有分)