some assembler tweaks, and a fix for indirect literal load relocation
parent
6f0e1c6bb9
commit
df230e7cd9
|
|
@ -1,5 +1,6 @@
|
|||
+ 0.80:
|
||||
|
||||
- make-image leaks memory if there is an error while parsing files
|
||||
- runtime primitives like fopen: check for null input
|
||||
- make = for sequences more efficient
|
||||
- zero-height gadgets mess up hit testing
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
IN: compiler-backend
|
||||
USING: alien assembler compiler compiler-backend kernel
|
||||
sequences ;
|
||||
USING: alien arrays assembler compiler compiler-backend kernel
|
||||
math sequences ;
|
||||
|
||||
! AMD64 register assignments
|
||||
! RAX RCX RDX RSI RDI R8 R9 R10 R11 vregs
|
||||
|
|
@ -48,3 +48,8 @@ M: float-regs fastcall-regs drop 0 ;
|
|||
: compile-prologue RSP 8 SUB ; inline
|
||||
|
||||
: compile-epilogue RSP 8 ADD ; inline
|
||||
|
||||
: load-indirect ( dest literal -- )
|
||||
#! We use RIP-relative addressing. The '3' is a hardcoded
|
||||
#! instruction length.
|
||||
add-literal from 3 - 1array MOV ; inline
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
IN: compiler-backend
|
||||
USING: alien assembler compiler compiler-backend kernel
|
||||
USING: alien arrays assembler compiler compiler-backend kernel
|
||||
sequences ;
|
||||
|
||||
! x86 register assignments
|
||||
|
|
@ -45,3 +45,6 @@ M: float-regs fastcall-regs drop 0 ;
|
|||
: compile-prologue ; inline
|
||||
|
||||
: compile-epilogue ; inline
|
||||
|
||||
: load-indirect ( dest literal -- )
|
||||
add-literal 1array MOV rel-absolute-cell rel-address ; inline
|
||||
|
|
|
|||
|
|
@ -6,6 +6,10 @@ lists math namespaces parser sequences words ;
|
|||
|
||||
! A postfix assembler for x86 and AMD64.
|
||||
|
||||
! In 32-bit mode, { 1234 } is absolute indirect addressing.
|
||||
! In 64-bit mode, { 1234 } is RIP-relative.
|
||||
! Beware!
|
||||
|
||||
: byte? -128 127 between? ;
|
||||
|
||||
GENERIC: modifier ( op -- mod )
|
||||
|
|
@ -76,7 +80,7 @@ PREDICATE: array displaced
|
|||
M: displaced modifier second byte? BIN: 01 BIN: 10 ? ;
|
||||
M: displaced register first register ;
|
||||
M: displaced displacement
|
||||
second dup byte? [ assemble-1 ] [ assemble-cell ] if ;
|
||||
second dup byte? [ assemble-1 ] [ assemble-4 ] if ;
|
||||
M: displaced canonicalize
|
||||
dup first EBP = not over second 0 = and
|
||||
[ first 1array ] when ;
|
||||
|
|
@ -92,7 +96,7 @@ M: disp-only register
|
|||
#! x86 encodes displacement-only as { EBP }.
|
||||
drop BIN: 101 ;
|
||||
M: disp-only displacement
|
||||
first assemble-cell ;
|
||||
first assemble-4 ;
|
||||
|
||||
( Utilities )
|
||||
UNION: operand register indirect displaced disp-only ;
|
||||
|
|
|
|||
Loading…
Reference in New Issue