I've been hacking at the half-finished AMD64 port of SBCL for the past week. There's been quite a lot of progress - originally it was crashing right at the start of cold-init when trying to make a hash table, now it's already crashing right at the end of cold-init while (uhh...) trying to make a hash-table. Getting from point A to point B has involved about 20 bugs, which were generally easy to fix after a few hours of staring at gdb and cross-compiler trace files.
The new hash-table bug might actually be fixed already, but I'll apparently finish writing this blog entry before the build finishes. A full rebuild with trace files and SB-SHOW takes a suprisingly long even on an Athlon 64 2800+... I don't understand how people managed to do SBCL / CMUCL ports with hardware that's orders of magnitude slower.
081514x86-64-again-branch1:
Float fixes needed for not crashing in MAKE-HASH-TABLE / REHASH /
%PUTHASH
rex-prefix byte must come after legacy prefix byte
(that's why they call it the prefix byte)
movq is #xf3 #0xf #x7e, not #xf3 #0xf #x73
make (add|sub|mul|div)(s|d) use (dst src) argument order
for the sake of consistency
use scalar (instead of packed) xmm ops in
%foo-float/signed
fix comparison vop translations / policy
cargo-cult handling of vops that overwrite one source
register
081514x86-64-again-branch2:
Hashing fixes to pass MAKE-HASH-TABLE / REMHASH / %PUTHASH
change all arrays of (u-b 32) to (u-b #sb!vm:n-word-bits)
in defstruct, hash-table and target-hash-table
change %SXHASH-SUBSTRING to do calculations with 64-bit
modular arithmetic instead of 32-bit The latter was
confusing something in the compiler, resulting in negative
hash values Real bug still exists somewhere Add some
macros to make %SXHASH-SUBSTRING less ugly, while we're at
it
081514x86-64-again-branch3:
Fix &rest arguments (n-word-bytes -> n-lowtag-bits)
Pad the short jumps in multiple-value receiving callers with
a nop, so that they're as long as the "mov %rbx,%rsp"
(This calling convention is sick)
Use #B8-#BF moves for 64-bit immediates instead of
SHL and OR (the immediate argument for OR is sign-extended)
081514x86-64-again-branch4:
Gets all the way to !PPRINT-COLD-INIT (assuming the complex number
tests in predlisp are commented out, leaving that for later)
Change more reader conditionals from x86 to (or x86 x86-64)
and from -alpha +alpha to conditionalization based on
SB!VM:N-WORD-BITS
VAR-ALLOC was shifting the length field of the header word
one bit too far to the left, causing memory corruption on
bignum operations
SIGNED-BYTE-32-P / CHECK-SIGNED-BYTE didn't work for negative
values (required that bits 32-64 were all 0, needs to
be all 0 or all 1)
Pass some c-call arguments in registers instead of the
stack (AMD64 ABI)