From 69a0ad5e4280a890e2279c6efe0119126e9ab1c2 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 23 Oct 2008 05:49:32 -0500 Subject: [PATCH] Ricing locals --- basis/cpu/x86/bootstrap.factor | 20 ++++++++++++++++++-- basis/locals/backend/backend.factor | 10 ++-------- core/bootstrap/primitives.factor | 3 +++ 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/basis/cpu/x86/bootstrap.factor b/basis/cpu/x86/bootstrap.factor index 95e0072dc4..7fc32da9a4 100644 --- a/basis/cpu/x86/bootstrap.factor +++ b/basis/cpu/x86/bootstrap.factor @@ -2,8 +2,8 @@ ! See http://factorcode.org/license.txt for BSD license. USING: bootstrap.image.private kernel kernel.private namespaces system cpu.x86.assembler layouts compiler.units math -math.private compiler.constants vocabs -slots.private words words.private ; +math.private compiler.constants vocabs slots.private words +words.private locals.backend ; IN: bootstrap.x86 big-endian off @@ -302,4 +302,20 @@ big-endian off ds-reg [] arg0 MOV ! save ] f f f \ fixnum-bitnot define-sub-primitive +[ + arg0 ds-reg [] MOV ! load local number + fixnum>slot@ ! turn local number into offset + arg1 bootstrap-cell MOV ! load base + arg1 arg0 SUB ! turn it into a stack offset + arg0 rs-reg arg1 [+] MOV ! load local value + ds-reg [] arg0 MOV ! push to stack +] f f f \ get-local define-sub-primitive + +[ + arg0 ds-reg [] MOV ! load local count + ds-reg bootstrap-cell SUB ! adjust stack pointer + fixnum>slot@ ! turn local number into offset + rs-reg arg0 SUB ! decrement retain stack pointer +] f f f \ drop-locals define-sub-primitive + [ "bootstrap.x86" forget-vocab ] with-compilation-unit diff --git a/basis/locals/backend/backend.factor b/basis/locals/backend/backend.factor index 27772d19d0..0d9ee6a64e 100644 --- a/basis/locals/backend/backend.factor +++ b/basis/locals/backend/backend.factor @@ -1,17 +1,11 @@ ! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: math kernel slots.private sequences effects words ; +USING: math.private kernel slots.private sequences effects words ; IN: locals.backend : load-locals ( n -- ) - dup zero? [ drop ] [ swap >r 1- load-locals ] if ; - -: get-local ( n -- value ) - dup zero? [ drop dup ] [ r> swap 1- get-local swap >r ] if ; + dup 0 eq? [ drop ] [ swap >r 1 fixnum-fast load-locals ] if ; : local-value 2 slot ; inline : set-local-value 2 set-slot ; inline - -: drop-locals ( n -- ) - dup zero? [ drop ] [ r> drop 1- drop-locals ] if ; diff --git a/core/bootstrap/primitives.factor b/core/bootstrap/primitives.factor index 62d4ec9273..f55942603d 100644 --- a/core/bootstrap/primitives.factor +++ b/core/bootstrap/primitives.factor @@ -80,6 +80,7 @@ bootstrapping? on "io.files" "io.files.private" "io.streams.c" + "locals.backend" "kernel" "kernel.private" "math" @@ -370,6 +371,8 @@ tuple { "eq?" "kernel" } { "tag" "kernel.private" } { "slot" "slots.private" } + { "get-local" "locals.backend" } + { "drop-locals" "locals.backend" } } [ make-sub-primitive ] assoc-each ! Primitive words