OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 13 Октябрь, 2024 00:43

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 242 ]  На страницу Пред.  1 ... 9, 10, 11, 12, 13  След.
Автор Сообщение
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Четверг, 26 Сентябрь, 2024 18:28 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2460
Откуда: Россия, Томск
arisu писал(а):
это, в общем, даже не должно быть дорого. на входе в процедуру, перед обратным бранчем: делаем
И во всех циклах не забудьте.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Четверг, 26 Сентябрь, 2024 18:43 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1448
Александр Ильин писал(а):
arisu писал(а):
это, в общем, даже не должно быть дорого. на входе в процедуру, перед обратным бранчем: делаем
И во всех циклах не забудьте.
так это два варианта же: на входе, И перед обратным бранчем (что и есть цикл). на самом деле в бумажке ребята ещё через некоторое количество инструкций проверку вставляют — видимо, на случай простыни в стопицот строчек. а вот на входе в процедуру не вставляют, кажется.

я думаю, что вставка на входе заменяет считание инструкций: там у ребят тогда (без входа) может быть ситуация, когда процедура чуть-чуть не дотягивает, и без циклов. и куча вызовов таких процедур (возможно, вложеных). и всё, шедулер скис. а если на входе вставлять — то никакого смысла считать инструкции, по-моему, и нет. хотя это может плохо дружить с инлайнером (если не копировать и проверки). в общем, когда соберусь делать — тогда и поэкспериментирую со стратегиями.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Пятница, 27 Сентябрь, 2024 22:49 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1448
а самое смешное то, что почти все эти танцы с регистровыми переменными совершенно не нужны. вместо этого нужен проход по коду, который убирает мёртвые store, и тогда Nanojit вполне в состоянии остальное сделать сам. кстати, даже чуть лучше, чем если пытаться его заставить насильно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Суббота, 28 Сентябрь, 2024 12:40 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1448
ну и в итоге: простейший, совершенно дубовый dead store eliminator — который убирает только простейшее, даже толком data flow analysis не делает, — смог превратить вот это:
Код:
=== Aggregated assembly output: BEGIN
===
  0xb721d913                                   [prologue]
  0xb721d913  55                               push ebp
  0xb721d914  8b ec                            mov ebp,esp
  0xb721d916                                   [frag entry]
  0xb721d916                                   [zero stack]
  0xb721d916  6a 00                            push 0
  0xb721d918  6a 00                            push 0
      parami1 = parami 0 ecx (in reg? -1)
  ------------------------------ # line 8: Core:Hashes:U32:Hash [MY_THISCALL_NO_SAVE]
  ------------------------------ # line 10: local variable: a
      allocp1 = allocp 4 (in reg? -1)
  ------------------------------ # line 10: cache param `a` to make addressable
      sti.s allocp1[0] = parami1 (in reg? -1)
  0xb721d91a  89 4d fc                         mov [ebp-4],ecx
      ldi1 = ldi.s allocp1[0] (in reg? -1)
  0xb721d91d  8b 5d fc                         mov ebx,[ebp-4]
      immi1 = immi 0x7ed55d16 (in reg? -1)
      addi1 = addi ldi1, immi1/*0x7ed55d16*/ (in reg? -1)
  0xb721d920  8d 9b 16 5d d5 7e                lea ebx,[ebx+2127912214]
      ldi2 = ldi.s allocp1[0] (in reg? -1)
  0xb721d926  8b 75 fc                         mov esi,[ebp-4]
      immi2 = immi 12 (in reg? -1)
      roli1 = roli ldi2, immi2/*12*/ (in reg? -1)
  0xb721d929  c1 c6 0c                         rol esi,12
      addi2 = addi addi1, roli1 (in reg? -1)
  0xb721d92c  8d 1c 33                         lea ebx,[ebx+esi*1]
      sti.s allocp1[0] = addi2 (in reg? -1)
  0xb721d92f  89 5d fc                         mov [ebp-4],ebx
      ldi3 = ldi.s allocp1[0] (in reg? -1)
  0xb721d932  8b 5d fc                         mov ebx,[ebp-4]
      immi3 = immi 0xc761c23c (in reg? -1)
      xori1 = xori ldi3, immi3/*0xc761c23c*/ (in reg? -1)
  0xb721d935  81 f3 3c c2 61 c7                xor ebx,-949894596
      ldi4 = ldi.s allocp1[0] (in reg? -1)
  0xb721d93b  8b 75 fc                         mov esi,[ebp-4]
      immi4 = immi 19 (in reg? -1)
      roli2 = roli ldi4, immi4/*19*/ (in reg? -1)
  0xb721d93e  c1 c6 13                         rol esi,19
      xori2 = xori xori1, roli2 (in reg? -1)
  0xb721d941  33 de                            xor ebx,esi
      sti.s allocp1[0] = xori2 (in reg? -1)
  0xb721d943  89 5d fc                         mov [ebp-4],ebx
      ldi5 = ldi.s allocp1[0] (in reg? -1)
  0xb721d946  8b 5d fc                         mov ebx,[ebp-4]
      immi5 = immi 0x165667b1 (in reg? -1)
      addi3 = addi ldi5, immi5/*0x165667b1*/ (in reg? -1)
  0xb721d949  8d 9b b1 67 56 16                lea ebx,[ebx+374761393]
      ldi6 = ldi.s allocp1[0] (in reg? -1)
  0xb721d94f  8b 75 fc                         mov esi,[ebp-4]
      immi6 = immi 5 (in reg? -1)
      roli3 = roli ldi6, immi6/*5*/ (in reg? -1)
  0xb721d952  c1 c6 05                         rol esi,5
      addi4 = addi addi3, roli3 (in reg? -1)
  0xb721d955  8d 1c 33                         lea ebx,[ebx+esi*1]
      sti.s allocp1[0] = addi4 (in reg? -1)
  0xb721d958  89 5d fc                         mov [ebp-4],ebx
      ldi7 = ldi.s allocp1[0] (in reg? -1)
  0xb721d95b  8b 5d fc                         mov ebx,[ebp-4]
      immi7 = immi 0xd3a2646c (in reg? -1)
      addi5 = addi ldi7, immi7/*0xd3a2646c*/ (in reg? -1)
  0xb721d95e  8d 9b 6c 64 a2 d3                lea ebx,[ebx-744332180]
      ldi8 = ldi.s allocp1[0] (in reg? -1)
  0xb721d964  8b 75 fc                         mov esi,[ebp-4]
      immi8 = immi 9 (in reg? -1)
      roli4 = roli ldi8, immi8/*9*/ (in reg? -1)
  0xb721d967  c1 c6 09                         rol esi,9
      xori3 = xori addi5, roli4 (in reg? -1)
  0xb721d96a  33 de                            xor ebx,esi
      sti.s allocp1[0] = xori3 (in reg? -1)
  0xb721d96c  89 5d fc                         mov [ebp-4],ebx
      ldi9 = ldi.s allocp1[0] (in reg? -1)
  0xb721d96f  8b 5d fc                         mov ebx,[ebp-4]
      immi9 = immi 0xfd7046c5 (in reg? -1)
      addi6 = addi ldi9, immi9/*0xfd7046c5*/ (in reg? -1)
  0xb721d972  8d 9b c5 46 70 fd                lea ebx,[ebx-42973499]
      ldi10 = ldi.s allocp1[0] (in reg? -1)
  0xb721d978  8b 75 fc                         mov esi,[ebp-4]
      immi10 = immi 3 (in reg? -1)
      roli5 = roli ldi10, immi10/*3*/ (in reg? -1)
  0xb721d97b  c1 c6 03                         rol esi,3
      addi7 = addi addi6, roli5 (in reg? -1)
  0xb721d97e  8d 1c 33                         lea ebx,[ebx+esi*1]
      sti.s allocp1[0] = addi7 (in reg? -1)
  0xb721d981  89 5d fc                         mov [ebp-4],ebx
      ldi11 = ldi.s allocp1[0] (in reg? -1)
  0xb721d984  8b 45 fc                         mov eax,[ebp-4]
      immi11 = immi 0xb55a4f09 (in reg? -1)
      xori4 = xori ldi11, immi11/*0xb55a4f09*/ (in reg? -1)
  0xb721d987  35 09 4f 5a b5                   xor eax,-1252372727
      ldi12 = ldi.s allocp1[0] (in reg? -1)
  0xb721d98c  8b 5d fc                         mov ebx,[ebp-4]
      immi12 = immi 16 (in reg? -1)
      roli6 = roli ldi12, immi12/*16*/ (in reg? -1)
  0xb721d98f  c1 c3 10                         rol ebx,16
      xori5 = xori xori4, roli6 (in reg? -1)
  0xb721d992  33 c3                            xor eax,ebx
      reti xori5 (in reg? -1)
  0xb721d994  8b e5                            mov esp,ebp
  0xb721d996  5d                               pop ebp
  0xb721d997  c3                               ret
      unreachable (in reg? -1)
      unreachable (in reg? -1)
  0xb721d998  90 90 90 90                      align
===
=== Aggregated assembly output: END

в это:
Код:
=== Aggregated assembly output: BEGIN
===
  0xb72e3abf                                   [prologue]
  0xb72e3abf                                   [prologue, no extra stack]
  0xb72e3abf  55                               push ebp
  0xb72e3ac0  8b ec                            mov ebp,esp
  0xb72e3ac2                                   [frag entry]
      parami1 = parami 0 ecx (in reg? -1)
  0xb72e3ac2  8b f1                            mov esi,ecx
  ------------------------------ # line 8: Core:Hashes:U32:Hash [MY_THISCALL_NO_SAVE]
  ------------------------------ # line 10: local variable: a
  ------------------------------ # removed dead store
  ------------------------------ # a
  ------------------------------ # sti/ldi optimisation
      immi1 = immi 0x7ed55d16 (in reg? -1)
      addi1 = addi parami1, immi1/*0x7ed55d16*/ (in reg? -1)
  0xb72e3ac4  8d 9e 16 5d d5 7e                lea ebx,[esi+2127912214]
  ------------------------------ # sti/ldi optimisation
      immi2 = immi 12 (in reg? -1)
      roli1 = roli parami1, immi2/*12*/ (in reg? -1)
  0xb72e3aca  c1 c6 0c                         rol esi,12
      addi2 = addi addi1, roli1 (in reg? -1)
  0xb72e3acd  8d 1c 33                         lea ebx,[ebx+esi*1]
  ------------------------------ # removed dead store
  ------------------------------ # a
  ------------------------------ # sti/ldi optimisation
      immi3 = immi 0xc761c23c (in reg? -1)
      xori1 = xori addi2, immi3/*0xc761c23c*/ (in reg? -1)
  0xb72e3ad0  8b f3                            mov esi,ebx
  0xb72e3ad2  81 f6 3c c2 61 c7                xor esi,-949894596
  ------------------------------ # sti/ldi optimisation
      immi4 = immi 19 (in reg? -1)
      roli2 = roli addi2, immi4/*19*/ (in reg? -1)
  0xb72e3ad8  c1 c3 13                         rol ebx,19
      xori2 = xori xori1, roli2 (in reg? -1)
  0xb72e3adb  33 f3                            xor esi,ebx
  ------------------------------ # removed dead store
  ------------------------------ # a
  ------------------------------ # sti/ldi optimisation
      immi5 = immi 0x165667b1 (in reg? -1)
      addi3 = addi xori2, immi5/*0x165667b1*/ (in reg? -1)
  0xb72e3add  8d 9e b1 67 56 16                lea ebx,[esi+374761393]
  ------------------------------ # sti/ldi optimisation
      immi6 = immi 5 (in reg? -1)
      roli3 = roli xori2, immi6/*5*/ (in reg? -1)
  0xb72e3ae3  c1 c6 05                         rol esi,5
      addi4 = addi addi3, roli3 (in reg? -1)
  0xb72e3ae6  8d 1c 33                         lea ebx,[ebx+esi*1]
  ------------------------------ # removed dead store
  ------------------------------ # a
  ------------------------------ # sti/ldi optimisation
      immi7 = immi 0xd3a2646c (in reg? -1)
      addi5 = addi addi4, immi7/*0xd3a2646c*/ (in reg? -1)
  0xb72e3ae9  8d b3 6c 64 a2 d3                lea esi,[ebx-744332180]
  ------------------------------ # sti/ldi optimisation
      immi8 = immi 9 (in reg? -1)
      roli4 = roli addi4, immi8/*9*/ (in reg? -1)
  0xb72e3aef  c1 c3 09                         rol ebx,9
      xori3 = xori addi5, roli4 (in reg? -1)
  0xb72e3af2  33 f3                            xor esi,ebx
  ------------------------------ # removed dead store
  ------------------------------ # a
  ------------------------------ # sti/ldi optimisation
      immi9 = immi 0xfd7046c5 (in reg? -1)
      addi6 = addi xori3, immi9/*0xfd7046c5*/ (in reg? -1)
  0xb72e3af4  8d 9e c5 46 70 fd                lea ebx,[esi-42973499]
  ------------------------------ # sti/ldi optimisation
      immi10 = immi 3 (in reg? -1)
      roli5 = roli xori3, immi10/*3*/ (in reg? -1)
  0xb72e3afa  c1 c6 03                         rol esi,3
      addi7 = addi addi6, roli5 (in reg? -1)
  0xb72e3afd  8d 1c 33                         lea ebx,[ebx+esi*1]
  ------------------------------ # removed dead store
  ------------------------------ # a
  ------------------------------ # sti/ldi optimisation
      immi11 = immi 0xb55a4f09 (in reg? -1)
      xori4 = xori addi7, immi11/*0xb55a4f09*/ (in reg? -1)
  0xb72e3b00  8b c3                            mov eax,ebx
  0xb72e3b02  35 09 4f 5a b5                   xor eax,-1252372727
  ------------------------------ # sti/ldi optimisation
      immi12 = immi 16 (in reg? -1)
      roli6 = roli addi7, immi12/*16*/ (in reg? -1)
  0xb72e3b07  c1 c3 10                         rol ebx,16
      xori5 = xori xori4, roli6 (in reg? -1)
  0xb72e3b0a  33 c3                            xor eax,ebx
      reti xori5 (in reg? -1)
  0xb72e3b0c  8b e5                            mov esp,ebp
  0xb72e3b0e  5d                               pop ebp
  0xb72e3b0f  c3                               ret
      unreachable (in reg? -1)
      unreachable (in reg? -1)
  0xb72e3b10  90 90 90 90                      align
===
=== Aggregated assembly output: END

а, оригинал, да:
Код:
PROCEDURE Hash* [no_overflow_checks] (a: INTEGER): INTEGER;
BEGIN
  a := (a + 07ED55D16H) + ROL(a, 12);
  a := (((a AS SET) / (0C761C23CH AS SET)) / (ROR(a, 19) AS SET) AS INTEGER);
  a := (a + 0165667B1H) + ROL(a, 5);
  a := ((a + 0D3A2646CH AS SET) / (ROL(a, 9) AS SET) AS INTEGER);
  a := (a + 0FD7046C5H) + ROL(a, 3);
  RETURN (((a AS SET) / (0B55A4F09H AS SET)) / (ROR(a, 16) AS SET) AS INTEGER);
END Hash;

как видим — вообще все временные сохранения в переменную вайпнулись. вместе с самой переменной. только ECX Nanojit отчего-то не захотел использовать напрямую, а перетащил в scratch register.

p.s.: кстати, я по спекам O/Ur после `FOR` переменную цикла зануляю. иба нефиг. а dead store eliminator ходит по пятам и зануления вайпает, лол.

и если чо — мы всё ещё можем делать крипто. потому что `ERASE()` никогда не вайпается, даже если локалы чистим.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Суббота, 28 Сентябрь, 2024 19:06 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1448
и ещё для сравнения.
Код:
TYPE
   Color = INTEGER;

PROCEDURE FastBlend* (dc, col: Color; acol: INTEGER): Color;
VAR rb, rb1, g, g1: INTEGER;
BEGIN
  acol := (acol MOD 100H) + 1; (* to not loose bits *)
  rb := ORD(BITS(dc) * BITS(0FF00FFH));
  g := ORD(BITS(dc) * BITS(000FF00H));
  rb1 := rb + LSH((ORD(BITS(col) * BITS(0FF00FFH)) - rb) * acol, -8);
  g1 := g + LSH((ORD(BITS(col) * BITS(000FF00H)) - g) * acol, -8);
  (* g is mixed with solid alpha; replace "0xff_" with other alpha if you want to *)
  RETURN
    ORD((BITS(rb1) * BITS(0FF00FFH)) +
     (BITS(g1) * BITS(0FF00FF00H)) +
     BITS(0FF000000H));
END FastBlend;

у BBCB/CP2:
Код:
00000001H:   55    PUSH   EBP
00000002H:   8B EC    MOV   EBP, ESP
00000004H:   57    PUSH   EDI
00000005H:   56    PUSH   ESI
00000006H:   31 C0    XOR   EAX, EAX
00000008H:   50    PUSH   EAX
00000009H:   50    PUSH   EAX
0000000AH:   50    PUSH   EAX
0000000BH:   50    PUSH   EAX
0000000CH:   8B 45 10    MOV   EAX, [EBP+16]
0000000FH:   25 FF 00 00 00    AND   EAX, 255
00000014H:   40    INC   EAX
00000015H:   89 45 10    MOV   [EBP+16], EAX
00000018H:   8B 45 08    MOV   EAX, [EBP+8]
0000001BH:   25 FF 00 FF 00    AND   EAX, 16711935
00000020H:   89 45 F4    MOV   [EBP-12], EAX
00000023H:   8B 45 08    MOV   EAX, [EBP+8]
00000026H:   25 00 FF 00 00    AND   EAX, 65280
0000002BH:   89 45 EC    MOV   [EBP-20], EAX
0000002EH:   8B 45 0C    MOV   EAX, [EBP+12]
00000031H:   25 FF 00 FF 00    AND   EAX, 16711935
00000036H:   2B 45 F4    SUB   EAX, [EBP-12]
00000039H:   0F AF 45 10    IMUL   EAX, [EBP+16]
0000003DH:   C1 E8 08    SHR   EAX, 8
00000040H:   03 45 F4    ADD   EAX, [EBP-12]
00000043H:   89 45 F0    MOV   [EBP-16], EAX
00000046H:   8B 45 0C    MOV   EAX, [EBP+12]
00000049H:   25 00 FF 00 00    AND   EAX, 65280
0000004EH:   2B 45 EC    SUB   EAX, [EBP-20]
00000051H:   0F AF 45 10    IMUL   EAX, [EBP+16]
00000055H:   C1 E8 08    SHR   EAX, 8
00000058H:   03 45 EC    ADD   EAX, [EBP-20]
0000005BH:   89 45 E8    MOV   [EBP-24], EAX
0000005EH:   8B 45 F0    MOV   EAX, [EBP-16]
00000061H:   25 FF 00 FF 00    AND   EAX, 16711935
00000066H:   8B 55 E8    MOV   EDX, [EBP-24]
00000069H:   81 E2 00 FF 00 FF    AND   EDX, FF00FF00H
0000006FH:   0B C2    OR   EAX, EDX
00000071H:   0D 00 00 00 FF    OR   EAX, FF000000H
00000076H:   8D 65 F8    LEA   ESP, [EBP-8]
00000079H:   5E    POP   ESI
0000007AH:   5F    POP   EDI
0000007BH:   5D    POP   EBP
0000007CH:   C2 0C 00   RET   12

у O/Ur:
Код:
  0xb72633b7                                   [prologue]
  0xb72633b7  55                               push ebp
  0xb72633b8  8b ec                            mov ebp,esp
  0xb72633ba                                   [frag entry]
  0xb72633ba                                   [zero stack]
  0xb72633ba  6a 00                            push 0
  0xb72633bc  6a 00                            push 0
  0xb72633be  89 4d fc                         mov [ebp-4],ecx  <= spill parami1
  0xb72633c1  8b f2                            mov esi,edx
  0xb72633c3  8b fb                            mov edi,ebx
  0xb72633c5  8b 5d fc                         mov ebx,[ebp-4]  <= restore parami1
  0xb72633c8  81 e7 ff 00 00 00                and edi,255
  0xb72633ce  8d 7f 01                         lea edi,[edi+1]
  0xb72633d1  8b c3                            mov eax,ebx
  0xb72633d3  25 ff 00 ff 00                   and eax,16711935
  0xb72633d8  81 e3 00 ff 00 00                and ebx,65280
  0xb72633de  8b ce                            mov ecx,esi
  0xb72633e0  81 e1 ff 00 ff 00                and ecx,16711935
  0xb72633e6  2b c8                            sub ecx,eax
  0xb72633e8  0f af cf                         imul ecx,edi
  0xb72633eb  c1 e9 08                         shr ecx,8
  0xb72633ee  8d 04 08                         lea eax,[eax+ecx*1]
  0xb72633f1  81 e6 00 ff 00 00                and esi,65280
  0xb72633f7  2b f3                            sub esi,ebx
  0xb72633f9  0f af f7                         imul esi,edi
  0xb72633fc  c1 ee 08                         shr esi,8
  0xb72633ff  8d 1c 33                         lea ebx,[ebx+esi*1]
  0xb7263402  25 ff 00 ff 00                   and eax,16711935
  0xb7263407  81 e3 00 ff 00 ff                and ebx,-16711936
  0xb726340d  0b c3                            or eax,ebx
  0xb726340f  0d 00 00 00 ff                   or eax,-16777216
  0xb7263414  8b e5                            mov esp,ebp
  0xb7263416  5d                               pop ebp
  0xb7263417  c3                               ret

Nanojit всё-таки спильнул один аргумент, чтобы потом его сразу достать. ну, никто не идеален, чо. поскольку Нано не в курсе разницы между спилами и локалами — ему тоже пришлось стек почистить нулями. на самом деле это можно починить: сейчас Нано трекает просто обращение к стеку, любое. а надо трекать использование `LIR_allocp` — и если не было, то чистить стек не обязательно.

p.s.: сделал. теперь там добрые хиппи:
Код:
  0xb728d3f0                                   [prologue]
  0xb728d3f0  55                               push ebp
  0xb728d3f1  8b ec                            mov ebp,esp
  0xb728d3f3                                   [frag entry]
  0xb728d3f3                                   [skipped stack zeroing (no locals)]
  0xb728d3f3  83 ec 08                         sub esp,8
  0xb728d3f6  89 4d fc                         mov [ebp-4],ecx  <= spill parami1

аж восемь там для красивого выравнивания. не особо нужно — но и не мешает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Воскресенье, 29 Сентябрь, 2024 10:08 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1448
шында полезная. поймал два бага. в остальном бесполезная, конечно.

быстроделаю быстроуродливый-хоть-какой-то-гуй, и потом демка. остальное по старой доброй традиции гейдева поправлю в патче первого дня (то есть, никогда).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Воскресенье, 29 Сентябрь, 2024 14:49 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1448
уф. почти сделал могозиний, в котором можно покупать рыбов^w пистолетов. я ленивый и мне так удобней, поэтому пистолетов покупать мышой. а больше мышой нигде ничего нельзя, гыг.


Вложения:
Комментарий к файлу: могазиний!
2024_09_29_14_45_16.png
2024_09_29_14_45_16.png [ 14.98 КБ | Просмотров: 851 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Понедельник, 30 Сентябрь, 2024 07:57 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1448
и покупать можно, и навигировать клавиатурой. правда, код такой… такой… короче, официально объявляю мой римэйк Threat примером кода, за который надо убивать. но у меня есть супержелезный отмаз: я кодирую в стиле оригинала! римейк — так римэйк!

кстати, вспомнил. в оригинале фпс-то 30, а не 20. казалось бы… но разница огромная. вернул 30 — мне так жопу надирают, что мама дорогая!

но код мой действительно дрянь неимоверная. в лучших традициях гейдева: «дедлайн позавчера в прошлом году, быстро пилим хоть что-то, что запускается.» магазин про клавиатуру не знал в принципе, всё прибито к мышелогике. координаты выбраного товара используются в момент рисования (потому что оружий в игре больше, чем можно купить, и при рисовании ненужные пропускаются), возвращая projectileId (который мунлайтит и как weaponId). а потом мне очень захотелось — и обработка клавиатуры добавлена офигенно корявым хаком поверх. заместо чтобы написать нормально. потому что весь код магазина вообще родился из тестовой процедуры «а нарисуем-ка список товаров; это, конечно, использоваться не будет, перепишу». ага. переписал.

единственное относительно приличное во всей игре — это кейбинды через мету:
playsimBindings.Set(Keysymdef.XK_KP_Left, New("CmdDown_Left", "CmdUp_Left"));
playsimBindings.Set(Keysymdef.XK_F1, New("Cmd_TogglePause", NIL));
и так далее.

надо бы, кстати, в мете кэшировать скомпиленый код для вызова процедур без аргументов и результата. не то чтобы это было каким-то узким местом, просто оно напрашивается. остальной кэшировать более-менее бесполезно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Вторник, 01 Октябрь, 2024 16:16 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1448
запилил кэширование сгенерённого кода для вызова команд через мету. то бишь, процедур без аргументов и результата. естественно, в итоге повторные вызовы стали примерно в шесьдесят раз быстрее (~11200 раз в миллисекунду). этот кэш я никогда не чищу — в предположении, что команд не так много, нет смысла.

идея в том, что все игровые бинды (и консольные команды) — как раз такие. если надо аргументы — звать в команде специальный консольный API. ну, как в оригинальном Обероне. а все остальные вызовы — это всякого рода извращения типа гуёв, где 170-180 вызовов в миллисекунду вполне достаточно.

можно, конечно, чуть-чуть поменять код и кэшировать всё — но пока не вижу смысла.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Вторник, 01 Октябрь, 2024 19:09 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1448
нет, так жить нельзя. полностью выкинул старый код магазина, написал вместо этого нормальные менюшки. самые простые, но менюшки, с объектами-пунктами. потому что попытался в старой каше кое-что поменять, и всё развалилось. ;-)

алсо, теперь у нас есть текст брифинга! полупрозрачность окон всё ещё палитровая — вся игра внутри рендерится в 256 цветов, и конвертируется в 24 только при заливании готового экрана в OpenGL-текстуру.


Вложения:
Комментарий к файлу: брифинг!
2024_10_01_16_33_02_960x800.png
2024_10_01_16_33_02_960x800.png [ 13.72 КБ | Просмотров: 794 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Среда, 02 Октябрь, 2024 14:48 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1448
не прошло и года как я, наконец, сделал рабочую внутриигровую консоль! ;-)


Вложения:
2024_10_02_14_45_11_960x800.png
2024_10_02_14_45_11_960x800.png [ 47.78 КБ | Просмотров: 749 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Пятница, 04 Октябрь, 2024 05:24 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1448
the time has come! defend your home asteroid from drunken monsters invasion!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Пятница, 04 Октябрь, 2024 09:35 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1448
по ходу сразу патч нулевого дня, лол. я настоящий геймдевелопер!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Суббота, 05 Октябрь, 2024 14:11 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1448
портировал HostLzff3 из LC. Oberon/Ur быстрее почти в два раза: 26 секунд на 15 мегов в LC, 13.5 секунд в O/Ur. это с проверками диапазонов массивов. если в O/Ur проверки вырубить — выигрываем около 200 миллисекунд. что говорит нам: вырубать проверки в O/Ur смысла никакого нет: они примерно в районе zero cost.

upd: ой. перепутал файлы. про быстрее в два раза отменяется: быстрее, но очень незначительно. а я уж было обрадовался…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Воскресенье, 06 Октябрь, 2024 15:00 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1448
у меня там много всяких апдейтов и фиксов как к игре, так и к компилятору. но спамить каждый пост архивом — как-то не самая блестящая идея, мне кажется. а с котокоробки вы качать не можете. сайта нет, репы нет. как нам поступить? хочется, так сказать, наилучший сервис дорогим игрокам обеспечить, свежайшие фиксы, новые удобные фичи. не, на другой файлохостинг уже мне заливать неудобно.

Борис, как бы нам это того, этого? может, создать новую тему специально для O/Ur+Threat, и вы мне дадите возможность бессрочно первый пост редактировать? я тогда просто буду заменять там аттач, и все дела.

p.s.: хранить все аттачи «ради истории» смысла нет: во-первых, у меня история есть, когда-нибудь я всё опубликую (есть некоторые причины, по которым пока не могу). во-вторых… я потом придумаю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Воскресенье, 06 Октябрь, 2024 18:39 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4707
Откуда: Россия, Орёл
arisu писал(а):
Борис, как бы нам это того, этого? может, создать новую тему специально для O/Ur+Threat, и вы мне дадите возможность бессрочно первый пост редактировать? я тогда просто буду заменять там аттач, и все дела.

Это так не работает, к сожалению. Права доступа и запрет редактирования -- разные настройки. Могу старые вложения прибить, если не нужны, например.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Понедельник, 07 Октябрь, 2024 00:07 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1448
тогда все в мусор, пожалуйста. я скоро залью очередной апдейт.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Вторник, 08 Октябрь, 2024 00:24 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1448
уф. два дня искал великолепнейший бажище, который проявлялся ровно в одном конкретном месте, ровно с одним конкретным сочетанием оптимизаций. пока у меня все вызовы были cdecl — он не имел шанса проявиться; а сейчас компилятор втихушку апгрейдит до thiscall/fastcall, если может — и…

бедный Nanojit не в курсе, что бывают ситуации, когда зануление стековых слотов критично. я-то в начало код зануления вставил, но… но нано понадобился слот для спилла регистра ДО того, как он выделил слоты под локалы. причём одноразовый. нано и взял первый. а потом этот же первый использовал под локал. а мой обероновский код-то ожидает, что на входе все локалы занулены — это в спеках Oberon/Ur явно указано. поэтому я не парюсь с `flag := FALSE;` в начале. а флаг-то уже не девочка. ой. причём происходит это далеко не всегда — не повезло (или наоборот, очень повезло) вот именно конкретной процедуре.

на самом деле это немножко неэффективный кодоген со стороны нано: там ему слот не нужен, у него там свободный регистр есть. но в связи с дизайном нано не в курсе, что так можно (на самом деле всё сложнее), и делает спилл — только для того, чтобы сразу из него значение в другой регистр забрать. прямо в прологе, до того, как у меня есть шанс ему сказать что-то не трогать.

в общем, пришлось сделать вместо освобождения слотов, где локалы жили — расстановку там могилок. нано культурный, он могилки не раскапывает. хак, конечно — ну да и ладно.


компилятор без попыток оптимизаций, если что, работал совершенно правильно. потому что оптимизации — зло! но добро. построение таблички прозрачностей (которое делается при загрузке каждой картинки) без оптимизаций подтормаживает так, что на глаз видно. чуть-чуть совсем, но подтормаживает. а с опимизацией — нет.

алсо, сильно подозреваю, что приобрёл бесполезную ачивку номер очередной: «скорее всего единственный в мире эксперт по Nanojit».


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Четверг, 10 Октябрь, 2024 02:54 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1448
выколупал из игры и музоний вдобавок. как полагается — честно, чтобы играть в воображаемый адлиб оригинальные файлы, а не дампом OPL из досбокса.

под это дело портанул NukedOPL. порт получился хороший: генерирует тишину, но очень усердно. ненавижу сишный код портировать.

ну, тишина тишиной (найду когда-нибудь, где оно косячит), а оно таки там уже пытается всё считать, так что можно прикинуть разницу в скорости между O/Ur и gcc -O2. O/Ur получается примерно в два раза тормознее. тут бы инлайнер помог, я подозреваю. алсо, во многих местах Nanojit умудряется сделать вполне неплохой код, храня кучу всего в регистрах и в память не скидывая. на самом деле я мог бы gcc догнать, но оно того не стоит: меня вполне устраивает код, который всего в полтора-два раза медленней, чем оптимизированый gcc. особенно с учётом практически молниеносной скорости компиляции.

p.s.: а вообще, выиграл, например, около секунды из двенадцати просто изменив прямой тупорылый сишный код на чуть более идеоматический, который O/Ur чуть лучше обрабатывает. конечно, gcc это (переписывание кода) делает автоматически — ну и ладно. я тоже считерил: компилятор для `ODD(n DIV power-of-two)` гереритует один `and`, пропуская сдвиг. мелочь, а приятно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Oberon/Ur
СообщениеДобавлено: Четверг, 10 Октябрь, 2024 05:00 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1448
ну вот я же говорил: идиотская сишечка. забыл одно разыменование, лол, и миксил адреса вместо содержимого.

музоний заиграл, однако выхлоп почему-то не bit exact. расходится медленно, начиная с разницы в единичку, до конца мелодии набегает в некоторых местах около пяти тыщ. в принципе, на мелодию это не влияет, так что если не найду, где скосячил — то и ладно.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 242 ]  На страницу Пред.  1 ... 9, 10, 11, 12, 13  След.

Часовой пояс: UTC + 3 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB