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.

      Float fixes needed for not crashing in MAKE-HASH-TABLE / REHASH /
       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
       fix comparison vop translations / policy
       cargo-cult handling of vops that overwrite one source
      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
       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)
      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
       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)