MSRevive / MasterSwordRebirth

Continuation of Master Sword Classic/Continued.
https://msrebirth.net/
Other
9 stars 6 forks source link

Replace CStat::Value calculation with non-conditional math #146

Closed Xaymar closed 1 year ago

Xaymar commented 1 year ago

This generates smaller and faster code, even after optimizations were run on the code.

gcc-12 -O3 old.c ``` mov edx, DWORD PTR [rbp-16] mov eax, edx sal eax, 2 add eax, edx add eax, eax mov edi, DWORD PTR [rbp-20] cdq idiv edi mov ecx, eax movsx rax, ecx imul rax, rax, 1717986919 shr rax, 32 mov edx, eax sar edx, 2 mov eax, ecx sar eax, 31 sub edx, eax mov eax, edx sal eax, 2 add eax, edx add eax, eax sub ecx, eax mov edx, ecx cmp edx, 4 setg al movzx eax, al mov DWORD PTR [rbp-8], eax mov eax, DWORD PTR [rbp-16] mov esi, DWORD PTR [rbp-20] cdq idiv esi mov edx, eax mov eax, DWORD PTR [rbp-8] add eax, edx mov DWORD PTR [rbp-12], eax ```
gcc-12 -O3 new.c ``` mov eax, DWORD PTR [rbp-20] mov edx, eax shr edx, 31 add eax, edx sar eax mov edx, eax mov eax, DWORD PTR [rbp-16] add eax, edx mov esi, DWORD PTR [rbp-20] cdq idiv esi mov DWORD PTR [rbp-4], eax ```
clang-15 -O3 old.c ``` mov eax, dword ptr [rbp - 20] imul eax, eax, 10 mov ecx, dword ptr [rbp - 24] cdq idiv ecx mov ecx, 10 cdq idiv ecx xor eax, eax mov ecx, 1 cmp edx, 5 cmovge eax, ecx mov dword ptr [rbp - 32], eax mov eax, dword ptr [rbp - 20] mov ecx, dword ptr [rbp - 24] cdq idiv ecx add eax, dword ptr [rbp - 32] mov dword ptr [rbp - 36], eax ```
clang-15 -O3 new.c ``` mov eax, dword ptr [rbp - 20] mov dword ptr [rbp - 40], eax # 4-byte Spill mov eax, dword ptr [rbp - 24] mov ecx, 2 cdq idiv ecx mov ecx, eax mov eax, dword ptr [rbp - 40] # 4-byte Reload add eax, ecx mov ecx, dword ptr [rbp - 24] cdq idiv ecx mov dword ptr [rbp - 28], eax ```
msvc-19 /O3 old.c ``` imul eax, DWORD PTR _x$[ebp], 10 mov ecx, DWORD PTR _y$[ebp] cdq idiv ecx cdq mov ecx, 10 ; 0000000aH idiv ecx cmp edx, 5 jl SHORT $LN3@main mov DWORD PTR tv82[ebp], 1 jmp SHORT $LN4@main $LN3@main: mov DWORD PTR tv82[ebp], 0 $LN4@main: mov edx, DWORD PTR tv82[ebp] mov DWORD PTR _rn$2[ebp], edx mov ecx, DWORD PTR _y$[ebp] mov eax, DWORD PTR _x$[ebp] cdq idiv ecx add eax, DWORD PTR _rn$2[ebp] mov DWORD PTR _r$1[ebp], eax ```
msvc-19 /O3 new.c ``` mov eax, DWORD PTR _y$[ebp] cdq sub eax, edx sar eax, 1 mov ecx, DWORD PTR _x$[ebp] add ecx, eax mov esi, DWORD PTR _y$[ebp] mov eax, ecx cdq idiv esi mov DWORD PTR _r$3[ebp], eax ```