2006-01-24 19:56:08 -05:00
|
|
|
! Copyright (C) 2005, 2006 Slava Pestov.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2005-12-02 01:23:09 -05:00
|
|
|
IN: compiler-backend
|
2006-03-12 18:37:17 -05:00
|
|
|
USING: alien arrays assembler compiler compiler-frontend kernel
|
2006-01-25 01:18:12 -05:00
|
|
|
kernel-internals math namespaces sequences ;
|
2005-12-02 01:23:09 -05:00
|
|
|
|
|
|
|
! AMD64 register assignments
|
|
|
|
! RAX RCX RDX RSI RDI R8 R9 R10 R11 vregs
|
2006-02-23 20:29:53 -05:00
|
|
|
! R13 cards_offset
|
2005-12-04 02:30:19 -05:00
|
|
|
! R14 datastack
|
|
|
|
! R15 callstack
|
|
|
|
|
2005-12-02 01:23:09 -05:00
|
|
|
: fixnum-imm? ( -- ? )
|
|
|
|
#! Can fixnum operations take immediate operands?
|
2005-12-04 14:30:28 -05:00
|
|
|
f ; inline
|
2005-12-02 01:23:09 -05:00
|
|
|
|
2005-12-07 00:14:24 -05:00
|
|
|
: ds-reg R14 ; inline
|
|
|
|
: cs-reg R15 ; inline
|
|
|
|
: remainder-reg RDX ; inline
|
|
|
|
|
2005-12-04 22:06:12 -05:00
|
|
|
: vregs { RAX RCX RDX RSI RDI R8 R9 R10 R11 } ; inline
|
2005-12-02 01:23:09 -05:00
|
|
|
|
2006-01-24 20:20:20 -05:00
|
|
|
M: int-regs return-reg drop RAX ;
|
|
|
|
|
|
|
|
M: int-regs fastcall-regs drop { RDI RSI RDX RCX R8 R9 } ;
|
2005-12-10 01:02:13 -05:00
|
|
|
|
2005-12-10 01:27:41 -05:00
|
|
|
: compile-c-call ( symbol dll -- )
|
2006-01-29 22:51:26 -05:00
|
|
|
2dup dlsym R10 swap MOV
|
|
|
|
rel-absolute-cell rel-dlsym R10 CALL ;
|
2005-12-10 01:02:13 -05:00
|
|
|
|
2006-01-24 20:20:20 -05:00
|
|
|
: compile-c-call* ( symbol dll args -- )
|
|
|
|
T{ int-regs } fastcall-regs
|
|
|
|
swap [ MOV ] 2each compile-c-call ;
|
2005-12-10 01:02:13 -05:00
|
|
|
|
2006-01-24 20:20:20 -05:00
|
|
|
M: float-regs return-reg drop XMM0 ;
|
2005-12-24 16:08:15 -05:00
|
|
|
|
2006-01-24 20:20:20 -05:00
|
|
|
M: float-regs fastcall-regs
|
|
|
|
drop { XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7 } ;
|
2005-12-02 01:23:09 -05:00
|
|
|
|
2005-12-04 22:55:02 -05:00
|
|
|
: address-operand ( address -- operand )
|
|
|
|
#! On AMD64, we have to load 64-bit addresses into a
|
2005-12-07 03:37:05 -05:00
|
|
|
#! scratch register first. The usage of R11 here is a hack.
|
|
|
|
#! We cannot write '0 scratch' since scratch registers are
|
|
|
|
#! not permitted inside basic-block VOPs.
|
|
|
|
R11 [ swap MOV ] keep ; inline
|
2005-12-04 22:55:02 -05:00
|
|
|
|
|
|
|
: fixnum>slot@ drop ; inline
|
2005-12-07 03:37:05 -05:00
|
|
|
|
|
|
|
: prepare-division CQO ; inline
|
2005-12-20 03:22:01 -05:00
|
|
|
|
2005-12-23 01:41:33 -05:00
|
|
|
: load-indirect ( dest literal -- )
|
|
|
|
#! We use RIP-relative addressing. The '3' is a hardcoded
|
|
|
|
#! instruction length.
|
2006-02-23 20:29:53 -05:00
|
|
|
add-literal from 3 - [] MOV ; inline
|
2006-01-25 01:18:12 -05:00
|
|
|
|
|
|
|
: stack-increment \ stack-reserve get 16 align 8 + ;
|
|
|
|
|
|
|
|
: compile-epilogue ( -- )
|
|
|
|
RSP stack-increment ADD ; inline
|