|
From: <CW...@us...> - 2012-03-30 23:03:38
|
Revision: 1534
http://graphics32.svn.sourceforge.net/graphics32/?rev=1534&view=rev
Author: CWBudde
Date: 2012-03-30 23:03:31 +0000 (Fri, 30 Mar 2012)
Log Message:
-----------
* fixed issues with addressing in 64-bit mode (in both FPC and Delphi) and removed unnecessary RET opcodes (not working properly in FPC 64-Bit compiler)
Modified Paths:
--------------
trunk/Source/Examples/Vcl/Blending/TextureBlend_Ex/TextureBlend_Ex.lpi
trunk/Source/GR32.inc
trunk/Source/GR32.pas
trunk/Source/GR32_Backends_Generic.pas
trunk/Source/GR32_Blend.pas
trunk/Source/GR32_Math.pas
trunk/Source/GR32_Resamplers.pas
trunk/Source/GR32_VectorMaps.pas
Modified: trunk/Source/Examples/Vcl/Blending/TextureBlend_Ex/TextureBlend_Ex.lpi
===================================================================
--- trunk/Source/Examples/Vcl/Blending/TextureBlend_Ex/TextureBlend_Ex.lpi 2012-03-29 23:37:52 UTC (rev 1533)
+++ trunk/Source/Examples/Vcl/Blending/TextureBlend_Ex/TextureBlend_Ex.lpi 2012-03-30 23:03:31 UTC (rev 1534)
@@ -22,7 +22,7 @@
<Item1 Name="Release" Default="True"/>
<Item2 Name="Debug">
<CompilerOptions>
- <Version Value="10"/>
+ <Version Value="11"/>
<PathDelim Value="\"/>
<SearchPaths>
<IncludeFiles Value="..\..\..\.."/>
@@ -44,7 +44,7 @@
</CodeGeneration>
<Linking>
<Debugging>
- <GenerateDebugInfo Value="True"/>
+ <DebugInfoType Value="dsStabs"/>
</Debugging>
<LinkSmart Value="True"/>
<Options>
@@ -101,7 +101,7 @@
</Units>
</ProjectOptions>
<CompilerOptions>
- <Version Value="10"/>
+ <Version Value="11"/>
<PathDelim Value="\"/>
<SearchPaths>
<IncludeFiles Value="..\..\..\.."/>
@@ -122,6 +122,7 @@
</CodeGeneration>
<Linking>
<Debugging>
+ <GenerateDebugInfo Value="False"/>
<UseLineInfoUnit Value="False"/>
<StripSymbols Value="True"/>
</Debugging>
Modified: trunk/Source/GR32.inc
===================================================================
--- trunk/Source/GR32.inc 2012-03-29 23:37:52 UTC (rev 1533)
+++ trunk/Source/GR32.inc 2012-03-30 23:03:31 UTC (rev 1534)
@@ -183,6 +183,9 @@
*)
{-$DEFINE OMIT_SSE2}
- {$IFNDEF COMPILER7_UP}
- {$DEFINE OMIT_SSE2}
+
+ {$IFNDEF COMPILERFPC}
+ {$IFNDEF COMPILER7_UP}
+ {$DEFINE OMIT_SSE2}
+ {$ENDIF}
{$ENDIF}
Modified: trunk/Source/GR32.pas
===================================================================
--- trunk/Source/GR32.pas 2012-03-29 23:37:52 UTC (rev 1533)
+++ trunk/Source/GR32.pas 2012-03-30 23:03:31 UTC (rev 1534)
@@ -50,7 +50,7 @@
{ Version Control }
const
- Graphics32Version = '1.9.0';
+ Graphics32Version = '1.9.1';
{ 32-bit Color }
Modified: trunk/Source/GR32_Backends_Generic.pas
===================================================================
--- trunk/Source/GR32_Backends_Generic.pas 2012-03-29 23:37:52 UTC (rev 1533)
+++ trunk/Source/GR32_Backends_Generic.pas 2012-03-30 23:03:31 UTC (rev 1534)
@@ -238,7 +238,11 @@
if (MapFileName <> '') or IsTemporary then
begin
if MapFileName = '' then
- MapFileName := GetTempFileName(IntToStr(Integer(Self)));
+ {$IFDEF HAS_NATIVEINT}
+ MapFileName := GetTempFileName(IntToStr(NativeUInt(Self)));
+ {$ELSE}
+ MapFileName := GetTempFileName(IntToStr(Cardinal(Self)));
+ {$ENDIF}
// delete file if exists
if FileExists(MapFileName) then
Modified: trunk/Source/GR32_Blend.pas
===================================================================
--- trunk/Source/GR32_Blend.pas 2012-03-29 23:37:52 UTC (rev 1533)
+++ trunk/Source/GR32_Blend.pas 2012-03-30 23:03:31 UTC (rev 1534)
@@ -769,8 +769,7 @@
RET
@1: MOV EAX,EDX
-@2: RET
-
+@2:
end;
procedure BlendMem_ASM(F: TColor32; var B: TColor32);
@@ -834,7 +833,7 @@
RET
@1: MOV [EDX],EAX
-@2: RET
+@2:
{$ENDIF}
{$IFDEF TARGET_x64}
@@ -892,7 +891,7 @@
RET
@1: MOV [RDX],EAX
-@2: RET
+@2:
{$ENDIF}
end;
@@ -961,7 +960,6 @@
POP EBX
@2: MOV EAX,EDX
- RET
{$ENDIF}
{$IFDEF TARGET_x64}
@@ -1011,7 +1009,6 @@
RET
@1: MOV EAX,EDX
- RET
{$ENDIF}
end;
@@ -1075,7 +1072,7 @@
POP ESI
@1: POP EBX
-@2: RET
+@2:
{$ENDIF}
{$IFDEF TARGET_x64}
@@ -1093,7 +1090,7 @@
// Get weight W = Fa * M
MOV EAX,ECX // EAX <- Fa Fr Fg Fb
- INC R8 // 255:256 range bias
+ INC R8D // 255:256 range bias
SHR EAX,24 // EAX <- 00 00 00 Fa
IMUL R8D,EAX // R8 <- 00 00 W **
SHR R8,8 // R8 <- 00 00 00 W
@@ -1134,7 +1131,7 @@
MOV [RDX],ECX
-@1: RET
+@1:
{$ENDIF}
end;
@@ -1221,7 +1218,6 @@
POP EBX
@4:
- RET
{$ENDIF}
{$IFDEF TARGET_x64}
@@ -1230,19 +1226,16 @@
// R8 <- Count
// test the counter for zero or negativity
- TEST R8,R8
+ TEST R8D,R8D
JS @4
- PUSH RSI
- PUSH RDI
+ MOV R10,RCX // R10 <- Src
+ MOV R11,RDX // R11 <- Dst
+ MOV ECX,R8D // RCX <- Count
- MOV RSI,RCX // RSI <- Src
- MOV RDI,RDX // RDI <- Dst
- MOV RCX,R8 // RCX <- Count
-
// loop start
@1:
- MOV EAX,[RSI]
+ MOV EAX,[R10]
TEST EAX,$FF000000
JZ @3 // complete transparency, proceed to next point
@@ -1269,7 +1262,7 @@
OR EAX,R8D // EAX <- Pa Pr Pg Pb
// W = 1 - W; Q = W * B
- MOV EDX,[RDI]
+ MOV EDX,[R11]
XOR R9D,$000000FF // R9D <- 1 - R9D
MOV R8D,EDX // R8D <- Ba Br Bg Bb
AND EDX,$00FF00FF // ESI <- 00 Br 00 Bb
@@ -1287,21 +1280,17 @@
// Z = P + Q (assuming no overflow at each byte)
ADD EAX,R8D // EAX <- Za Zr Zg Zb
@2:
- MOV [RDI],EAX
+ MOV [R11],EAX
@3:
- ADD RSI,4
- ADD RDI,4
+ ADD R10,4
+ ADD R11,4
// loop end
- DEC RCX
+ DEC ECX
JNZ @1
- POP RDI
- POP RSI
-
@4:
- RET
{$ENDIF}
end;
@@ -1537,7 +1526,7 @@
RET
@1: MOV EAX,EDX
-@2: RET
+@2:
{$ENDIF}
{$IFDEF TARGET_x64}
@@ -1586,7 +1575,7 @@
RET
@1: MOV EAX,EDX
-@2: RET
+@2:
{$ENDIF}
end;
@@ -1650,7 +1639,6 @@
@1: RET
@2: MOV [EDX],EAX
- RET
{$ENDIF}
{$IFDEF TARGET_x64}
@@ -1679,7 +1667,7 @@
OR EAX,ECX // EAX <- 00 Pr Pg Pb
// W = 1 - W; Q = W * B
- MOV R9D,[EDX]
+ MOV R9D,[RDX]
XOR R8D,$000000FF // R8D <- 1 - R8D
MOV ECX,R9D // ECX <- Ba Br Bg Bb
AND R9D,$00FF00FF // R9D <- 00 Br 00 Bb
@@ -1697,10 +1685,10 @@
// Z = P + Q (assuming no overflow at each byte)
ADD EAX,ECX // EAX <- 00 Zr Zg Zb
- MOV [EDX],EAX
+ MOV [RDX],EAX
-@1: MOV [EDX],EAX
-@2: RET
+@1: MOV [RDX],EAX
+@2:
{$ENDIF}
end;
@@ -1737,9 +1725,9 @@
begin
GetMem(AlphaTable, 257 * 8 * SizeOf(Cardinal));
{$IFDEF HAS_NATIVEINT}
- alpha_ptr := Pointer(NativeInt(AlphaTable) and $FFFFFFF8);
- if NativeInt(alpha_ptr) < NativeInt(AlphaTable) then
- alpha_ptr := Pointer(NativeInt(alpha_ptr) + 8);
+ alpha_ptr := Pointer(NativeUInt(AlphaTable) and $FFFFFFF8);
+ if NativeUInt(alpha_ptr) < NativeUInt(AlphaTable) then
+ alpha_ptr := Pointer(NativeUInt(alpha_ptr) + 8);
{$ELSE}
alpha_ptr := Pointer(Cardinal(AlphaTable) and $FFFFFFF8);
if Cardinal(alpha_ptr) < Cardinal(AlphaTable) then
@@ -1954,14 +1942,14 @@
MOV EAX,ECX
SHR EAX,24
- INC R8 // 255:256 range bias
- IMUL R8,EAX
- SHR R8,8
+ INC R8D // 255:256 range bias
+ IMUL R8D,EAX
+ SHR R8D,8
JZ @1
PXOR MM0,MM0
MOVD MM1,ECX
- SHL R8,4
+ SHL R8D,4
MOVD MM2,[RDX]
PUNPCKLBW MM1,MM0
PUNPCKLBW MM2,MM0
@@ -2035,7 +2023,7 @@
POP EDI
POP ESI
-@4: RET
+@4:
end;
procedure BlendLineEx_MMX(Src, Dst: PColor32; Count: Integer; M: TColor32);
@@ -2209,15 +2197,15 @@
// R8 - Weight of X [0..255]
// Result := W * (X - Y) + Y
- TEST R8,R8 // Set flags for R8
+ TEST R8D,R8D // Set flags for R8
JZ @1 // W = 0 ? => Result := EDX
- CMP R8,$FF
+ CMP R8D,$FF
JZ @2
MOVD MM1,ECX
PXOR MM0,MM0
- SHL R8,4
+ SHL R8D,4
MOVD MM2,[RDX]
PUNPCKLBW MM1,MM0
@@ -2765,16 +2753,16 @@
TEST ECX, $FF000000
JZ @1
- MOV R9,RCX
- SHR R9,24
- INC R8 // 255:256 range bias
- IMUL R8,R9
- SHR R8,8
+ MOV R9D,ECX
+ SHR R9D,24
+ INC R8D // 255:256 range bias
+ IMUL R8D,R9D
+ SHR R8D,8
JZ @1
PXOR XMM0,XMM0
MOVD XMM1,ECX
- SHL R8,4
+ SHL R8D,4
MOVD XMM2,[RDX]
PUNPCKLBW XMM1,XMM0
PUNPCKLBW XMM2,XMM0
@@ -2802,13 +2790,11 @@
TEST ECX,ECX
JZ @4
- PUSH ESI
- PUSH EDI
+ PUSH EBX
- MOV ESI,EAX
- MOV EDI,EDX
+ MOV EBX,EAX
-@1: MOV EAX,[ESI]
+@1: MOV EAX,[EBX]
TEST EAX,$FF000000
JZ @3
CMP EAX,$FF000000
@@ -2816,7 +2802,7 @@
MOVD XMM0,EAX
PXOR XMM3,XMM3
- MOVD XMM2,[EDI]
+ MOVD XMM2,[EDX]
PUNPCKLBW XMM0,XMM3
MOV EAX,bias_ptr
PUNPCKLBW XMM2,XMM3
@@ -2833,18 +2819,17 @@
PACKUSWB XMM2,XMM3
MOVD EAX, XMM2
-@2: MOV [EDI],EAX
+@2: MOV [EDX],EAX
-@3: ADD ESI,4
- ADD EDI,4
+@3: ADD EBX,4
+ ADD EDX,4
DEC ECX
JNZ @1
- POP EDI
- POP ESI
+ POP EBX
-@4: RET
+@4:
{$ENDIF}
{$IFDEF TARGET_X64}
@@ -2855,10 +2840,7 @@
TEST R8D,R8D
JZ @4
- MOV R10,RCX
- MOV R11,RDX
-
-@1: MOV EAX,[R10]
+@1: MOV EAX,[RCX]
TEST EAX,$FF000000
JZ @3
CMP EAX,$FF000000
@@ -2866,7 +2848,7 @@
MOVD XMM0,EAX
PXOR XMM3,XMM3
- MOVD XMM2,[R11]
+ MOVD XMM2,[RDX]
PUNPCKLBW XMM0,XMM3
MOV RAX,bias_ptr
PUNPCKLBW XMM2,XMM3
@@ -2883,15 +2865,15 @@
PACKUSWB XMM2,XMM3
MOVD EAX, XMM2
-@2: MOV [R11],EAX
+@2: MOV [RDX],EAX
-@3: ADD R10,4
- ADD R11,4
+@3: ADD RCX,4
+ ADD RDX,4
DEC R8D
JNZ @1
-@4: RET
+@4:
{$ENDIF}
end;
@@ -3122,15 +3104,15 @@
// R8 - Weight of X [0..255]
// Result := W * (X - Y) + Y
- TEST R8,R8 // Set flags for R8
+ TEST R8D,R8D // Set flags for R8
JZ @1 // W = 0 ? => Result := EDX
- CMP R8,$FF
+ CMP R8D,$FF
JZ @2
MOVD XMM1,ECX
PXOR XMM0,XMM0
- SHL R8,4
+ SHL R8D,4
MOVD XMM2,[RDX]
PUNPCKLBW XMM1,XMM0
@@ -3324,7 +3306,7 @@
ADD EAX,$0FF01000
PSLLW XMM0,4
XOR EDX,EDX // EDX <- 00
- DIV EAX,ECX // EAX <- Fa / Ra = Wa
+ DIV ECX // EAX <- Fa / Ra = Wa
MOVD XMM4,EAX // XMM3 <- Wa
PSHUFLW XMM4,XMM4,$C0 // XMM3 <- 00 00 ** Wa ** Wa ** Wa
PMULHW XMM0,XMM4 // XMM0 <- 00 00 ** Pr ** Pg ** Pb
@@ -3367,7 +3349,7 @@
ADD EAX,$0FF01000
PSLLW XMM0,4
XOR EDX,EDX // EDX <- 00
- DIV EAX,ECX // EAX <- Fa / Ra = Wa
+ DIV ECX // EAX <- Fa / Ra = Wa
MOVD XMM4,EAX // XMM3 <- Wa
PSHUFLW XMM4,XMM4,$C0 // XMM3 <- 00 00 ** Wa ** Wa ** Wa
PMULHW XMM0,XMM4 // XMM0 <- 00 00 ** Pr ** Pg ** Pb
Modified: trunk/Source/GR32_Math.pas
===================================================================
--- trunk/Source/GR32_Math.pas 2012-03-29 23:37:52 UTC (rev 1533)
+++ trunk/Source/GR32_Math.pas 2012-03-30 23:03:31 UTC (rev 1534)
@@ -559,6 +559,7 @@
const
CHalf : TFloat = 0.5;
asm
+{$IFDEF TARGET_x86}
MOV EAX, Value
SUB EAX, $3F800000
SAR EAX, 1
@@ -569,6 +570,18 @@
FADD DWORD PTR [ESP - 4]
FMUL CHalf
{$ENDIF}
+{$IFDEF TARGET_x64}
+ MOVD EAX, Value
+ SUB EAX, $3F800000
+ SAR EAX, 1
+ ADD EAX, $3F800000
+ MOVD XMM1, EAX
+ DIVSS XMM0, XMM1
+ ADDSS XMM0, XMM1
+ MOVD XMM1, CHalf
+ MULSS XMM0, XMM1
+{$ENDIF}
+{$ENDIF}
end;
function FastInvSqrt(const Value: Single): Single;
Modified: trunk/Source/GR32_Resamplers.pas
===================================================================
--- trunk/Source/GR32_Resamplers.pas 2012-03-29 23:37:52 UTC (rev 1533)
+++ trunk/Source/GR32_Resamplers.pas 2012-03-30 23:03:31 UTC (rev 1534)
@@ -961,8 +961,8 @@
CombineLine(@Buf1[1], @Buf1[0], SrcRectW, FracX);
if SrcRect.Left > 0 then
- {$IFDEF FPC}
- C2 := CombineReg(PColor32(PtrUInt(SrcP) - 4)^, SrcP[0], FracX xor $FF)
+ {$IFDEF HAS_NATIVEINT}
+ C2 := CombineReg(PColor32(NativeUInt(SrcP) - 4)^, SrcP[0], FracX xor $FF)
{$ELSE}
C2 := CombineReg(PColor32(Integer(SrcP) - 4)^, SrcP[0], FracX xor $FF)
{$ENDIF}
@@ -980,8 +980,8 @@
CombineLine(@Buf2[1], @Buf2[0], SrcRectW, FracX xor $FF);
if SrcRect.Left > 0 then
- {$IFDEF FPC}
- C1 := CombineReg(PColor32(PtrUInt(SrcP) - 4)^, SrcP[0], FracX)
+ {$IFDEF HAS_NATIVEINT}
+ C1 := CombineReg(PColor32(NativeUInt(SrcP) - 4)^, SrcP[0], FracX)
{$ELSE}
C1 := CombineReg(PColor32(Integer(SrcP) - 4)^, SrcP[0], FracX)
{$ENDIF}
@@ -1029,8 +1029,8 @@
CombineLine(@Buf2[1], @Buf2[0], SrcRectW, FracX xor $FF);
if SrcRect.Left > 0 then
- {$IFDEF FPC}
- C2 := CombineReg(PColor32(PtrUInt(SrcP) - 4)^, SrcP[0], FracX xor $FF)
+ {$IFDEF HAS_NATIVEINT}
+ C2 := CombineReg(PColor32(NativeUInt(SrcP) - 4)^, SrcP[0], FracX xor $FF)
{$ELSE}
C2 := CombineReg(PColor32(Integer(SrcP) - 4)^, SrcP[0], FracX xor $FF)
{$ENDIF}
@@ -1072,8 +1072,8 @@
CombineLine(@Buf2[1], @Buf2[0], SrcRectW, FracY xor $FF);
CombineLine(@Buf2[0], @Buf1[0], SrcRectW, FracY xor $FF);
if SrcRect.Left > 0 then
- {$IFDEF FPC}
- C2 := CombineReg(PColor32(PtrUInt(SrcP) - 4)^, SrcP[0], FracX xor $FF)
+ {$IFDEF HAS_NATIVEINT}
+ C2 := CombineReg(PColor32(NativeUInt(SrcP) - 4)^, SrcP[0], FracX xor $FF)
{$ELSE}
C2 := CombineReg(PColor32(Integer(SrcP) - 4)^, SrcP[0], FracX xor $FF)
{$ENDIF}
@@ -1806,7 +1806,7 @@
Inc(C);
end;
{$IFDEF HAS_NATIVEINT}
- Inc(NativeInt(RowSrc), OffSrc);
+ Inc(NativeUInt(RowSrc), OffSrc);
{$ELSE}
Inc(Cardinal(RowSrc), OffSrc);
{$ENDIF}
@@ -2288,7 +2288,7 @@
Inc(DstLine, Dst.Width);
{$IFDEF HAS_NATIVEINT}
- Inc(NativeInt(RowSrc), OffSrc * dy);
+ Inc(NativeUInt(RowSrc), OffSrc * dy);
{$ELSE}
Inc(Cardinal(RowSrc), OffSrc * dy);
{$ENDIF}
@@ -3103,7 +3103,11 @@
Fixed := Round((clX - X) * W);
PHorzKernel := @HorzKernel;
FloorKernel := @FWeightTable.ValPtr[KWidth - MAX_KERNEL_WIDTH, Int]^;
- CeilKernel := PKernelEntry(Integer(FloorKernel) + J);
+ {$IFDEF HAS_NATIVEINT}
+ CeilKernel := PKernelEntry(NativeUInt(FloorKernel) + J);
+ {$ELSE}
+ CeilKernel := PKernelEntry(Cardinal(FloorKernel) + J);
+ {$ENDIF}
Dev := -256;
for I := -KWidth to KWidth do
begin
@@ -3119,7 +3123,11 @@
Fixed := Round((clY - Y) * W);
PVertKernel := @VertKernel;
FloorKernel := @FWeightTable.ValPtr[KWidth - MAX_KERNEL_WIDTH, Int]^;
- CeilKernel := PKernelEntry(Integer(FloorKernel) + J);
+ {$IFDEF HAS_NATIVEINT}
+ CeilKernel := PKernelEntry(NativeUInt(FloorKernel) + J);
+ {$ELSE}
+ CeilKernel := PKernelEntry(Cardinal(FloorKernel) + J);
+ {$ENDIF}
Dev := -256;
for I := -KWidth to KWidth do
begin
Modified: trunk/Source/GR32_VectorMaps.pas
===================================================================
--- trunk/Source/GR32_VectorMaps.pas 2012-03-29 23:37:52 UTC (rev 1533)
+++ trunk/Source/GR32_VectorMaps.pas 2012-03-30 23:03:31 UTC (rev 1534)
@@ -241,8 +241,8 @@
WY := TFixedRec(Y).Frac;
{$IFDEF HAS_NATIVEINT}
Result := CombineVectorsReg(CombineVectorsReg(PFixedPoint(P)^,
- PFixedPoint(NativeInt(P) + H)^, WX), CombineVectorsReg(
- PFixedPoint(NativeInt(P) + W)^, PFixedPoint(NativeInt(P) + W + H)^, WX),
+ PFixedPoint(NativeUInt(P) + H)^, WX), CombineVectorsReg(
+ PFixedPoint(NativeUInt(P) + W)^, PFixedPoint(NativeUInt(P) + W + H)^, WX),
WY);
{$ELSE}
Result := CombineVectorsReg(CombineVectorsReg(PFixedPoint(P)^,
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|