On Saturday, June 10, 2017 at 7:19:44 PM UTC-7, Julian Fondren wrote:
> But if your defense is, "this is 'generic', I know it's slower", you
> could at least stop pretending that people are insane or filled with
> evil for wanting code that's like 7x faster.
My array sort is getting attacked pretty hard! Why the array sort, rather than some other aspect of the novice-package? The array sort is very basic code, so it seems an unlikely target for attack.
I think the reason why it is targeted in particular is because EXCHANGE shows up the weakness of SwiftForth.
Here is the EXCHANGE code:
-----------------------------------------------------------------------
SwiftForth? [if] \ SwiftForth's optimization is so bad that no Forth version is any good
icode exchange ( adrX adrY size -- ) \ the size of the record must be a multiple of W
0 [ebp] edx mov w [ebp] ecx mov \ EDX<>ECX, with EBX being the size
begin non-zero? while
0 [ecx] eax mov
0 [edx] eax xor eax 0 [edx] xor 0 [edx] eax xor
eax 0 [ecx] mov
w # edx add w # ecx add
w # ebx sub repeat
w 2 * [ebp] ebx mov
w 3 * # ebp add ret end-code
[else]
macro: exchange ( adrX adrY size -- ) \ the size of the record must be a multiple of W
begin dup while \ -- adrX adrY remaining
-rot \ -- remaining adrX adrY
dup @ rover @ \ -- remaining adrX adrY Y X
rover ! rover ! \ -- remaining adrX adrY
w + swap w + rot w - \ -- adrY adrX remaining \ adrY and adrX change places
repeat
3drop ;
[then]
-----------------------------------------------------------------------
Is SwiftForth's optimization bad?
Well, here is EXCHANGE in VFX:
: test exchange ; ok
see test
TEST
( 004E0A20 85DB ) TEST EBX, EBX
( 004E0A22 0F8425000000 ) JZ/E 004E0A4D
( 004E0A28 8B5500 ) MOV EDX, [EBP]
( 004E0A2B 8B0A ) MOV ECX, 0 [EDX]
( 004E0A2D 8B4504 ) MOV EAX, [EBP+04]
( 004E0A30 8B00 ) MOV EAX, 0 [EAX]
( 004E0A32 8902 ) MOV 0 [EDX], EAX
( 004E0A34 8B4504 ) MOV EAX, [EBP+04]
( 004E0A37 8908 ) MOV 0 [EAX], ECX
( 004E0A39 83C204 ) ADD EDX, 04
( 004E0A3C 8B4D04 ) MOV ECX, [EBP+04]
( 004E0A3F 83C104 ) ADD ECX, 04
( 004E0A42 83C3FC ) ADD EBX, -04
( 004E0A45 894D00 ) MOV [EBP], ECX
( 004E0A48 895504 ) MOV [EBP+04], EDX
( 004E0A4B EBD3 ) JMP 004E0A20 TEST
( 004E0A4D 8B5D08 ) MOV EBX, [EBP+08]
( 004E0A50 8D6D0C ) LEA EBP, [EBP+0C]
( 004E0A53 C3 ) NEXT,
( 52 bytes, 19 instructions )
ok
Here is EXCHANGE in SwiftForth (name changed to FORTH-EXCHANGE to distinguish it from my ICODE version):
see forth-exchange
4908CF EBX EBX OR 09DB
4908D1 490944 JZ 0F846D000000
4908D7 EBX ECX MOV 8BCB
4908D9 4 [EBP] EAX MOV 8B4504
4908DC 0 [EBP] EBX MOV 8B5D00
4908DF EAX 0 [EBP] MOV 894500
4908E2 ECX 4 [EBP] MOV 894D04
4908E5 4 # EBP SUB 83ED04
4908E8 EBX 0 [EBP] MOV 895D00
4908EB 0 [EBX] EBX MOV 8B1B
4908ED 4 # EBP SUB 83ED04
4908F0 EBX 0 [EBP] MOV 895D00
4908F3 8 [EBP] EBX MOV 8B5D08
4908F6 0 [EBX] EBX MOV 8B1B
4908F8 4 # EBP SUB 83ED04
4908FB EBX 0 [EBP] MOV 895D00
4908FE 8 [EBP] EBX MOV 8B5D08
490901 0 [EBP] EAX MOV 8B4500
490904 EAX 0 [EBX] MOV 8903
490906 4 [EBP] EBX MOV 8B5D04
490909 8 # EBP ADD 83C508
49090C 4 # EBP SUB 83ED04
49090F EBX 0 [EBP] MOV 895D00
490912 8 [EBP] EBX MOV 8B5D08
490915 0 [EBP] EAX MOV 8B4500
490918 EAX 0 [EBX] MOV 8903
49091A 4 [EBP] EBX MOV 8B5D04
49091D 8 # EBP ADD 83C508
490920 4 # EBX ADD 83C304
490923 0 [EBP] EAX MOV 8B4500
490926 EBX 0 [EBP] MOV 895D00
490929 EAX EBX MOV 8BD8
49092B 4 # EBX ADD 83C304
49092E EBX ECX MOV 8BCB
490930 4 [EBP] EBX MOV 8B5D04
490933 0 [EBP] EAX MOV 8B4500
490936 EAX 4 [EBP] MOV 894504
490939 ECX 0 [EBP] MOV 894D00
49093C 4 # EBX SUB 83EB04
49093F 4908CF JMP E98BFFFFFF
490944 48369F ( 3drop ) JMP E9562DFFFF ok
SwiftForth optimization is pretty bad! This is why I have so much SwiftForth-specific assembly-language in the novice-package. This is my hand-written version:
see exchange
48689F 0 [EBP] EDX MOV 8B5500
4868A2 4 [EBP] ECX MOV 8B4D04
4868A5 EBX EBX OR 09DB
4868A7 4868BE JZ 7415
4868A9 0 [ECX] EAX MOV 8B01
4868AB 0 [EDX] EAX XOR 3302
4868AD EAX 0 [EDX] XOR 3102
4868AF 0 [EDX] EAX XOR 3302
4868B1 EAX 0 [ECX] MOV 8901
4868B3 4 # EDX ADD 83C204
4868B6 4 # ECX ADD 83C104
4868B9 4 # EBX SUB 83EB04
4868BC 4868A5 JMP EBE7
4868BE 8 [EBP] EBX MOV 8B5D08
4868C1 C # EBP ADD 83C50C
4868C4 RET C3 ok
EXCHANGE shines a spotlight on the poor code quality of SwiftForth. This is why Elizabeth Rather's sycophants say that I know my code is 7x slower than their code. They want to ban EXCHANGE so nobody sees what a bad job SwiftForth does of compiling it. They want me to stop writing Forth code --- it is Elizabeth Rather's way or the highway!