Адрес инструкции

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Адрес инструкции

Сообщение Azazaz » 13.03.2017 18:21:51

В общем, я пишу высокопроизводительный низкоуровневый код и возникла необходимость получить адреса определенных инструкций написанных на Pascal (соответственно что бы совершить потом прыжок), какие методы есть?
(нужно получить конкретные статические значения на момент компиляции)
Azazaz
новенький
 
Сообщения: 41
Зарегистрирован: 21.04.2015 20:00:03

Re: Адрес инструкции

Сообщение zub » 13.03.2017 19:06:08

Код: Выделить всё
program Project1;
uses
sysutils;
label
  label1,label2;
begin
  label1:
  writeln(inttohex(ptruint(@label1),8));
  label2:
  writeln(inttohex(ptruint(@label2),8));
  readln;
end.

?

Добавлено спустя 1 минуту 24 секунды:
В общем, я пишу таксебепроизводительный, неподдерживаемый, непортируемый...

fixed
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Адрес инструкции

Сообщение runewalsh » 13.03.2017 19:16:29

Ого, так можно? Прикольно.

Добавлю другую частность: можешь пытаться задавать в коде магические числа типа $11223344{55667788}, потом находить и менять, понадеявшись, что число закодировано непосредственно и что другая инструкция не развернулась в такое же. Рекомендую придумать быстрый тест и параноить работоспособность таких трюков при каждом запуске.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: Адрес инструкции

Сообщение Azazaz » 13.03.2017 19:24:14

Код: Выделить всё
uses sysutils;
label
label1,label2;
const
a = @label2 - @label1;
begin
  label1:
  writeln(inttohex(ptruint(@label1),8));
  label2:
  writeln(inttohex(ptruint(@label2),8));
  readln;
end.

Компилятор как бы не знает.
Azazaz
новенький
 
Сообщения: 41
Зарегистрирован: 21.04.2015 20:00:03

Re: Адрес инструкции

Сообщение zub » 13.03.2017 19:26:13

Какбы незнает какбы что?
Естественно в компайлтайме он прикидывается валенком. посчитай разницу в рантайме
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Адрес инструкции

Сообщение Azazaz » 13.03.2017 19:37:29

Суть в том что если считать разницу в во время исполнения, то оптимизация теряет смысл, проще case + GoTo сделать - такой подход медленнее, прирост будет в том случае, если прыжки будут происходить по заранее вычисленному смещению и нужно что бы значение смещения было прописано в самом коде статически. Так вот, почему это компилятор не знает где заканчивается одна инструкция и начинается вторая?

Добавлено спустя 5 минут 6 секунд:
Можно предположить что компилятор трансформирует дифференцированный набор инструкций в измененный набор в последствии анализа кода и проведения оптимизации, но в таком случае почему смещение отдельных инструкций детерминируется без вопросов?
Azazaz
новенький
 
Сообщения: 41
Зарегистрирован: 21.04.2015 20:00:03

Re: Адрес инструкции

Сообщение zub » 13.03.2017 19:45:38

>>Суть в том что если считать разницу в во время исполнения, то оптимизация теряет смысл\
Приведите пжст пример того чего вы хотите в коде?
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Адрес инструкции

Сообщение vitaly_l » 13.03.2017 19:53:17

Azazaz писал(а):проще case + GoTo сделать ... Так вот, почему это компилятор не знает где заканчивается одна инструкция и начинается вторая?

Компилятор вообще никак не реагирует на телодвижения GoTo и не следит за ними. Соответственно, даже если Вы преднамеренно сделаете ошибку используя goto, он её не заметит.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Адрес инструкции

Сообщение Azazaz » 13.03.2017 20:06:58

Исходная задача
Код: Выделить всё
procedure P1(k: byte);
label L1,L2,L3;
procedure S1;inline;
begin ... end;
procedure S2;inline;
begin ... end;
procedure S3;inline;
begin ... end;
begin
case k of
  1: GoTo L1; 2: GoTo L2; 3: GoTo L3;
end;
L1: S1;
L2: S2;
L3: S3;
end;

То есть тут имеется цепочка не линейного кода:
Код: Выделить всё
case k of
  1: GoTo L1; 2: GoTo L2; 3: GoTo L3;
end;

Эта часть кода трансформируется в нечто:
Код: Выделить всё
cmpb   $1,%al
   jb   .Lj107
   subb   $1,%al
   je   .Lj104
   subb   $1,%al
   je   .Lj105
   subb   $1,%al
   je   .Lj106
   jmp   .Lj107

Путем несложных вычислений находим, что эта цепочка является нестабильной и при равномерном распределении параметра k будет показывать различную скорость исполнения каждый раз в сторону замедления.
РЕШЕНИЕ: берем смещения между адресами меток и кидаем в массив типа off: array[0..3]of byte, далее используя безусловный переход (jmp) используем смещения путем jmp off[%номер_метки%]. Таким образом участок не линейного кода превращается в короткий участок линейных инструкций.
Azazaz
новенький
 
Сообщения: 41
Зарегистрирован: 21.04.2015 20:00:03

Re: Адрес инструкции

Сообщение vitaly_l » 13.03.2017 20:21:26

Azazaz писал(а):begin
case k of
  1: GoTo L1; 2: GoTo L2; 3: GoTo L3;
end;
L1: S1;
L2: S2;
L3: S3;
end;


Вот так будет быстрее и правильнее.
Код: Выделить всё
begin
case k of
  1: S1;
  2: S2;
  3: S3;
end;

В смысле откажитесь от goto (не верю что я сам, в слух, написал эту фразу: "откажитесь от goto")

А array - действительно быстрее.
Последний раз редактировалось vitaly_l 13.03.2017 20:26:14, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Адрес инструкции

Сообщение runewalsh » 13.03.2017 20:24:13

Компилятор сам строит таблицу прыжков, если считает нужным. Добавь больше последовательных вариантов и посмотри, в какой именно момент.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

Re: Адрес инструкции

Сообщение zub » 13.03.2017 20:30:16

Azazaz
Компилятор всеравно умнее тебя. включи оптимизацию.
Если так не считаешь - никто не мешает в рантайме заполнить линейный массив или мап и вызывать нужное
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Адрес инструкции

Сообщение Azazaz » 13.03.2017 20:36:29

Ассемблерный код который я выложил сгенерирован под 4 уровнем оптимизации. Компилятор не читает мысли.
Azazaz
новенький
 
Сообщения: 41
Зарегистрирован: 21.04.2015 20:00:03

Re: Адрес инструкции

Сообщение zub » 13.03.2017 20:43:55

Насколько я знаю при локализованом k должна быть таблица переходов, в других случаях бинарный поиск нужной ветки. Видимо компилятор считает что при таком колве ветвей - выигрыша небудет.
Лучше оптимизируйте алгоритм, рутину оставте компилятору
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: Адрес инструкции

Сообщение runewalsh » 13.03.2017 21:13:01

Хм, всё-таки не очень-то оптимизирует, может и быть смысл. Кейс с шагом 1 — отлично (и даже 2–4, но они даже не оптимизируются делением — просто таблица разбавляется дырками), но вот остальное...
Код: Выделить всё
var
   i: integer;

begin
   writeln('var');
   writeln('   q: cardinal;');
   writeln;
   writeln('begin');
   writeln('   readln(q);');
   writeln('   case q of');
   for i := 0 to 1023 do
      writeln('      ', i*i, ': writeln(''', i*i, ''');');
   writeln('   end;');
   writeln('end.');
end.

Код: Выделить всё
var
   q: cardinal;

begin
   readln(q);
   case q of
      0: writeln('0');
      1: writeln('1');
      4: writeln('4');
      9: writeln('9');
      16: writeln('16');
      25: writeln('25');
      36: writeln('36');
      49: writeln('49');
      64: writeln('64');
      81: writeln('81');
      100: writeln('100');
      121: writeln('121');
      144: writeln('144');
      169: writeln('169');
      196: writeln('196');
      225: writeln('225');
      256: writeln('256');
      289: writeln('289');
      324: writeln('324');
      361: writeln('361');
      400: writeln('400');
      441: writeln('441');
      484: writeln('484');
      529: writeln('529');
      576: writeln('576');
      625: writeln('625');
      676: writeln('676');
      729: writeln('729');
      784: writeln('784');
      841: writeln('841');
      900: writeln('900');
      961: writeln('961');
      1024: writeln('1024');
      1089: writeln('1089');
      1156: writeln('1156');
      1225: writeln('1225');
      1296: writeln('1296');
      1369: writeln('1369');
      1444: writeln('1444');
      1521: writeln('1521');
      1600: writeln('1600');
      1681: writeln('1681');
      1764: writeln('1764');
      1849: writeln('1849');
      1936: writeln('1936');
      2025: writeln('2025');
      2116: writeln('2116');
      2209: writeln('2209');
      2304: writeln('2304');
      2401: writeln('2401');
      2500: writeln('2500');
      2601: writeln('2601');
      2704: writeln('2704');
      2809: writeln('2809');
      2916: writeln('2916');
      3025: writeln('3025');
      3136: writeln('3136');
      3249: writeln('3249');
      3364: writeln('3364');
      3481: writeln('3481');
      3600: writeln('3600');
      3721: writeln('3721');
      3844: writeln('3844');
      3969: writeln('3969');
      4096: writeln('4096');
      4225: writeln('4225');
      4356: writeln('4356');
      4489: writeln('4489');
      4624: writeln('4624');
      4761: writeln('4761');
      4900: writeln('4900');
      5041: writeln('5041');
      5184: writeln('5184');
      5329: writeln('5329');
      5476: writeln('5476');
      5625: writeln('5625');
      5776: writeln('5776');
      5929: writeln('5929');
      6084: writeln('6084');
      6241: writeln('6241');
      6400: writeln('6400');
      6561: writeln('6561');
      6724: writeln('6724');
      6889: writeln('6889');
      7056: writeln('7056');
      7225: writeln('7225');
      7396: writeln('7396');
      7569: writeln('7569');
      7744: writeln('7744');
      7921: writeln('7921');
      8100: writeln('8100');
      8281: writeln('8281');
      8464: writeln('8464');
      8649: writeln('8649');
      8836: writeln('8836');
      9025: writeln('9025');
      9216: writeln('9216');
      9409: writeln('9409');
      9604: writeln('9604');
      9801: writeln('9801');
      10000: writeln('10000');
      10201: writeln('10201');
      10404: writeln('10404');
      10609: writeln('10609');
      10816: writeln('10816');
      11025: writeln('11025');
      11236: writeln('11236');
      11449: writeln('11449');
      11664: writeln('11664');
      11881: writeln('11881');
      12100: writeln('12100');
      12321: writeln('12321');
      12544: writeln('12544');
      12769: writeln('12769');
      12996: writeln('12996');
      13225: writeln('13225');
      13456: writeln('13456');
      13689: writeln('13689');
      13924: writeln('13924');
      14161: writeln('14161');
      14400: writeln('14400');
      14641: writeln('14641');
      14884: writeln('14884');
      15129: writeln('15129');
      15376: writeln('15376');
      15625: writeln('15625');
      15876: writeln('15876');
      16129: writeln('16129');
      16384: writeln('16384');
      16641: writeln('16641');
      16900: writeln('16900');
      17161: writeln('17161');
      17424: writeln('17424');
      17689: writeln('17689');
      17956: writeln('17956');
      18225: writeln('18225');
      18496: writeln('18496');
      18769: writeln('18769');
      19044: writeln('19044');
      19321: writeln('19321');
      19600: writeln('19600');
      19881: writeln('19881');
      20164: writeln('20164');
      20449: writeln('20449');
      20736: writeln('20736');
      21025: writeln('21025');
      21316: writeln('21316');
      21609: writeln('21609');
      21904: writeln('21904');
      22201: writeln('22201');
      22500: writeln('22500');
      22801: writeln('22801');
      23104: writeln('23104');
      23409: writeln('23409');
      23716: writeln('23716');
      24025: writeln('24025');
      24336: writeln('24336');
      24649: writeln('24649');
      24964: writeln('24964');
      25281: writeln('25281');
      25600: writeln('25600');
      25921: writeln('25921');
      26244: writeln('26244');
      26569: writeln('26569');
      26896: writeln('26896');
      27225: writeln('27225');
      27556: writeln('27556');
      27889: writeln('27889');
      28224: writeln('28224');
      28561: writeln('28561');
      28900: writeln('28900');
      29241: writeln('29241');
      29584: writeln('29584');
      29929: writeln('29929');
      30276: writeln('30276');
      30625: writeln('30625');
      30976: writeln('30976');
      31329: writeln('31329');
      31684: writeln('31684');
      32041: writeln('32041');
      32400: writeln('32400');
      32761: writeln('32761');
      33124: writeln('33124');
      33489: writeln('33489');
      33856: writeln('33856');
      34225: writeln('34225');
      34596: writeln('34596');
      34969: writeln('34969');
      35344: writeln('35344');
      35721: writeln('35721');
      36100: writeln('36100');
      36481: writeln('36481');
      36864: writeln('36864');
      37249: writeln('37249');
      37636: writeln('37636');
      38025: writeln('38025');
      38416: writeln('38416');
      38809: writeln('38809');
      39204: writeln('39204');
      39601: writeln('39601');
      40000: writeln('40000');
      40401: writeln('40401');
      40804: writeln('40804');
      41209: writeln('41209');
      41616: writeln('41616');
      42025: writeln('42025');
      42436: writeln('42436');
      42849: writeln('42849');
      43264: writeln('43264');
      43681: writeln('43681');
      44100: writeln('44100');
      44521: writeln('44521');
      44944: writeln('44944');
      45369: writeln('45369');
      45796: writeln('45796');
      46225: writeln('46225');
      46656: writeln('46656');
      47089: writeln('47089');
      47524: writeln('47524');
      47961: writeln('47961');
      48400: writeln('48400');
      48841: writeln('48841');
      49284: writeln('49284');
      49729: writeln('49729');
      50176: writeln('50176');
      50625: writeln('50625');
      51076: writeln('51076');
      51529: writeln('51529');
      51984: writeln('51984');
      52441: writeln('52441');
      52900: writeln('52900');
      53361: writeln('53361');
      53824: writeln('53824');
      54289: writeln('54289');
      54756: writeln('54756');
      55225: writeln('55225');
      55696: writeln('55696');
      56169: writeln('56169');
      56644: writeln('56644');
      57121: writeln('57121');
      57600: writeln('57600');
      58081: writeln('58081');
      58564: writeln('58564');
      59049: writeln('59049');
      59536: writeln('59536');
      60025: writeln('60025');
      60516: writeln('60516');
      61009: writeln('61009');
      61504: writeln('61504');
      62001: writeln('62001');
      62500: writeln('62500');
      63001: writeln('63001');
      63504: writeln('63504');
      64009: writeln('64009');
      64516: writeln('64516');
      65025: writeln('65025');
      65536: writeln('65536');
      66049: writeln('66049');
      66564: writeln('66564');
      67081: writeln('67081');
      67600: writeln('67600');
      68121: writeln('68121');
      68644: writeln('68644');
      69169: writeln('69169');
      69696: writeln('69696');
      70225: writeln('70225');
      70756: writeln('70756');
      71289: writeln('71289');
      71824: writeln('71824');
      72361: writeln('72361');
      72900: writeln('72900');
      73441: writeln('73441');
      73984: writeln('73984');
      74529: writeln('74529');
      75076: writeln('75076');
      75625: writeln('75625');
      76176: writeln('76176');
      76729: writeln('76729');
      77284: writeln('77284');
      77841: writeln('77841');
      78400: writeln('78400');
      78961: writeln('78961');
      79524: writeln('79524');
      80089: writeln('80089');
      80656: writeln('80656');
      81225: writeln('81225');
      81796: writeln('81796');
      82369: writeln('82369');
      82944: writeln('82944');
      83521: writeln('83521');
      84100: writeln('84100');
      84681: writeln('84681');
      85264: writeln('85264');
      85849: writeln('85849');
      86436: writeln('86436');
      87025: writeln('87025');
      87616: writeln('87616');
      88209: writeln('88209');
      88804: writeln('88804');
      89401: writeln('89401');
      90000: writeln('90000');
      90601: writeln('90601');
      91204: writeln('91204');
      91809: writeln('91809');
      92416: writeln('92416');
      93025: writeln('93025');
      93636: writeln('93636');
      94249: writeln('94249');
      94864: writeln('94864');
      95481: writeln('95481');
      96100: writeln('96100');
      96721: writeln('96721');
      97344: writeln('97344');
      97969: writeln('97969');
      98596: writeln('98596');
      99225: writeln('99225');
      99856: writeln('99856');
      100489: writeln('100489');
      101124: writeln('101124');
      101761: writeln('101761');
      102400: writeln('102400');
      103041: writeln('103041');
      103684: writeln('103684');
      104329: writeln('104329');
      104976: writeln('104976');
      105625: writeln('105625');
      106276: writeln('106276');
      106929: writeln('106929');
      107584: writeln('107584');
      108241: writeln('108241');
      108900: writeln('108900');
      109561: writeln('109561');
      110224: writeln('110224');
      110889: writeln('110889');
      111556: writeln('111556');
      112225: writeln('112225');
      112896: writeln('112896');
      113569: writeln('113569');
      114244: writeln('114244');
      114921: writeln('114921');
      115600: writeln('115600');
      116281: writeln('116281');
      116964: writeln('116964');
      117649: writeln('117649');
      118336: writeln('118336');
      119025: writeln('119025');
      119716: writeln('119716');
      120409: writeln('120409');
      121104: writeln('121104');
      121801: writeln('121801');
      122500: writeln('122500');
      123201: writeln('123201');
      123904: writeln('123904');
      124609: writeln('124609');
      125316: writeln('125316');
      126025: writeln('126025');
      126736: writeln('126736');
      127449: writeln('127449');
      128164: writeln('128164');
      128881: writeln('128881');
      129600: writeln('129600');
      130321: writeln('130321');
      131044: writeln('131044');
      131769: writeln('131769');
      132496: writeln('132496');
      133225: writeln('133225');
      133956: writeln('133956');
      134689: writeln('134689');
      135424: writeln('135424');
      136161: writeln('136161');
      136900: writeln('136900');
      137641: writeln('137641');
      138384: writeln('138384');
      139129: writeln('139129');
      139876: writeln('139876');
      140625: writeln('140625');
      141376: writeln('141376');
      142129: writeln('142129');
      142884: writeln('142884');
      143641: writeln('143641');
      144400: writeln('144400');
      145161: writeln('145161');
      145924: writeln('145924');
      146689: writeln('146689');
      147456: writeln('147456');
      148225: writeln('148225');
      148996: writeln('148996');
      149769: writeln('149769');
      150544: writeln('150544');
      151321: writeln('151321');
      152100: writeln('152100');
      152881: writeln('152881');
      153664: writeln('153664');
      154449: writeln('154449');
      155236: writeln('155236');
      156025: writeln('156025');
      156816: writeln('156816');
      157609: writeln('157609');
      158404: writeln('158404');
      159201: writeln('159201');
      160000: writeln('160000');
      160801: writeln('160801');
      161604: writeln('161604');
      162409: writeln('162409');
      163216: writeln('163216');
      164025: writeln('164025');
      164836: writeln('164836');
      165649: writeln('165649');
      166464: writeln('166464');
      167281: writeln('167281');
      168100: writeln('168100');
      168921: writeln('168921');
      169744: writeln('169744');
      170569: writeln('170569');
      171396: writeln('171396');
      172225: writeln('172225');
      173056: writeln('173056');
      173889: writeln('173889');
      174724: writeln('174724');
      175561: writeln('175561');
      176400: writeln('176400');
      177241: writeln('177241');
      178084: writeln('178084');
      178929: writeln('178929');
      179776: writeln('179776');
      180625: writeln('180625');
      181476: writeln('181476');
      182329: writeln('182329');
      183184: writeln('183184');
      184041: writeln('184041');
      184900: writeln('184900');
      185761: writeln('185761');
      186624: writeln('186624');
      187489: writeln('187489');
      188356: writeln('188356');
      189225: writeln('189225');
      190096: writeln('190096');
      190969: writeln('190969');
      191844: writeln('191844');
      192721: writeln('192721');
      193600: writeln('193600');
      194481: writeln('194481');
      195364: writeln('195364');
      196249: writeln('196249');
      197136: writeln('197136');
      198025: writeln('198025');
      198916: writeln('198916');
      199809: writeln('199809');
      200704: writeln('200704');
      201601: writeln('201601');
      202500: writeln('202500');
      203401: writeln('203401');
      204304: writeln('204304');
      205209: writeln('205209');
      206116: writeln('206116');
      207025: writeln('207025');
      207936: writeln('207936');
      208849: writeln('208849');
      209764: writeln('209764');
      210681: writeln('210681');
      211600: writeln('211600');
      212521: writeln('212521');
      213444: writeln('213444');
      214369: writeln('214369');
      215296: writeln('215296');
      216225: writeln('216225');
      217156: writeln('217156');
      218089: writeln('218089');
      219024: writeln('219024');
      219961: writeln('219961');
      220900: writeln('220900');
      221841: writeln('221841');
      222784: writeln('222784');
      223729: writeln('223729');
      224676: writeln('224676');
      225625: writeln('225625');
      226576: writeln('226576');
      227529: writeln('227529');
      228484: writeln('228484');
      229441: writeln('229441');
      230400: writeln('230400');
      231361: writeln('231361');
      232324: writeln('232324');
      233289: writeln('233289');
      234256: writeln('234256');
      235225: writeln('235225');
      236196: writeln('236196');
      237169: writeln('237169');
      238144: writeln('238144');
      239121: writeln('239121');
      240100: writeln('240100');
      241081: writeln('241081');
      242064: writeln('242064');
      243049: writeln('243049');
      244036: writeln('244036');
      245025: writeln('245025');
      246016: writeln('246016');
      247009: writeln('247009');
      248004: writeln('248004');
      249001: writeln('249001');
      250000: writeln('250000');
      251001: writeln('251001');
      252004: writeln('252004');
      253009: writeln('253009');
      254016: writeln('254016');
      255025: writeln('255025');
      256036: writeln('256036');
      257049: writeln('257049');
      258064: writeln('258064');
      259081: writeln('259081');
      260100: writeln('260100');
      261121: writeln('261121');
      262144: writeln('262144');
      263169: writeln('263169');
      264196: writeln('264196');
      265225: writeln('265225');
      266256: writeln('266256');
      267289: writeln('267289');
      268324: writeln('268324');
      269361: writeln('269361');
      270400: writeln('270400');
      271441: writeln('271441');
      272484: writeln('272484');
      273529: writeln('273529');
      274576: writeln('274576');
      275625: writeln('275625');
      276676: writeln('276676');
      277729: writeln('277729');
      278784: writeln('278784');
      279841: writeln('279841');
      280900: writeln('280900');
      281961: writeln('281961');
      283024: writeln('283024');
      284089: writeln('284089');
      285156: writeln('285156');
      286225: writeln('286225');
      287296: writeln('287296');
      288369: writeln('288369');
      289444: writeln('289444');
      290521: writeln('290521');
      291600: writeln('291600');
      292681: writeln('292681');
      293764: writeln('293764');
      294849: writeln('294849');
      295936: writeln('295936');
      297025: writeln('297025');
      298116: writeln('298116');
      299209: writeln('299209');
      300304: writeln('300304');
      301401: writeln('301401');
      302500: writeln('302500');
      303601: writeln('303601');
      304704: writeln('304704');
      305809: writeln('305809');
      306916: writeln('306916');
      308025: writeln('308025');
      309136: writeln('309136');
      310249: writeln('310249');
      311364: writeln('311364');
      312481: writeln('312481');
      313600: writeln('313600');
      314721: writeln('314721');
      315844: writeln('315844');
      316969: writeln('316969');
      318096: writeln('318096');
      319225: writeln('319225');
      320356: writeln('320356');
      321489: writeln('321489');
      322624: writeln('322624');
      323761: writeln('323761');
      324900: writeln('324900');
      326041: writeln('326041');
      327184: writeln('327184');
      328329: writeln('328329');
      329476: writeln('329476');
      330625: writeln('330625');
      331776: writeln('331776');
      332929: writeln('332929');
      334084: writeln('334084');
      335241: writeln('335241');
      336400: writeln('336400');
      337561: writeln('337561');
      338724: writeln('338724');
      339889: writeln('339889');
      341056: writeln('341056');
      342225: writeln('342225');
      343396: writeln('343396');
      344569: writeln('344569');
      345744: writeln('345744');
      346921: writeln('346921');
      348100: writeln('348100');
      349281: writeln('349281');
      350464: writeln('350464');
      351649: writeln('351649');
      352836: writeln('352836');
      354025: writeln('354025');
      355216: writeln('355216');
      356409: writeln('356409');
      357604: writeln('357604');
      358801: writeln('358801');
      360000: writeln('360000');
      361201: writeln('361201');
      362404: writeln('362404');
      363609: writeln('363609');
      364816: writeln('364816');
      366025: writeln('366025');
      367236: writeln('367236');
      368449: writeln('368449');
      369664: writeln('369664');
      370881: writeln('370881');
      372100: writeln('372100');
      373321: writeln('373321');
      374544: writeln('374544');
      375769: writeln('375769');
      376996: writeln('376996');
      378225: writeln('378225');
      379456: writeln('379456');
      380689: writeln('380689');
      381924: writeln('381924');
      383161: writeln('383161');
      384400: writeln('384400');
      385641: writeln('385641');
      386884: writeln('386884');
      388129: writeln('388129');
      389376: writeln('389376');
      390625: writeln('390625');
      391876: writeln('391876');
      393129: writeln('393129');
      394384: writeln('394384');
      395641: writeln('395641');
      396900: writeln('396900');
      398161: writeln('398161');
      399424: writeln('399424');
      400689: writeln('400689');
      401956: writeln('401956');
      403225: writeln('403225');
      404496: writeln('404496');
      405769: writeln('405769');
      407044: writeln('407044');
      408321: writeln('408321');
      409600: writeln('409600');
      410881: writeln('410881');
      412164: writeln('412164');
      413449: writeln('413449');
      414736: writeln('414736');
      416025: writeln('416025');
      417316: writeln('417316');
      418609: writeln('418609');
      419904: writeln('419904');
      421201: writeln('421201');
      422500: writeln('422500');
      423801: writeln('423801');
      425104: writeln('425104');
      426409: writeln('426409');
      427716: writeln('427716');
      429025: writeln('429025');
      430336: writeln('430336');
      431649: writeln('431649');
      432964: writeln('432964');
      434281: writeln('434281');
      435600: writeln('435600');
      436921: writeln('436921');
      438244: writeln('438244');
      439569: writeln('439569');
      440896: writeln('440896');
      442225: writeln('442225');
      443556: writeln('443556');
      444889: writeln('444889');
      446224: writeln('446224');
      447561: writeln('447561');
      448900: writeln('448900');
      450241: writeln('450241');
      451584: writeln('451584');
      452929: writeln('452929');
      454276: writeln('454276');
      455625: writeln('455625');
      456976: writeln('456976');
      458329: writeln('458329');
      459684: writeln('459684');
      461041: writeln('461041');
      462400: writeln('462400');
      463761: writeln('463761');
      465124: writeln('465124');
      466489: writeln('466489');
      467856: writeln('467856');
      469225: writeln('469225');
      470596: writeln('470596');
      471969: writeln('471969');
      473344: writeln('473344');
      474721: writeln('474721');
      476100: writeln('476100');
      477481: writeln('477481');
      478864: writeln('478864');
      480249: writeln('480249');
      481636: writeln('481636');
      483025: writeln('483025');
      484416: writeln('484416');
      485809: writeln('485809');
      487204: writeln('487204');
      488601: writeln('488601');
      490000: writeln('490000');
      491401: writeln('491401');
      492804: writeln('492804');
      494209: writeln('494209');
      495616: writeln('495616');
      497025: writeln('497025');
      498436: writeln('498436');
      499849: writeln('499849');
      501264: writeln('501264');
      502681: writeln('502681');
      504100: writeln('504100');
      505521: writeln('505521');
      506944: writeln('506944');
      508369: writeln('508369');
      509796: writeln('509796');
      511225: writeln('511225');
      512656: writeln('512656');
      514089: writeln('514089');
      515524: writeln('515524');
      516961: writeln('516961');
      518400: writeln('518400');
      519841: writeln('519841');
      521284: writeln('521284');
      522729: writeln('522729');
      524176: writeln('524176');
      525625: writeln('525625');
      527076: writeln('527076');
      528529: writeln('528529');
      529984: writeln('529984');
      531441: writeln('531441');
      532900: writeln('532900');
      534361: writeln('534361');
      535824: writeln('535824');
      537289: writeln('537289');
      538756: writeln('538756');
      540225: writeln('540225');
      541696: writeln('541696');
      543169: writeln('543169');
      544644: writeln('544644');
      546121: writeln('546121');
      547600: writeln('547600');
      549081: writeln('549081');
      550564: writeln('550564');
      552049: writeln('552049');
      553536: writeln('553536');
      555025: writeln('555025');
      556516: writeln('556516');
      558009: writeln('558009');
      559504: writeln('559504');
      561001: writeln('561001');
      562500: writeln('562500');
      564001: writeln('564001');
      565504: writeln('565504');
      567009: writeln('567009');
      568516: writeln('568516');
      570025: writeln('570025');
      571536: writeln('571536');
      573049: writeln('573049');
      574564: writeln('574564');
      576081: writeln('576081');
      577600: writeln('577600');
      579121: writeln('579121');
      580644: writeln('580644');
      582169: writeln('582169');
      583696: writeln('583696');
      585225: writeln('585225');
      586756: writeln('586756');
      588289: writeln('588289');
      589824: writeln('589824');
      591361: writeln('591361');
      592900: writeln('592900');
      594441: writeln('594441');
      595984: writeln('595984');
      597529: writeln('597529');
      599076: writeln('599076');
      600625: writeln('600625');
      602176: writeln('602176');
      603729: writeln('603729');
      605284: writeln('605284');
      606841: writeln('606841');
      608400: writeln('608400');
      609961: writeln('609961');
      611524: writeln('611524');
      613089: writeln('613089');
      614656: writeln('614656');
      616225: writeln('616225');
      617796: writeln('617796');
      619369: writeln('619369');
      620944: writeln('620944');
      622521: writeln('622521');
      624100: writeln('624100');
      625681: writeln('625681');
      627264: writeln('627264');
      628849: writeln('628849');
      630436: writeln('630436');
      632025: writeln('632025');
      633616: writeln('633616');
      635209: writeln('635209');
      636804: writeln('636804');
      638401: writeln('638401');
      640000: writeln('640000');
      641601: writeln('641601');
      643204: writeln('643204');
      644809: writeln('644809');
      646416: writeln('646416');
      648025: writeln('648025');
      649636: writeln('649636');
      651249: writeln('651249');
      652864: writeln('652864');
      654481: writeln('654481');
      656100: writeln('656100');
      657721: writeln('657721');
      659344: writeln('659344');
      660969: writeln('660969');
      662596: writeln('662596');
      664225: writeln('664225');
      665856: writeln('665856');
      667489: writeln('667489');
      669124: writeln('669124');
      670761: writeln('670761');
      672400: writeln('672400');
      674041: writeln('674041');
      675684: writeln('675684');
      677329: writeln('677329');
      678976: writeln('678976');
      680625: writeln('680625');
      682276: writeln('682276');
      683929: writeln('683929');
      685584: writeln('685584');
      687241: writeln('687241');
      688900: writeln('688900');
      690561: writeln('690561');
      692224: writeln('692224');
      693889: writeln('693889');
      695556: writeln('695556');
      697225: writeln('697225');
      698896: writeln('698896');
      700569: writeln('700569');
      702244: writeln('702244');
      703921: writeln('703921');
      705600: writeln('705600');
      707281: writeln('707281');
      708964: writeln('708964');
      710649: writeln('710649');
      712336: writeln('712336');
      714025: writeln('714025');
      715716: writeln('715716');
      717409: writeln('717409');
      719104: writeln('719104');
      720801: writeln('720801');
      722500: writeln('722500');
      724201: writeln('724201');
      725904: writeln('725904');
      727609: writeln('727609');
      729316: writeln('729316');
      731025: writeln('731025');
      732736: writeln('732736');
      734449: writeln('734449');
      736164: writeln('736164');
      737881: writeln('737881');
      739600: writeln('739600');
      741321: writeln('741321');
      743044: writeln('743044');
      744769: writeln('744769');
      746496: writeln('746496');
      748225: writeln('748225');
      749956: writeln('749956');
      751689: writeln('751689');
      753424: writeln('753424');
      755161: writeln('755161');
      756900: writeln('756900');
      758641: writeln('758641');
      760384: writeln('760384');
      762129: writeln('762129');
      763876: writeln('763876');
      765625: writeln('765625');
      767376: writeln('767376');
      769129: writeln('769129');
      770884: writeln('770884');
      772641: writeln('772641');
      774400: writeln('774400');
      776161: writeln('776161');
      777924: writeln('777924');
      779689: writeln('779689');
      781456: writeln('781456');
      783225: writeln('783225');
      784996: writeln('784996');
      786769: writeln('786769');
      788544: writeln('788544');
      790321: writeln('790321');
      792100: writeln('792100');
      793881: writeln('793881');
      795664: writeln('795664');
      797449: writeln('797449');
      799236: writeln('799236');
      801025: writeln('801025');
      802816: writeln('802816');
      804609: writeln('804609');
      806404: writeln('806404');
      808201: writeln('808201');
      810000: writeln('810000');
      811801: writeln('811801');
      813604: writeln('813604');
      815409: writeln('815409');
      817216: writeln('817216');
      819025: writeln('819025');
      820836: writeln('820836');
      822649: writeln('822649');
      824464: writeln('824464');
      826281: writeln('826281');
      828100: writeln('828100');
      829921: writeln('829921');
      831744: writeln('831744');
      833569: writeln('833569');
      835396: writeln('835396');
      837225: writeln('837225');
      839056: writeln('839056');
      840889: writeln('840889');
      842724: writeln('842724');
      844561: writeln('844561');
      846400: writeln('846400');
      848241: writeln('848241');
      850084: writeln('850084');
      851929: writeln('851929');
      853776: writeln('853776');
      855625: writeln('855625');
      857476: writeln('857476');
      859329: writeln('859329');
      861184: writeln('861184');
      863041: writeln('863041');
      864900: writeln('864900');
      866761: writeln('866761');
      868624: writeln('868624');
      870489: writeln('870489');
      872356: writeln('872356');
      874225: writeln('874225');
      876096: writeln('876096');
      877969: writeln('877969');
      879844: writeln('879844');
      881721: writeln('881721');
      883600: writeln('883600');
      885481: writeln('885481');
      887364: writeln('887364');
      889249: writeln('889249');
      891136: writeln('891136');
      893025: writeln('893025');
      894916: writeln('894916');
      896809: writeln('896809');
      898704: writeln('898704');
      900601: writeln('900601');
      902500: writeln('902500');
      904401: writeln('904401');
      906304: writeln('906304');
      908209: writeln('908209');
      910116: writeln('910116');
      912025: writeln('912025');
      913936: writeln('913936');
      915849: writeln('915849');
      917764: writeln('917764');
      919681: writeln('919681');
      921600: writeln('921600');
      923521: writeln('923521');
      925444: writeln('925444');
      927369: writeln('927369');
      929296: writeln('929296');
      931225: writeln('931225');
      933156: writeln('933156');
      935089: writeln('935089');
      937024: writeln('937024');
      938961: writeln('938961');
      940900: writeln('940900');
      942841: writeln('942841');
      944784: writeln('944784');
      946729: writeln('946729');
      948676: writeln('948676');
      950625: writeln('950625');
      952576: writeln('952576');
      954529: writeln('954529');
      956484: writeln('956484');
      958441: writeln('958441');
      960400: writeln('960400');
      962361: writeln('962361');
      964324: writeln('964324');
      966289: writeln('966289');
      968256: writeln('968256');
      970225: writeln('970225');
      972196: writeln('972196');
      974169: writeln('974169');
      976144: writeln('976144');
      978121: writeln('978121');
      980100: writeln('980100');
      982081: writeln('982081');
      984064: writeln('984064');
      986049: writeln('986049');
      988036: writeln('988036');
      990025: writeln('990025');
      992016: writeln('992016');
      994009: writeln('994009');
      996004: writeln('996004');
      998001: writeln('998001');
      1000000: writeln('1000000');
      1002001: writeln('1002001');
      1004004: writeln('1004004');
      1006009: writeln('1006009');
      1008016: writeln('1008016');
      1010025: writeln('1010025');
      1012036: writeln('1012036');
      1014049: writeln('1014049');
      1016064: writeln('1016064');
      1018081: writeln('1018081');
      1020100: writeln('1020100');
      1022121: writeln('1022121');
      1024144: writeln('1024144');
      1026169: writeln('1026169');
      1028196: writeln('1028196');
      1030225: writeln('1030225');
      1032256: writeln('1032256');
      1034289: writeln('1034289');
      1036324: writeln('1036324');
      1038361: writeln('1038361');
      1040400: writeln('1040400');
      1042441: writeln('1042441');
      1044484: writeln('1044484');
      1046529: writeln('1046529');
   end;
end.

Компилируется в 1023 sub+je даже с -O4. А должно в дерево сравнений. А я-то гадал, почему моя Symbol.Classify на основе большого case по кодовым точкам такая медленная. :D Главное, для case по строкам документация явно предупреждает: «no optimizations are performed», так что наивный читатель может предположить, что для порядковых типов они реализованы.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 578
Зарегистрирован: 27.04.2010 00:15:25

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 39

Рейтинг@Mail.ru