فهرست منبع

* fixed test on platforms that don't have 8-bit and 16-bit rol/ror

git-svn-id: trunk@36144 -
nickysn 8 سال پیش
والد
کامیت
4a8a7c210a
1فایلهای تغییر یافته به همراه102 افزوده شده و 17 حذف شده
  1. 102 17
      tests/tbs/tb0627b.pp

+ 102 - 17
tests/tbs/tb0627b.pp

@@ -10,9 +10,51 @@ program tb0627b;
 
 
 {$mode objfpc}
 {$mode objfpc}
 
 
-{$ifdef CPU64}
-  {$define CPU_HAS_INLINE_ROX_QWORD}
-{$endif}
+{ unfortunately, for this test, we need to mirror some defines from systemh.inc :( }
+
+{ if the test fails on some platform, please first check whether these defines
+  are up to date with the ones in the rtl }
+
+{------------------------------------------------------------------------------}
+
+{$ifdef FPC_HAS_INTERNAL_ROX}
+
+{$if defined(cpux86_64) or defined(cpui386) or defined(cpui8086)}
+{$define FPC_HAS_INTERNAL_ROX_BYTE}
+{$define FPC_HAS_INTERNAL_ROX_WORD}
+{$endif defined(cpux86_64) or defined(cpui386) or defined(cpui8086)}
+
+{$if defined(cpux86_64) or defined(cpui386) or defined(arm) or defined(powerpc) or defined(powerpc64) or defined(cpuaarch64)}
+{$define FPC_HAS_INTERNAL_ROX_DWORD}
+{$endif defined(cpux86_64) or defined(cpui386) or defined(arm) or defined(powerpc) or defined(powerpc64) or defined(cpuaarch64)}
+
+{$if defined(cpux86_64) or defined(powerpc64) or defined(cpuaarch64)}
+{$define FPC_HAS_INTERNAL_ROX_QWORD}
+{$define FPC_HAS_INTERNAL_ROX_ASSIGN_QWORD}
+{$endif defined(cpux86_64) or defined(powerpc64) or defined(cpuaarch64)}
+
+{$endif FPC_HAS_INTERNAL_ROX}
+
+{$ifdef FPC_HAS_INTERNAL_SAR}
+
+{$if defined(cpux86_64) or defined(cpui386) or defined(cpui8086) or defined(mips) or defined(mipsel) or defined(sparc)}
+{$define FPC_HAS_INTERNAL_SAR_BYTE}
+{$define FPC_HAS_INTERNAL_SAR_WORD}
+{$endif defined(cpux86_64) or defined(cpui386) or defined(cpui8086) or defined(mips) or defined(mipsel) or defined(sparc)}
+
+{ currently, all supported CPUs have an internal 32 bit sar implementation }
+{ $if defined(cpux86_64) or defined(cpui386) or defined(arm) or defined(powerpc) or defined(powerpc64) or defined(mips) or defined(mipsel)}
+{$define FPC_HAS_INTERNAL_SAR_DWORD}
+{ $endif defined(cpux86_64) or defined(cpui386) or defined(arm) or defined(powerpc) or defined(powerpc64) or defined(mips) or defined(mipsel)}
+
+{$if defined(cpux86_64) or defined(powerpc64) or defined(cpuaarch64)}
+{$define FPC_HAS_INTERNAL_SAR_QWORD}
+{$define FPC_HAS_INTERNAL_SAR_ASSIGN_QWORD}
+{$endif defined(cpux86_64) or defined(powerpc64) or defined(cpuaarch64)}
+
+{$endif FPC_HAS_INTERNAL_SAR}
+
+{------------------------------------------------------------------------------}
 
 
 var
 var
   SideEffectsHappened: Boolean = False;
   SideEffectsHappened: Boolean = False;
@@ -51,6 +93,7 @@ end;
 
 
 procedure Check(i64, expected_value: Int64);
 procedure Check(i64, expected_value: Int64);
 begin
 begin
+  Write('+');
   if i64<>expected_value then
   if i64<>expected_value then
   begin
   begin
     Writeln('Error!');
     Writeln('Error!');
@@ -60,6 +103,7 @@ end;
 
 
 procedure Check(qw, expected_value: QWord);
 procedure Check(qw, expected_value: QWord);
 begin
 begin
+  Write('+');
   if qw<>expected_value then
   if qw<>expected_value then
   begin
   begin
     Writeln('Error!');
     Writeln('Error!');
@@ -69,6 +113,7 @@ end;
 
 
 procedure Check(b, expected_value: Boolean);
 procedure Check(b, expected_value: Boolean);
 begin
 begin
+  Write('+');
   if b<>expected_value then
   if b<>expected_value then
   begin
   begin
     Writeln('Error!');
     Writeln('Error!');
@@ -124,40 +169,80 @@ begin
       Check(s32_SideEffects and 0, 0); CheckNoSideEffectsHappened;
       Check(s32_SideEffects and 0, 0); CheckNoSideEffectsHappened;
       Check(0 shr s32_SideEffects, 0); CheckNoSideEffectsHappened;
       Check(0 shr s32_SideEffects, 0); CheckNoSideEffectsHappened;
       Check(0 shl s32_SideEffects, 0); CheckNoSideEffectsHappened;
       Check(0 shl s32_SideEffects, 0); CheckNoSideEffectsHappened;
+{$ifdef FPC_HAS_INTERNAL_SAR_BYTE}
       Check(SarShortInt(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
       Check(SarShortInt(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
       Check(SarShortInt(ShortInt($ff), u8_SideEffects), -1); CheckNoSideEffectsHappened;
       Check(SarShortInt(ShortInt($ff), u8_SideEffects), -1); CheckNoSideEffectsHappened;
+{$else FPC_HAS_INTERNAL_SAR_BYTE}
+      Check(SarShortInt(0, u8_SideEffects), 0); CheckSideEffectsHappened;
+      Check(SarShortInt(ShortInt($ff), u8_SideEffects), -1); CheckSideEffectsHappened;
+{$endif FPC_HAS_INTERNAL_SAR_BYTE}
+{$ifdef FPC_HAS_INTERNAL_SAR_WORD}
       Check(SarSmallInt(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
       Check(SarSmallInt(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
       Check(SarSmallInt(SmallInt($ffff), u8_SideEffects), -1); CheckNoSideEffectsHappened;
       Check(SarSmallInt(SmallInt($ffff), u8_SideEffects), -1); CheckNoSideEffectsHappened;
+{$else FPC_HAS_INTERNAL_SAR_WORD}
+      Check(SarSmallInt(0, u8_SideEffects), 0); CheckSideEffectsHappened;
+      Check(SarSmallInt(SmallInt($ffff), u8_SideEffects), -1); CheckSideEffectsHappened;
+{$endif FPC_HAS_INTERNAL_SAR_WORD}
+{$ifdef FPC_HAS_INTERNAL_SAR_DWORD}
       Check(SarLongInt(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
       Check(SarLongInt(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
       Check(SarLongInt(LongInt($ffffffff), u8_SideEffects), -1); CheckNoSideEffectsHappened;
       Check(SarLongInt(LongInt($ffffffff), u8_SideEffects), -1); CheckNoSideEffectsHappened;
+{$else FPC_HAS_INTERNAL_SAR_DWORD}
+      Check(SarLongInt(0, u8_SideEffects), 0); CheckSideEffectsHappened;
+      Check(SarLongInt(LongInt($ffffffff), u8_SideEffects), -1); CheckSideEffectsHappened;
+{$endif FPC_HAS_INTERNAL_SAR_DWORD}
+      { SAR_QWORD is always handled inline in the compiler, regardless of
+        the FPC_HAS_INTERNAL_SAR_QWORD define }
+//{$ifdef FPC_HAS_INTERNAL_SAR_QWORD}
       Check(SarInt64(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
       Check(SarInt64(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
       Check(SarInt64(Int64($ffffffffffffffff), u8_SideEffects), -1); CheckNoSideEffectsHappened;
       Check(SarInt64(Int64($ffffffffffffffff), u8_SideEffects), -1); CheckNoSideEffectsHappened;
+//{$else FPC_HAS_INTERNAL_SAR_QWORD}
+//      Check(SarInt64(0, u8_SideEffects), 0); CheckSideEffectsHappened;
+//      Check(SarInt64(Int64($ffffffffffffffff), u8_SideEffects), -1); CheckSideEffectsHappened;
+//{$endif FPC_HAS_INTERNAL_SAR_QWORD}
+{$ifdef FPC_HAS_INTERNAL_ROX_BYTE}
       Check(RorByte(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
       Check(RorByte(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
       Check(RolByte(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
       Check(RolByte(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
-      Check(RorWord(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
-      Check(RolWord(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
-      Check(RorDWord(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
-      Check(RolDWord(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
-{$ifdef CPU_HAS_INLINE_ROX_QWORD}
-      Check(RorQWord(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
-      Check(RolQWord(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
-{$else CPU_HAS_INLINE_ROX_QWORD}
-      Check(RorQWord(0, u8_SideEffects), 0); CheckSideEffectsHappened;
-      Check(RolQWord(0, u8_SideEffects), 0); CheckSideEffectsHappened;
-{$endif CPU_HAS_INLINE_ROX_QWORD}
       Check(RorByte($ff, u8_SideEffects), $ff); CheckNoSideEffectsHappened;
       Check(RorByte($ff, u8_SideEffects), $ff); CheckNoSideEffectsHappened;
       Check(RolByte($ff, u8_SideEffects), $ff); CheckNoSideEffectsHappened;
       Check(RolByte($ff, u8_SideEffects), $ff); CheckNoSideEffectsHappened;
+{$else FPC_HAS_INTERNAL_ROX_BYTE}
+      Check(RorByte(0, u8_SideEffects), 0); CheckSideEffectsHappened;
+      Check(RolByte(0, u8_SideEffects), 0); CheckSideEffectsHappened;
+      Check(RorByte($ff, u8_SideEffects), $ff); CheckSideEffectsHappened;
+      Check(RolByte($ff, u8_SideEffects), $ff); CheckSideEffectsHappened;
+{$endif FPC_HAS_INTERNAL_ROX_BYTE}
+{$ifdef FPC_HAS_INTERNAL_ROX_WORD}
+      Check(RorWord(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
+      Check(RolWord(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
       Check(RorWord($ffff, u8_SideEffects), $ffff); CheckNoSideEffectsHappened;
       Check(RorWord($ffff, u8_SideEffects), $ffff); CheckNoSideEffectsHappened;
       Check(RolWord($ffff, u8_SideEffects), $ffff); CheckNoSideEffectsHappened;
       Check(RolWord($ffff, u8_SideEffects), $ffff); CheckNoSideEffectsHappened;
+{$else FPC_HAS_INTERNAL_ROX_WORD}
+      Check(RorWord(0, u8_SideEffects), 0); CheckSideEffectsHappened;
+      Check(RolWord(0, u8_SideEffects), 0); CheckSideEffectsHappened;
+      Check(RorWord($ffff, u8_SideEffects), $ffff); CheckSideEffectsHappened;
+      Check(RolWord($ffff, u8_SideEffects), $ffff); CheckSideEffectsHappened;
+{$endif FPC_HAS_INTERNAL_ROX_WORD}
+{$ifdef FPC_HAS_INTERNAL_ROX_DWORD}
+      Check(RorDWord(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
+      Check(RolDWord(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
       Check(RorDWord($ffffffff, u8_SideEffects), $ffffffff); CheckNoSideEffectsHappened;
       Check(RorDWord($ffffffff, u8_SideEffects), $ffffffff); CheckNoSideEffectsHappened;
       Check(RolDWord($ffffffff, u8_SideEffects), $ffffffff); CheckNoSideEffectsHappened;
       Check(RolDWord($ffffffff, u8_SideEffects), $ffffffff); CheckNoSideEffectsHappened;
-{$ifdef CPU_HAS_INLINE_ROX_QWORD}
+{$else FPC_HAS_INTERNAL_ROX_DWORD}
+      Check(RorDWord(0, u8_SideEffects), 0); CheckSideEffectsHappened;
+      Check(RolDWord(0, u8_SideEffects), 0); CheckSideEffectsHappened;
+      Check(RorDWord($ffffffff, u8_SideEffects), $ffffffff); CheckSideEffectsHappened;
+      Check(RolDWord($ffffffff, u8_SideEffects), $ffffffff); CheckSideEffectsHappened;
+{$endif FPC_HAS_INTERNAL_ROX_DWORD}
+{$ifdef FPC_HAS_INTERNAL_ROX_QWORD}
+      Check(RorQWord(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
+      Check(RolQWord(0, u8_SideEffects), 0); CheckNoSideEffectsHappened;
       Check(RorQWord(QWord($ffffffffffffffff), u8_SideEffects), QWord($ffffffffffffffff)); CheckNoSideEffectsHappened;
       Check(RorQWord(QWord($ffffffffffffffff), u8_SideEffects), QWord($ffffffffffffffff)); CheckNoSideEffectsHappened;
       Check(RolQWord(QWord($ffffffffffffffff), u8_SideEffects), QWord($ffffffffffffffff)); CheckNoSideEffectsHappened;
       Check(RolQWord(QWord($ffffffffffffffff), u8_SideEffects), QWord($ffffffffffffffff)); CheckNoSideEffectsHappened;
-{$else CPU_HAS_INLINE_ROX_QWORD}
+{$else FPC_HAS_INTERNAL_ROX_QWORD}
+      Check(RorQWord(0, u8_SideEffects), 0); CheckSideEffectsHappened;
+      Check(RolQWord(0, u8_SideEffects), 0); CheckSideEffectsHappened;
       Check(RorQWord(QWord($ffffffffffffffff), u8_SideEffects), QWord($ffffffffffffffff)); CheckSideEffectsHappened;
       Check(RorQWord(QWord($ffffffffffffffff), u8_SideEffects), QWord($ffffffffffffffff)); CheckSideEffectsHappened;
       Check(RolQWord(QWord($ffffffffffffffff), u8_SideEffects), QWord($ffffffffffffffff)); CheckSideEffectsHappened;
       Check(RolQWord(QWord($ffffffffffffffff), u8_SideEffects), QWord($ffffffffffffffff)); CheckSideEffectsHappened;
-{$endif CPU_HAS_INLINE_ROX_QWORD}
+{$endif FPC_HAS_INTERNAL_ROX_QWORD}
   end;
   end;
   Writeln('Ok!');
   Writeln('Ok!');
 end.
 end.