From 528e9f61f3a36eaaa41a05d35776caa9e551ad81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Lindqvist?= Date: Mon, 18 May 2015 15:58:07 +0200 Subject: [PATCH] bootstrap.x86: new words jit-call-Xarg for calling vm functions with arguments, simplifies some assembly code --- basis/bootstrap/assembler/x86.32.factor | 47 +++++++++++++------------ basis/bootstrap/assembler/x86.64.factor | 32 +++++++++-------- 2 files changed, 41 insertions(+), 38 deletions(-) diff --git a/basis/bootstrap/assembler/x86.32.factor b/basis/bootstrap/assembler/x86.32.factor index b601c86e14..e1ddc11dcd 100644 --- a/basis/bootstrap/assembler/x86.32.factor +++ b/basis/bootstrap/assembler/x86.32.factor @@ -37,6 +37,21 @@ IN: bootstrap.x86 : jit-call ( name -- ) 0 CALL f rc-relative rel-dlsym ; +:: jit-call-1arg ( arg1s name -- ) + ESP [] arg1s MOV + name jit-call ; + +:: jit-call-2arg ( arg1s arg2s name -- ) + ESP [] arg1s MOV + ESP 4 [+] arg2s MOV + name jit-call ; + +:: jit-call-3arg ( arg1s arg2s arg3s name -- ) + ESP [] arg1s MOV + ESP 4 [+] arg2s MOV + ESP 8 [+] arg3s MOV + name jit-call ; + [ pic-tail-reg 0 MOV 0 rc-absolute-cell rel-here 0 JMP f rc-relative rel-word-pic-tail @@ -79,16 +94,13 @@ IN: bootstrap.x86 [ jit-load-vm - ESP [] vm-reg MOV EAX EBP 8 [+] MOV - ESP 4 [+] EAX MOV - "begin_callback" jit-call + vm-reg EAX "begin_callback" jit-call-2arg jit-call-quot jit-load-vm - ESP [] vm-reg MOV - "end_callback" jit-call + vm-reg "end_callback" jit-call-1arg ] \ c-to-factor define-sub-primitive : signal-handler-save-regs ( -- regs ) @@ -169,12 +181,8 @@ IN: bootstrap.x86 jit-load-vm jit-save-context - ! Store arguments - ESP [] EAX MOV - ESP 4 [+] vm-reg MOV - - ! Call VM - "lazy_jit_compile" jit-call + ! Call VM, quotation reference is in EAX + EAX vm-reg "lazy_jit_compile" jit-call-2arg ] [ jit-call-quot ] [ jit-jump-quot ] @@ -245,11 +253,9 @@ IN: bootstrap.x86 [ JNO ] [ EBX tag-bits get SAR - ESP [] EBX MOV - ESP 4 [+] EBP MOV jit-load-vm - ESP 8 [+] vm-reg MOV - "overflow_fixnum_multiply" jit-call + + EBX EBP vm-reg "overflow_fixnum_multiply" jit-call-3arg ] jit-conditional ] \ fixnum* define-sub-primitive @@ -312,8 +318,7 @@ IN: bootstrap.x86 ! Create the new context in return-reg jit-load-vm jit-save-context - ESP [] vm-reg MOV - "new_context" jit-call + vm-reg "new_context" jit-call-1arg jit-save-quot-and-param @@ -339,9 +344,7 @@ IN: bootstrap.x86 : jit-delete-current-context ( -- ) jit-load-vm jit-load-context - ESP [] vm-reg MOV - ESP 4 [+] ctx-reg MOV - "delete_context" jit-call ; + vm-reg ctx-reg "delete_context" jit-call-2arg ; [ jit-delete-current-context @@ -351,9 +354,7 @@ IN: bootstrap.x86 : jit-start-context-and-delete ( -- ) jit-load-vm jit-load-context - ESP [] vm-reg MOV - ESP 4 [+] ctx-reg MOV - "reset_context" jit-call + vm-reg ctx-reg "reset_context" jit-call-2arg jit-save-quot-and-param ctx-reg jit-switch-context diff --git a/basis/bootstrap/assembler/x86.64.factor b/basis/bootstrap/assembler/x86.64.factor index be447ebd86..eeecdc4e30 100644 --- a/basis/bootstrap/assembler/x86.64.factor +++ b/basis/bootstrap/assembler/x86.64.factor @@ -1,10 +1,10 @@ ! Copyright (C) 2007, 2011 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: bootstrap.image.private kernel kernel.private namespaces -system layouts vocabs parser compiler.constants +USING: bootstrap.image.private kernel kernel.private layouts locals namespaces +vocabs parser compiler.constants compiler.codegen.relocation math math.private cpu.x86.assembler cpu.x86.assembler.operands sequences generic.single.private -threads.private locals ; +threads.private ; IN: bootstrap.x86 8 \ cell set @@ -33,6 +33,15 @@ IN: bootstrap.x86 RAX 0 MOV f rc-absolute-cell rel-dlsym RAX CALL ; +:: jit-call-1arg ( arg1s name -- ) + arg1 arg1s MOV + name jit-call ; + +:: jit-call-2arg ( arg1s arg2s name -- ) + arg1 arg1s MOV + arg2 arg2s MOV + name jit-call ; + [ pic-tail-reg 5 [RIP+] LEA 0 JMP f rc-relative rel-word-pic-tail @@ -74,15 +83,13 @@ IN: bootstrap.x86 [ arg2 arg1 MOV - arg1 vm-reg MOV - "begin_callback" jit-call + vm-reg "begin_callback" jit-call-1arg ! call the quotation arg1 return-reg MOV jit-call-quot - arg1 vm-reg MOV - "end_callback" jit-call + vm-reg "end_callback" jit-call-1arg ] \ c-to-factor define-sub-primitive : signal-handler-save-regs ( -- regs ) @@ -280,8 +287,7 @@ IN: bootstrap.x86 ! twice, first before calling new_context() which may GC, ! and again after popping the two parameters from the stack. jit-save-context - arg1 vm-reg MOV - "new_context" jit-call + vm-reg "new_context" jit-call-1arg jit-pop-quot-and-param jit-save-context @@ -293,9 +299,7 @@ IN: bootstrap.x86 : jit-delete-current-context ( -- ) jit-load-context - arg1 vm-reg MOV - arg2 ctx-reg MOV - "delete_context" jit-call ; + vm-reg ctx-reg "delete_context" jit-call-2arg ; [ jit-delete-current-context @@ -304,9 +308,7 @@ IN: bootstrap.x86 : jit-start-context-and-delete ( -- ) jit-load-context - arg1 vm-reg MOV - arg2 ctx-reg MOV - "reset_context" jit-call + vm-reg ctx-reg "reset_context" jit-call-2arg jit-pop-quot-and-param ctx-reg jit-switch-context