Browse Source

+ added compile time const evaluation for Bsf/Bsr(const) as well

git-svn-id: trunk@35941 -
nickysn 8 years ago
parent
commit
5393daa994
3 changed files with 1567 additions and 0 deletions
  1. 1 0
      .gitattributes
  2. 36 0
      compiler/ninl.pas
  3. 1530 0
      tests/test/tbsx2.pp

+ 1 - 0
.gitattributes

@@ -12104,6 +12104,7 @@ tests/test/tblock2a.pp svneol=native#text/plain
 tests/test/tbopr.pp svneol=native#text/plain
 tests/test/tbrtlevt.pp svneol=native#text/plain
 tests/test/tbsx1.pp svneol=native#text/plain
+tests/test/tbsx2.pp svneol=native#text/plain
 tests/test/tcas128.pp svneol=native#text/pascal
 tests/test/tcase0.pp svneol=native#text/pascal
 tests/test/tcase1.pp svneol=native#text/plain

+ 36 - 0
compiler/ninl.pas

@@ -2534,6 +2534,42 @@ implementation
               in_ror_x,
               in_ror_x_y :
                 result:=handle_const_rox;
+              in_bsf_x:
+                begin
+                  if left.nodetype=ordconstn then
+                    begin
+                      case left.resultdef.size of
+                        1:
+                          result:=cordconstnode.create(BsfByte(Byte(tordconstnode(left).value.uvalue)),resultdef,false);
+                        2:
+                          result:=cordconstnode.create(BsfWord(Word(tordconstnode(left).value.uvalue)),resultdef,false);
+                        4:
+                          result:=cordconstnode.create(BsfDWord(DWord(tordconstnode(left).value.uvalue)),resultdef,false);
+                        8:
+                          result:=cordconstnode.create(BsfQWord(QWord(tordconstnode(left).value.uvalue)),resultdef,false);
+                        else
+                          internalerror(2017042401);
+                      end;
+                    end;
+                end;
+              in_bsr_x :
+                begin
+                  if left.nodetype=ordconstn then
+                    begin
+                      case left.resultdef.size of
+                        1:
+                          result:=cordconstnode.create(BsrByte(Byte(tordconstnode(left).value.uvalue)),resultdef,false);
+                        2:
+                          result:=cordconstnode.create(BsrWord(Word(tordconstnode(left).value.uvalue)),resultdef,false);
+                        4:
+                          result:=cordconstnode.create(BsrDWord(DWord(tordconstnode(left).value.uvalue)),resultdef,false);
+                        8:
+                          result:=cordconstnode.create(BsrQWord(QWord(tordconstnode(left).value.uvalue)),resultdef,false);
+                        else
+                          internalerror(2017042401);
+                      end;
+                    end;
+                end;
               in_popcnt_x :
                 begin
                   if left.nodetype=ordconstn then

+ 1530 - 0
tests/test/tbsx2.pp

@@ -0,0 +1,1530 @@
+{$mode objfpc}
+
+program tbsx2;
+
+function test_byte: boolean;
+var
+  f,r: byte;
+begin
+  f:=BsfByte($07);
+  if f<>0 then
+  begin
+    writeln('BsfByte($07) returned ',f,', should be 0');
+    exit(false);
+  end;
+  f:=BsrByte($01);
+  if f<>0 then
+  begin
+    writeln('BsrByte($01) returned ',f,', should be 0');
+    exit(false);
+  end;
+  f:=BsfByte($0E);
+  if f<>1 then
+  begin
+    writeln('BsfByte($0E) returned ',f,', should be 1');
+    exit(false);
+  end;
+  f:=BsrByte($03);
+  if f<>1 then
+  begin
+    writeln('BsrByte($03) returned ',f,', should be 1');
+    exit(false);
+  end;
+  f:=BsfByte($14);
+  if f<>2 then
+  begin
+    writeln('BsfByte($14) returned ',f,', should be 2');
+    exit(false);
+  end;
+  f:=BsrByte($06);
+  if f<>2 then
+  begin
+    writeln('BsrByte($06) returned ',f,', should be 2');
+    exit(false);
+  end;
+  f:=BsfByte($28);
+  if f<>3 then
+  begin
+    writeln('BsfByte($28) returned ',f,', should be 3');
+    exit(false);
+  end;
+  f:=BsrByte($0B);
+  if f<>3 then
+  begin
+    writeln('BsrByte($0B) returned ',f,', should be 3');
+    exit(false);
+  end;
+  f:=BsfByte($30);
+  if f<>4 then
+  begin
+    writeln('BsfByte($30) returned ',f,', should be 4');
+    exit(false);
+  end;
+  f:=BsrByte($14);
+  if f<>4 then
+  begin
+    writeln('BsrByte($14) returned ',f,', should be 4');
+    exit(false);
+  end;
+  f:=BsfByte($60);
+  if f<>5 then
+  begin
+    writeln('BsfByte($60) returned ',f,', should be 5');
+    exit(false);
+  end;
+  f:=BsrByte($25);
+  if f<>5 then
+  begin
+    writeln('BsrByte($25) returned ',f,', should be 5');
+    exit(false);
+  end;
+  f:=BsfByte($40);
+  if f<>6 then
+  begin
+    writeln('BsfByte($40) returned ',f,', should be 6');
+    exit(false);
+  end;
+  f:=BsrByte($46);
+  if f<>6 then
+  begin
+    writeln('BsrByte($46) returned ',f,', should be 6');
+    exit(false);
+  end;
+  f:=BsfByte($80);
+  if f<>7 then
+  begin
+    writeln('BsfByte($80) returned ',f,', should be 7');
+    exit(false);
+  end;
+  f:=BsrByte($87);
+  if f<>7 then
+  begin
+    writeln('BsrByte($87) returned ',f,', should be 7');
+    exit(false);
+  end;
+
+  f:=BsfByte(0);
+  if (f<>$ff) then
+  begin
+    writeln('BsfByte(0) returned ',f,', should be ',$ff);
+    exit(false);
+  end;
+  r:=BsrByte(0);
+  if r<>$ff then
+  begin
+    writeln('BsrByte(0) returned ',r,', should be ',$ff);
+    exit(false);
+  end;
+  result:=true;
+end;
+
+function test_word: boolean;
+var
+  f,r: integer;
+begin
+  f:=BsfWord(15);
+  if f<>0 then
+  begin
+    writeln('BsfWord(15) returned ',f,', should be 0');
+    exit(false);
+  end;
+  f:=BsrWord(1);
+  if f<>0 then
+  begin
+    writeln('BsrWord(1) returned ',f,', should be 0');
+    exit(false);
+  end;
+  f:=BsfWord(30);
+  if f<>1 then
+  begin
+    writeln('BsfWord(30) returned ',f,', should be 1');
+    exit(false);
+  end;
+  f:=BsrWord(3);
+  if f<>1 then
+  begin
+    writeln('BsrWord(3) returned ',f,', should be 1');
+    exit(false);
+  end;
+  f:=BsfWord(52);
+  if f<>2 then
+  begin
+    writeln('BsfWord(52) returned ',f,', should be 2');
+    exit(false);
+  end;
+  f:=BsrWord(6);
+  if f<>2 then
+  begin
+    writeln('BsrWord(6) returned ',f,', should be 2');
+    exit(false);
+  end;
+  f:=BsfWord(104);
+  if f<>3 then
+  begin
+    writeln('BsfWord(104) returned ',f,', should be 3');
+    exit(false);
+  end;
+  f:=BsrWord(11);
+  if f<>3 then
+  begin
+    writeln('BsrWord(11) returned ',f,', should be 3');
+    exit(false);
+  end;
+  f:=BsfWord(176);
+  if f<>4 then
+  begin
+    writeln('BsfWord(176) returned ',f,', should be 4');
+    exit(false);
+  end;
+  f:=BsrWord(20);
+  if f<>4 then
+  begin
+    writeln('BsrWord(20) returned ',f,', should be 4');
+    exit(false);
+  end;
+  f:=BsfWord(352);
+  if f<>5 then
+  begin
+    writeln('BsfWord(352) returned ',f,', should be 5');
+    exit(false);
+  end;
+  f:=BsrWord(37);
+  if f<>5 then
+  begin
+    writeln('BsrWord(37) returned ',f,', should be 5');
+    exit(false);
+  end;
+  f:=BsfWord(576);
+  if f<>6 then
+  begin
+    writeln('BsfWord(576) returned ',f,', should be 6');
+    exit(false);
+  end;
+  f:=BsrWord(70);
+  if f<>6 then
+  begin
+    writeln('BsrWord(70) returned ',f,', should be 6');
+    exit(false);
+  end;
+  f:=BsfWord(1152);
+  if f<>7 then
+  begin
+    writeln('BsfWord(1152) returned ',f,', should be 7');
+    exit(false);
+  end;
+  f:=BsrWord(135);
+  if f<>7 then
+  begin
+    writeln('BsrWord(135) returned ',f,', should be 7');
+    exit(false);
+  end;
+  f:=BsfWord(1792);
+  if f<>8 then
+  begin
+    writeln('BsfWord(1792) returned ',f,', should be 8');
+    exit(false);
+  end;
+  f:=BsrWord(264);
+  if f<>8 then
+  begin
+    writeln('BsrWord(264) returned ',f,', should be 8');
+    exit(false);
+  end;
+  f:=BsfWord(3584);
+  if f<>9 then
+  begin
+    writeln('BsfWord(3584) returned ',f,', should be 9');
+    exit(false);
+  end;
+  f:=BsrWord(521);
+  if f<>9 then
+  begin
+    writeln('BsrWord(521) returned ',f,', should be 9');
+    exit(false);
+  end;
+  f:=BsfWord(5120);
+  if f<>10 then
+  begin
+    writeln('BsfWord(5120) returned ',f,', should be 10');
+    exit(false);
+  end;
+  f:=BsrWord(1034);
+  if f<>10 then
+  begin
+    writeln('BsrWord(1034) returned ',f,', should be 10');
+    exit(false);
+  end;
+  f:=BsfWord(10240);
+  if f<>11 then
+  begin
+    writeln('BsfWord(10240) returned ',f,', should be 11');
+    exit(false);
+  end;
+  f:=BsrWord(2059);
+  if f<>11 then
+  begin
+    writeln('BsrWord(2059) returned ',f,', should be 11');
+    exit(false);
+  end;
+  f:=BsfWord(12288);
+  if f<>12 then
+  begin
+    writeln('BsfWord(12288) returned ',f,', should be 12');
+    exit(false);
+  end;
+  f:=BsrWord(4108);
+  if f<>12 then
+  begin
+    writeln('BsrWord(4108) returned ',f,', should be 12');
+    exit(false);
+  end;
+  f:=BsfWord(24576);
+  if f<>13 then
+  begin
+    writeln('BsfWord(24576) returned ',f,', should be 13');
+    exit(false);
+  end;
+  f:=BsrWord(8205);
+  if f<>13 then
+  begin
+    writeln('BsrWord(8205) returned ',f,', should be 13');
+    exit(false);
+  end;
+  f:=BsfWord(16384);
+  if f<>14 then
+  begin
+    writeln('BsfWord(16384) returned ',f,', should be 14');
+    exit(false);
+  end;
+  f:=BsrWord(16398);
+  if f<>14 then
+  begin
+    writeln('BsrWord(16398) returned ',f,', should be 14');
+    exit(false);
+  end;
+  f:=BsfWord(32768);
+  if f<>15 then
+  begin
+    writeln('BsfWord(32768) returned ',f,', should be 15');
+    exit(false);
+  end;
+  f:=BsrWord(32783);
+  if f<>15 then
+  begin
+    writeln('BsrWord(32783) returned ',f,', should be 15');
+    exit(false);
+  end;
+
+  f:=BsfWord(0);
+  if (f<>$ff) then
+  begin
+    writeln('BsfWord(0) returned ',f,', should be ',$ff);
+    exit(false);
+  end;
+  r:=BsrWord(0);
+  if r<>$ff then
+  begin
+    writeln('BsrWord(0) returned ',r,', should be ',$ff);
+    exit(false);
+  end;
+  result:=true;
+end;
+
+function test_dword: boolean;
+var
+  f,r: integer;
+begin
+  f:=BsfDWord(31);
+  if f<>0 then
+  begin
+    writeln('BsfDWord(31) returned ',f,', should be 0');
+    exit(false);
+  end;
+  f:=BsrDWord(1);
+  if f<>0 then
+  begin
+    writeln('BsrDWord(1) returned ',f,', should be 0');
+    exit(false);
+  end;
+  f:=BsfDWord(62);
+  if f<>1 then
+  begin
+    writeln('BsfDWord(62) returned ',f,', should be 1');
+    exit(false);
+  end;
+  f:=BsrDWord(3);
+  if f<>1 then
+  begin
+    writeln('BsrDWord(3) returned ',f,', should be 1');
+    exit(false);
+  end;
+  f:=BsfDWord(116);
+  if f<>2 then
+  begin
+    writeln('BsfDWord(116) returned ',f,', should be 2');
+    exit(false);
+  end;
+  f:=BsrDWord(6);
+  if f<>2 then
+  begin
+    writeln('BsrDWord(6) returned ',f,', should be 2');
+    exit(false);
+  end;
+  f:=BsfDWord(232);
+  if f<>3 then
+  begin
+    writeln('BsfDWord(232) returned ',f,', should be 3');
+    exit(false);
+  end;
+  f:=BsrDWord(11);
+  if f<>3 then
+  begin
+    writeln('BsrDWord(11) returned ',f,', should be 3');
+    exit(false);
+  end;
+  f:=BsfDWord(432);
+  if f<>4 then
+  begin
+    writeln('BsfDWord(432) returned ',f,', should be 4');
+    exit(false);
+  end;
+  f:=BsrDWord(20);
+  if f<>4 then
+  begin
+    writeln('BsrDWord(20) returned ',f,', should be 4');
+    exit(false);
+  end;
+  f:=BsfDWord(864);
+  if f<>5 then
+  begin
+    writeln('BsfDWord(864) returned ',f,', should be 5');
+    exit(false);
+  end;
+  f:=BsrDWord(37);
+  if f<>5 then
+  begin
+    writeln('BsrDWord(37) returned ',f,', should be 5');
+    exit(false);
+  end;
+  f:=BsfDWord(1600);
+  if f<>6 then
+  begin
+    writeln('BsfDWord(1600) returned ',f,', should be 6');
+    exit(false);
+  end;
+  f:=BsrDWord(70);
+  if f<>6 then
+  begin
+    writeln('BsrDWord(70) returned ',f,', should be 6');
+    exit(false);
+  end;
+  f:=BsfDWord(3200);
+  if f<>7 then
+  begin
+    writeln('BsfDWord(3200) returned ',f,', should be 7');
+    exit(false);
+  end;
+  f:=BsrDWord(135);
+  if f<>7 then
+  begin
+    writeln('BsrDWord(135) returned ',f,', should be 7');
+    exit(false);
+  end;
+  f:=BsfDWord(5888);
+  if f<>8 then
+  begin
+    writeln('BsfDWord(5888) returned ',f,', should be 8');
+    exit(false);
+  end;
+  f:=BsrDWord(264);
+  if f<>8 then
+  begin
+    writeln('BsrDWord(264) returned ',f,', should be 8');
+    exit(false);
+  end;
+  f:=BsfDWord(11776);
+  if f<>9 then
+  begin
+    writeln('BsfDWord(11776) returned ',f,', should be 9');
+    exit(false);
+  end;
+  f:=BsrDWord(521);
+  if f<>9 then
+  begin
+    writeln('BsrDWord(521) returned ',f,', should be 9');
+    exit(false);
+  end;
+  f:=BsfDWord(21504);
+  if f<>10 then
+  begin
+    writeln('BsfDWord(21504) returned ',f,', should be 10');
+    exit(false);
+  end;
+  f:=BsrDWord(1034);
+  if f<>10 then
+  begin
+    writeln('BsrDWord(1034) returned ',f,', should be 10');
+    exit(false);
+  end;
+  f:=BsfDWord(43008);
+  if f<>11 then
+  begin
+    writeln('BsfDWord(43008) returned ',f,', should be 11');
+    exit(false);
+  end;
+  f:=BsrDWord(2059);
+  if f<>11 then
+  begin
+    writeln('BsrDWord(2059) returned ',f,', should be 11');
+    exit(false);
+  end;
+  f:=BsfDWord(77824);
+  if f<>12 then
+  begin
+    writeln('BsfDWord(77824) returned ',f,', should be 12');
+    exit(false);
+  end;
+  f:=BsrDWord(4108);
+  if f<>12 then
+  begin
+    writeln('BsrDWord(4108) returned ',f,', should be 12');
+    exit(false);
+  end;
+  f:=BsfDWord(155648);
+  if f<>13 then
+  begin
+    writeln('BsfDWord(155648) returned ',f,', should be 13');
+    exit(false);
+  end;
+  f:=BsrDWord(8205);
+  if f<>13 then
+  begin
+    writeln('BsrDWord(8205) returned ',f,', should be 13');
+    exit(false);
+  end;
+  f:=BsfDWord(278528);
+  if f<>14 then
+  begin
+    writeln('BsfDWord(278528) returned ',f,', should be 14');
+    exit(false);
+  end;
+  f:=BsrDWord(16398);
+  if f<>14 then
+  begin
+    writeln('BsrDWord(16398) returned ',f,', should be 14');
+    exit(false);
+  end;
+  f:=BsfDWord(557056);
+  if f<>15 then
+  begin
+    writeln('BsfDWord(557056) returned ',f,', should be 15');
+    exit(false);
+  end;
+  f:=BsrDWord(32783);
+  if f<>15 then
+  begin
+    writeln('BsrDWord(32783) returned ',f,', should be 15');
+    exit(false);
+  end;
+  f:=BsfDWord(983040);
+  if f<>16 then
+  begin
+    writeln('BsfDWord(983040) returned ',f,', should be 16');
+    exit(false);
+  end;
+  f:=BsrDWord(65552);
+  if f<>16 then
+  begin
+    writeln('BsrDWord(65552) returned ',f,', should be 16');
+    exit(false);
+  end;
+  f:=BsfDWord(1966080);
+  if f<>17 then
+  begin
+    writeln('BsfDWord(1966080) returned ',f,', should be 17');
+    exit(false);
+  end;
+  f:=BsrDWord(131089);
+  if f<>17 then
+  begin
+    writeln('BsrDWord(131089) returned ',f,', should be 17');
+    exit(false);
+  end;
+  f:=BsfDWord(3407872);
+  if f<>18 then
+  begin
+    writeln('BsfDWord(3407872) returned ',f,', should be 18');
+    exit(false);
+  end;
+  f:=BsrDWord(262162);
+  if f<>18 then
+  begin
+    writeln('BsrDWord(262162) returned ',f,', should be 18');
+    exit(false);
+  end;
+  f:=BsfDWord(6815744);
+  if f<>19 then
+  begin
+    writeln('BsfDWord(6815744) returned ',f,', should be 19');
+    exit(false);
+  end;
+  f:=BsrDWord(524307);
+  if f<>19 then
+  begin
+    writeln('BsrDWord(524307) returned ',f,', should be 19');
+    exit(false);
+  end;
+  f:=BsfDWord(11534336);
+  if f<>20 then
+  begin
+    writeln('BsfDWord(11534336) returned ',f,', should be 20');
+    exit(false);
+  end;
+  f:=BsrDWord(1048596);
+  if f<>20 then
+  begin
+    writeln('BsrDWord(1048596) returned ',f,', should be 20');
+    exit(false);
+  end;
+  f:=BsfDWord(23068672);
+  if f<>21 then
+  begin
+    writeln('BsfDWord(23068672) returned ',f,', should be 21');
+    exit(false);
+  end;
+  f:=BsrDWord(2097173);
+  if f<>21 then
+  begin
+    writeln('BsrDWord(2097173) returned ',f,', should be 21');
+    exit(false);
+  end;
+  f:=BsfDWord(37748736);
+  if f<>22 then
+  begin
+    writeln('BsfDWord(37748736) returned ',f,', should be 22');
+    exit(false);
+  end;
+  f:=BsrDWord(4194326);
+  if f<>22 then
+  begin
+    writeln('BsrDWord(4194326) returned ',f,', should be 22');
+    exit(false);
+  end;
+  f:=BsfDWord(75497472);
+  if f<>23 then
+  begin
+    writeln('BsfDWord(75497472) returned ',f,', should be 23');
+    exit(false);
+  end;
+  f:=BsrDWord(8388631);
+  if f<>23 then
+  begin
+    writeln('BsrDWord(8388631) returned ',f,', should be 23');
+    exit(false);
+  end;
+  f:=BsfDWord(117440512);
+  if f<>24 then
+  begin
+    writeln('BsfDWord(117440512) returned ',f,', should be 24');
+    exit(false);
+  end;
+  f:=BsrDWord(16777240);
+  if f<>24 then
+  begin
+    writeln('BsrDWord(16777240) returned ',f,', should be 24');
+    exit(false);
+  end;
+  f:=BsfDWord(234881024);
+  if f<>25 then
+  begin
+    writeln('BsfDWord(234881024) returned ',f,', should be 25');
+    exit(false);
+  end;
+  f:=BsrDWord(33554457);
+  if f<>25 then
+  begin
+    writeln('BsrDWord(33554457) returned ',f,', should be 25');
+    exit(false);
+  end;
+  f:=BsfDWord(335544320);
+  if f<>26 then
+  begin
+    writeln('BsfDWord(335544320) returned ',f,', should be 26');
+    exit(false);
+  end;
+  f:=BsrDWord(67108890);
+  if f<>26 then
+  begin
+    writeln('BsrDWord(67108890) returned ',f,', should be 26');
+    exit(false);
+  end;
+  f:=BsfDWord(671088640);
+  if f<>27 then
+  begin
+    writeln('BsfDWord(671088640) returned ',f,', should be 27');
+    exit(false);
+  end;
+  f:=BsrDWord(134217755);
+  if f<>27 then
+  begin
+    writeln('BsrDWord(134217755) returned ',f,', should be 27');
+    exit(false);
+  end;
+  f:=BsfDWord(805306368);
+  if f<>28 then
+  begin
+    writeln('BsfDWord(805306368) returned ',f,', should be 28');
+    exit(false);
+  end;
+  f:=BsrDWord(268435484);
+  if f<>28 then
+  begin
+    writeln('BsrDWord(268435484) returned ',f,', should be 28');
+    exit(false);
+  end;
+  f:=BsfDWord(1610612736);
+  if f<>29 then
+  begin
+    writeln('BsfDWord(1610612736) returned ',f,', should be 29');
+    exit(false);
+  end;
+  f:=BsrDWord(536870941);
+  if f<>29 then
+  begin
+    writeln('BsrDWord(536870941) returned ',f,', should be 29');
+    exit(false);
+  end;
+  f:=BsfDWord(1073741824);
+  if f<>30 then
+  begin
+    writeln('BsfDWord(1073741824) returned ',f,', should be 30');
+    exit(false);
+  end;
+  f:=BsrDWord(1073741854);
+  if f<>30 then
+  begin
+    writeln('BsrDWord(1073741854) returned ',f,', should be 30');
+    exit(false);
+  end;
+  f:=BsfDWord(2147483648);
+  if f<>31 then
+  begin
+    writeln('BsfDWord(2147483648) returned ',f,', should be 31');
+    exit(false);
+  end;
+  f:=BsrDWord(2147483679);
+  if f<>31 then
+  begin
+    writeln('BsrDWord(2147483679) returned ',f,', should be 31');
+    exit(false);
+  end;
+
+  f:=BsfDWord(0);
+  if (f<>$ff) then
+  begin
+    writeln('BsfDWord(0) returned ',f,', should be ',$ff);
+    exit(false);
+  end;
+  r:=BsrDWord(0);
+  if r<>$ff then
+  begin
+    writeln('BsrDWord(0) returned ',r,', should be ',$ff);
+    exit(false);
+  end;
+  result:=true;
+end;
+
+function test_qword: boolean;
+var
+  f, r: integer;
+begin
+  f:=BsfQWord(63);
+  if f<>0 then
+  begin
+    writeln('BsfQWord(63) returned ',f,', should be 0');
+    exit(false);
+  end;
+  f:=BsrQWord(1);
+  if f<>0 then
+  begin
+    writeln('BsrQWord(1) returned ',f,', should be 0');
+    exit(false);
+  end;
+  f:=BsfQWord(126);
+  if f<>1 then
+  begin
+    writeln('BsfQWord(126) returned ',f,', should be 1');
+    exit(false);
+  end;
+  f:=BsrQWord(3);
+  if f<>1 then
+  begin
+    writeln('BsrQWord(3) returned ',f,', should be 1');
+    exit(false);
+  end;
+  f:=BsfQWord(244);
+  if f<>2 then
+  begin
+    writeln('BsfQWord(244) returned ',f,', should be 2');
+    exit(false);
+  end;
+  f:=BsrQWord(6);
+  if f<>2 then
+  begin
+    writeln('BsrQWord(6) returned ',f,', should be 2');
+    exit(false);
+  end;
+  f:=BsfQWord(488);
+  if f<>3 then
+  begin
+    writeln('BsfQWord(488) returned ',f,', should be 3');
+    exit(false);
+  end;
+  f:=BsrQWord(11);
+  if f<>3 then
+  begin
+    writeln('BsrQWord(11) returned ',f,', should be 3');
+    exit(false);
+  end;
+  f:=BsfQWord(944);
+  if f<>4 then
+  begin
+    writeln('BsfQWord(944) returned ',f,', should be 4');
+    exit(false);
+  end;
+  f:=BsrQWord(20);
+  if f<>4 then
+  begin
+    writeln('BsrQWord(20) returned ',f,', should be 4');
+    exit(false);
+  end;
+  f:=BsfQWord(1888);
+  if f<>5 then
+  begin
+    writeln('BsfQWord(1888) returned ',f,', should be 5');
+    exit(false);
+  end;
+  f:=BsrQWord(37);
+  if f<>5 then
+  begin
+    writeln('BsrQWord(37) returned ',f,', should be 5');
+    exit(false);
+  end;
+  f:=BsfQWord(3648);
+  if f<>6 then
+  begin
+    writeln('BsfQWord(3648) returned ',f,', should be 6');
+    exit(false);
+  end;
+  f:=BsrQWord(70);
+  if f<>6 then
+  begin
+    writeln('BsrQWord(70) returned ',f,', should be 6');
+    exit(false);
+  end;
+  f:=BsfQWord(7296);
+  if f<>7 then
+  begin
+    writeln('BsfQWord(7296) returned ',f,', should be 7');
+    exit(false);
+  end;
+  f:=BsrQWord(135);
+  if f<>7 then
+  begin
+    writeln('BsrQWord(135) returned ',f,', should be 7');
+    exit(false);
+  end;
+  f:=BsfQWord(14080);
+  if f<>8 then
+  begin
+    writeln('BsfQWord(14080) returned ',f,', should be 8');
+    exit(false);
+  end;
+  f:=BsrQWord(264);
+  if f<>8 then
+  begin
+    writeln('BsrQWord(264) returned ',f,', should be 8');
+    exit(false);
+  end;
+  f:=BsfQWord(28160);
+  if f<>9 then
+  begin
+    writeln('BsfQWord(28160) returned ',f,', should be 9');
+    exit(false);
+  end;
+  f:=BsrQWord(521);
+  if f<>9 then
+  begin
+    writeln('BsrQWord(521) returned ',f,', should be 9');
+    exit(false);
+  end;
+  f:=BsfQWord(54272);
+  if f<>10 then
+  begin
+    writeln('BsfQWord(54272) returned ',f,', should be 10');
+    exit(false);
+  end;
+  f:=BsrQWord(1034);
+  if f<>10 then
+  begin
+    writeln('BsrQWord(1034) returned ',f,', should be 10');
+    exit(false);
+  end;
+  f:=BsfQWord(108544);
+  if f<>11 then
+  begin
+    writeln('BsfQWord(108544) returned ',f,', should be 11');
+    exit(false);
+  end;
+  f:=BsrQWord(2059);
+  if f<>11 then
+  begin
+    writeln('BsrQWord(2059) returned ',f,', should be 11');
+    exit(false);
+  end;
+  f:=BsfQWord(208896);
+  if f<>12 then
+  begin
+    writeln('BsfQWord(208896) returned ',f,', should be 12');
+    exit(false);
+  end;
+  f:=BsrQWord(4108);
+  if f<>12 then
+  begin
+    writeln('BsrQWord(4108) returned ',f,', should be 12');
+    exit(false);
+  end;
+  f:=BsfQWord(417792);
+  if f<>13 then
+  begin
+    writeln('BsfQWord(417792) returned ',f,', should be 13');
+    exit(false);
+  end;
+  f:=BsrQWord(8205);
+  if f<>13 then
+  begin
+    writeln('BsrQWord(8205) returned ',f,', should be 13');
+    exit(false);
+  end;
+  f:=BsfQWord(802816);
+  if f<>14 then
+  begin
+    writeln('BsfQWord(802816) returned ',f,', should be 14');
+    exit(false);
+  end;
+  f:=BsrQWord(16398);
+  if f<>14 then
+  begin
+    writeln('BsrQWord(16398) returned ',f,', should be 14');
+    exit(false);
+  end;
+  f:=BsfQWord(1605632);
+  if f<>15 then
+  begin
+    writeln('BsfQWord(1605632) returned ',f,', should be 15');
+    exit(false);
+  end;
+  f:=BsrQWord(32783);
+  if f<>15 then
+  begin
+    writeln('BsrQWord(32783) returned ',f,', should be 15');
+    exit(false);
+  end;
+  f:=BsfQWord(3080192);
+  if f<>16 then
+  begin
+    writeln('BsfQWord(3080192) returned ',f,', should be 16');
+    exit(false);
+  end;
+  f:=BsrQWord(65552);
+  if f<>16 then
+  begin
+    writeln('BsrQWord(65552) returned ',f,', should be 16');
+    exit(false);
+  end;
+  f:=BsfQWord(6160384);
+  if f<>17 then
+  begin
+    writeln('BsfQWord(6160384) returned ',f,', should be 17');
+    exit(false);
+  end;
+  f:=BsrQWord(131089);
+  if f<>17 then
+  begin
+    writeln('BsrQWord(131089) returned ',f,', should be 17');
+    exit(false);
+  end;
+  f:=BsfQWord(11796480);
+  if f<>18 then
+  begin
+    writeln('BsfQWord(11796480) returned ',f,', should be 18');
+    exit(false);
+  end;
+  f:=BsrQWord(262162);
+  if f<>18 then
+  begin
+    writeln('BsrQWord(262162) returned ',f,', should be 18');
+    exit(false);
+  end;
+  f:=BsfQWord(23592960);
+  if f<>19 then
+  begin
+    writeln('BsfQWord(23592960) returned ',f,', should be 19');
+    exit(false);
+  end;
+  f:=BsrQWord(524307);
+  if f<>19 then
+  begin
+    writeln('BsrQWord(524307) returned ',f,', should be 19');
+    exit(false);
+  end;
+  f:=BsfQWord(45088768);
+  if f<>20 then
+  begin
+    writeln('BsfQWord(45088768) returned ',f,', should be 20');
+    exit(false);
+  end;
+  f:=BsrQWord(1048596);
+  if f<>20 then
+  begin
+    writeln('BsrQWord(1048596) returned ',f,', should be 20');
+    exit(false);
+  end;
+  f:=BsfQWord(90177536);
+  if f<>21 then
+  begin
+    writeln('BsfQWord(90177536) returned ',f,', should be 21');
+    exit(false);
+  end;
+  f:=BsrQWord(2097173);
+  if f<>21 then
+  begin
+    writeln('BsrQWord(2097173) returned ',f,', should be 21');
+    exit(false);
+  end;
+  f:=BsfQWord(171966464);
+  if f<>22 then
+  begin
+    writeln('BsfQWord(171966464) returned ',f,', should be 22');
+    exit(false);
+  end;
+  f:=BsrQWord(4194326);
+  if f<>22 then
+  begin
+    writeln('BsrQWord(4194326) returned ',f,', should be 22');
+    exit(false);
+  end;
+  f:=BsfQWord(343932928);
+  if f<>23 then
+  begin
+    writeln('BsfQWord(343932928) returned ',f,', should be 23');
+    exit(false);
+  end;
+  f:=BsrQWord(8388631);
+  if f<>23 then
+  begin
+    writeln('BsrQWord(8388631) returned ',f,', should be 23');
+    exit(false);
+  end;
+  f:=BsfQWord(654311424);
+  if f<>24 then
+  begin
+    writeln('BsfQWord(654311424) returned ',f,', should be 24');
+    exit(false);
+  end;
+  f:=BsrQWord(16777240);
+  if f<>24 then
+  begin
+    writeln('BsrQWord(16777240) returned ',f,', should be 24');
+    exit(false);
+  end;
+  f:=BsfQWord(1308622848);
+  if f<>25 then
+  begin
+    writeln('BsfQWord(1308622848) returned ',f,', should be 25');
+    exit(false);
+  end;
+  f:=BsrQWord(33554457);
+  if f<>25 then
+  begin
+    writeln('BsrQWord(33554457) returned ',f,', should be 25');
+    exit(false);
+  end;
+  f:=BsfQWord(2483027968);
+  if f<>26 then
+  begin
+    writeln('BsfQWord(2483027968) returned ',f,', should be 26');
+    exit(false);
+  end;
+  f:=BsrQWord(67108890);
+  if f<>26 then
+  begin
+    writeln('BsrQWord(67108890) returned ',f,', should be 26');
+    exit(false);
+  end;
+  f:=BsfQWord(4966055936);
+  if f<>27 then
+  begin
+    writeln('BsfQWord(4966055936) returned ',f,', should be 27');
+    exit(false);
+  end;
+  f:=BsrQWord(134217755);
+  if f<>27 then
+  begin
+    writeln('BsrQWord(134217755) returned ',f,', should be 27');
+    exit(false);
+  end;
+  f:=BsfQWord(9395240960);
+  if f<>28 then
+  begin
+    writeln('BsfQWord(9395240960) returned ',f,', should be 28');
+    exit(false);
+  end;
+  f:=BsrQWord(268435484);
+  if f<>28 then
+  begin
+    writeln('BsrQWord(268435484) returned ',f,', should be 28');
+    exit(false);
+  end;
+  f:=BsfQWord(18790481920);
+  if f<>29 then
+  begin
+    writeln('BsfQWord(18790481920) returned ',f,', should be 29');
+    exit(false);
+  end;
+  f:=BsrQWord(536870941);
+  if f<>29 then
+  begin
+    writeln('BsrQWord(536870941) returned ',f,', should be 29');
+    exit(false);
+  end;
+  f:=BsfQWord(35433480192);
+  if f<>30 then
+  begin
+    writeln('BsfQWord(35433480192) returned ',f,', should be 30');
+    exit(false);
+  end;
+  f:=BsrQWord(1073741854);
+  if f<>30 then
+  begin
+    writeln('BsrQWord(1073741854) returned ',f,', should be 30');
+    exit(false);
+  end;
+  f:=BsfQWord(70866960384);
+  if f<>31 then
+  begin
+    writeln('BsfQWord(70866960384) returned ',f,', should be 31');
+    exit(false);
+  end;
+  f:=BsrQWord(2147483679);
+  if f<>31 then
+  begin
+    writeln('BsrQWord(2147483679) returned ',f,', should be 31');
+    exit(false);
+  end;
+  f:=BsfQWord(133143986176);
+  if f<>32 then
+  begin
+    writeln('BsfQWord(133143986176) returned ',f,', should be 32');
+    exit(false);
+  end;
+  f:=BsrQWord(4294967328);
+  if f<>32 then
+  begin
+    writeln('BsrQWord(4294967328) returned ',f,', should be 32');
+    exit(false);
+  end;
+  f:=BsfQWord(266287972352);
+  if f<>33 then
+  begin
+    writeln('BsfQWord(266287972352) returned ',f,', should be 33');
+    exit(false);
+  end;
+  f:=BsrQWord(8589934625);
+  if f<>33 then
+  begin
+    writeln('BsrQWord(8589934625) returned ',f,', should be 33');
+    exit(false);
+  end;
+  f:=BsfQWord(498216206336);
+  if f<>34 then
+  begin
+    writeln('BsfQWord(498216206336) returned ',f,', should be 34');
+    exit(false);
+  end;
+  f:=BsrQWord(17179869218);
+  if f<>34 then
+  begin
+    writeln('BsrQWord(17179869218) returned ',f,', should be 34');
+    exit(false);
+  end;
+  f:=BsfQWord(996432412672);
+  if f<>35 then
+  begin
+    writeln('BsfQWord(996432412672) returned ',f,', should be 35');
+    exit(false);
+  end;
+  f:=BsrQWord(34359738403);
+  if f<>35 then
+  begin
+    writeln('BsrQWord(34359738403) returned ',f,', should be 35');
+    exit(false);
+  end;
+  f:=BsfQWord(1855425871872);
+  if f<>36 then
+  begin
+    writeln('BsfQWord(1855425871872) returned ',f,', should be 36');
+    exit(false);
+  end;
+  f:=BsrQWord(68719476772);
+  if f<>36 then
+  begin
+    writeln('BsrQWord(68719476772) returned ',f,', should be 36');
+    exit(false);
+  end;
+  f:=BsfQWord(3710851743744);
+  if f<>37 then
+  begin
+    writeln('BsfQWord(3710851743744) returned ',f,', should be 37');
+    exit(false);
+  end;
+  f:=BsrQWord(137438953509);
+  if f<>37 then
+  begin
+    writeln('BsrQWord(137438953509) returned ',f,', should be 37');
+    exit(false);
+  end;
+  f:=BsfQWord(6871947673600);
+  if f<>38 then
+  begin
+    writeln('BsfQWord(6871947673600) returned ',f,', should be 38');
+    exit(false);
+  end;
+  f:=BsrQWord(274877906982);
+  if f<>38 then
+  begin
+    writeln('BsrQWord(274877906982) returned ',f,', should be 38');
+    exit(false);
+  end;
+  f:=BsfQWord(13743895347200);
+  if f<>39 then
+  begin
+    writeln('BsfQWord(13743895347200) returned ',f,', should be 39');
+    exit(false);
+  end;
+  f:=BsrQWord(549755813927);
+  if f<>39 then
+  begin
+    writeln('BsrQWord(549755813927) returned ',f,', should be 39');
+    exit(false);
+  end;
+  f:=BsfQWord(25288767438848);
+  if f<>40 then
+  begin
+    writeln('BsfQWord(25288767438848) returned ',f,', should be 40');
+    exit(false);
+  end;
+  f:=BsrQWord(1099511627816);
+  if f<>40 then
+  begin
+    writeln('BsrQWord(1099511627816) returned ',f,', should be 40');
+    exit(false);
+  end;
+  f:=BsfQWord(50577534877696);
+  if f<>41 then
+  begin
+    writeln('BsfQWord(50577534877696) returned ',f,', should be 41');
+    exit(false);
+  end;
+  f:=BsrQWord(2199023255593);
+  if f<>41 then
+  begin
+    writeln('BsrQWord(2199023255593) returned ',f,', should be 41');
+    exit(false);
+  end;
+  f:=BsfQWord(92358976733184);
+  if f<>42 then
+  begin
+    writeln('BsfQWord(92358976733184) returned ',f,', should be 42');
+    exit(false);
+  end;
+  f:=BsrQWord(4398046511146);
+  if f<>42 then
+  begin
+    writeln('BsrQWord(4398046511146) returned ',f,', should be 42');
+    exit(false);
+  end;
+  f:=BsfQWord(184717953466368);
+  if f<>43 then
+  begin
+    writeln('BsfQWord(184717953466368) returned ',f,', should be 43');
+    exit(false);
+  end;
+  f:=BsrQWord(8796093022251);
+  if f<>43 then
+  begin
+    writeln('BsrQWord(8796093022251) returned ',f,', should be 43');
+    exit(false);
+  end;
+  f:=BsfQWord(334251534843904);
+  if f<>44 then
+  begin
+    writeln('BsfQWord(334251534843904) returned ',f,', should be 44');
+    exit(false);
+  end;
+  f:=BsrQWord(17592186044460);
+  if f<>44 then
+  begin
+    writeln('BsrQWord(17592186044460) returned ',f,', should be 44');
+    exit(false);
+  end;
+  f:=BsfQWord(668503069687808);
+  if f<>45 then
+  begin
+    writeln('BsfQWord(668503069687808) returned ',f,', should be 45');
+    exit(false);
+  end;
+  f:=BsrQWord(35184372088877);
+  if f<>45 then
+  begin
+    writeln('BsrQWord(35184372088877) returned ',f,', should be 45');
+    exit(false);
+  end;
+  f:=BsfQWord(1196268651020288);
+  if f<>46 then
+  begin
+    writeln('BsfQWord(1196268651020288) returned ',f,', should be 46');
+    exit(false);
+  end;
+  f:=BsrQWord(70368744177710);
+  if f<>46 then
+  begin
+    writeln('BsrQWord(70368744177710) returned ',f,', should be 46');
+    exit(false);
+  end;
+  f:=BsfQWord(2392537302040576);
+  if f<>47 then
+  begin
+    writeln('BsfQWord(2392537302040576) returned ',f,', should be 47');
+    exit(false);
+  end;
+  f:=BsrQWord(140737488355375);
+  if f<>47 then
+  begin
+    writeln('BsrQWord(140737488355375) returned ',f,', should be 47');
+    exit(false);
+  end;
+  f:=BsfQWord(4222124650659840);
+  if f<>48 then
+  begin
+    writeln('BsfQWord(4222124650659840) returned ',f,', should be 48');
+    exit(false);
+  end;
+  f:=BsrQWord(281474976710704);
+  if f<>48 then
+  begin
+    writeln('BsrQWord(281474976710704) returned ',f,', should be 48');
+    exit(false);
+  end;
+  f:=BsfQWord(8444249301319680);
+  if f<>49 then
+  begin
+    writeln('BsfQWord(8444249301319680) returned ',f,', should be 49');
+    exit(false);
+  end;
+  f:=BsrQWord(562949953421361);
+  if f<>49 then
+  begin
+    writeln('BsrQWord(562949953421361) returned ',f,', should be 49');
+    exit(false);
+  end;
+  f:=BsfQWord(14636698788954112);
+  if f<>50 then
+  begin
+    writeln('BsfQWord(14636698788954112) returned ',f,', should be 50');
+    exit(false);
+  end;
+  f:=BsrQWord(1125899906842674);
+  if f<>50 then
+  begin
+    writeln('BsrQWord(1125899906842674) returned ',f,', should be 50');
+    exit(false);
+  end;
+  f:=BsfQWord(29273397577908224);
+  if f<>51 then
+  begin
+    writeln('BsfQWord(29273397577908224) returned ',f,', should be 51');
+    exit(false);
+  end;
+  f:=BsrQWord(2251799813685299);
+  if f<>51 then
+  begin
+    writeln('BsrQWord(2251799813685299) returned ',f,', should be 51');
+    exit(false);
+  end;
+  f:=BsfQWord(49539595901075456);
+  if f<>52 then
+  begin
+    writeln('BsfQWord(49539595901075456) returned ',f,', should be 52');
+    exit(false);
+  end;
+  f:=BsrQWord(4503599627370548);
+  if f<>52 then
+  begin
+    writeln('BsrQWord(4503599627370548) returned ',f,', should be 52');
+    exit(false);
+  end;
+  f:=BsfQWord(99079191802150912);
+  if f<>53 then
+  begin
+    writeln('BsfQWord(99079191802150912) returned ',f,', should be 53');
+    exit(false);
+  end;
+  f:=BsrQWord(9007199254741045);
+  if f<>53 then
+  begin
+    writeln('BsrQWord(9007199254741045) returned ',f,', should be 53');
+    exit(false);
+  end;
+  f:=BsfQWord(162129586585337856);
+  if f<>54 then
+  begin
+    writeln('BsfQWord(162129586585337856) returned ',f,', should be 54');
+    exit(false);
+  end;
+  f:=BsrQWord(18014398509482038);
+  if f<>54 then
+  begin
+    writeln('BsrQWord(18014398509482038) returned ',f,', should be 54');
+    exit(false);
+  end;
+  f:=BsfQWord(324259173170675712);
+  if f<>55 then
+  begin
+    writeln('BsfQWord(324259173170675712) returned ',f,', should be 55');
+    exit(false);
+  end;
+  f:=BsrQWord(36028797018964023);
+  if f<>55 then
+  begin
+    writeln('BsrQWord(36028797018964023) returned ',f,', should be 55');
+    exit(false);
+  end;
+  f:=BsfQWord(504403158265495552);
+  if f<>56 then
+  begin
+    writeln('BsfQWord(504403158265495552) returned ',f,', should be 56');
+    exit(false);
+  end;
+  f:=BsrQWord(72057594037927992);
+  if f<>56 then
+  begin
+    writeln('BsrQWord(72057594037927992) returned ',f,', should be 56');
+    exit(false);
+  end;
+  f:=BsfQWord(1008806316530991104);
+  if f<>57 then
+  begin
+    writeln('BsfQWord(1008806316530991104) returned ',f,', should be 57');
+    exit(false);
+  end;
+  f:=BsrQWord(144115188075855929);
+  if f<>57 then
+  begin
+    writeln('BsrQWord(144115188075855929) returned ',f,', should be 57');
+    exit(false);
+  end;
+  f:=BsfQWord(1441151880758558720);
+  if f<>58 then
+  begin
+    writeln('BsfQWord(1441151880758558720) returned ',f,', should be 58');
+    exit(false);
+  end;
+  f:=BsrQWord(288230376151711802);
+  if f<>58 then
+  begin
+    writeln('BsrQWord(288230376151711802) returned ',f,', should be 58');
+    exit(false);
+  end;
+  f:=BsfQWord(2882303761517117440);
+  if f<>59 then
+  begin
+    writeln('BsfQWord(2882303761517117440) returned ',f,', should be 59');
+    exit(false);
+  end;
+  f:=BsrQWord(576460752303423547);
+  if f<>59 then
+  begin
+    writeln('BsrQWord(576460752303423547) returned ',f,', should be 59');
+    exit(false);
+  end;
+  f:=BsfQWord(3458764513820540928);
+  if f<>60 then
+  begin
+    writeln('BsfQWord(3458764513820540928) returned ',f,', should be 60');
+    exit(false);
+  end;
+  f:=BsrQWord(1152921504606847036);
+  if f<>60 then
+  begin
+    writeln('BsrQWord(1152921504606847036) returned ',f,', should be 60');
+    exit(false);
+  end;
+  f:=BsfQWord(6917529027641081856);
+  if f<>61 then
+  begin
+    writeln('BsfQWord(6917529027641081856) returned ',f,', should be 61');
+    exit(false);
+  end;
+  f:=BsrQWord(2305843009213694013);
+  if f<>61 then
+  begin
+    writeln('BsrQWord(2305843009213694013) returned ',f,', should be 61');
+    exit(false);
+  end;
+  f:=BsfQWord(4611686018427387904);
+  if f<>62 then
+  begin
+    writeln('BsfQWord(4611686018427387904) returned ',f,', should be 62');
+    exit(false);
+  end;
+  f:=BsrQWord(4611686018427387966);
+  if f<>62 then
+  begin
+    writeln('BsrQWord(4611686018427387966) returned ',f,', should be 62');
+    exit(false);
+  end;
+  f:=BsfQWord(9223372036854775808);
+  if f<>63 then
+  begin
+    writeln('BsfQWord(9223372036854775808) returned ',f,', should be 63');
+    exit(false);
+  end;
+  f:=BsrQWord(9223372036854775871);
+  if f<>63 then
+  begin
+    writeln('BsrQWord(9223372036854775871) returned ',f,', should be 63');
+    exit(false);
+  end;
+
+  f:=BsfQWord(0);
+  if (f<>$ff) then
+  begin
+    writeln('BsfQWord(0) returned ',f,', should be ',$ff);
+    exit(false);
+  end;
+  r:=BsrQWord(0);
+  if r<>$ff then
+  begin
+    writeln('BsrQWord(0) returned ',r,', should be ',$ff);
+    exit(false);
+  end;
+  result:=true;
+end;
+
+begin
+  if test_byte then writeln('passed') else halt(1);
+  if test_word then writeln('passed') else halt(1);
+  if test_dword then writeln('passed') else halt(1);
+  if test_qword then writeln('passed') else halt(1);
+end.