unit FastcodeMaxFPUnit01; //Version : 0.1. Preliminary version //Only direct calling supported interface function MaxFPFastcodeP4(const A, B : Extended) : Extended; overload; function MaxFPFastcodeP3(const A, B : Extended) : Extended; overload; function MaxFPFastcodeXP(const A, B : Extended) : Extended; overload; function MaxFPFastcodeOpteron(const A, B : Extended) : Extended; overload; function MaxFPFastcodeRTL(const A, B : Extended) : Extended; overload; //function MaxFPFastcodePascal(const A, B : Extended) : Extended; overload; function MaxFPFastcodeBlended(const A, B : Extended) : Extended; overload; function MaxFPFastcodeP4(const A, B : Double) : Double; overload; function MaxFPFastcodeP3(const A, B : Double) : Double; overload; function MaxFPFastcodeXP(const A, B : Double) : Double; overload; function MaxFPFastcodeOpteron(const A, B : Double) : Double; overload; function MaxFPFastcodeRTL(const A, B : Double) : Double; overload; function MaxFPFastcodePascal(const A, B : Double) : Double; overload; function MaxFPFastcodeBlended(const A, B : Double) : Double; overload; function MaxFPFastcodeP4(const A, B : Single) : Single; overload; function MaxFPFastcodeP3(const A, B : Single) : Single; overload; function MaxFPFastcodeXP(const A, B : Single) : Single; overload; function MaxFPFastcodeOpteron(const A, B : Single) : Single; overload; function MaxFPFastcodeRTL(const A, B : Single) : Single; overload; function MaxFPFastcodePascal(const A, B : Single) : Single; overload; function MaxFPFastcodeBlended(const A, B : Single) : Single; overload; implementation //Author: Dennis Kjaer Christensen //Date: N/A //Optimized for: P4 //Instructionset(s): N/A //Original Name: MaxDKCASM3 function MaxFPFastcodeP4(const A, B : Single) : Single; overload; asm fld A fld B fcomi st(0), st(1) fcmovb st(0), st(1) ffree st(1) end; //Author: John O'Harrow //Date: N/A //Optimized for: P3 //Instructionset(s): N/A //Original Name: MaxJOH function MaxFPFastcodeP3(const A, B : Extended) : Extended; overload; asm fld A fld B fcomi st(0), st(1) fcmovb st(0), st(1) ffree st(1) end; //Author: Dennis Kjaer Christensen //Date: N/A //Optimized for: XP //Instructionset(s): N/A //Original Name: MaxDKCASM2 function MaxFPFastcodeXP(const A, B : Extended) : Extended; overload; asm //if A >= B then fld A fld B fcomi st(0), st(1) jb @Else //Result := A ffree st(1) pop ebp ret $18 //else //Result := B; @Else : fxch ffree st(1) end; //Author: Dennis Kjaer Christensen //Date: N/A //Optimized for: Opteron //Instructionset(s): N/A //Original Name: MaxDKCASM2 function MaxFPFastcodeOpteron(const A, B : Extended) : Extended; overload; asm //if A >= B then fld A fld B fcomi st(0), st(1) jb @Else //Result := A ffree st(1) pop ebp ret $18 //else //Result := B; @Else : fxch ffree st(1) end; //Author: John O'Harrow //Date: N/A //Optimized for: RTL //Instructionset(s): N/A //Original Name: MaxJOH_RTL function MaxFPFastcodeRTL(const A, B : Extended) : Extended; overload; asm fld A fld B fcom fstsw ax sahf jnc @done fxch @done: ffree st(1) end; //Author: Dennis Kjaer Christensen //Date: N/A //Optimized for: Blended //Instructionset(s): N/A //Original Name: MaxDKCASM2 function MaxFPFastcodeBlended(const A, B : Extended) : Extended; overload; asm //if A >= B then fld A fld B fcomi st(0), st(1) jb @Else //Result := A ffree st(1) pop ebp ret $18 //else //Result := B; @Else : fxch ffree st(1) end; //Author: Dennis Kjaer Christensen //Date: N/A //Optimized for: P4 //Instructionset(s): N/A //Original Name: MaxDKCASM3 function MaxFPFastcodeP4(const A, B : Double) : Double; overload; asm fld A fld B fcomi st(0), st(1) fcmovb st(0), st(1) ffree st(1) end; //Author: John O'Harrow //Date: N/A //Optimized for: P3 //Instructionset(s): N/A //Original Name: MaxJOH function MaxFPFastcodeP3(const A, B : Double) : Double; overload; asm fld A fld B fcomi st(0), st(1) fcmovb st(0), st(1) ffree st(1) end; //Author: Dennis Kjaer Christensen //Date: N/A //Optimized for: XP //Instructionset(s): N/A //Original Name: MaxDKCASM2 function MaxFPFastcodeXP(const A, B : Double) : Double; overload; asm //if A >= B then fld A fld B fcomi st(0),st(1) jb @Else //Result := A ffree st(1) pop ebp ret 16 //else //Result := B; @Else : fxch ffree st(1) end; //Author: Dennis Kjaer Christensen //Date: N/A //Optimized for: Opteron //Instructionset(s): N/A //Original Name: MaxDKCASM2 function MaxFPFastcodeOpteron(const A, B : Double) : Double; overload; asm //if A >= B then fld A fld B fcomi st(0),st(1) jb @Else //Result := A ffree st(1) pop ebp ret 16 //else //Result := B; @Else : fxch ffree st(1) end; //Author: John O'Harrow //Date: N/A //Optimized for: RTL //Instructionset(s): N/A //Original Name: MaxJOH_RTL function MaxFPFastcodeRTL(const A, B : Double) : Double; overload; asm fld A fld B fcom fstsw ax sahf jnc @done fxch @done: ffree st(1) end; //Author: Dennis Kjaer Christensen //Date: N/A //Optimized for: Pascal //Instructionset(s): N/A //Original Name: MaxDKCPas function MaxFPFastcodePascal(const A, B : Double) : Double; overload; begin if A >= B then Result := A else Result := B; end; //Author: Dennis Kjaer Christensen //Date: N/A //Optimized for: Blended //Instructionset(s): N/A //Original Name: MaxDKCASM2 function MaxFPFastcodeBlended(const A, B : Double) : Double; overload; asm //if A >= B then fld A fld B fcomi st(0),st(1) jb @Else //Result := A ffree st(1) pop ebp ret 16 //else //Result := B; @Else : fxch ffree st(1) end; //Author: Dennis Kjaer Christensen //Date: N/A //Optimized for: P4 //Instructionset(s): N/A //Original Name: MaxDKCSSE function MaxFPFastcodeP4(const A, B : Single) : Single; overload; asm movss xmm0,A movss xmm1,b maxss xmm0,xmm1 movss [esp-8],xmm0 fld dword ptr [esp-8] end; //Author: John O'Harrow //Date: N/A //Optimized for: P3 //Instructionset(s): N/A //Original Name: MaxJOH function MaxFPFastcodeP3(const A, B : Single) : Single; overload; asm fld A fld B fcomi st(0), st(1) fcmovb st(0), st(1) ffree st(1) end; //Author: Dennis Kjaer Christensen //Date: N/A //Optimized for: XP //Instructionset(s): N/A //Original Name: MaxDKCSSE function MaxFPFastcodeXP(const A, B : Single) : Single; overload; asm movss xmm0,A movss xmm1,b maxss xmm0,xmm1 movss [esp-8],xmm0 fld dword ptr [esp-8] end; //Author: Dennis Kjaer Christensen //Date: N/A //Optimized for: Opteron //Instructionset(s): N/A //Original Name: MaxDKCSSE function MaxFPFastcodeOpteron(const A, B : Single) : Single; overload; asm movss xmm0,A movss xmm1,b maxss xmm0,xmm1 movss [esp-8],xmm0 fld dword ptr [esp-8] end; //Author: John O'Harrow //Date: N/A //Optimized for: RTL //Instructionset(s): N/A //Original Name: MaxJOH_RTL function MaxFPFastcodeRTL(const A, B : Single) : Single; overload; asm fld B fcomp A fstsw ax and eax, $100 shr eax, 6 {eax = 0 or 4} fld dword ptr [ebp+eax+8] end; //Author: Dennis Kjaer Christensen //Date: N/A //Optimized for: Pascal //Instructionset(s): N/A //Original Name: MaxDKCPas function MaxFPFastcodePascal(const A, B : Single) : Single; overload; begin if A >= B then Result := A else Result := B; end; //Author: John O'Harrow //Date: N/A //Optimized for: Blended //Instructionset(s): N/A //Original Name: MaxJOH function MaxFPFastcodeBlended(const A, B : Single) : Single; overload; asm fld A fld B fcomi st(0), st(1) fcmovb st(0), st(1) ffree st(1) end; end.