Адрес инструкции
Модератор: Модераторы
Адрес инструкции
В общем, я пишу высокопроизводительный низкоуровневый код и возникла необходимость получить адреса определенных инструкций написанных на Pascal (соответственно что бы совершить потом прыжок), какие методы есть?
(нужно получить конкретные статические значения на момент компиляции)
(нужно получить конкретные статические значения на момент компиляции)
Код: Выделить всё
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
Ого, так можно? Прикольно.
Добавлю другую частность: можешь пытаться задавать в коде магические числа типа $11223344{55667788}, потом находить и менять, понадеявшись, что число закодировано непосредственно и что другая инструкция не развернулась в такое же. Рекомендую придумать быстрый тест и параноить работоспособность таких трюков при каждом запуске.
Добавлю другую частность: можешь пытаться задавать в коде магические числа типа $11223344{55667788}, потом находить и менять, понадеявшись, что число закодировано непосредственно и что другая инструкция не развернулась в такое же. Рекомендую придумать быстрый тест и параноить работоспособность таких трюков при каждом запуске.
Код: Выделить всё
uses sysutils;
label
label1,label2;
const
a = @label2 - @label1;
begin
label1:
writeln(inttohex(ptruint(@label1),8));
label2:
writeln(inttohex(ptruint(@label2),8));
readln;
end.
Компилятор как бы не знает.
Какбы незнает какбы что?
Естественно в компайлтайме он прикидывается валенком. посчитай разницу в рантайме
Естественно в компайлтайме он прикидывается валенком. посчитай разницу в рантайме
Суть в том что если считать разницу в во время исполнения, то оптимизация теряет смысл, проще case + GoTo сделать - такой подход медленнее, прирост будет в том случае, если прыжки будут происходить по заранее вычисленному смещению и нужно что бы значение смещения было прописано в самом коде статически. Так вот, почему это компилятор не знает где заканчивается одна инструкция и начинается вторая?
Добавлено спустя 5 минут 6 секунд:
Можно предположить что компилятор трансформирует дифференцированный набор инструкций в измененный набор в последствии анализа кода и проведения оптимизации, но в таком случае почему смещение отдельных инструкций детерминируется без вопросов?
Добавлено спустя 5 минут 6 секунд:
Можно предположить что компилятор трансформирует дифференцированный набор инструкций в измененный набор в последствии анализа кода и проведения оптимизации, но в таком случае почему смещение отдельных инструкций детерминируется без вопросов?
>>Суть в том что если считать разницу в во время исполнения, то оптимизация теряет смысл\
Приведите пжст пример того чего вы хотите в коде?
Приведите пжст пример того чего вы хотите в коде?
Azazaz писал(а):проще case + GoTo сделать ... Так вот, почему это компилятор не знает где заканчивается одна инструкция и начинается вторая?
Компилятор вообще никак не реагирует на телодвижения GoTo и не следит за ними. Соответственно, даже если Вы преднамеренно сделаете ошибку используя goto, он её не заметит.
Исходная задача
То есть тут имеется цепочка не линейного кода:
Эта часть кода трансформируется в нечто:
Путем несложных вычислений находим, что эта цепочка является нестабильной и при равномерном распределении параметра k будет показывать различную скорость исполнения каждый раз в сторону замедления.
РЕШЕНИЕ: берем смещения между адресами меток и кидаем в массив типа off: array[0..3]of byte, далее используя безусловный переход (jmp) используем смещения путем jmp off[%номер_метки%]. Таким образом участок не линейного кода превращается в короткий участок линейных инструкций.
Код: Выделить всё
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 писал(а):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 19:26:14, всего редактировалось 1 раз.
Компилятор сам строит таблицу прыжков, если считает нужным. Добавь больше последовательных вариантов и посмотри, в какой именно момент.
Azazaz
Компилятор всеравно умнее тебя. включи оптимизацию.
Если так не считаешь - никто не мешает в рантайме заполнить линейный массив или мап и вызывать нужное
Компилятор всеравно умнее тебя. включи оптимизацию.
Если так не считаешь - никто не мешает в рантайме заполнить линейный массив или мап и вызывать нужное
Ассемблерный код который я выложил сгенерирован под 4 уровнем оптимизации. Компилятор не читает мысли.
Насколько я знаю при локализованом k должна быть таблица переходов, в других случаях бинарный поиск нужной ветки. Видимо компилятор считает что при таком колве ветвей - выигрыша небудет.
Лучше оптимизируйте алгоритм, рутину оставте компилятору
Лучше оптимизируйте алгоритм, рутину оставте компилятору
Хм, всё-таки не очень-то оптимизирует, может и быть смысл. Кейс с шагом 1 — отлично (и даже 2–4, но они даже не оптимизируются делением — просто таблица разбавляется дырками), но вот остальное...
⇓
Компилируется в 1023 sub+je даже с -O4. А должно в дерево сравнений. А я-то гадал, почему моя Symbol.Classify на основе большого case по кодовым точкам такая медленная. :D Главное, для case по строкам документация явно предупреждает: «no optimizations are performed», так что наивный читатель может предположить, что для порядковых типов они реализованы.
Код: Выделить всё
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», так что наивный читатель может предположить, что для порядковых типов они реализованы.
