Use CALL/RET for pushing and returning to continuations on amd64.
authorTaylor R Campbell <campbell@mumble.net>
Sat, 29 Dec 2018 01:11:00 +0000 (01:11 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Tue, 13 Aug 2019 14:37:02 +0000 (14:37 +0000)
commit17e0374d393ce446fd1ec5aac38da1ff31d2ac7e
tree82500be34ea37077498a80dbefba5b25e20012bc
parent876b77d1f9c4e71256cf9dba8f2b70423a2052c5
Use CALL/RET for pushing and returning to continuations on amd64.

Calls now look like:

  ;; (assign (register #x123) (cons-pointer tag (entry:continuation cont)))
  (CALL (@PCR pushed))
  (JMP (@PCR cont))
pushed:
  (OR Q (@R ,rsp) (&U ,tag))
  ...
  (JMP (@PCR uuo-link))

Returns now look like:

  ;; (pop-return)
  (AND Q (@R ,rsp) (R ,regnum:datum-mask))
  (RET)

These should happen in pairs, so that we can take advantage of the
CPU's return address branch target prediction stack rather than
abusing the indirect jump branch target predictor.

WARNING: This changes the amd64 compiled code interface, so new
compiled code requires a new microcode.  (A new microcode might be
able to handle existing compiled code just fine.)
src/compiler/machines/x86-64/rules1.scm
src/compiler/machines/x86-64/rules3.scm
src/microcode/cmpintmd/x86-64.c
src/microcode/cmpintmd/x86-64.h