...
>Even my dumb compiler (TOS cached) already translates this to:
...
>0000000000406242 <mf_DAYSslashMONTH>:
> 406242: 4c 89 e0 mov %r12,%rax
> 406245: 41 bc b3 fb ee 00 mov $0xeefbb3,%r12d
> 40624b: 48 8d 44 00 fe lea -0x2(%rax,%rax,1),%rax
> 406250: 49 89 c4 mov %rax,%r12
> 406253: 41 bc b3 fb ee 00 mov $0xeefbb3,%r12d
> 406259: c4 42 fb f7 e4 shrx %rax,%r12,%r12
> 40625e: 4d 89 27 mov %r12,(%r15)
> 406261: 41 bc 03 00 00 00 mov $0x3,%r12d
> 406267: 49 8b 07 mov (%r15),%rax
> 40626a: 83 e0 03 and $0x3,%eax
> 40626d: 49 89 07 mov %rax,(%r15)
> 406270: 41 bc 1c 00 00 00 mov $0x1c,%r12d
> 406276: 49 89 c4 mov %rax,%r12
> 406279: 49 83 cc 1c or $0x1c,%r12
> 40627d: c3 retq
Yes, this is a case (straight-line code) where existing Forth systems
do well. Let's see:
gforth-fast (development):
$7FA5FDC99158 lit 1->2
$7FA5FDC99160 #15662003
7FA5FD93F812: mov r15,$08[rbx]
$7FA5FDC99168 swap 2->1
7FA5FD93F816: mov $00[r13],r15
7FA5FD93F81A: sub r13,$08
$7FA5FDC99170 1- 1->1
7FA5FD93F81E: sub r8,$01
$7FA5FDC99178 2* 1->1
7FA5FD93F822: add r8,r8
$7FA5FDC99180 rshift 1->1
7FA5FD93F825: mov rax,$08[r13]
7FA5FD93F829: mov ecx,r8d
7FA5FD93F82C: add r13,$08
7FA5FD93F830: shr rax,CL
7FA5FD93F833: mov r8,rax
$7FA5FDC99188 lit and 1->1
$7FA5FDC99190 #3
$7FA5FDC99198 and
7FA5FD93F836: add rbx,$48
7FA5FD93F83A: and r8,-$10[rbx]
$7FA5FDC991A0 lit 1->2
$7FA5FDC991A8 #28
7FA5FD93F83E: mov r15,$08[rbx]
$7FA5FDC991B0 or 2->1
7FA5FD93F842: or r8,r15
$7FA5FDC991B8 ;s 1->1
7FA5FD93F845: mov rbx,[r14]
7FA5FD93F848: add r14,$08
7FA5FD93F84C: mov rax,[rbx]
7FA5FD93F84F: jmp eax
iforth lxf SwiftForth x64 vfx64
pop rbx dec ebx -8 [RBP] RBP LEA DEC RBX
lea rbx, [rbx -1 +] shl ebx, 1h EEFBB3 # 0 [RBP] MOV SHL RBX, #1
lea rbx, [rbx*2 0 +] mov eax, #EEFBB3h RBX DEC MOV RCX, RBX
mov rcx, rbx mov ecx, ebx RBX SHL MOV EBX, #00EEFBB3
mov rbx, $00EEFBB3 d# shr eax, cl RBX RCX MOV SHR RBX, CL
shr rbx, cl and eax, #3h 0 [RBP] RBX MOV AND RBX, #03
and rbx, 3 b# or eax, #1Ch 8 [RBP] RBP LEA OR RBX, #1C
or rbx, #28 b# mov ebx, eax RBX CL SHR RET/NEXT
push rbx ret near 3 # RBX AND
; 1C # RBX OR
RET
- anton
--
M. Anton Ertl
http://www.complang.tuwien.ac.at/anton/home.html
comp.lang.forth FAQs:
http://www.complang.tuwien.ac.at/forth/faq/toc.html
New standard:
https://forth-standard.org/
EuroForth 2023:
https://euro.theforth.net/2023