mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 11:50:28 +02:00
* libguile/vm-engine.c: Renumber opcodes, and take the opportunity to fold recent additions into more logical places. Be more precise when describing the encoding of operands, to shuffle local references only and not constants, immediates, or other such values. (SP_REF, SP_SET): New helpers. (BR_BINARY, BR_ARITHMETIC): Take full 24-bit operands. Our shuffle strategy is to emit push when needed to bring far locals near, then pop afterwards, shuffling away far destination values as needed; but that doesn't work for conditionals, unless we introduce a trampoline. Let's just do the simple thing for now. Native compilation will use condition codes. (push, pop, drop): Back from the dead! We'll only use these for temporary shuffling though, when an opcode can't address the full 24-bit range. (long-fmov): New instruction, like long-mov but relative to the frame pointer. (load-typed-array, make-array): Don't use a compressed encoding so that we can avoid the shuffling case. It would be a pain, given that they have so many operands already. * module/language/bytecode.scm (compute-instruction-arity): Update for new instrution word encodings. * module/system/vm/assembler.scm: Update to expose some opcodes directly, without the need for shuffling wrappers. Adapt to instruction word encodings change. * module/system/vm/disassembler.scm (disassembler): Adapt to instruction coding change.
104 lines
3 KiB
Scheme
104 lines
3 KiB
Scheme
;;; Bytecode
|
|
|
|
;; Copyright (C) 2013 Free Software Foundation, Inc.
|
|
|
|
;;;; This library is free software; you can redistribute it and/or
|
|
;;;; modify it under the terms of the GNU Lesser General Public
|
|
;;;; License as published by the Free Software Foundation; either
|
|
;;;; version 3 of the License, or (at your option) any later version.
|
|
;;;;
|
|
;;;; This library is distributed in the hope that it will be useful,
|
|
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
;;;; Lesser General Public License for more details.
|
|
;;;;
|
|
;;;; You should have received a copy of the GNU Lesser General Public
|
|
;;;; License along with this library; if not, write to the Free Software
|
|
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
;;; Code:
|
|
|
|
(define-module (language bytecode)
|
|
#:use-module (ice-9 match)
|
|
#:use-module ((srfi srfi-1) #:select (fold))
|
|
#:export (instruction-list
|
|
instruction-arity
|
|
builtin-name->index
|
|
builtin-index->name))
|
|
|
|
(load-extension (string-append "libguile-" (effective-version))
|
|
"scm_init_instructions")
|
|
(load-extension (string-append "libguile-" (effective-version))
|
|
"scm_init_vm_builtins")
|
|
|
|
(define (compute-instruction-arity name args)
|
|
(define (first-word-arity word)
|
|
(case word
|
|
((X32) 0)
|
|
((X8_S24) 1)
|
|
((X8_F24) 1)
|
|
((X8_C24) 1)
|
|
((X8_L24) 1)
|
|
((X8_S8_I16) 2)
|
|
((X8_S12_S12) 2)
|
|
((X8_S12_C12) 2)
|
|
((X8_C12_C12) 2)
|
|
((X8_F12_F12) 2)
|
|
((X8_S8_S8_S8) 3)
|
|
((X8_S8_S8_C8) 3)
|
|
((X8_S8_C8_S8) 3)))
|
|
(define (tail-word-arity word)
|
|
(case word
|
|
((C32) 1)
|
|
((I32) 1)
|
|
((A32) 1)
|
|
((B32) 0)
|
|
((N32) 1)
|
|
((R32) 1)
|
|
((L32) 1)
|
|
((LO32) 1)
|
|
((C8_C24) 2)
|
|
((B1_C7_L24) 3)
|
|
((B1_X7_S24) 2)
|
|
((B1_X7_F24) 2)
|
|
((B1_X7_C24) 2)
|
|
((B1_X7_L24) 2)
|
|
((B1_X31) 1)
|
|
((X8_S24) 1)
|
|
((X8_F24) 1)
|
|
((X8_C24) 1)
|
|
((X8_L24) 1)))
|
|
(match args
|
|
((arg0 . args)
|
|
(fold (lambda (arg arity)
|
|
(+ (tail-word-arity arg) arity))
|
|
(first-word-arity arg0)
|
|
args))))
|
|
|
|
(define *macro-instruction-arities*
|
|
'((cache-current-module! . (0 . 2))
|
|
(cached-toplevel-box . (1 . 3))
|
|
(cached-module-box . (1 . 4))))
|
|
|
|
(define (compute-instruction-arities)
|
|
(let ((table (make-hash-table)))
|
|
(for-each
|
|
(match-lambda
|
|
;; Put special cases here.
|
|
((name op '! . args)
|
|
(hashq-set! table name
|
|
(cons 0 (compute-instruction-arity name args))))
|
|
((name op '<- . args)
|
|
(hashq-set! table name
|
|
(cons 1 (1- (compute-instruction-arity name args))))))
|
|
(instruction-list))
|
|
(for-each (match-lambda
|
|
((name . arity)
|
|
(hashq-set! table name arity)))
|
|
*macro-instruction-arities*)
|
|
table))
|
|
|
|
(define *instruction-arities* (delay (compute-instruction-arities)))
|
|
|
|
(define (instruction-arity name)
|
|
(hashq-ref (force *instruction-arities*) name))
|